日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現貪吃蛇游戲

瀏覽:136日期:2022-08-28 09:04:56

最近JAVA和JSwing上手練習了一下貪吃蛇,供大家參考,具體內容如下

Java實現貪吃蛇游戲

歡迎交流和加入新的內容

用到了JSwing,下面是一些具體的思路

實現

* 蛇:

采用單鏈表記錄首尾,整個蛇被分為lattice格子,放在map里

* 移動:

我在實現的過程中發現最難得反而是蛇的定義和實現。一直想著怎么樣用單獨的方法表示出蛇來,但是如果將蛇單獨實現,總有些細節實現起來特別麻煩

其實蛇移動并非牽一發而動全身,其實身子是沒有發生變化的,關鍵是兩點:

a.頭的移動b.尾巴的移動

實現:

直接把蛇實現在地圖的小格子里,不再單獨設置子類或者ArrayList等,Map里加上蛇頭的坐標,從而使得Map可以根據蛇頭改變蛇的坐標(類似于變量交換)。為頭部單獨設置x,y,作為移動的方向(也可以作為靜態變量x和y,不過沒什么區別),為身子設置next指針,只要next.next不是尾巴,那么保持不變。如果next是尾巴,就把自己的設置為尾巴,并且改變next,使之成為普通地圖塊。(refresh方法)

* 控制方向:

使用鍵盤事件,目前僅設置了wasd四個

* 窗口設計:

view extends JPanel,控制顯示,然后在Lattice里調用Graphics.draw(...)實現對每個格子的顯示

下面是核心的map部分代碼(包括自動移動,檢測食物,增加長度等等)

