貪吃蛇java代碼,貪吃蛇java代碼eclipse

本文目錄一覽:

java貪吃蛇代碼注釋求解

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Rectangle;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JFrame;

public class InterFace extends JFrame {

/**

* WIDTH:寬

* HEIGHT:高

* SLEEPTIME:可以看作蛇運動的速度

* L = 1,R = 2, U = 3, D = 4 左右上下代碼

*/

public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 200, L = 1,R = 2, U = 3, D = 4;

BufferedImage offersetImage= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR);;

Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);

Snake snake;

Node node;

public InterFace() {

//創建”蛇”對象

snake = new Snake(this);

//創建”食物”對象

createNode();

this.setBounds(100, 100, WIDTH, HEIGHT);

//添加鍵盤監聽器

this.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent arg0) {

System.out.println(arg0.getKeyCode());

switch (arg0.getKeyCode()) {

//映射上下左右4個鍵位

case KeyEvent.VK_LEFT:

snake.dir = L;

break;

case KeyEvent.VK_RIGHT:

snake.dir = R;

break;

case KeyEvent.VK_UP:

snake.dir = U;

break;

case KeyEvent.VK_DOWN:

snake.dir = D;

}

}

});

this.setTitle(“貪吃蛇 0.1 By : Easy”);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

//啟動線程,開始執行

new Thread(new ThreadUpadte()).start();

}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();

g2d.setColor(Color.white);

g2d.fillRect(0, 0, WIDTH, HEIGHT);

g2d.setColor(Color.black);

g2d.drawRect(rect.x, rect.y, rect.width, rect.height);

//如果蛇碰撞(吃)到食物,則創建新食物

if (snake.hit(node)) {

createNode();

}

snake.draw(g2d);

node.draw(g2d);

g.drawImage(offersetImage, 0, 0, null);

}

class ThreadUpadte implements Runnable {

public void run() {

//無限重繪畫面

while (true) {

try {

Thread.sleep(SLEEPTIME);

repaint(); //

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

/**

* 創建食物

*/

public void createNode() {

//隨機食物的出現位置

int x = (int) (Math.random() * 650) + 50,y = (int) (Math.random() * 500) + 50;

Color color = Color.blue;

node = new Node(x, y, color);

}

public static void main(String args[]) {

new InterFace();

}

}

/**

* 節點類(包括食物和蛇的身軀組成節點)

*/

class Node {

int x, y, width = 15, height = 15;

Color color;

public Node(int x, int y, Color color) {

this(x, y);

this.color = color;

}

public Node(int x, int y) {

this.x = x;

this.y = y;

this.color = color.black;

}

public void draw(Graphics2D g2d) {

g2d.setColor(color);

g2d.drawRect(x, y, width, height);

}

public Rectangle getRect() {

return new Rectangle(x, y, width, height);

}

}

/**

* 蛇

*/

class Snake {

public ListNode nodes = new ArrayListNode();

InterFace interFace;

int dir=InterFace.R;

public Snake(InterFace interFace) {

this.interFace = interFace;

nodes.add(new Node(20 + 150, 40 + 150));

addNode();

}

/**

* 是否碰撞到食物

* @return true 是 false 否

*/

public boolean hit(Node node) {

//遍歷整個蛇體是否與食物碰撞

for (int i = 0; i nodes.size(); i++) {

if (nodes.get(i).getRect().intersects(node.getRect())) {

addNode();

return true;

}

}

return false;

}

public void draw(Graphics2D g2d) {

for (int i = 0; i nodes.size(); i++) {

nodes.get(i).draw(g2d);

}

move();

}

public void move() {

nodes.remove((nodes.size() – 1));

addNode();

}

public synchronized void addNode() {

Node nodeTempNode = nodes.get(0);

//如果方向

switch (dir) {

case InterFace.L:

//判斷是否會撞牆

if (nodeTempNode.x = 20) {

nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x – nodeTempNode.width,

nodeTempNode.y));

break;

case InterFace.R:

//判斷是否會撞牆

if (nodeTempNode.x = 20 + 15 * 50 – nodeTempNode.width) {

nodeTempNode = new Node(20 – nodeTempNode.width, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width,

nodeTempNode.y));

break;

case InterFace.U:

//判斷是否會撞牆

if (nodeTempNode.y = 40) {

nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y – nodeTempNode.height));

break;

case InterFace.D:

//判斷是否會撞牆

if (nodeTempNode.y = 40 + 15 * 35 – nodeTempNode.height) {

nodeTempNode = new Node(nodeTempNode.x,40 – nodeTempNode.height);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));

break;

}

}

}

