Java版貪吃蛇(比較完善的版本)

來源:互聯網
上載者:User

標籤:java   mvc   gui   貪吃蛇   多線程   

很認真的寫的一個java版的貪吃蛇遊戲,圖形介面,支援菜單操作,鍵盤監聽,可加速,減速,統計得分,設定運動速度,設定遊戲背景顏色等!應該沒有Bug了,因為全被我修改沒了。哈哈。

下面是項目各包及類的層次關係:


遊戲的主要運行介面如下:



下面是部分代碼,詳細源碼見此連結:http://pan.baidu.com/s/1bnubnzh

//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;//監聽器組private Set<SnakeListener> listeners = new HashSet<SnakeListener>();//儲存蛇的鏈表結構private LinkedList<Point> body = new LinkedList<Point>();private boolean life;//是否活著private boolean pause;//是否暫停遊戲private int oldDirection,newDirection;//新,舊方向的引入(避免一次移動時間內的無效方向)private Point oldTail;//舊的尾巴(在吃掉食物的時候使用)private int foodCount = 0;//吃掉食物的數量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;}}//清空蛇的節點的方法(用來開始一次新的遊戲)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;}//用來改變pause常量的狀態public void changePause() {pause = !pause;}//蛇死掉的方法public void die() {life = false;}//蛇移動的方法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++;}//擷取吃到的食物數量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;}//擷取代表蛇頭的節點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);}//畫蛇頭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);}//控制蛇移動的線程內部類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();}}}}//啟動線程的方法public void begin() {new Thread(new SnakeDriver()).start();}//添加監聽器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;}/** * 產生石頭 */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);}}}}}


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java版貪吃蛇(比較完善的版本)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.