最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java貪吃蛇游戲完善版

 更新時(shí)間:2021年09月13日 16:02:29   作者:技術(shù)宅--火狼  
這篇文章主要為大家詳細(xì)介紹了Java貪吃蛇游戲完善版,支持菜單操作,鍵盤(pán)監(jiān)聽(tīng),可加速,減速,統(tǒng)計(jì)得分等功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

很認(rèn)真的寫(xiě)的一個(gè)java版的貪吃蛇游戲,圖形界面,支持菜單操作,鍵盤(pán)監(jiān)聽(tīng),可加速,減速,統(tǒng)計(jì)得分,設(shè)定運(yùn)動(dòng)速度,設(shè)定游戲背景顏色等!應(yīng)該沒(méi)有Bug了,因?yàn)槿晃倚薷臎](méi)了。

下面是項(xiàng)目各包及類的層次關(guān)系:

游戲的主要運(yùn)行界面截圖如下:

下面是部分代碼,詳細(xì)源碼見(jiàn)此鏈接:貪吃蛇源碼下載

Snake類:

package com.huowolf.entities; 
 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.util.HashSet; 
import java.util.LinkedList; 
import java.util.Set; 
 
import com.huowolf.listener.SnakeListener; 
import com.huowolf.util.Global; 
 
 
public class Snake { 
 
 //代表方向的常量 
 public static final int UP = 1; 
 public static final int DOWN = -1; 
 public static final int LEFT = 2; 
 public static final int RIGHT = -2; 
 
 //監(jiān)聽(tīng)器組 
 private Set<SnakeListener> listeners = new HashSet<SnakeListener>(); 
 //存儲(chǔ)蛇的鏈表結(jié)構(gòu) 
 private LinkedList<Point> body = new LinkedList<Point>(); 
 
 private boolean life;  //是否活著 
 private boolean pause;  //是否暫停游戲 
 private int oldDirection,newDirection; //新,舊方向的引入(避免一次移動(dòng)時(shí)間內(nèi)的無(wú)效方向) 
 private Point oldTail;  //舊的尾巴(在吃掉食物的時(shí)候使用) 
 private int foodCount = 0; //吃掉食物的數(shù)量 
 private Color headColor; 
 private Color bodyColor; 
 private int sleepTime; 
 
 public boolean isLife() { 
 return life; 
 } 
 public int getSleepTime() { 
 return sleepTime; 
 } 
 
 public void setSleepTime(int sleepTime) { 
 this.sleepTime = sleepTime; 
 } 
 
 
 public void setHeadColor(Color headColor) { 
 this.headColor = headColor; 
 } 
 
 
 public void setBodyColor(Color bodyColor) { 
 this.bodyColor = bodyColor; 
 } 
 
 
 public void init() { 
 int x = Global.WIDTH/2; 
 int y = Global.HEIGHT/2; 
 for(int i=0;i<3;i++) { 
 body.addLast(new Point(x--,y)); 
 } 
 
 oldDirection = newDirection = RIGHT; 
 foodCount = 0; 
 life = true; 
 pause = false; 
 
 if(sleepTime==0) { 
 sleepTime = 300; 
 } 
 } 
 
 //清空蛇的節(jié)點(diǎn)的方法(用來(lái)開(kāi)始一次新的游戲) 
 public void clear() { 
 body.clear(); 
 } 
 
 
 public void setLife(boolean life) { 
 this.life = life; 
 } 
 
 
 public boolean getPause() { 
 return pause; 
 } 
 
 public void setPause(boolean pause) { 
 this.pause = pause; 
 } 
 
 
 //用來(lái)改變pause常量的狀態(tài) 
 public void changePause() { 
 pause = !pause; 
 } 
 
 
 //蛇死掉的方法 
 public void die() { 
 life = false; 
 } 
 
