贪吃蛇双人源代码java 贪吃蛇的源代码

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

}

}

希望采纳

高分跪求用Java编写的贪吃蛇源代码!具体要求看问题补充!急急急~~~544266616@qq.com

import java.awt.Graphics;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.InputEvent;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.JCheckBoxMenuItem;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.KeyStroke;

public class 贪吃蛇 extends JFrame implements ActionListener, KeyListener,Runnable {

/**

*

*/

private static final long serialVersionUID = 1L;

private JMenuBar menuBar;

private JMenu youXiMenu,nanDuMenu,fenShuMenu,guanYuMenu;

private JMenuItem kaiShiYouXi,exitItem,zuoZheItem,fenShuItem;

private JCheckBoxMenuItem cJianDan,cPuTong,cKunNan;

private int length = 6;

private Toolkit toolkit;

private int i,x,y,z,objectX,objectY,object=0,growth=0,time;//bojectX,Y

private int m[]=new int[50];

private int n[]=new int[50];

private Thread she = null;

private int life=0;

private int foods = 0;

private int fenshu=0;

public void run(){

time=500;

for(i=0;i=length-1;i++)

{

m[i]=90-i*10;n[i]=60;

}

x=m[0];

y=n[0];

z=4;

while(she!=null)

{

check();

try

{

Thread.sleep(time);

}

catch(Exception ee)

{

System.out.println(z+"");

}

}

}

public 贪吃蛇() {

setVisible(true);

menuBar = new JMenuBar();

toolkit=getToolkit();

youXiMenu = new JMenu("游戏");

kaiShiYouXi = new JMenuItem("开始游戏");

exitItem = new JMenuItem("退出游戏");

nanDuMenu = new JMenu("困难程度");

cJianDan = new JCheckBoxMenuItem("简单");

cPuTong = new JCheckBoxMenuItem("普通");

cKunNan = new JCheckBoxMenuItem("困难");

fenShuMenu = new JMenu("积分排行");

fenShuItem = new JMenuItem("最高记录");

guanYuMenu = new JMenu("关于");

zuoZheItem = new JMenuItem("关于作者");

guanYuMenu.add(zuoZheItem);

nanDuMenu.add(cJianDan);

nanDuMenu.add(cPuTong);

nanDuMenu.add(cKunNan);

fenShuMenu.add(fenShuItem);

youXiMenu.add(kaiShiYouXi);

youXiMenu.add(exitItem);

menuBar.add(youXiMenu);

menuBar.add(nanDuMenu);

menuBar.add(fenShuMenu);

menuBar.add(guanYuMenu);

zuoZheItem.addActionListener(this);

kaiShiYouXi.addActionListener(this);

exitItem.addActionListener(this);

addKeyListener(this);

fenShuItem.addActionListener(this);

KeyStroke keyOpen = KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK);

kaiShiYouXi.setAccelerator(keyOpen);

KeyStroke keyExit = KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK);

exitItem.setAccelerator(keyExit);

setJMenuBar(menuBar);

setTitle("贪吃蛇");

setResizable(false);

setBounds(300,200,400,400);

validate();

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public static void main(String args[]) {

new 贪吃蛇();

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==kaiShiYouXi)

{

length = 6;

life = 0;

foods = 0;

if(she==null)

{

she=new Thread(this);

she.start();

}

else if(she!=null)

{

she=null;

she= new Thread(this);

she.start();

}

}

if(e.getSource()==exitItem)

{

System.exit(0);

}

if(e.getSource()==zuoZheItem)

{

JOptionPane.showMessageDialog(this, "孤独的野狼制作"+"\n\n"+" "+"QQ号:2442701497"+"\n");

}

if(e.getSource()==fenShuItem)

{

JOptionPane.showMessageDialog(this,"最高记录为"+fenshu+"");

}

}