貪吃蛇 java代碼

自己寫着玩的,很簡單,你試一試哦…

主要用了javax.swing.Timer這個類:

import java.awt.*;

import javax.swing.*;

@SuppressWarnings(“serial”)

public class MainClass extends JFrame {

ControlSnake control;

Toolkit kit;

Dimension dimen;

public static void main(String[] args) {

new MainClass(“my snake”);

}

public MainClass(String s) {

super(s);

control = new ControlSnake();

control.setFocusable(true);

kit = Toolkit.getDefaultToolkit();

dimen = kit.getScreenSize();

add(control);

setLayout(new BorderLayout());

setLocation(dimen.width / 3, dimen.height / 3);// dimen.width/3,dimen.height/3

setSize(FWIDTH, FHEIGHT);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setResizable(false);

setVisible(true);

}

public static final int FWIDTH = 315;

public static final int FHEIGHT = 380;

}

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.Timer;

import java.util.Random;

@SuppressWarnings(“serial”)

public class ControlSnake extends JPanel implements ActionListener {

Random rand;

ArrayListPoint list, listBody;

String str, str1;

static boolean key;

int x, y, dx, dy, fx, fy, flag;

int snakeBody;

int speed;

public ControlSnake() {

snakeBody = 1;

str = “上下左右方向鍵控制 P鍵暫停…”;

str1 = “現在的長度為:” + snakeBody;

key = true;

flag = 1;

speed = 700;

rand = new Random();

list = new ArrayListPoint();

listBody = new ArrayListPoint();

x = 5;

y = 5;

list.add(new Point(x, y));

listBody.add(list.get(0));

dx = 10;

dy = 0;

fx = rand.nextInt(30) * 10 + 5;// 2

fy = rand.nextInt(30) * 10 + 5;// 2

setBackground(Color.WHITE);

setSize(new Dimension(318, 380));

final Timer time = new Timer(speed, this);

time.start();

addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == 37) {

dx = -10;

dy = 0;

} else if (e.getKeyCode() == 38) {

dx = 0;

dy = -10;

} else if (e.getKeyCode() == 39) {

dx = 10;

dy = 0;

} else if (e.getKeyCode() == 40) {

dx = 0;

dy = 10;

} else if (e.getKeyCode() == 80) {

if (flag % 2 == 1) {

time.stop();

}

if (flag % 2 == 0) {

time.start();

}

flag++;

}

}

});

}

public void paint(Graphics g) {

g.setColor(Color.WHITE);

g.fillRect(0, 0, 400, 400);

g.setColor(Color.DARK_GRAY);

g.drawLine(3, 3, 305, 3);

g.drawLine(3, 3, 3, 305);

g.drawLine(305, 3, 305, 305);

g.drawLine(3, 305, 305, 305);

g.setColor(Color.PINK);

for (int i = 0; i listBody.size(); i++) {

g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);

}

g.fillRect(x, y, 9, 9);

g.setColor(Color.ORANGE);

g.fillRect(fx, fy, 9, 9);

g.setColor(Color.DARK_GRAY);

str1 = “現在的長度為:” + snakeBody;

g.drawString(str, 10, 320);

g.drawString(str1, 10, 335);

}

public void actionPerformed(ActionEvent e) {

x += dx;

y += dy;

if (makeOut() == false) {

JOptionPane.showMessageDialog(null, “重新開始……”);

speed = 700;

snakeBody = 1;

x = 5;

y = 5;

list.clear();

list.add(new Point(x, y));

listBody.clear();

listBody.add(list.get(0));

dx = 10;

dy = 0;

}

addPoint(x, y);

if (x == fx y == fy) {

speed = (int) (speed * 0.8);//速度增加參數

if (speed 200) {

speed = 100;

}

fx = rand.nextInt(30) * 10 + 5;// 2

fy = rand.nextInt(30) * 10 + 5;// 2

snakeBody++;// 2

} // 2

repaint();

}