 //蛇移動(dòng)的方法 
 public void move() { 
 if(!(oldDirection + newDirection==0)) { 
 oldDirection = newDirection ; 
 } 
 
 //去尾 
 oldTail = body.removeLast(); 
 int x = body.getFirst().x; 
 int y = body.getFirst().y; 
 
 switch(oldDirection) { 
 case UP: 
 y--; 
 if(y<0) { 
  y = Global.HEIGHT -1 ; 
 } 
 break; 
 case DOWN: 
 y++; 
 if(y >= Global.HEIGHT) { 
  y = 0; 
 } 
 break; 
 case LEFT: 
 x--; 
 if(x<0) { 
  x = Global.WIDTH-1; 
 } 
 break; 
 case RIGHT: 
 x++; 
 if(x >= Global.WIDTH) { 
  x = 0; 
 } 
 break; 
 } 
 
 Point newHead = new Point(x, y); 
 //加頭 
 body.addFirst(newHead); 
 } 
 
 //改變方向 
 public void changeDirection(int direction) { 
 newDirection = direction; 
 } 
 
 
 //吃食物 
 public void eatFood() { 
 body.addLast(oldTail); 
 foodCount++; 
 } 
 
 //獲取吃到的食物數(shù)量 
 public int getFoodCount() { 
 return foodCount; 
 } 
 
 
 //蛇是否吃到了自己的身體 
 public boolean isEatBody() { 
 for(int i=1;i<body.size();i++) { 
 if(body.get(i).equals(this.getHead())) 
 return true; 
 } 
 
 return false; 
 } 
 
 //獲取代表蛇頭的節(jié)點(diǎn) 
 public Point getHead() { 
 return body.getFirst(); 
 } 
 
 //顯示自己 
 public void drawMe(Graphics g) { 
 if(bodyColor==null) { 
 g.setColor(new Color(0x3333FF)); 
 } else { 
 g.setColor(bodyColor); 
 } 
 
 for(Point p : body) { 
 
 g.fillRoundRect(p.x*Global.CELL_SIZE, p.y*Global.CELL_SIZE, 
  Global.CELL_SIZE, Global.CELL_SIZE, 15,12 ); 
 } 
 drawHead(g); 
 } 
 
 //畫(huà)蛇頭 
 public void drawHead(Graphics g) { 
 if(headColor==null) 
 g.setColor(Color.YELLOW); 
 else { 
 g.setColor(headColor); 
 } 
 
 g.fillRoundRect(getHead().x * Global.CELL_SIZE, getHead().y* Global.CELL_SIZE, 
 Global.CELL_SIZE, Global.CELL_SIZE, 15,12); 
 } 
 
 
 //控制蛇移動(dòng)的線程內(nèi)部類 
 private class SnakeDriver implements Runnable { 
 public void run() { 
 while(life) { 
 if(pause==false) { 
  move(); 
  for(SnakeListener l : listeners) 
  l.snakeMoved(Snake.this); 
 } 
  
 try { 
  Thread.sleep(sleepTime); 
 } catch (InterruptedException e) { 
  e.printStackTrace(); 
 } 
 } 
 } 
 } 
 
 //啟動(dòng)線程的方法 
 public void begin() { 
 new Thread(new SnakeDriver()).start(); 
 
 } 
 
 //添加監(jiān)聽(tīng)器 
 public void addSnakeListener(SnakeListener l) { 
 if(l != null) { 
 listeners.add(l); 
 } 
 } 
 
 //加速 
 public void speedUp() { 
 if(sleepTime>50) { 
 sleepTime-=20; 
 } 
 } 
 
 //減速 
 public void speedDown() { 
 if(sleepTime<700) { 
 sleepTime+=20; 
 } 
 } 
 
} 

Food類:

package com.huowolf.entities; 
 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
 
import com.huowolf.util.Global; 
 
 
public class Food extends Point{ 
 
 private static final long serialVersionUID = 1L; 
 
 private Color foodColor; 
 
 
 public void setFoodColor(Color foodColor) { 
 this.foodColor = foodColor; 
 } 
 
