贪吃蛇代码java注释,java编写贪吃蛇简单版

求"贪吃蛇"小游戏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程序一部分,我需要下面程序代码的详细注解~~~~我会重赏的,以高分告劳~

/**

* MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑

*/

class SnakeView implements Observer {

SnakeControl control = null; //实例话一个SnakeControl对象是control ..SnakeControl在jdk中不存在可能是第3方的或者是自己编写的一个类吧

SnakeModel model = null;//如上

JFrame mainFrame; //创建一个面板类jframe

Canvas paintCanvas;

/**

*Canvas 组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件。

*应用程序必须为 Canvas 类创建子类,以获得有用的功能(如创建自定义组件)。必须重写 paint 方法,以便在 canvas 上执行自定义图形。

*/

JLabel labelScore;//....不说了吧..

public static final int canvasWidth = 200; //常量宽度200

public static final int canvasHeight = 300;//常量高300

public static final int nodeWidth = 10;//常量宽度10

public static final int nodeHeight = 10;//常量高度10

public SnakeView(SnakeModel model, SnakeControl control) {

this.model = model;

this.control = control;

mainFrame = new JFrame("GreedSnake");//创建jframe 标题是GreedSnake

Container cp = mainFrame.getContentPane(); //得到jfram的容器

labelScore = new JLabel("Score:"); //创建jlabel 标签内容是"Score:"

cp.add(labelScore, BorderLayout.NORTH);/将jlabel添加到jfram的容器中去

paintCanvas = new Canvas(); //创建新绘图区

paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1); //设置绘图区大小

paintCanvas.addKeyListener(control);//添加键盘监听器control

cp.add(paintCanvas, BorderLayout.CENTER);//将绘图区添加到jfram容器中去.布局是BorderLayout的CENTER位置.就是东西南北中的中间

JPanel panelButtom = new JPanel();//创建一个panel

panelButtom.setLayout(new BorderLayout());//设置布局是BorderLayout

JLabel labelHelp;//标签的创建和添加开始了.......new了3遍就是实例化了3个都加到了panle的中间 ,标签的内容都是""中间的

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);//把这个panel添加到jframe的容器里面去

mainFrame.addKeyListener(control);//为jframe添加键盘监听器

mainFrame.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口和/或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该 Window。

mainFrame.setResizable(false);//设置此 frame 是否可由用户调整大小。false就是不能

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击又上角的就是关闭

mainFrame.setVisible(true);//设置jfram为能看到

}

void repaint() {

Graphics g = paintCanvas.getGraphics();//Graphics详细看jdk文档..我就知道是一个所有图形上下文的抽象基类..这里应该是那个画图面板

g.setColor(Color.WHITE);//设置这个颜色

g.fillRect(0, 0, canvasWidth, canvasHeight);//画一个矩形在x,y处画一个宽是200,高是300的矩形,

g.setColor(Color.BLACK);//颜色是黑的

LinkedList na = model.nodeArray;//LinkedList 类 List 接口的链接列表实现就是一个集合对象了,因为不知道SnakeModel具体是一个什么类这里就当作这个类能得到一个集合

Iterator it = na.iterator();//得到迭代器去迭代这个集合

while (it.hasNext()) {//开始用while迭代

Node n = (Node) it.next();//得到一个集合中元素.是一个Node....这里的Node不知道是什么对象..有待于研究

drawNode(g, n);//调用另外方法

}

g.setColor(Color.RED);//设置颜色是红的

Node n = model.food;//得到一个新node..看来Node这里应该是一个坐标..这里的坐标就是蛇吃的那个东西

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) {//这个就是Observer监听类必须实现的方法..这里是去调用repaint()方法..repaint方法就是不断去改变画图版里面的内容的

repaint();

}

}

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程序代码(要能运行的,有完整注释的)

三个文件,楼主看好:

运行可以,但是并不能鼓吹是一个具有好的风格的代码,。

//文件一

package greedysnake_cx;

public class Node {

int x=0;

int y=0;

int nodewidth;

int nodeheight;

Node(int x,int y){

this.x=x;

this.y=y;

}

}

//文件二

package greedysnake_cx;

/**

* 实现一个greedysnake的模型,具有功能:

* 1)移动,moveOn()----从director参数中获取方向信息,如果方向定义的下一个点的逻辑值是true,检查是不是food,是则将food添加到

* 列表的头部,snake继续移动,不是则停止移动(撞到蛇尾巴了)

* 2)加速,speedUp()----将现成的停滞时间间隔interval按照一定的比率 speedRate进行扩大

* 3)减速,speedDown()----....

*

* 该类实现Runnable接口,

* */

//定义snake的模型

import java.util.*;

