java中的贪吃蛇源码_贪吃蛇代码JAVA

hacker|
124

文章目录:

求一段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();

}

}

希望采纳

求贪吃蛇Java代码

#includestdio.h

#includestdlib.h

#includeWindows.h

#includeconio.h

#includetime.h

#define Map_long 20

#define Map_high 15

typedef struct snake{

int goods_class;

int direction;

}SNAKE;

/*-------------------------------------------------------*/

/* 全局变量声明区 */

/* 二维结构体数组里goods_class的值,0代表活动区域(空格),

* 1代表■(地图砖头),2代表★(食物),3代表●(蛇头)

* 3之后的数字代表◎(蛇身),3+蛇长度-1表示◎(蛇尾)*/

/*direction表示蛇移动的方向,↑8,↓2,←4,→6*/

SNAKE Snake[Map_high][Map_long] = { { 0 } };

unsigned die = 0; //1表示游戏结束

unsigned snake_move = 0; //移动成功,用来跳出三重循环

unsigned eat_food = 0; //1表示碰到食物,2表示用来跳出循环

unsigned snake_long = 3; //记录蛇的长度

void Move(int ch); //蛇移动的函数

void HideCursor(); //隐藏光标函数

int main(void)

{

system("mode con:cols=43 lines=20"); //将控制台设置成长41,高18

HideCursor();

/*定义局部变量区域*/

unsigned i, j;

unsigned food = 0; //食物存在的标志,1代表食物存在

unsigned food_x, food_y; //产生食物的临时坐标

unsigned score = 0; //统计分数

char ch = '\0'; //用来获取↑↓←→

/*播种子*/

srand((unsigned)time(NULL));

/*初始化地图*/

for (i = 0; i Map_long; i++)

{

Snake[0][i].goods_class = 1;

Snake[Map_high - 1][i].goods_class = 1;

}

for (i = 0; i Map_high; i++)

{

Snake[i][0].goods_class = 1;

Snake[i][Map_long - 1].goods_class = 1;

}

/*初始化蛇的位置*/

for (i = 0; i snake_long; i++)

Snake[Map_high / 2][Map_long / 2 + i].goods_class = snake_long + i;

while (1)

{

while (!_kbhit())

{

switch (ch)

{

case 72:Move(8); break;

case 75:Move(4); break;

case 77:Move(6); break;

case 80:Move(2); break;

default:break;

}

if (eat_food == 2) //2表示吃到食物,开始重置状态

{

food = 0; //食物没有了

eat_food = 0; //重新判定是否吃到食物

snake_long++; //蛇的长度加1

score++; //增加分数

}

/*产生食物*/

do{

if (food == 1)

break;

food_x = rand() % Map_long;

food_y = rand() % Map_high;

if (Snake[food_y][food_x].goods_class == 0)

{

Snake[food_y][food_x].goods_class = 2;

food++;

break;

}

} while (1);

printf("Grade:%u\n", score);

for (i = 0; i Map_high; i++)

{

if (die == 1)

break;

for (j = 0; j Map_long; j++)

{

switch (Snake[i][j].goods_class)

{

case 0:printf(" "); break;

case 1:printf("■"); break;

case 2:printf("★"); break;

case 3:printf("●"); break;

default:printf("◎"); break;

}

}

putchar('\n');

}

printf("Up↑ Down↓ Left← Right→ Other Pause.");

Sleep(50);

system("cls");

if (die == 1)

break;

}

if (die == 1)

break;

do{

ch = _getch();

} while (ch != -32 ch != 80 ch != 72 ch != 77 ch != 75);

ch = _getch();

}

system("cls");

printf("Game Over,your grade is %u.\n", score);

getchar();

return 0;

}

void Move(int ch)