 public Color getFoodColor() { 
 return foodColor; 
 } 
 
 public void newFood(Point p) { 
 setLocation(p); 
 } 
 
 public boolean isFoodEated(Snake snake) { 
 return this.equals(snake.getHead()); 
 } 
 
 public void drawMe(Graphics g) { 
 if(foodColor==null) { 
 g.setColor(Color.RED); 
 }else { 
 g.setColor(foodColor); 
 } 
 
 g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true); 
 } 
} 

Ground類

package com.huowolf.entities; 
 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.util.Random; 
 
import com.huowolf.util.Global; 
 
public class Ground { 
 private boolean [][] rocks = new boolean[Global.WIDTH][Global.HEIGHT]; 
 private int mapType = 1; 
 
 
 
 public int getMapType() { 
 return mapType; 
 } 
 
 public void setMapType(int mapType) { 
 this.mapType = mapType; 
 } 
 
 
 //初始化地面(清空石頭) 
 public void clear() { 
 for (int x = 0; x < Global.WIDTH; x++) 
 for (int y = 0; y < Global.HEIGHT; y++) 
 rocks[x][y] = false; 
 } 
 
 /** 
 * 產(chǎn)生石頭 
 */ 
 public void generateRocks1() { 
 for (int x = 0; x < Global.WIDTH; x++) 
 rocks[x][0] = rocks[x][Global.HEIGHT - 1] = true; 
 for (int y = 0; y < Global.HEIGHT; y++) 
 rocks[0][y] = rocks[Global.WIDTH - 1][y] = true; 
 } 
 
 
 public void generateRocks2() { 
 
 for (int y = 0; y < 6; y++) { 
 rocks[0][y] = true; 
 rocks[Global.WIDTH - 1][y] = true; 
 rocks[0][Global.HEIGHT - 1 - y] = true; 
 rocks[Global.WIDTH - 1][Global.HEIGHT - 1 - y] = true; 
 } 
 for (int y = 6; y < Global.HEIGHT - 6; y++) { 
 rocks[6][y] = true; 
 rocks[Global.WIDTH - 7][y] = true; 
 } 
 } 
 
 
 public void generateRocks3() { 
 for(int x=4;x<14;x++) 
 rocks[x][5] = true; 
 for(int j=5;j<15;j++) 
 rocks[21][j] = true; 
 for(int y=13;y<20;y++) 
 rocks[14][y] = true; 
 for(int x=2;x<10;x++) 
 rocks[x][17] = true; 
 for(int i=10;i<Global.WIDTH-3;i++) 
 rocks[i][Global.HEIGHT-3] = true; 
 } 
 
 //蛇是否吃到了石頭 
 public boolean isGroundEated(Snake snake) { 
 for(int x=0; x<Global.WIDTH;x++) { 
 for(int y=0; y<Global.HEIGHT;y++) { 
 if(rocks[x][y] == true && 
  (x==snake.getHead().x &&y==snake.getHead().y)) { 
  return true; 
 } 
 } 
 } 
 return false; 
 
 } 
 
 public Point getPoint() { 
 Random random = new Random(); 
 int x=0,y=0; 
 do { 
 x = random.nextInt(Global.WIDTH); 
 y = random.nextInt(Global.HEIGHT); 
 } while (rocks[x][y]==true); 
 
 return new Point(x,y); 
 } 
 