import javax.swing.*;

public class SnakeModel implements Runnable {

private GreedSnake gs;

//给每一个矩阵点确立一个boolean值

boolean[][] matrix;

private int maxX;

private int maxY;

//设置一个节点的列表;

LinkedList nodeArray = new LinkedList();

Node food=null;

int direction=UP;

int score=0;

//定义方向

public final static int LEFT=1;

public final static int UP=2;

public final static int RIGHT=3;

public final static int DOWN=4;

private int interval=200; //停顿时间的间隔

boolean pause=false; //定义暂停

private double speedRate=0.5; //定义速度的变更幅度

//constructor

public SnakeModel(GreedSnake gs,int maxx,int maxy){

this.gs=gs;

this.maxX=maxx;

this.maxY=maxy;

//this.matrix=null;

////////////////////////////////////////////////////////////////////

//init matrix[][];

matrix=new boolean[maxX][]; //***********************不初始化是不行滴

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

matrix[i]=new boolean[maxY];//将矩阵的每一行定义成列的集合

Arrays.fill(matrix[i], false);///使用java.util.Arrays的static方法fill,将matrix[]数组里面的元素全部定义成false

//至此,矩阵里面所有的点的boolean值都是flase

//for(int j=0;jmaxY;j++){

//matrix[i][j]=false;

//}

}

////////////////////////////////////////////////////////////////////

//init nodeArray

int initlength=10;

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

//确保snake出现在屏幕的中央 assure that the greedy snake appears in the center of the model

//snake的长度由maxX来确定

int x=maxX/2+i;

int y=maxY/2;

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

matrix[x][y]=true;

}

//////////////////////////////////////////////////////////////////////

//创建食物

food=createFood();

System.out.println("some test!");

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

}//end constructor

//snake动起

public boolean moveOn(){

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

int x=head.x;

int y=head.y;

switch(direction){

case LEFT:

x--;break;

case UP:

y--;break;

case RIGHT:

x++;break;

case DOWN:

y++;break;

default:

}

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

if(matrix[x][y]){//当蛇头转至一个bool值为true的点时

if(x==food.xy==food.y){//该点是食物

nodeArray.addFirst(food);

//吃掉补上

food=createFood();

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

score+=10;

return true;

}

else //该点不是食物,(蛇尾巴)

return false;

}

else{

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

matrix[x][y]=true;

Node nn=(Node)nodeArray.removeLast();//移除并且返回列表中的最后一个元素

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

return true;

}

}

return false;

}//end moveOn

public void run() {

boolean running=true;

while(running){

try{

Thread.sleep(interval);

}

catch(InterruptedException e){

e.printStackTrace();

}

if(!pause){

if(moveOn()){

gs.repaint();

}

else{

JOptionPane.showMessageDialog(null, "sorry myboy,GAME OVER!", "message", JOptionPane.INFORMATION_MESSAGE);

running=false;

}

}

}

/*boolean running=true;

while(running){

try{

Thread.sleep(interval);

}

catch (InterruptedException e){

e.printStackTrace();

}

if(!pause){

if(moveOn()){

gs.repaint();

}

else{

JOptionPane.showMessageDialog(null,"i am sorry ,you failed!","message",JOptionPane.INFORMATION_MESSAGE);

break;

}

}

}//end while

running=false;//当且仅当失败退出的时候;

*/

}

//获取当前游戏得分

public int getScore(){

return this.score;

}

//加速

public void speedUp(){

interval*=speedRate;

}

//减速

public void speedDown(){

interval/=speedRate;

}

//设置暂停

public void chagePause(){

pause=!pause;

}

//设置方向

public void chageDirection(int newdirection){

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

direction=newdirection;

}

}

//生成食物

private Node createFood() {

/*

* 创建一个随机数的生成器,这个是java.util.Random类

* 与java.lang.Math类中的random()方法有不一样的地方,彼方法返回一个0-1之间的随机数

* */

Random random=new Random();

int foodx=random.nextInt(maxX);

int foody=random.nextInt(maxY);

Node food=new Node(foodx,foody);

return food;

}

}

//文件三

package greedysnake_cx;

/**

* 在repaint()方法中,绘画上下文对象是从canvas对象使用getContentPane()获取的!!

* */

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