{

int i, j, n;

int direction; //临时存储方向

for (n = 0; n snake_long; n++)

for (i = 0; i Map_high; i++)

{

if (snake_move == 1)

{

snake_move = 0;

break;

}

if (eat_food == 2)

break;

for (j = 0; j Map_long; j++)

if (Snake[i][j].goods_class == 3 + n)

{

/*第一次获取按键,初始化蛇的运动状态*/

if (Snake[i][j].goods_class == 3 Snake[i][j].direction == 0)

{

Snake[i][j].direction = ch;

Snake[i][j + 1].direction = 4;

Snake[i][j + 2].direction = 4;

}

else if (Snake[i][j].goods_class == 3) //重置蛇头的方向

Snake[i][j].direction = ch;

/*进行移动前,先判断蛇头是否碰到死亡因子*/

if (Snake[i][j].goods_class == 3)

{

if (Snake[i][j].direction == 8 Snake[i - 1][j].goods_class != 0 Snake[i - 1][j].goods_class != 2)

die++;

else if (Snake[i][j].direction == 2 Snake[i + 1][j].goods_class != 0 Snake[i + 1][j].goods_class != 2)

die++;

else if (Snake[i][j].direction == 4 Snake[i][j - 1].goods_class != 0 Snake[i][j - 1].goods_class != 2)

die++;

else if (Snake[i][j].direction == 6 Snake[i][j + 1].goods_class != 0 Snake[i][j + 1].goods_class != 2)

die++;

}

/*进行移动前,先判断蛇头是否碰到食物*/

if (Snake[i][j].goods_class == 3)

{

if (Snake[i][j].direction == 8 Snake[i - 1][j].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 2 Snake[i + 1][j].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 4 Snake[i][j - 1].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 6 Snake[i][j + 1].goods_class == 2)

eat_food++;

}

if (die == 1)

break;

/*蛇尾的移动*/

if (Snake[i][j].goods_class == 3 + snake_long - 1)

{

if (eat_food == 1) //吃到食物就更新蛇尾

{

if (Snake[i][j].direction == 8)

{

direction = Snake[i - 1][j].direction;

Snake[i - 1][j] = Snake[i][j];

Snake[i - 1][j].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 2)

{

direction = Snake[i + 1][j].direction;

Snake[i + 1][j] = Snake[i][j];

Snake[i + 1][j].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 4)

{

direction = Snake[i][j - 1].direction;

Snake[i][j - 1] = Snake[i][j];

Snake[i][j - 1].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 6)

{

direction = Snake[i][j + 1].direction;

Snake[i][j + 1] = Snake[i][j];

Snake[i][j + 1].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

snake_move++;

eat_food++;

break;

}

else{

if (Snake[i][j].direction == 8)

{

Snake[i][j].direction = Snake[i - 1][j].direction;

Snake[i - 1][j] = Snake[i][j];

Snake[i][j].goods_class = 0;

}

else if (Snake[i][j].direction == 2)

{

求Java贪吃蛇代码

贪吃蛇

import java.awt.*;

import java.awt.event.*;

public class GreedSnake //主类

{

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

new MyWindow();

}

}

class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口

{

Button snake[]; //定义蛇按钮

int shu=0; //蛇的节数

int food[]; //食物数组

boolean result=true; //判定结果是输 还是赢

Thread thread; //定义线程

static int weix,weiy; //食物位置

boolean t=true; //判定游戏是否结束

int fangxiang=0; //蛇移动方向

int x=0,y=0; //蛇头位置

MyPanel()

{

setLayout(null);

snake=new Button[20];

food=new int [20];

thread=new Thread(this);

for(int j=0;j20;j++)

{

food[j]=(int)(Math.random()*99);//定义20个随机食物

}

weix=(int)(food[0]*0.1)*60; //十位*60为横坐标

weiy=(int)(food[0]%10)*40; //个位*40为纵坐标

for(int i=0;i20;i++)

{

snake[i]=new Button();

}

add(snake[0]);

snake[0].setBackground(Color.black);

snake[0].addKeyListener(this); //为蛇头添加键盘监视器

snake[0].setBounds(0,0,10,10);

setBackground(Color.cyan);

}

public void run() //接收线程

{

while(t)

{

if(fangxiang==0)//向右

{

try

{

x+=10;

snake[0].setLocation(x, y);//设置蛇头位置

if(x==weixy==weiy) //吃到食物

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint(); //重绘下一个食物

add(snake[shu]); //增加蛇节数和位置

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100); //睡眠100ms

}

catch(Exception e){}

}

else if(fangxiang==1)//向左

{

try

{

x-=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

else if(fangxiang==2)//向上

{

try

{

y-=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

else if(fangxiang==3)//向下

{

try

{

y+=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

int num1=shu;

while(num11)//判断是否咬自己的尾巴

{

if(snake[num1].getBounds().x==snake[0].getBounds().xsnake[num1].getBounds().y==snake[0].getBounds().y)

{

t=false;

result=false;

repaint();

}

num1--;

}

if(x0||x=this.getWidth()||y0||y=this.getHeight())//判断是否撞墙

{

t=false;

result=false;

repaint();

}

int num=shu;

while(num0) //设置蛇节位置

{

snake[num].setBounds(snake[num-1].getBounds());

num--;

}

if(shu==15) //如果蛇节数等于15则胜利

{

t=false;

result=true;

repaint();

}

}

}

public void keyPressed(KeyEvent e) //按下键盘方向键

{

if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键

{

if(fangxiang!=1)//如果先前方向不为左

fangxiang=0;

}

else if(e.getKeyCode()==KeyEvent.VK_LEFT)

{ if(fangxiang!=0)

fangxiang=1;

}

else if(e.getKeyCode()==KeyEvent.VK_UP)

{ if(fangxiang!=3)

fangxiang=2;

}

else if(e.getKeyCode()==KeyEvent.VK_DOWN)

{ if(fangxiang!=2)

fangxiang=3;

}

}

public void keyTyped(KeyEvent e)

{

}

public void keyReleased(KeyEvent e)

{

}

public void paint(Graphics g) //在面板上绘图

{

int x1=this.getWidth()-1;

int y1=this.getHeight()-1;

g.setColor(Color.red);

g.fillOval(weix, weiy, 10, 10);//食物

g.drawRect(0, 0, x1, y1); //墙

if(t==falseresult==false)

g.drawString("GAME OVER!", 250, 200);//输出游戏失败

else if(t==falseresult==true)

g.drawString("YOU WIN!", 250, 200);//输出游戏成功

}

}

class MyWindow extends Frame implements ActionListener//自定义窗口类

{

MyPanel my;

Button btn;

Panel panel;

MyWindow()

{

super("GreedSnake");

my=new MyPanel();

btn=new Button("begin");

panel=new Panel();

btn.addActionListener(this);

panel.add(new Label("begin后请按Tab键选定蛇"));

panel.add(btn);

panel.add(new Label("按上下左右键控制蛇行动"));

add(panel,BorderLayout.NORTH);

add(my,BorderLayout.CENTER);

setBounds(100,100,610,500);

setVisible(true);

validate();

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

}

public void actionPerformed(ActionEvent e)//按下begin按钮

{

if(e.getSource()==btn)

{

try

{

my.thread.start(); //开始线程

my.validate();

}

catch(Exception ee){}

}

}

}

希望对你能有所帮助。

求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中的贪吃蛇程序

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.util.*;

public class SnakeGame extends JFrame implements KeyListener{

private int stat=1,direction=0,bodylen=6,headx=7,heady=8,

tailx=1,taily=8,tail,foodx,foody,food;//初始化定义变量

public final int EAST=1,WEST=2,SOUTH=3,NORTH=4;//方向常量

int [][] fillblock=new int [20][20];//定义蛇身所占位置

public SnakeGame() {//构造函数

super("贪吃蛇");

setSize(510,510);

setVisible(true);//设定窗口属性

addKeyListener(this);//添加监听

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

for(int i=1;i=7;i++) fillblock[i][8]=EAST;//初始化蛇身属性

direction=EAST;//方向初始化的设置

FoodLocate(); //定位食物

while (stat==1){

fillblock[headx][heady]=direction;

switch(direction){

case 1:headx++;break;

case 2:headx--;break;

case 3:heady++;break;

case 4:heady--;break;

}//蛇头的前进

if(heady19||headx19||tailx19||taily19||heady0||headx0||tailx0||taily0||fillblock[headx][heady]!=0){

stat=0;

break;

} //判断游戏是否结束

try{

Thread.sleep(150); }

catch(InterruptedException e){}//延迟

fillblock[headx][heady]=direction;

if(headx==foodxheady==foody){//吃到食物

FoodLocate();

food=2;

try{

Thread.sleep(100); }

catch(InterruptedException e){}//延迟

}

if(food!=0)food--;

else{tail=fillblock[tailx][taily];

fillblock[tailx][taily]=0;//蛇尾的消除

switch(tail){

case 1:tailx++;break;

case 2:tailx--;break;

case 3:taily++;break;

case 4:taily--;break;

}//蛇尾的前进

}

repaint();

}

if(stat==0)

JOptionPane.showMessageDialog(null,"GAME OVER","Game Over",JOptionPane.INFORMATION_MESSAGE);

}

public void keyPressed(KeyEvent e) {//按键响应

int keyCode=e.getKeyCode();

if(stat==1) switch(keyCode){

case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;

case KeyEvent.VK_DOWN:if(direction!=NORTH)direction=SOUTH;break;

case KeyEvent.VK_LEFT:if(direction!=EAST)direction=WEST;break;

case KeyEvent.VK_RIGHT:if (direction!=WEST)direction=EAST;break;

}

}

public void keyReleased(KeyEvent e){}//空函数

public void keyTyped(KeyEvent e){} //空函数

public void FoodLocate(){//定位食物坐标

do{

Random r=new Random();

foodx=r.nextInt(20);

foody=r.nextInt(20);

}while (fillblock[foodx][foody]!=0);

}

public void paint(Graphics g){//画图

super.paint(g);

g.setColor(Color.BLUE);

for(int i=0;i20;i++)

for(int j=0;j20;j++)

if (fillblock[i][j]!=0)

g.fillRect(25*i+5,25*j+5,24,24);

g.setColor(Color.RED);

g.fillRect(foodx*25+5,foody*25+5,24,24);

}

public static void main(String[] args) {//主程序

SnakeGame application=new SnakeGame();

}

}

求"贪吃蛇"小游戏JAVA源代码一份

贪吃蛇

import java.awt.*;

import java.awt.event.*;

public class GreedSnake //主类

{

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

new MyWindow();

}

}

class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口

{

Button snake[]; //定义蛇按钮

int shu=0; //蛇的节数

int food[]; //食物数组

boolean result=true; //判定结果是输 还是赢

Thread thread; //定义线程

static int weix,weiy; //食物位置

boolean t=true; //判定游戏是否结束

int fangxiang=0; //蛇移动方向

int x=0,y=0; //蛇头位置

MyPanel()

{

setLayout(null);

snake=new Button[20];

food=new int [20];

thread=new Thread(this);

for(int j=0;j20;j++)

{

food[j]=(int)(Math.random()*99);//定义20个随机食物

}

weix=(int)(food[0]*0.1)*60; //十位*60为横坐标

weiy=(int)(food[0]%10)*40; //个位*40为纵坐标

for(int i=0;i20;i++)

{

snake[i]=new Button();

}

add(snake[0]);

snake[0].setBackground(Color.black);

snake[0].addKeyListener(this); //为蛇头添加键盘监视器

snake[0].setBounds(0,0,10,10);

setBackground(Color.cyan);

}

public void run() //接收线程

{

while(t)

{

if(fangxiang==0)//向右

{

try

{

x+=10;

snake[0].setLocation(x, y);//设置蛇头位置

if(x==weixy==weiy) //吃到食物

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint(); //重绘下一个食物

add(snake[shu]); //增加蛇节数和位置

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100); //睡眠100ms

}

catch(Exception e){}

}

else if(fangxiang==1)//向左

{

try

{

x-=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

else if(fangxiang==2)//向上

{

try

{

y-=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

else if(fangxiang==3)//向下

{

try

{

y+=10;

snake[0].setLocation(x, y);

if(x==weixy==weiy)

{

shu++;

weix=(int)(food[shu]*0.1)*60;

weiy=(int)(food[shu]%10)*40;

repaint();

add(snake[shu]);

snake[shu].setBounds(snake[shu-1].getBounds());

}

thread.sleep(100);

}

catch(Exception e){}

}

int num1=shu;

while(num11)//判断是否咬自己的尾巴

{

if(snake[num1].getBounds().x==snake[0].getBounds().xsnake[num1].getBounds().y==snake[0].getBounds().y)

{

t=false;

result=false;

repaint();

}

num1--;

}

if(x0||x=this.getWidth()||y0||y=this.getHeight())//判断是否撞墙

{

t=false;

result=false;

repaint();

}

int num=shu;

while(num0) //设置蛇节位置

{

snake[num].setBounds(snake[num-1].getBounds());

num--;

}

if(shu==15) //如果蛇节数等于15则胜利

{

t=false;

result=true;

repaint();

}

}

}

public void keyPressed(KeyEvent e) //按下键盘方向键

{

if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键

{

if(fangxiang!=1)//如果先前方向不为左

fangxiang=0;

}

else if(e.getKeyCode()==KeyEvent.VK_LEFT)

{ if(fangxiang!=0)

fangxiang=1;

}

else if(e.getKeyCode()==KeyEvent.VK_UP)

{ if(fangxiang!=3)

fangxiang=2;

}

else if(e.getKeyCode()==KeyEvent.VK_DOWN)

{ if(fangxiang!=2)

fangxiang=3;

}

}

public void keyTyped(KeyEvent e)

{

}

public void keyReleased(KeyEvent e)

{

}

public void paint(Graphics g) //在面板上绘图

{

int x1=this.getWidth()-1;

int y1=this.getHeight()-1;

g.setColor(Color.red);

g.fillOval(weix, weiy, 10, 10);//食物

g.drawRect(0, 0, x1, y1); //墙

if(t==falseresult==false)

g.drawString("GAME OVER!", 250, 200);//输出游戏失败

else if(t==falseresult==true)

g.drawString("YOU WIN!", 250, 200);//输出游戏成功

}

}

class MyWindow extends Frame implements ActionListener//自定义窗口类

{

MyPanel my;

Button btn;

Panel panel;

MyWindow()

{

super("GreedSnake");

my=new MyPanel();

btn=new Button("begin");

panel=new Panel();

btn.addActionListener(this);

panel.add(new Label("begin后请按Tab键选定蛇"));

panel.add(btn);

panel.add(new Label("按上下左右键控制蛇行动"));

add(panel,BorderLayout.NORTH);

add(my,BorderLayout.CENTER);

setBounds(100,100,610,500);

setVisible(true);

validate();

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

}

public void actionPerformed(ActionEvent e)//按下begin按钮

{

if(e.getSource()==btn)

{

try

{

my.thread.start(); //开始线程

my.validate();

}

catch(Exception ee){}

}

}

}

3条大神的评论

  • avatar
    访客 2022-07-08 上午 03:43:03

    e (1) { while (!_kbhit()) { switch (ch) { case 72:Move(8); break;

  • avatar
    访客 2022-07-08 上午 12:21:41

    //1表示碰到食物,2表示用来跳出循环 unsigned snake_long = 3; //记录蛇的长度 void Move(int ch); //蛇移动的函数 void HideCursor();

  • avatar
    访客 2022-07-08 上午 04:27:26

    yout());JLabel labelHelp;labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);panelButtom.add(labelHelp, B

发表评论