 //顯示方法 
 public void drawMe(Graphics g) { 
 g.setColor(Color.DARK_GRAY); 
 
 for(int x=0; x<Global.WIDTH;x++) { 
 for(int y=0; y<Global.HEIGHT;y++) { 
 if(rocks[x][y] == true) { 
  g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, 
  Global.CELL_SIZE,Global.CELL_SIZE, true); 
 } 
 } 
 } 
 } 
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法

    IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法

    這篇文章主要介紹了IDEA?mybatis?Mapper.xml報(bào)紅的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • SpringMVC框架如何與Junit整合看這個(gè)就夠了

    SpringMVC框架如何與Junit整合看這個(gè)就夠了

    這篇文章主要介紹了SpringMVC框架如何與Junit整合看這個(gè)就夠了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java設(shè)計(jì)模式中的策略(Strategy)模式解讀

    Java設(shè)計(jì)模式中的策略(Strategy)模式解讀

    這篇文章主要介紹了Java設(shè)計(jì)模式中的策略(Strategy)模式解讀,對(duì)象的某個(gè)行為,在不同場(chǎng)景有不同實(shí)現(xiàn)方式,可以將這些行為的具體實(shí)現(xiàn)定義為一組策略,每個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)一種策略,在不同場(chǎng)景使用不同的實(shí)現(xiàn),并且可以自由切換策略,需要的朋友可以參考下
    2023-10-10
  • 使用java實(shí)現(xiàn)http多線程斷點(diǎn)下載文件(一)

    使用java實(shí)現(xiàn)http多線程斷點(diǎn)下載文件(一)

    Java 多線程斷點(diǎn)下載文件基本原理:利用URLConnection獲取要下載文件的長(zhǎng)度、頭部等相關(guān)信息,并設(shè)置響應(yīng)的頭部信息,本文將詳細(xì)介紹,需要了解更多的朋友可以參考下
    2012-12-12
  • SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    這篇文章主要介紹了SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • protobuf與json轉(zhuǎn)換小結(jié)

    protobuf與json轉(zhuǎn)換小結(jié)

    protobuf對(duì)象不能直接使用jsonlib去轉(zhuǎn),因?yàn)閜rotobuf生成的對(duì)象的get方法返回的類型有byte[],而只有String類型可以作為json的key,protobuf提供方法進(jìn)行轉(zhuǎn)換
    2017-07-07
  • Spring @Primary和@Qualifier注解原理解析

    Spring @Primary和@Qualifier注解原理解析

    這篇文章主要介紹了Spring @Primary和@Qualifier注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot項(xiàng)目使用MDC給日志增加唯一標(biāo)識(shí)的實(shí)現(xiàn)步驟

    SpringBoot項(xiàng)目使用MDC給日志增加唯一標(biāo)識(shí)的實(shí)現(xiàn)步驟

    本文介紹了如何在SpringBoot項(xiàng)目中使用MDC(Mapped?Diagnostic?Context)為日志增加唯一標(biāo)識(shí),以便于日志追蹤,通過(guò)創(chuàng)建日志攔截器、配置攔截器以及修改日志配置文件,可以實(shí)現(xiàn)這一功能,文章還提供了源碼地址,方便讀者學(xué)習(xí)和參考,感興趣的朋友一起看看吧
    2025-03-03
  • Java單例模式、饑餓模式代碼實(shí)例

    Java單例模式、饑餓模式代碼實(shí)例

    這篇文章主要介紹了Java單例模式、饑餓模式代碼實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    這篇文章主要介紹了從源碼的角度淺析HashMap、TreeMap元素的存儲(chǔ)和獲取元素的邏輯;從Map與Set之間的關(guān)系淺析常用的Set中元素的存儲(chǔ)和判斷是否重復(fù)的邏輯,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

丹寨县| 莱西市| 涞源县| 炎陵县| 南城县| 攀枝花市| 宣威市| 赤水市| 宝山区| 涟源市| 阳高县| 安义县| 当阳市| 吉木乃县| 河南省| 安庆市| 重庆市| 永定县| 台江县| 安丘市| 南召县| 尉氏县| 达日县| 东安县| 宣城市| 那曲县| 米易县| 乌拉特后旗| 林州市| 西城区| 康保县| 阿拉善盟| 博罗县| 家居| 姚安县| 井研县| 郸城县| 闽清县| 江川县| 安顺市| 吴江市|