public class GreedSnake implements KeyListener{

Canvas canvas;

private JLabel jlabel;

private JPanel jpanel;

private JFrame jframe;

SnakeModel snakemodel;

private final static int canvaswidth=400;

private final static int canvasheight=300;

private final static int nodewidth=10;

private final static int nodeheight=10;

//construction

GreedSnake(){

jframe=new JFrame("The Greed Sanke!");

jframe.setLayout(new BorderLayout());

Container cp=jframe.getContentPane();

//在jframe面板中添加各种组件

jlabel=new JLabel("welcome");

jlabel.setText("Welcome my friend! Enjoy your self!");

cp.add(jlabel,BorderLayout.NORTH);

canvas=new Canvas();

canvas.setSize(canvaswidth,canvasheight);

canvas.addKeyListener(this); //给空白面板添加键盘时间监听器!

cp.add(canvas,BorderLayout.CENTER);

jpanel=new JPanel();

jpanel.setLayout(new BorderLayout());

JLabel label=new JLabel("Pass enter or 'r' or 's' to start",JLabel.CENTER);

jpanel.add(label,BorderLayout.NORTH);

JLabel label2=new JLabel("Pass space to pause this game!",JLabel.CENTER);

jpanel.add(label2,BorderLayout.CENTER);

JLabel label3=new JLabel("Pass pageUp or pageDown to up or down the speed of the snake!",JLabel.CENTER);

jpanel.add(label3,BorderLayout.SOUTH);

cp.add(jpanel,BorderLayout.SOUTH);

//给顶层容器设置时间监听、可视化、关闭按钮的设定

jframe.addKeyListener(this);

jframe.pack();

jframe.setVisible(true);

jframe.setResizable(false);

jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

begin();

}//end construction

public void begin(){

//开启一个SnakeModel的进程,并且开始改进程

snakemodel=new SnakeModel(this,canvaswidth/nodewidth,canvasheight/nodeheight);

(new Thread(snakemodel)).start();

}

void repaint(){

int score=snakemodel.getScore();

jlabel.setText("您的得分是:"+score);

Graphics g=canvas.getGraphics();///pay attention!

g.setColor(Color.white);

g.fillRect(0, 0, canvaswidth, canvasheight);

g.setColor(Color.blue);

LinkedList list=snakemodel.nodeArray;

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

Node nn=(Node)list.get(i);

paintingNode(g,nn);

}

//绘制food

g.setColor(Color.green);

Node foodnode=new Node(snakemodel.food.x,snakemodel.food.y);

paintingNode(g,foodnode);

}

public void paintingNode(Graphics gg,Node n){

/*

* 使用Graphics 的fillRect方法,填充一个矩形,

* 矩形的起点需要乘以一个NODE的长宽,以避免重叠

* */

gg.fillRect(n.x*nodewidth, n.y*nodeheight,nodewidth-1,nodeheight-1);

}

public void keyPressed(KeyEvent e) {//按下某一个键时,调用此方法

int keycode=e.getKeyCode();

/* if(keycode==KeyEvent.VK_ENTER||keycode==KeyEvent.VK_R){

begin();

}*/

switch(keycode){

case KeyEvent.VK_LEFT:

snakemodel.chageDirection(SnakeModel.LEFT);

break;

case KeyEvent.VK_UP:

snakemodel.chageDirection(SnakeModel.UP);

break;

case KeyEvent.VK_RIGHT:

snakemodel.chageDirection(SnakeModel.RIGHT);

break;

case KeyEvent.VK_DOWN:

snakemodel.chageDirection(SnakeModel.DOWN);

break;

case KeyEvent.VK_PAGE_DOWN:

snakemodel.speedDown();

break;

case KeyEvent.VK_PAGE_UP:

snakemodel.speedUp();

break;

case KeyEvent.VK_ENTER:

case KeyEvent.VK_R:

begin();

break;

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

snakemodel.chagePause();

default:

}//end switch

}//end keyPressed

public void keyReleased(KeyEvent e) {//释放某一个键时,调用此方法

}

public void keyTyped(KeyEvent e) {//键入某一个键时,调用此方法!

}

//main

public static void main(String[] args){

GreedSnake gs=new GreedSnake();

}

}

如何用慧编程做贪吃蛇代码

用慧编程做贪吃蛇代码过程如下:

1、我们需要建立四个头文件,然后分别设置蛇的状态,上下左右,这是蛇能够有方向可走的前提,然后我们再设置蛇身的节点,定义一个简单的函数,这样蛇的全身以及他的行走方向就弄完了。

2、贪吃蛇不能穿墙代码。

3、第二步,一个函数这个函数的目的是贪吃蛇不能穿墙,很简单的代码分别设置长宽的最大位移,在内部范围内设置为一即可通过,否则不能穿墙。贪吃蛇随机生成一个食物。

4、设置一个随机函数。这样贪吃蛇代码就做好了。

慧编程是一款面向STEAM教育领域的积木式和代码编程软件,基于图形化编程开发。


名称栏目:贪吃蛇代码java注释,java编写贪吃蛇简单版
转载来于:http://scyanting.com/article/dsicisc.html