电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java實現貪吃蛇游戲

瀏覽:54日期: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
相關文章:
主站蜘蛛池模板: 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 聚丙烯酰胺_厂家_价格-河南唐达净水材料有限公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 江西自考网-江西自学考试网| 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 南京欧陆电气股份有限公司-风力发电机官网 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 硬齿面减速机[型号全],ZQ减速机-淄博久增机械 | 浙江浩盛阀门有限公司| 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 重庆轻质隔墙板-重庆安吉升科技有限公司 |