public void check(){

isDead();

if(she!=null)

{

if(growth==0)

{

reform(); //得到食物

}

else

{

upgrowth(); //生成食物

}

if(x==objectXy==objectY)

{

object=0;

growth=1;

toolkit.beep();

}

if(object==0)

{

object=1;

objectX=(int)Math.floor(Math.random()*39)*10;

objectY=(int)Math.floor(Math.random()*29)*10+50;

}

this.repaint(); //重绘

}

}

void isDead()

{

//判断游戏是否结束的方法

if(z==4)

{

x=x+10;

}

else if(z==3)

{

x=x-10;

}

else if(z==2)

{

y=y+10;

}

else if(z==1)

{

y=y-10;

}

if(x0||x390||y50||y390)

{

she=null;

}

for(i=1;ilength;i++)

{

if(m[i]==xn[i]==y)

{

she=null;

}

}

}

public void upgrowth()

{

//当蛇吃到东西时的方法

if(length50)

{

length++;

}

growth--;

time=time-10;

reform();

life+=100;

if(fenshulife)

{

fenshu = life;

}

foods++;

}

public void reform()

{

for(i=length-1;i0;i--)

{

m[i]=m[i-1];

n[i]=n[i-1];

}

if(z==4)

{

m[0]=m[0]+10;

}

if(z==3)

{

m[0]=m[0]-10;

}

if(z==2)

{

n[0]=n[0]+10;

}

if(z==1)

{

n[0]=n[0]-10;

}

}

public void keyPressed(KeyEvent e)

{

if(she!=null)

{

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

{

if(z!=2)

{

z=1;

check();

}

}

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

{

if(z!=1)

{

z=2;

check();

}

}

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

{

if(z!=4)

{

z=3;

check();

}

}

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

{

if(z!=3)

{

z=4;

check();

}

}

}

}

public void keyReleased(KeyEvent e)

{

}

public void keyTyped(KeyEvent e)

{

}

public void paint(Graphics g) {

g.setColor(Color.DARK_GRAY); //设置背景

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

g.setColor(Color.pink);

for(i=0;i=length-1;i++)

{

g.fillRect(m[i],n[i],10,10);

}

g.setColor(Color.green); //蛇的食物

g.fillRect(objectX,objectY,10,10);

g.setColor(Color.white);

g.drawString("当前 分数"+this.life,6,60);

g.drawString("当前已吃食物数"+this.foods,6,72);

}

}

求Java 大神给个可以在eclipse上运行的贪吃蛇源代码在线等急