public void addPoint(int xx, int yy) {

// 動態的記錄最新發生的50步以內的移動過的坐標

// 並畫出最新的snakeBody

if (list.size() 100) {//蛇身長度最長為100

list.add(new Point(xx, yy));

} else {

list.remove(0);

list.add(new Point(xx, yy));

}

if (snakeBody == 1) {

listBody.remove(0);

listBody.add(0, list.get(list.size() – 1));

} else {

listBody.clear();

if (list.size() snakeBody) {

for (int i = list.size() – 1; i 0; i–) {

listBody.add(list.get(i));

}

} else {

for (int i = list.size() – 1; listBody.size() snakeBody; i–) {

listBody.add(list.get(i));

}

}

}

}

public boolean makeOut() {

if ((x 3 || y 3) || (x 305 || y 305)) {

return false;

}

for (int i = 0; i listBody.size() – 1; i++) {

for (int j = i + 1; j listBody.size(); j++) {

if (listBody.get(i).equals(listBody.get(j))) {

return false;

}

}

}

return true;

}

}

求java貪吃蛇的編程,並有注釋

J2ME貪吃蛇源代碼——200行左右,包含詳細注釋 package snake;import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;public class SnakeMIDlet extends MIDlet {

SnakeCanvas displayable = new SnakeCanvas();

public SnakeMIDlet() {

Display.getDisplay(this).setCurrent(displayable);

}public void startApp() {}public void pauseApp() {}public void destroyApp(boolean unconditional) {}}//文件名:SnakeCanvas.javapackage snake;import java.util.*;

import javax.microedition.lcdui.*;/**

* 貪吃蛇遊戲

*/

public class SnakeCanvas extends Canvas implements Runnable{

/**存儲貪吃蛇節點坐標,其中第二維下標為0的代表x坐標,第二維下標是1的代表y坐標*/

int[][] snake = new int[200][2];

/**已經使用的節點數量*/

int snakeNum;

/**貪吃蛇運動方向,0代表向上,1代表向下,2代表向左,3代表向右*/

int direction;

/*移動方向*/

/**向上*/

private final int DIRECTION_UP = 0;

/**向下*/

private final int DIRECTION_DOWN = 1;

/**向左*/

private final int DIRECTION_LEFT = 2;

/**向右*/

private final int DIRECTION_RIGHT = 3;/**遊戲區域寬度*/

int width;

/**遊戲區域高度*/

int height;/**蛇身單元寬度*/

private final byte SNAKEWIDTH = 4;/**是否處於暫停狀態,true代表暫停*/

boolean isPaused = false;

/**是否處於運行狀態,true代表運行*/

boolean isRun = true;/**時間間隔*/

private final int SLEEP_TIME = 300;

/**食物的X坐標*/

int foodX;

/**食物的Y坐標*/

int foodY;

/**食物的閃爍控制*/

boolean b = true;

/**Random對象*/

Random random = new Random();

public SnakeCanvas() {

//初始化

init();

width = this.getWidth();

height = this.getHeight();

//啟動線程

new Thread(this).start();

}/**

* 初始化開始數據

*/

private void init(){

//初始化節點數量

snakeNum = 7;

//初始化節點數據

for(int i = 0;i snakeNum;i++){

snake[i][0] = 100 – SNAKEWIDTH * i;

snake[i][1] = 40;

}

//初始化移動方向

direction = DIRECTION_RIGHT;

//初始化食物坐標

foodX = 100;

foodY = 100;

}protected void paint(Graphics g) {

//清屏

g.setColor(0xffffff);

g.fillRect(0,0,width,height);

g.setColor(0);//繪製蛇身

for(int i = 0;i snakeNum;i++){

g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,SNAKEWIDTH);

}

//繪製食物

if(b){

g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH);

}

}private void move(int direction){

//蛇身移動

for(int i = snakeNum – 1;i 0;i–){

snake[i][0] = snake[i – 1][0];

snake[i][1] = snake[i – 1][1];

}//第一個單元格移動

switch(direction){

case DIRECTION_UP:

snake[0][1] = snake[0][1] – SNAKEWIDTH;

break;

case DIRECTION_DOWN:

snake[0][1] = snake[0][1] + SNAKEWIDTH;

break;

case DIRECTION_LEFT:

snake[0][0] = snake[0][0] – SNAKEWIDTH;

break;

case DIRECTION_RIGHT:

snake[0][0] = snake[0][0] + SNAKEWIDTH;

break;

}

}