import codes.myGame.snake.cell.Lattice; import java.util.Random; public class Smap { private boolean getFood = false;//如果得到食物,該指針設為true,并且在隨后的autoChange里增加蛇的長度 private boolean gameOver = false; private boolean directionChange = false;//這里標志的作用是保證在一次運動期間只會進行一次轉向,使游戲更流暢 private int MAP_SIZE; private Lattice[][] map; private int directionX = 0;//下一次頭在當前位置的哪個方向上 private int directionY = 1;//下一次頭在當前位置的哪個方向上 private int[] head = new int[2];//記錄當前頭的位置 private int[] food = new int[2];//記錄當前食物的位置 public Smap(int size) { MAP_SIZE = size; map = new Lattice[MAP_SIZE][MAP_SIZE]; for(int i=0;i<size;i++){ for (int j = 0 ;j<size;j++){ map[i][j] = new Lattice(); } } map[MAP_SIZE/2][MAP_SIZE/2].setHead(true,map[MAP_SIZE/2][MAP_SIZE/2-1]);//初始化設置一個頭結點,以及他的尾節點 head[0] = MAP_SIZE/2; head[1] = MAP_SIZE/2; map[MAP_SIZE/2][MAP_SIZE/2-1].setRear(true,null); this.randFood(); } //模擬蛇的自動移動 public void autoChange(){ this.setHead(); if(food[0]==head[0] && food[1]==head[1]){//如果新的頭部碰觸到了食物,那么尾部增長 getFood = true; } if(!gameOver)this.setRear(); if(getFood)this.randFood(); directionChange = false; } //根據鍵盤事件,改變頭的下一次移動方向,注意 該移動方向是僅針對頭部的 //setDirection和setHead兩個方法需要互斥進行,這里單線程,用synchronized即可 //(否則,如果當前頭部在邊界位置,連續變幻方向可能導致在setHead里發生溢出) public synchronized void setDirection(int x,int y){ if(directionY!=y && directionX!=x &&!directionChange){ directionX = x; directionY = y; directionChange = true; } } public boolean gameOver(){ return gameOver;//頭碰到身子,證明gameOver } private synchronized void setHead(){ int i = head[0]; int j = head[1]; head[0] = ( head[0] + directionX + MAP_SIZE)%MAP_SIZE; head[1] = ( head[1] + directionY + MAP_SIZE )%MAP_SIZE; if(map[head[0]][head[1]].isBody())gameOver = true; map[head[0]][head[1]].setHead(true,map[i][j]); map[i][j].setBody(true,null); map[i][j].setHead(false,null); //傳入null表示不改變當前指向 } //設置尾巴由于沒法像頭部那樣直接設置,這里只能采用鏈表遍歷的方式獲取尾巴 private void setRear(){ if(!getFood){ Lattice temp = map[head[0]][head[1]]; while (!temp.next.isRear())temp = temp.next; temp.next().setRear(false,null); temp.setRear(true,null); temp.setBody(false,null); } } private void randFood(){ getFood = false; map[food[0]][food[1]].setFood(false);//先把當前的食物取消掉 boolean flag = false;//設置下一個食物 Random random = new Random(); int x = random.nextInt(MAP_SIZE); int y = random.nextInt(MAP_SIZE); while (!flag){ x = random.nextInt(MAP_SIZE); y = random.nextInt(MAP_SIZE); if(!map[x][y].isHead() && !map[x][y].isRear() &&!map[x][y].isBody())flag = true; } map[x][y].setFood(true); food[0] = x; food[1] = y; } public Lattice get(int row, int col){ return map[row][col]; } public int getMAP_SIZE() { return MAP_SIZE; }}

下面是顯示部分的代碼

顯示分為兩部分,一塊是利用Graphics.draw()方法實現單個單元格的繪制,另一塊設置view類繼承自JPanel。負責繪制圖畫顯示

public class Lattice { private boolean isBody = false; private boolean isHead = false; private boolean isFood = false; private boolean isRear = false; public Lattice next = null; public void setHead(boolean bool,Lattice next){ isHead = bool; if(next!=null)this.next = next; } public void setBody(boolean bool,Lattice next){ isBody = bool; if(next!=null)this.next = next; //傳入參數為null時,不改變當前的next } public void setRear(boolean bool,Lattice next){ isRear = bool; this.next = next; } public void setFood(boolean bool){ isFood = bool; } public Lattice next(){ return next; } public boolean isHead(){ return isHead; } public boolean isFood(){ return isFood; } public boolean isRear(){ return isRear; } public boolean isBody(){ return isBody; } public void refresh(){ if(isHead){ isBody = true; isHead = false;// 怎么設置下一個頭呢?(考慮把DirectionX,Y放到Smap里,而不是這里) }else if(isBody){ if(next.isRear){ next.isRear = false; isRear = true; isBody = false; } } }// 在這里設置細胞可見 public void draw(Graphics g, int x, int y, int size) { g.setColor(black); g.drawRect(x, y, size, size); if ( isHead ) { g.setColor( red); g.fillRect(x, y, size, size); }else if ( isBody || isRear) { g.setColor(black); g.fillRect(x, y, size, size); }else if(isFood){ g.setColor( blue); g.fillRect(x, y, size, size); } }}

view部分:

import codes.myGame.snake.cell.Lattice;import javax.swing.*;import java.awt.*; public class View extends JPanel { private static final long serialVersionUID = -5258995676212660595L; private static final int GRID_SIZE = 32; //填充的像素數量 private Smap thisMap; public View(Smap map) { thisMap = map; } @Override public void paint(Graphics g) { super.paint(g); int size = thisMap.getMAP_SIZE(); for (int row = 0; row< size; row++ ) { for (int col = 0; col< size; col++ ) { Lattice lattice = thisMap.get(row, col); if ( lattice != null ) { lattice.draw(g, col*GRID_SIZE, row*GRID_SIZE, GRID_SIZE);//對應的格子的顯示 } } } } @Override public Dimension getPreferredSize() {//創建該div大小 return new Dimension(thisMap.getMAP_SIZE()*GRID_SIZE+1, thisMap.getMAP_SIZE()*GRID_SIZE+1); }}

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成午夜精品一区二区三区软件| 秋霞影院一区二区三区| 国产视频一区欧美| 亚洲人妖在线| 国产精品一区亚洲| 国产视频网站一区二区三区| 国产欧美日韩影院| 精品久久电影| 亚洲天堂黄色| 日韩福利视频一区| 福利精品在线| 羞羞答答国产精品www一本| 日韩精品三区四区| 国产成人精选| 国产午夜久久| 久久精品超碰| 亚洲电影有码| 亚洲综合福利| 激情中国色综合| 日韩视频在线一区二区三区| 在线看片日韩| 久久久久免费| 黄色欧美日韩| 欧美在线精品一区| 日本一区二区免费高清| 亚洲激情二区| 麻豆视频久久| 久久成人亚洲| 91免费精品| 亚洲精品日本| 欧美日韩国产v| 日韩精品国产欧美| 久久天堂av| 久久国产人妖系列| 国产精品99一区二区| 亚洲1区在线| 另类专区亚洲| 无码日韩精品一区二区免费| 麻豆视频在线看| 综合国产精品| 亚洲一级少妇| 日本少妇精品亚洲第一区| 久久精品亚洲欧美日韩精品中文字幕| 日韩精品一区二区三区免费视频 | 久久婷婷一区| 国产精品夜夜夜| 水蜜桃久久夜色精品一区的特点| 国产精品传媒麻豆hd| 巨乳诱惑日韩免费av| 老牛国内精品亚洲成av人片| 蜜桃91丨九色丨蝌蚪91桃色| 丁香婷婷久久| 欧美天堂在线| 免费黄网站欧美| 亚洲欧美一区在线| 精品久久91| 日韩精品视频网| 亚洲一区网站| 欧美一级精品| 都市激情国产精品| 国产精品17p| 69精品国产久热在线观看| 国产免费成人| 九色精品91| 国产99在线| 精品国产亚洲一区二区三区大结局| 亚洲免费资源| 亚洲中午字幕| 五月婷婷亚洲| 99久久婷婷这里只有精品| 国际精品欧美精品| 欧美成a人片免费观看久久五月天| 综合国产精品| 久久福利精品| 好看的亚洲午夜视频在线| av一区在线| 日韩欧美另类一区二区| 国产成人精品亚洲线观看| 麻豆精品久久| 欧美日韩黄网站| 日韩高清二区| 亚洲乱亚洲高清| 视频一区国产视频| 亚洲一区欧美激情| 亚洲欧美日韩国产综合精品二区 | 国产成人精品一区二区三区视频| 欧美精品影院| 欧美亚洲免费| 国产欧美一区| 国产精品videossex| 国产精品白丝一区二区三区| 欧美日韩va| 国产精品免费不| 精品中文字幕一区二区三区| 麻豆极品一区二区三区| 国精品产品一区| 日韩免费看片| 蜜桃tv一区二区三区| 国产精品97| 99pao成人国产永久免费视频| 欧美99久久| 亚洲欧美视频| 婷婷视频一区二区三区| 青青国产精品| 久久精品九色| 99成人超碰| 亚洲一区亚洲| 日韩成人av影视| 精品在线网站观看| 神马日本精品| 爽爽淫人综合网网站| 日韩精品视频中文字幕| 国产日韩一区| 国产成人精选| 不卡在线一区| 日韩欧美激情| 国产成人久久精品麻豆二区 | 成人日韩在线观看| 亚洲少妇自拍| 国产欧美一级| 久久毛片亚洲| 亚洲一区国产一区| 欧美亚洲自偷自偷| 亚洲国产成人二区| 蜜臀久久久久久久| 老司机精品视频网| 欧美中文一区二区| 日韩精品国产欧美| 欧洲av不卡| 亚洲精品免费观看| 欧美丰满日韩| 麻豆精品91| 精品久久电影| 午夜在线精品| 激情不卡一区二区三区视频在线| 久久婷婷丁香| 欧美久久精品| 亚洲婷婷在线| 国产激情久久| 亚洲一区二区免费看| 久久伊人亚洲| 六月丁香综合| 高清av一区| 亚洲乱码一区| 日韩精品一卡| 国产欧美69| 在线亚洲欧美| 91嫩草亚洲精品| 日本成人精品| 日韩精品久久久久久久电影99爱| 中文字幕av一区二区三区人| 91麻豆国产自产在线观看亚洲| 视频一区视频二区中文字幕| 国产成人精品一区二区三区视频 | 中文字幕人成乱码在线观看| 久久香蕉精品| 欧洲在线一区| 你懂的国产精品永久在线| 视频一区在线播放| 群体交乱之放荡娇妻一区二区| 国产美女精品视频免费播放软件| 免费观看不卡av| 精品亚洲自拍| 青草久久视频| 另类激情亚洲| 精品一区三区| 日韩精品免费一区二区三区| 国产精品久久久久久久久免费高清 | 欧美韩日一区| 国产日韩欧美三区| 视频一区二区三区入口| 久久久亚洲一区| 97精品国产| 国产精品久久亚洲不卡| 日韩在线观看一区二区| 999久久久国产精品| 91亚洲国产成人久久精品| 国产精品.xx视频.xxtv| 91精品国产经典在线观看| 蜜桃av一区| 国产日韩专区| 亚洲精品1区| 好看的av在线不卡观看| 久久国产亚洲精品| 亚洲成人不卡| 日韩在线第七页| 韩国久久久久久| 激情久久99| 韩日一区二区| 国产成人久久| 久久电影tv| 日韩久久精品| 国产v综合v| 日韩精品一区二区三区免费观看| 欧美国产美女| 99久久精品费精品国产| 日韩一区二区三区在线免费观看| 国产91欧美| 日本午夜大片a在线观看| 国产一区二区三区国产精品|