「java贪吃蛇入门教程」用java编写贪吃蛇原理

博主:adminadmin 2023-03-22 15:13:11 490

今天给各位分享java贪吃蛇入门教程的知识,其中也会对用java编写贪吃蛇原理进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java 编写 贪吃蛇游戏的 大体思路是什么?

要代码和jar包我这有,思路我就大概讲一下:首先是要在画布上画上一个块,这就是蛇头,但是蛇是会变长的,所以需要用一个东西来存蛇,那就可以用数组、ArrayList、LinkedList、等等(我比较喜欢用LinkedList),这里虽然说的是蛇,其实是一个块的x、y坐标,蛇是画好了,但蛇是会动的,这就要用一个线程和一个move()方法了,让它不停的动,蛇是动了,但是没有方向,这时需要一个方法让它有方向,但要注意的是相反的方向不能改变方向(也就是按了上,按下就不能用了),蛇有方向又能动,但到边上了就不行了,这时就要让它出界结束游戏,接下来就是要出现食物了,食物这个好办,用一个随机数搞定它,注意食物不能在界外,食物有了,蛇就要去吃它了,这时就要用一个方法去吃食物了,吃到了让蛇长一个块,食物重新出现,蛇是长大了,但是它可以碰到自己的身体,那么你就要做了方法让它碰到后结束游戏,就这样最初步的思路搞定了。接下来的就是一些细节了,这就不说了。

java贪吃蛇Snake类怎么写

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

//Main Class

public class GreedSnake extends KeyAdapter{

    JFrame mainFrame;

    Canvas paintCanvas;

    JLabel labelScore;//计分牌

    SnakeModel snakeModel=null;// 蛇

    public static final int DEFAULT_WIDTH=500;

    public static final int DEFAULT_HEIGHT=300;

    public static final int nodeWidth=10;

    public static final int nodeHeight=10;

//    GreedSnake():初始化游戏界面

    public GreedSnake(){

//        设置界面元素

        mainFrame=new JFrame("贪吃蛇游戏");

        Container cp=mainFrame.getContentPane();

        labelScore=new JLabel("所得分数为:",JLabel.CENTER);

        cp.add(labelScore,BorderLayout.NORTH);

        paintCanvas=new Canvas();

        paintCanvas.setSize(DEFAULT_WIDTH+1,DEFAULT_HEIGHT+1);

        paintCanvas.addKeyListener(this);

        cp.add(paintCanvas,BorderLayout.CENTER);

        JPanel panelButtom=new JPanel();

        panelButtom.setLayout(new BorderLayout());

        JLabel labelHelp;// 帮助信息

        labelHelp=new JLabel("按 PageUP 或 PageDown 键改变速度",JLabel.CENTER);

        panelButtom.add(labelHelp,BorderLayout.NORTH);

        labelHelp=new JLabel("按 Enter 或 S 键重新开始游戏",JLabel.CENTER);

        panelButtom.add(labelHelp,BorderLayout.CENTER);

        labelHelp=new JLabel("按 SPACE 键或 P 键暂停游戏",JLabel.CENTER);

        panelButtom.add(labelHelp,BorderLayout.SOUTH);

        cp.add(panelButtom,BorderLayout.SOUTH);

        mainFrame.addKeyListener(this);

        mainFrame.pack();

        mainFrame.setResizable(false);//设置窗口大小不能变化

        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        mainFrame.setVisible(true);

        begin();

    }

//    keyPressed():按键检测

    public void keyPressed(KeyEvent e){

        int keyCode=e.getKeyCode();

        if(snakeModel.running)

            switch(keyCode){

            case KeyEvent.VK_UP:

                snakeModel.changeDirection(SnakeModel.UP);

                break;

            case KeyEvent.VK_DOWN:

                snakeModel.changeDirection(SnakeModel.DOWN);

                break;

            case KeyEvent.VK_LEFT:

                snakeModel.changeDirection(SnakeModel.LEFT);

                break;

            case KeyEvent.VK_RIGHT:

                snakeModel.changeDirection(SnakeModel.RIGHT);

                break;

            case KeyEvent.VK_ADD:

            case KeyEvent.VK_PAGE_UP:

                snakeModel.speedUp();// 加速

                break;

            case KeyEvent.VK_SUBTRACT:

            case KeyEvent.VK_PAGE_DOWN:

                snakeModel.speedDown();// 减速

                break;

            case KeyEvent.VK_SPACE:

            case KeyEvent.VK_P:

                snakeModel.changePauseState();// 暂停或继续

                break;

            default:

            }

        //重新开始

        if(keyCode==KeyEvent.VK_S || keyCode==KeyEvent.VK_ENTER){

            snakeModel.running=false;

            begin();

        }

    }

//    repaint():绘制游戏界面(包括蛇和食物)

    void repaint(){

        Graphics g=paintCanvas.getGraphics();

        //draw background

        g.setColor(Color.LIGHT_GRAY);

        g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT);

        //draw the snake

        g.setColor(Color.BLACK);

        LinkedList na=snakeModel.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=snakeModel.food;

        drawNode(g,n);

        updateScore();

    }