/**

* 吃掉食物,自身增長

*/

private void eatFood(){

//判別蛇頭是否和食物重疊

if(snake[0][0] == foodX snake[0][1] == foodY){

snakeNum++;

generateFood();

}

}

/**

* 產生食物

* 說明:食物的坐標必須位於屏幕內,且不能和蛇身重合

*/

private void generateFood(){

while(true){

foodX = Math.abs(random.nextInt() % (width – SNAKEWIDTH + 1))

/ SNAKEWIDTH * SNAKEWIDTH;

foodY = Math.abs(random.nextInt() % (height – SNAKEWIDTH + 1))

/ SNAKEWIDTH * SNAKEWIDTH;

boolean b = true;

for(int i = 0;i snakeNum;i++){

if(foodX == snake[i][0] snake[i][1] == foodY){

b = false;

break;

}

}

if(b){

break;

}

}

}

/**

* 判斷遊戲是否結束

* 結束條件:

* 1、蛇頭超出邊界

* 2、蛇頭碰到自身

*/

private boolean isGameOver(){

//邊界判別

if(snake[0][0] 0 || snake[0][0] (width – SNAKEWIDTH) ||

snake[0][1] 0 || snake[0][1] (height – SNAKEWIDTH)){

return true;

}

//碰到自身

for(int i = 4;i snakeNum;i++){

if(snake[0][0] == snake[i][0]

snake[0][1] == snake[i][1]){

return true;

}

}

return false;

}/**

* 事件處理

*/

public void keyPressed(int keyCode){

int action = this.getGameAction(keyCode);

//改變方向

switch(action){

case UP:

if(direction != DIRECTION_DOWN){

direction = DIRECTION_UP;

}

break;

case DOWN:

if(direction != DIRECTION_UP){

direction = DIRECTION_DOWN;

}

break;

case LEFT:

if(direction != DIRECTION_RIGHT){

direction = DIRECTION_LEFT;

}

break;

case RIGHT:

if(direction != DIRECTION_LEFT){

direction = DIRECTION_RIGHT;

}

break;

case FIRE:

//暫停和繼續

isPaused = !isPaused;

break;

}

}/**

* 線程方法

* 使用精確延時

*/

public void run(){

try{

while (isRun) {

//開始時間

long start = System.currentTimeMillis();

if(!isPaused){

//吃食物

eatFood();

//移動

move(direction);

//結束遊戲

if(isGameOver()){

break;

}

//控制閃爍

b = !b;

}

//重新繪製

repaint();

long end = System.currentTimeMillis();

//延時

if(end – start SLEEP_TIME){

Thread.sleep(SLEEP_TIME – (end – start));

}

}

}catch(Exception e){}

}

}

求一段JAVA編寫的貪吃蛇小程序源代碼

用MVC方式實現的貪吃蛇遊戲,共有4個類。運行GreedSnake運行即可。主要是觀察者模式的使用,我已經添加了很多注釋了。

1、

/*

* 程序名稱:貪食蛇

* 原作者:BigF

* 修改者:algo

* 說明:我以前也用C寫過這個程序,現在看到BigF用Java寫的這個,發現雖然作者自稱是Java的初學者,

* 但是明顯編寫程序的素養不錯,程序結構寫得很清晰,有些細微得地方也寫得很簡潔,一時興起之

* 下,我認真解讀了這個程序,發現數據和表現分開得很好,而我近日正在學習MVC設計模式,

* 因此嘗試把程序得結構改了一下,用MVC模式來實現,對源程序得改動不多。

* 我同時也為程序增加了一些自己理解得注釋,希望對大家閱讀有幫助。

*/

package mvcTest;

/**

* @author WangYu

* @version 1.0

* Description:

* /pre

* Create on :Date :2005-6-13 Time:15:57:16

* LastModified:

* History:

*/

