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

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

Java實現貪吃蛇游戲

瀏覽:140日期: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久久,三上悠亚国产精品一区二区三区
国产剧情在线观看一区| 奇米狠狠一区二区三区| 五月婷婷亚洲| 亚洲精品**中文毛片| 欧美午夜三级| 亚洲免费一区二区| 日韩在线看片| 在线观看一区| 日韩欧美另类一区二区| 国产一区调教| 美女久久久久久| 国产精品多人| 另类欧美日韩国产在线| 91精品丝袜国产高跟在线| 亚洲a一区二区三区| 里番精品3d一二三区| 日本色综合中文字幕| 日韩亚洲精品在线观看| 美女精品一区| 久久国产乱子精品免费女| 欧美成人日韩| 欧美特黄一级| 亚洲免费观看高清完整版在线观| 女人天堂亚洲aⅴ在线观看| 国内精品福利| 丝袜美腿亚洲一区二区图片| 成人在线视频区| 国产精品久一| 欧美日韩国产精品一区二区亚洲| 国产夫妻在线| 欧美日韩精品免费观看视完整| 精品欧美激情在线观看| 蜜桃视频第一区免费观看| 免费成人在线影院| 91日韩在线| 久久亚洲成人| 国产模特精品视频久久久久| 99久久亚洲精品| 日本成人中文字幕在线视频| 国产日产精品_国产精品毛片 | 亚洲97av| 欧美天堂在线| 999久久久免费精品国产| 中文字幕系列一区| 中文一区一区三区免费在线观| 久久激情综合网| 国产+成+人+亚洲欧洲在线| 久久婷婷久久| 欧美日本久久| 伊人久久高清| 亚洲成人三区| 国内精品99| 免费国产亚洲视频| 亚洲我射av| 美女亚洲一区| 国产精品日本一区二区三区在线 | 免费看av不卡| 少妇精品久久久一区二区| 日韩高清一区在线| 欧美一区影院| 亚洲高清av| 91九色综合| 国产精品久久久久久久久久齐齐 | 99视频精品免费观看| 91欧美日韩| 桃色av一区二区| 国产成人免费| 九九精品调教| 精品中文字幕一区二区三区av| 少妇久久久久| 自由日本语亚洲人高潮| 在线一区免费观看| 在线精品亚洲| 欧美在线看片| 亚洲资源在线| 欧美日本三区| 9999国产精品| 激情五月色综合国产精品| 精品午夜视频| 国产欧美69| 亚洲字幕久久| 欧美黑人巨大videos精品| 久久久亚洲欧洲日产| 色天使综合视频| 久久福利精品| 成人在线观看免费视频| 国产一区清纯| 国产欧美一区二区三区精品观看| 精品五月天堂| 亚洲成人va| 免费在线看一区| 国产精品乱战久久久| 久久免费福利| 国产精品免费看| 国产精品videossex| 欧美不卡在线| 国产精品v一区二区三区| 欧美~级网站不卡| 日韩精品成人| 亚洲精品.com| 国产精品久久久久久妇女| 欧美日韩黑人| 三级亚洲高清视频| 欧美亚洲自偷自偷| 欧美在线看片| 久久精品免费一区二区三区| 日韩欧美中文字幕电影| 国产精品久久久久久久久妇女| 伊人久久大香线蕉av不卡| 香蕉视频成人在线观看| 国产欧美高清视频在线| 国产午夜久久av| 国产精品99精品一区二区三区∴ | 欧美精品一卡| 午夜国产一区二区| 蜜桃tv一区二区三区| 久久超碰99| 精品久久福利| 免费不卡中文字幕在线| 1024精品久久久久久久久| 韩日一区二区三区| 日韩精品一区第一页| 久久三级毛片| 国产亚洲午夜| 欧美成人一二区| 欧美日韩四区| 久久在线91| 亚洲一区二区三区在线免费| 国产精品毛片在线| 中文一区一区三区免费在线观| 中文字幕日韩高清在线| 99热精品久久| 久久亚洲二区| 欧美一级二级视频| 麻豆一区二区三区| 亚洲九九精品| 国产精品视频3p| 日韩综合在线| 好看的av在线不卡观看| 综合激情视频| 蜜桃av一区二区三区电影| 香蕉成人av| 国产精品三p一区二区| 91成人在线| 一级欧洲+日本+国产| 亚洲天堂一区二区| 国产一区二区精品久| 国产一区不卡| www.九色在线| 激情综合自拍| 日韩精品一区二区三区免费观影 | 一区二区三区国产在线| 久久电影一区| 日本三级亚洲精品| 国产精品网址| 麻豆久久久久久| 日产精品一区二区| 精精国产xxxx视频在线播放| 伊伊综合在线| 亚洲成人二区| 精品在线99| 日本不卡视频在线观看| 日本欧美在线| 美女视频网站久久| 国产99亚洲| 亚洲视频电影在线| 国产欧美一区二区三区国产幕精品 | 欧美日韩激情在线一区二区三区| 国产精品av一区二区| 久久夜色精品| 精品伊人久久| 播放一区二区| 香蕉成人久久| 久久不见久久见中文字幕免费| 日韩精品诱惑一区?区三区| 久久国产99| 久久精品国产亚洲一区二区三区| 婷婷成人在线| 欧美a级一区二区| 欧美午夜不卡影院在线观看完整版免费| 亚洲不卡av不卡一区二区| 日本91福利区| 国产精品久久| 岛国精品一区| 国产欧美综合一区二区三区| 99国产精品| 久久中文在线| 狠狠久久伊人| 日韩大片在线| 夜夜精品视频| 日韩欧美久久| 久久亚洲精精品中文字幕| 日韩激情一区| 欧美日韩精品免费观看视频完整| 极品日韩av| 色综合视频一区二区三区日韩| 国产伦乱精品| 亚洲天堂一区二区| 亚洲三级国产| 国产成人77亚洲精品www|