packagecom.tarena.elts.test;importjava.awt.Color;importjava.awt.Font;importjava.awt.Point;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Random;importjava.util.Set;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;publicclassWormFrameextendsJFrame{privatestaticfinallongserialVersionUID=1L;publicstaticfinalintUP=-10;publicstaticfinalintDOWN=10;publicstaticfinalintLEFT=-200;publicstaticfinalintRIGHT=200;privateintspeed=200;//蛇的移动速度,越小越快privateJPaneljPanel=null;//游戏面板privateJLabeljLabel=null;//显示游戏结束的标签privateJButtonreset=null;//从新开始游戏的按钮privateJButtoncontrol=null;//控制方向的按钮privateListworm=newArrayList();//贪吃蛇//将整个面板划分成节点,蛇走到那里,就那整个节点点亮privateMapnodes=newHashMap();privateintdir=LEFT;//方向privatePointfood;//食物privatebooleanisContinue=false;//判断蛇是否行动的标记publicstaticvoidmain(String[]args){newWormFrame();}publicWormFrame(){initialize();start();}//游戏初始化privatevoidinitialize(){this.setSize(500,500);this.setLocation(250,100);this.setResizable(false);this.add(getJPanel());//添加面板this.setTitle("贪吃蛇,空格键暂停,回车开始");this.setVisible(true);}//游戏开始privatevoidstart(){isContinue=true;while(true){while(isContinue){try{Pointp=worm.get(0);intx=(int)p.getX()+dir/20;inty=(int)p.getY()+dir%100;if(food.equals(newPoint(x,y))){worm.add(0,food);if(worm.size()%1==0){speed-=10;}getFood();continue;}p=newPoint(x,y);if(worm.contains(p)){thrownewException();}nodes.get(p).setVisible(false);worm.add(0,p);nodes.get(worm.remove(worm.size()-1)).setVisible(true);Thread.sleep(speed);}catch(Exceptione){jLabel.setVisible(true);reset.setVisible(true);//不停止内循环,jLabel和reset不消失isContinue=false;}}try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}//游戏从新开始privatevoidreset(){worm=newArrayList();for(Pointp:nodes.keySet()){nodes.get(p).setVisible(false);}addWorm();dir=LEFT;getFood();isContinue=true;}//获取游戏面板的方法,面板中有记录游戏时间的标签,//代表游戏角色的按钮和重新开始游戏的按钮privateJPanelgetJPanel(){if(jPanel==null){//显示游戏结束的标签getOver();//从新开始的按钮getReset();//控制按钮getControl();//游戏面板jPanel=newJPanel();jPanel.setLayout(null);//设置面板布局为空//jPanel.setForeground(newColor(255,255,255));//设置面板前景色jPanel.setBackground(newColor(0,0,0));//设置面板背景色jPanel.add(jLabel,null);//面板中添加显示游戏结束的标签jPanel.add(reset,null);//面板中添加从新开始的按钮jPanel.add(control,null);for(inti=0;i490;i+=10){for(intj=0;j470;j+=10){JButtonjb=newJButton();Pointp=newPoint(i,j);jb.setBounds(i,j,10,10);jb.setBackground(newColor(255,255,255));jb.setEnabled(false);//jb.setVisible(true);nodes.put(p,jb);jPanel.add(jb,null);}}addWorm();//添加一条蛇getFood();//食物按钮jPanel.setVisible(true);//设置面板可见}returnjPanel;}//游戏结束标签privatevoidgetOver(){jLabel=newJLabel();jLabel.setBounds(170,200,200,50);//设置标签大小和位置jLabel.setFont(newFont("Dialog",Font.BOLD,24));//设置标签字体jLabel.setForeground(newColor(250,2,2));//设置标签前景颜色jLabel.setText("游戏结束");jLabel.setEnabled(true);//设置此标签可用jLabel.setVisible(false);//设置此标签不可见}//从新开始按钮privatevoidgetReset(){if(reset==null){reset=newJButton();//新建一个按钮reset.setBounds(170,300,164,51);//设置按钮的大小reset.setText("重新开始");//设置按钮的内容reset.setVisible(false);//设置按钮不可见//添加按钮的时间监听器reset.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){reset.setVisible(false);//点击重新开始按钮后,按钮消失jLabel.setVisible(false);//记录游戏时间的按钮也消失try{Thread.sleep(1000);}catch(InterruptedExceptione1){e1.printStackTrace();}reset();}});}}//控制方向的按钮privatevoidgetControl(){if(control==null){control=newJButton();control.addKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){switch(e.getKeyCode()){caseKeyEvent.VK_LEFT:chDir(LEFT);break;caseKeyEvent.VK_RIGHT:chDir(RIGHT);break;caseKeyEvent.VK_UP:chDir(UP);break;caseKeyEvent.VK_DOWN:chDir(DOWN);break;caseKeyEvent.VK_ENTER:isContinue=true;break;caseKeyEvent.VK_SPACE:isContinue=false;break;}}});}}//生成食物privatevoidgetFood(){Randomran=newRandom();//横坐标最大480,纵坐标最大460intx=ran.nextInt(49)*10;inty=ran.nextInt(47)*10;food=newPoint(x,y);Setset=newHashSet(worm);while(set.contains(food)){x=ran.nextInt(50)*10;y=ran.nextInt(50)*10;food=newPoint(x,y);}nodes.get(food).setVisible(false);}//改变方向privatevoidchDir(intdir){if(this.dir+dir!=0){this.dir=dir;}}//添加Worm的方法privatevoidaddWorm(){for(inti=250;i300;i+=10){Pointp=newPoint(i,250);worm.add(p);nodes.get(p).setVisible(true);}}}//给分

求一份java 贪吃蛇的代码

package games;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

import static java.lang.Math.*;//静态导入

/*

* 此类是贪吃蛇的简单实现方法

* 自己可以加入在开始时的设置,比如

* 选关,初始的蛇的长度等等

*/

public class Snake extends JPanel {

private static final long serialVersionUID = 1L;

private Direction dir;// 要走的方向

private int blockWidth = 10;// 块大小

private int blockSpace = 2;// 块之间的间隔

private long sleepTime;// 重画的进间间隔

private MySnake my;

private int total;// 代表蛇的长度

private Rectangle food;// 代表蛇的食物

private volatile boolean go;

private int round;// 表示第几关

public Snake(JFrame jf) {

initOther();

// 为顶级窗口类JFrame添加事件处理函数

jf.addKeyListener(new KeyAdapter() {

public void keyReleased(KeyEvent ke) {

int code = ke.getKeyCode();

if (code == KeyEvent.VK_RIGHT) {

if (dir != Direction.WEST)

dir = Direction.EAST;

}

else if (code == KeyEvent.VK_LEFT) {

if (dir != Direction.EAST)

dir = Direction.WEST;

}

else if (code == KeyEvent.VK_UP) {

if (dir != Direction.SOUTH)

dir = Direction.NORTH;

}

else if (code == KeyEvent.VK_DOWN) {

if (dir != Direction.NORTH)

dir = Direction.SOUTH;

} else if (code == KeyEvent.VK_ENTER) {

if (!go)

initOther();

}

}

});

this.setBounds(300, 300, 400, 400);

this.setVisible(true);

}

// 随机生成一个食物的位置

private void makeFood() {

int x = 40 + (int) (random() * 30) * 12;

int y = 10 + (int) (random() * 30) * 12;

food = new Rectangle(x, y, 10, 10);

}

// 做一些初始化的工作

private void initOther() {

dir = Direction.EAST;

sleepTime = 500;

my = new MySnake();

makeFood();

total = 3;

round = 1;

new Thread(new Runnable() {

public void run() {

go = true;

while (go) {

try {

Thread.sleep(sleepTime);

repaint();

} catch (Exception exe) {

exe.printStackTrace();

}

}

}

}).start();

}

// 处理多少关的函数

private void handleRound() {

if (total == 6) {

round = 2;

sleepTime = 300;

} else if (total == 10) {

round = 3;

sleepTime = 200;

} else if (total == 15) {

round = 4;

sleepTime = 100;

} else if (total == 18) {

round = 5;

sleepTime = 50;

} else if (total == 20) {

round = 6;

sleepTime = 20;

} else if (total 21) {

round = 7;

sleepTime = 15;

}

}

// 把自己的组件全部画出来

public void paintComponent(Graphics g) {

g.setColor(Color.PINK);

g.fillRect(0, 0, this.getWidth(), this.getHeight());

g.setColor(Color.BLACK);

g.drawRect(40, 10, 358, 360);

if (go) {

my.move();

my.draw(g);

g.setFont(new Font("黑体", Font.BOLD, 20));

g.drawString("您的得分:" + (total * 10) + " 第" + round + "关", 40,

400);

} else {

g.setFont(new Font("黑体", Font.BOLD, 20));

g.drawString("游戏结束,按回车(ENTER)键重玩!", 40, 440);

}

g.setColor(Color.RED);

g.fillRect(food.x, food.y, food.width, food.height);

}

private class MySnake {

private ArrayListRectangle list;

public MySnake() {

list = new ArrayListRectangle();

list.add(new Rectangle(160 + 24, 130, 10, 10));

list.add(new Rectangle(160 + 12, 130, 10, 10));

list.add(new Rectangle(160, 130, 10, 10));

}

// 蛇移动的方法

public void move() {

if (isDead()) {

go = false;

return;

}

if (dir == Direction.EAST) {

Rectangle rec = list.get(0);

Rectangle rec1 = new Rectangle(rec.x

+ (blockWidth + blockSpace), rec.y, rec.width,

rec.height);

list.add(0, rec1);

} else if (dir == Direction.WEST) {

Rectangle rec = list.get(0);

Rectangle rec1 = new Rectangle(rec.x

- (blockWidth + blockSpace), rec.y, rec.width,

rec.height);

list.add(0, rec1);

} else if (dir == Direction.NORTH) {

Rectangle rec = list.get(0);

Rectangle rec1 = new Rectangle(rec.x, rec.y

- (blockWidth + blockSpace), rec.width, rec.height);

list.add(0, rec1);

} else if (dir == Direction.SOUTH) {

Rectangle rec = list.get(0);

Rectangle rec1 = new Rectangle(rec.x, rec.y

+ (blockWidth + blockSpace), rec.width, rec.height);

list.add(0, rec1);

}

if (isEat()) {

handleRound();

makeFood();

} else {

list.remove(list.size() - 1);

}

}

// 判断是否吃到了食物

private boolean isEat() {

if (list.get(0).contains(food)) {

total++;

return true;

} else

return false;

}

// 判断是否死了,如果碰壁或者自己吃到自己都算死了

private boolean isDead() {

Rectangle temp = list.get(0);

if (dir == Direction.EAST) {

if (temp.x == 388)

return true;

else {

Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10);

for (Rectangle rec : list) {

if (rec.contains(comp))

return true;

}

}

return false;

} else if (dir == Direction.WEST) {

if (temp.x == 40)

return true;

else {

Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10);

for (Rectangle rec : list) {

if (rec.contains(comp))

return true;

}

}

return false;

} else if (dir == Direction.NORTH) {

if (temp.y == 10)

return true;

else {

Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10);

for (Rectangle rec : list) {

if (rec.contains(comp))

return true;

}

}

return false;

} else if (dir == Direction.SOUTH) {

if (temp.y == 358)

return true;

else {

Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10);

for (Rectangle rec : list) {

if (rec.contains(comp))

return true;

}

}

return false;

} else {

return false;

}

}