public class GreedSnake {

public static void main(String[] args) {

SnakeModel model = new SnakeModel(20,30);

SnakeControl control = new SnakeControl(model);

SnakeView view = new SnakeView(model,control);

//添加一個觀察者,讓view成為model的觀察者

model.addObserver(view);

(new Thread(model)).start();

}

}

————————————————————-

2、

package mvcTest;

//SnakeControl.java

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

/**

* MVC中的Controler,負責接收用戶的操作,並把用戶操作通知Model

*/

public class SnakeControl implements KeyListener{

SnakeModel model;

public SnakeControl(SnakeModel model){

this.model = model;

}

public void keyPressed(KeyEvent e) {

int keyCode = e.getKeyCode();

if (model.running){ // 運行狀態下,處理的按鍵

switch (keyCode) {

case KeyEvent.VK_UP:

model.changeDirection(SnakeModel.UP);

break;

case KeyEvent.VK_DOWN:

model.changeDirection(SnakeModel.DOWN);

break;

case KeyEvent.VK_LEFT:

model.changeDirection(SnakeModel.LEFT);

break;

case KeyEvent.VK_RIGHT:

model.changeDirection(SnakeModel.RIGHT);

break;

case KeyEvent.VK_ADD:

case KeyEvent.VK_PAGE_UP:

model.speedUp();

break;

case KeyEvent.VK_SUBTRACT:

case KeyEvent.VK_PAGE_DOWN:

model.speedDown();

break;

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

model.changePauseState();

break;

default:

}

}

// 任何情況下處理的按鍵,按鍵導致重新啟動遊戲

if (keyCode == KeyEvent.VK_R ||

keyCode == KeyEvent.VK_S ||

keyCode == KeyEvent.VK_ENTER) {

model.reset();

}

}

public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

}

}

————————————————————-

3、

/*

*

*/

package mvcTest;

/**

* 遊戲的Model類,負責所有遊戲相關數據及運行

* @author WangYu

* @version 1.0

* Description:

* /pre

* Create on :Date :2005-6-13 Time:15:58:33

* LastModified:

* History:

*/

//SnakeModel.java

import javax.swing.*;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Random;

/**

* 遊戲的Model類,負責所有遊戲相關數據及運行

*/