//    drawNode():绘画某一结点(蛇身或食物)

    private void drawNode(Graphics g,Node n){

        g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);

    }

//    updateScore():改变计分牌

    public void updateScore(){

        String s="所得分数为: "+snakeModel.score;

        labelScore.setText(s);

    }

//    begin():游戏开始,放置贪吃蛇

    void begin(){

        if(snakeModel==null||!snakeModel.running){

            snakeModel=new SnakeModel(this,DEFAULT_WIDTH/nodeWidth,

                    DEFAULT_HEIGHT/nodeHeight);

            (new Thread(snakeModel)).start();

        }

    }

//    main():主函数

    public static void main(String[] args){

        GreedSnake gs=new GreedSnake();

    }

}

//Node:结点类

class Node{

    int x;

    int y;

    Node(int x,int y){

        this.x=x;

        this.y=y;

    }

}

//SnakeModel:贪吃蛇模型

class SnakeModel implements Runnable{

    GreedSnake gs;

    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和DOWN是偶数,RIGHT和LEFT是奇数

    public static final int UP=2;

    public static final int DOWN=4;

    public static final int LEFT=1;

    public static final int RIGHT=3;

//    GreedModel():初始化界面

    public SnakeModel(GreedSnake gs,int maxX,int maxY){

        this.gs=gs;

        this.maxX=maxX;

        this.maxY=maxY;

        matrix=new boolean[maxX][];

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

            matrix[i]=new boolean[maxY];

            Arrays.fill(matrix[i],false);// 没有蛇和食物的地区置false

        }

        //初始化贪吃蛇

        int initArrayLength=maxX20 ? 10 : maxX/2;

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

            int x=maxX/2+i;

            int y=maxY/2;

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

            matrix[x][y]=true;// 蛇身处置true

        }

        food=createFood();

        matrix[food.x][food.y]=true;// 食物处置true

    }

//    changeDirection():改变运动方向

    public void changeDirection(int newDirection){

        if(direction%2!=newDirection%2){// 避免冲突

            direction=newDirection;

        }

    }

//    moveOn():贪吃蛇运动函数

    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=xxmaxX)(0=yymaxY)){

            if(matrix[x][y]){// 吃到食物或者撞到身体

                if(x==food.xy==food.y){// 吃到食物

                    nodeArray.addFirst(food);// 在头部加上一结点

                    //计分规则与移动长度和速度有关

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

                    score+=scoreGet0 ? 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;//越界(撞到墙壁)

    }

    //run():贪吃蛇运动线程

    public void run(){

        running=true;

        while(running){

            try{

                Thread.sleep(timeInterval);

            }

            catch(Exception e){

                break;

            }

            if(!paused){

                if(moveOn()){// 未结束

                    gs.repaint();

                }

                else{//游戏结束

                    JOptionPane.showMessageDialog(null,"GAME OVER",

                            "Game Over",JOptionPane.INFORMATION_MESSAGE);

                    break;

                }

            }

        }

        running=false;

    }

//    createFood():生成食物及放置地点

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

    }

//    speedUp():加快蛇运动速度

    public void speedUp(){

        timeInterval*=speedChangeRate;

    }

//    speedDown():放慢蛇运动速度

    public void speedDown(){

        timeInterval/=speedChangeRate;

    }

//    changePauseState(): 改变游戏状态(暂停或继续)

    public void changePauseState(){

        paused=!paused;

    }

}

java贪吃蛇技术选型怎么写的?

Java贪吃蛇技术选型一般需要考虑以下几点:

开发平台:需要选择适用于Java语言的开发平台,如Eclipse、IntelliJ IDEA等。

编程语言:需要选择Java语言来开发贪吃蛇游戏。

框架和库:可以使用Java中的Swing框架和AWT库来开发图形界面,并使用Java多线程编程技术来实现游戏的实时动态效果。

算法和数据结构:可以使用队列或链表等数据结构来存储贪吃蛇的身体,并使用类似贪心算法的思想来决定贪吃蛇的下一步移动方向。

编码风格和规范:需要遵循Java的编码风格和规范,确保代码的可读性和可维护性。

希望以上内容能够帮助您了解Java贪吃蛇技术选型。如果您有其他问题,欢迎随时告诉我,我会尽力为您解答。

用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马士兵版贪吃蛇问题

首先new Yard() 是新建一个Yard的实例

你在Snake里new一个 在Start里又new一个

可是这条蛇是属于哪个一个Yard呢

如果按原先作法Snake s = new Snake(this)可以在new Yard的时候把自身传给对应的那条蛇

就是马老师讲的--持有对方引用 用起来很方便

********************************

如果你非得在Snake中直接new 可以按下面的改试试看吧

1. 在Snake.java里添加一个空的构造方法:

Yard y;

snake(){

.......... .........

.......... .........

this.y = new Yard();

}

2. 在Yard.java里把Snake s = new Snake(this)改成 static Snake s = new Snake();

3. 在Start.java把第一句Yard y = new Yard();换成 Yard y = Yard.s.y;

这样用的话显然很不好使

求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贪吃蛇入门教程和用java编写贪吃蛇原理的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。