// 把自己画出来

public void draw(Graphics g) {

for (Rectangle rec : list) {

g.fillRect(rec.x, rec.y, rec.width, rec.height);

}

}

}

public static void main(String arsg[]) {

JFrame jf = new JFrame("贪吃蛇");

Snake s = new Snake(jf);

jf.getContentPane().add(s, BorderLayout.CENTER);

jf.setBounds(300, 300, 500, 500);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

// 定义一个枚举,在此也可以用接口或者常量值代替

enum Direction {

EAST, SOUTH, WEST, NORTH;

}

java 双人贪吃蛇

package game;

/*这是一个双人贪吃蛇游戏

*玩家一 A S D W 控制方向

*玩家二 上下左右 控制方向

*当某玩家无路可走的时候既输

*/

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class HsGame extends JFrame {

HsGame(String str) {

// 设置主面版

this.setTitle(str);

this.setSize(910, 630);

this.setLocation(50, 50);

MyPanel mp = new MyPanel();

this.add(mp);

this.addKeyListener(mp);

new Thread(mp).start();

}

// 主线程

public static void main(String[] args) {

HsGame m = new HsGame("贪吃蛇竞技版");

m.setVisible(true);

}

}

class MyPanel extends JPanel implements Runnable, KeyListener {

int[][] s1 = new int[180][120];

int[][] s2 = new int[180][120];

int x1 = 40;

int y1 = 60;

int x2 = 140;

int y2 = 60;

// 设置线程休眠时间

int sleep = 50;

// 设置初始方向

int fangxiang1 = 2;

int fangxiang2 = 0;

// 构造函数

MyPanel() {

// 初始化界面

for (int ix = 0; ix 180; ix++) {

for (int iy = 0; iy 120; iy++) {

s1[ix][iy] = 0;

s2[ix][iy] = 0;

}

}

// 设置边界

// 上下边界

for (int ix = 0; ix 180; ix++) {

s1[ix][0] = 1;

s1[ix][119] = 1;

s2[ix][0] = 1;

s2[ix][119] = 1;

}

// 左右边界

for (int iy = 0; iy 120; iy++) {

s1[0][iy] = 1;

s1[179][iy] = 1;

s2[0][iy] = 1;

s2[179][iy] = 1;

}

}

// 画板

public void paint(Graphics g) {

// 显示玩家一

g.setColor(Color.red);

for (int ix = 0; ix 180; ix++) {

for (int iy = 0; iy 120; iy++) {

if (s1[ix][iy] == 1) {

g.fillRect(ix * 5, iy * 5, 5, 5);

}

}

}

// 显示玩家二

g.setColor(Color.blue);

for (int ix = 0; ix 180; ix++) {

for (int iy = 0; iy 120; iy++) {

if (s2[ix][iy] == 1) {

g.fillRect(ix * 5, iy * 5, 5, 5);

}

}

}

// 画出边界

g.setColor(Color.black);

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

g.fillRect(i * 5, 0, 5, 5);

g.fillRect(i * 5, 119 * 5, 5, 5);

}

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

g.fillRect(0, i * 5, 5, 5);

g.fillRect(179 * 5, i * 5, 5, 5);

}

}