class SnakeModel extends Observable implements Runnable {

boolean[][] matrix; // 指示位置上有沒蛇體或食物

LinkedList nodeArray = new LinkedList(); // 蛇體

Node food;

int maxX;

int maxY;

int direction = 2; // 蛇運行的方向

boolean running = false; // 運行狀態

int timeInterval = 200; // 時間間隔,毫秒

double speedChangeRate = 0.75; // 每次得速度變化率

boolean paused = false; // 暫停標誌

int score = 0; // 得分

int countMove = 0; // 吃到食物前移動的次數

// UP and DOWN should be even

// RIGHT and LEFT should be odd

public static final int UP = 2;

public static final int DOWN = 4;

public static final int LEFT = 1;

public static final int RIGHT = 3;

public SnakeModel( int maxX, int maxY) {

this.maxX = maxX;

this.maxY = maxY;

reset();

}

public void reset(){

direction = SnakeModel.UP; // 蛇運行的方向

timeInterval = 200; // 時間間隔,毫秒

paused = false; // 暫停標誌

score = 0; // 得分

countMove = 0; // 吃到食物前移動的次數

// initial matirx, 全部清0

matrix = new boolean[maxX][];

for (int i = 0; i maxX; ++i) {

matrix[i] = new boolean[maxY];

Arrays.fill(matrix[i], false);

}

// initial the snake

// 初始化蛇體,如果橫向位置超過20個,長度為10,否則為橫向位置的一半

int initArrayLength = maxX 20 ? 10 : maxX / 2;

nodeArray.clear();

for (int i = 0; i initArrayLength; ++i) {

int x = maxX / 2 + i;//maxX被初始化為20

int y = maxY / 2; //maxY被初始化為30

//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]

//默認的運行方向向上,所以遊戲一開始nodeArray就變為:

// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]

nodeArray.addLast(new Node(x, y));

matrix[x][y] = true;

}

// 創建食物

food = createFood();

matrix[food.x][food.y] = true;

}

public void changeDirection(int newDirection) {

// 改變的方向不能與原來方向同向或反向

if (direction % 2 != newDirection % 2) {

direction = newDirection;

}

}

/**

* 運行一次

* @return

*/

public boolean moveOn() {

Node n = (Node) nodeArray.getFirst();

int x = n.x;

int y = n.y;

// 根據方向增減坐標值

switch (direction) {

case UP:

y–;

break;

case DOWN:

y++;

break;

case LEFT:

x–;

break;

case RIGHT:

x++;

break;

}

// 如果新坐標落在有效範圍內,則進行處理

if ((0 = x x maxX) (0 = y y maxY)) {

if (matrix[x][y]) { // 如果新坐標的點上有東西(蛇體或者食物)

if (x == food.x y == food.y) { // 吃到食物,成功

nodeArray.addFirst(food); // 從蛇頭贈長

// 分數規則,與移動改變方向的次數和速度兩個元素有關

int scoreGet = (10000 – 200 * countMove) / timeInterval;

score += scoreGet 0 ? scoreGet : 10;

countMove = 0;

food = createFood(); // 創建新的食物

matrix[food.x][food.y] = true; // 設置食物所在位置

return true;

} else // 吃到蛇體自身,失敗

return false;

} else { // 如果新坐標的點上沒有東西(蛇體),移動蛇體

nodeArray.addFirst(new Node(x, y));

matrix[x][y] = true;

n = (Node) nodeArray.removeLast();

matrix[n.x][n.y] = false;

countMove++;

return true;

}

}

return false; // 觸到邊線,失敗

}

public void run() {

running = true;

while (running) {

try {

Thread.sleep(timeInterval);

} catch (Exception e) {

break;

}

if (!paused) {

if (moveOn()) {

setChanged(); // Model通知View數據已經更新

notifyObservers();

} else {

JOptionPane.showMessageDialog(null,

“you failed”,

“Game Over”,

JOptionPane.INFORMATION_MESSAGE);

break;

}

}

}

running = false;

}

private Node createFood() {

int x = 0;

int y = 0;

// 隨機獲取一個有效區域內的與蛇體和食物不重疊的位置

do {

Random r = new Random();

x = r.nextInt(maxX);

y = r.nextInt(maxY);

} while (matrix[x][y]);

return new Node(x, y);

}

public void speedUp() {

timeInterval *= speedChangeRate;

}

public void speedDown() {

timeInterval /= speedChangeRate;

}

public void changePauseState() {

paused = !paused;

}

public String toString() {

String result = “”;

for (int i = 0; i nodeArray.size(); ++i) {

Node n = (Node) nodeArray.get(i);

result += “[” + n.x + “,” + n.y + “]”;

}

return result;

}

}

class Node {

int x;

int y;

Node(int x, int y) {

this.x = x;

this.y = y;

}

}

————————————————————

4、

package mvcTest;

//SnakeView.java

import javax.swing.*;

import java.awt.*;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Observer;

/**

* MVC模式中得Viewer,只負責對數據的顯示,而不用理會遊戲的控制邏輯

*/

public class SnakeView implements Observer {

SnakeControl control = null;

SnakeModel model = null;

JFrame mainFrame;

Canvas paintCanvas;

JLabel labelScore;

public static final int canvasWidth = 200;

public static final int canvasHeight = 300;

public static final int nodeWidth = 10;

public static final int nodeHeight = 10;

public SnakeView(SnakeModel model, SnakeControl control) {

this.model = model;

this.control = control;

mainFrame = new JFrame(“GreedSnake”);

Container cp = mainFrame.getContentPane();

// 創建頂部的分數顯示

labelScore = new JLabel(“Score:”);

cp.add(labelScore, BorderLayout.NORTH);

// 創建中間的遊戲顯示區域

paintCanvas = new Canvas();

paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);

paintCanvas.addKeyListener(control);

cp.add(paintCanvas, BorderLayout.CENTER);

// 創建底下的幫助欄

JPanel panelButtom = new JPanel();

panelButtom.setLayout(new BorderLayout());

JLabel labelHelp;

labelHelp = new JLabel(“PageUp, PageDown for speed;”, JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.NORTH);

labelHelp = new JLabel(“ENTER or R or S for start;”, JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.CENTER);

labelHelp = new JLabel(“SPACE or P for pause”, JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.SOUTH);

cp.add(panelButtom, BorderLayout.SOUTH);

mainFrame.addKeyListener(control);

mainFrame.pack();

mainFrame.setResizable(false);

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.setVisible(true);

}

void repaint() {

Graphics g = paintCanvas.getGraphics();

//draw background

g.setColor(Color.WHITE);

g.fillRect(0, 0, canvasWidth, canvasHeight);

// draw the snake

g.setColor(Color.BLACK);

LinkedList na = model.nodeArray;

Iterator it = na.iterator();

while (it.hasNext()) {

Node n = (Node) it.next();

drawNode(g, n);

}

// draw the food

g.setColor(Color.RED);

Node n = model.food;

drawNode(g, n);

updateScore();

}

private void drawNode(Graphics g, Node n) {

g.fillRect(n.x * nodeWidth,

n.y * nodeHeight,

nodeWidth – 1,

nodeHeight – 1);

}

public void updateScore() {

String s = “Score: ” + model.score;

labelScore.setText(s);

}

public void update(Observable o, Object arg) {

repaint();

}

}

希望採納

想要一個在eclipse上直接運行的貪吃蛇代碼

第一個類:

/**

* 代表蛇的運行方向

* @author Administrator

*

*/

public enum Dir {

L, U, R, D

}

第二個類:

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.Random;

/**

* 代表蛋

* @author Administrator

*

*/

public class Egg {

int row, col;

int w = Yard.BLOCK_SIZE;

int h = Yard.BLOCK_SIZE;

private static Random r = new Random();

private Color color = Color.GREEN;

public Egg(int row, int col) {

this.row = row;

this.col = col;

}

public Egg() {

this(r.nextInt(Yard.ROWS-2) + 2, r.nextInt(Yard.COLS));

}

public void reAppear() {

this.row = r.nextInt(Yard.ROWS-2) + 2;

this.col = r.nextInt(Yard.COLS);

}

public Rectangle getRect() {

return new Rectangle(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h);

}

public void draw(Graphics g) {

Color c = g.getColor();

g.setColor(color);

g.fillOval(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h);

g.setColor(c);

if(color == Color.GREEN) color = Color.RED;

else color = Color.GREEN;

}

public int getCol() {

return col;

}

public void setCol(int col) {

this.col = col;

}

public int getRow() {

return row;

}

public void setRow(int row) {

this.row = row;

}

}

第三個類:

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.event.KeyEvent;

/**

* 代表蛇

* @author Administrator

*

*/

public class Snake {

private Node head = null;

private Node tail = null;

private int size = 0;

private Node n = new Node(20, 30, Dir.L);

private Yard y;

public Snake(Yard y) {

head = n;

tail = n;

size = 1;

this.y = y;

}

public void addToTail() {

Node node = null;

switch(tail.dir) {

case L :

node = new Node(tail.row, tail.col + 1, tail.dir);

break;

case U :

node = new Node(tail.row + 1, tail.col, tail.dir);

break;

case R :

node = new Node(tail.row, tail.col – 1, tail.dir);

break;

case D :

node = new Node(tail.row – 1, tail.col, tail.dir);

break;

}

tail.next = node;

node.prev = tail;

tail = node;

size ++;

}

public void addToHead() {

Node node = null;

switch(head.dir) {

case L :

node = new Node(head.row, head.col – 1, head.dir);

break;

case U :

node = new Node(head.row – 1, head.col, head.dir);

break;

case R :

node = new Node(head.row, head.col + 1, head.dir);

break;

case D :

node = new Node(head.row + 1, head.col, head.dir);

break;

}

node.next = head;

head.prev = node;

head = node;

size ++;

}

public void draw(Graphics g) {

if(size = 0) return;

move();

for(Node n = head; n != null; n = n.next) {

n.draw(g);

}

}

private void move() {

addToHead();

deleteFromTail();

checkDead();

}

private void checkDead() {

if(head.row 2 || head.col 0 || head.row Yard.ROWS || head.col Yard.COLS) {

y.stop();

}

for(Node n = head.next; n != null; n = n.next) {

if(head.row == n.row head.col == n.col) {

y.stop();

}

}

}

private void deleteFromTail() {

if(size == 0) return;

tail = tail.prev;

tail.next = null;

}

private class Node {

int w = Yard.BLOCK_SIZE;

int h = Yard.BLOCK_SIZE;

int row , col;

Dir dir = Dir.L;

Node next = null;

Node prev = null;

Node(int row, int col, Dir dir) {

this.row = row;

this.col = col;

this.dir = dir;

}

void draw(Graphics g) {

Color c = g.getColor();

g.setColor(Color.BLACK);

g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h);

g.setColor(c);

}

}