public void run() {

while (true) {

switch (fangxiang1) {

case 0:

x1--;

break;

case 1:

y1--;

break;

case 2:

x1++;

break;

case 3:

y1++;

}

switch (fangxiang2) {

case 0:

x2--;

break;

case 1:

y2--;

break;

case 2:

x2++;

break;

case 3:

y2++;

}

// 判断死活

if (s1[x1][y1] == 1 || s2[x1][y1] == 1) {

// 弹出player2胜利对话框

JOptionPane.showMessageDialog(null,

"player 2 win!",

"Game Over !", JOptionPane.ERROR_MESSAGE);

// 结束游戏

System.exit(0);

} else {

s1[x1][y1] = 1;

}

if (s2[x2][y2] == 1 || s1[x2][y2] == 1) {

// 弹出player1胜利对话框

JOptionPane.showMessageDialog(null,

"player 1 win!",

"Game Over !", JOptionPane.ERROR_MESSAGE);

// 结束游戏

System.exit(0);

} else {

s2[x2][y2] = 1;

}

try {

Thread.sleep(sleep);

} catch (Exception e) {

e.printStackTrace();

}

// 重画

this.repaint();

}

}

public void keyTyped(KeyEvent e) {

}

public void keyPressed(KeyEvent e) {

// 玩家一控制

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

if (fangxiang1 != 2) {

fangxiang1 = 0;

System.out.println("player 1 left");

}

}

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

if (fangxiang1 != 3) {

fangxiang1 = 1;

System.out.println("player 1 up");

}

}

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

if (fangxiang1 != 0) {

fangxiang1 = 2;

System.out.println("player 1 right");

}

}

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

if (fangxiang1 != 1) {

fangxiang1 = 3;

System.out.println("player 1 down");

}

}

// 玩家二控制

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

if (fangxiang2 != 2) {

fangxiang2 = 0;

System.out.println("player 2 left");

}

}

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

if (fangxiang2 != 3) {

fangxiang2 = 1;

System.out.println("player 2 up");

}

}

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

if (fangxiang2 != 0) {

fangxiang2 = 2;

System.out.println("player 2 right");

}

}

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

if (fangxiang2 != 1) {

fangxiang2 = 3;

System.out.println("player 2 down");

}

}

}

public void keyReleased(KeyEvent e) {

}

}


网页名称:贪吃蛇双人源代码java 贪吃蛇的源代码
本文URL:http://azwzsj.com/article/hhhhce.html