public void eat(Egg e) {

if(this.getRect().intersects(e.getRect())) {

e.reAppear();

this.addToHead();

y.setScore(y.getScore() + 5);

}

}

private Rectangle getRect() {

return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE * head.row, head.w, head.h);

}

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

switch(key) {

case KeyEvent.VK_LEFT :

if(head.dir != Dir.R)

head.dir = Dir.L;

break;

case KeyEvent.VK_UP :

if(head.dir != Dir.D)

head.dir = Dir.U;

break;

case KeyEvent.VK_RIGHT :

if(head.dir != Dir.L)

head.dir = Dir.R;

break;

case KeyEvent.VK_DOWN :

if(head.dir != Dir.U)

head.dir = Dir.D;

break;

}

}

}

第四個類:

import java.awt.Color;

import java.awt.Font;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

/**

* 這個類代表貪吃蛇的活動場所

* @author bjsxt

* @version 1.0

*/

public class Yard extends Frame {

PaintThread paintThread = new PaintThread();

private boolean gameOver = false; //遊戲是否結束

/**

* 行數

*/

public static final int ROWS = 30;

public static final int COLS = 30;

public static final int BLOCK_SIZE = 15;

private Font fontGameOver = new Font(“宋體”, Font.BOLD, 50);

private int score = 0;

Snake s = new Snake(this);

Egg e = new Egg();

Image offScreenImage = null;

public void launch() {

this.setLocation(200, 200);

this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);

this.addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

this.setVisible(true);

this.addKeyListener(new KeyMonitor());

new Thread(paintThread).start();

}

public static void main(String[] args) {

new Yard().launch();

}

public void stop() {

gameOver = true;

}

@Override

public void paint(Graphics g) {

Color c = g.getColor();

g.setColor(Color.GRAY);

g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);

g.setColor(Color.DARK_GRAY);

//畫出橫線

for(int i=1; iROWS; i++) {

g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i);

}

for(int i=1; iCOLS; i++) {

g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);

}

g.setColor(Color.YELLOW);

g.drawString(“score:” + score, 10, 60);

if(gameOver) {

g.setFont(fontGameOver);

g.drawString(“遊戲結束”, 120, 180);

paintThread.pause();

}

g.setColor(c);

s.eat(e);

e.draw(g);

s.draw(g);

}

@Override

public void update(Graphics g) {

if(offScreenImage == null) {

offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);

}

Graphics gOff = offScreenImage.getGraphics();

paint(gOff);

g.drawImage(offScreenImage, 0, 0, null);

}

private class PaintThread implements Runnable {

private boolean running = true;

private boolean pause = false;

public void run() {

while(running) {

if(pause) continue;

else repaint();

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public void pause() {

this.pause = true;

}

public void reStart() {

this.pause = false;

s = new Snake(Yard.this);

gameOver = false;

}

public void gameOver() {

running = false;

}

}

private class KeyMonitor extends KeyAdapter {

@Override

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

if(key == KeyEvent.VK_F2) {

paintThread.reStart();

}

s.keyPressed(e);

}

}

/**

* 拿到所得的分數

* @return 分數

*/

public int getScore() {

return score;

}

/**

* 設置所得的分數

* @param score 分數

*/

public void setScore(int score) {

this.score = score;

}

}

僅供參考。

原創文章,作者:TGTZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134474.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TGTZ的頭像TGTZ
上一篇 2024-10-04 00:06
下一篇 2024-10-04 00:06

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29

發表回復

登錄後才能評論