贪吃蛇java代码 Java贪吃蛇代码

java贪吃蛇代码注释求解

import java.awt.Color;

创新互联-专业网站定制、快速模板网站建设、高性价比清水河网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式清水河网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖清水河地区。费用合理售后完善,十年实体公司更值得信赖。

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;

}

}

}

想要一个在eclipse上直接运行的贪吃蛇代码

第一个类:

/**

* 代表蛇的运行方向

* @author Administrator

*

*/

public enum Dir {

L, U, R, D

}

第二个类:

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.Random;

/**

* 代表蛋

* @author Administrator

*

*/

public class Egg {

int row, col;

int w = Yard.BLOCK_SIZE;

int h = Yard.BLOCK_SIZE;

private static Random r = new Random();

private Color color = Color.GREEN;

public Egg(int row, int col) {

this.row = row;

this.col = col;

}

public Egg() {

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

}

public void reAppear() {

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

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

}

public Rectangle getRect() {

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

}

public void draw(Graphics g) {

Color c = g.getColor();

g.setColor(color);

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

g.setColor(c);

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

else color = Color.GREEN;

}

public int getCol() {

return col;

}

public void setCol(int col) {

this.col = col;

}

public int getRow() {

return row;

}

public void setRow(int row) {

this.row = row;

}

}

第三个类:

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.event.KeyEvent;

/**

* 代表蛇

* @author Administrator

*

*/

public class Snake {

private Node head = null;

private Node tail = null;

private int size = 0;

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

private Yard y;

public Snake(Yard y) {

head = n;

tail = n;

size = 1;

this.y = y;

}

public void addToTail() {

Node node = null;

switch(tail.dir) {

case L :

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

break;

case U :

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

break;

case R :

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

break;

case D :

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

break;

}

tail.next = node;

node.prev = tail;

tail = node;

size ++;

}

public void addToHead() {

Node node = null;

switch(head.dir) {

case L :

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

break;

case U :

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

break;

case R :

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

break;

case D :

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

break;

}

node.next = head;

head.prev = node;

head = node;

size ++;

}

public void draw(Graphics g) {

if(size = 0) return;

move();

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

n.draw(g);

}

}

private void move() {

addToHead();

deleteFromTail();

checkDead();

}

private void checkDead() {

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

y.stop();

}

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

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

y.stop();

}

}

}

private void deleteFromTail() {

if(size == 0) return;

tail = tail.prev;

tail.next = null;

}

private class Node {

int w = Yard.BLOCK_SIZE;

int h = Yard.BLOCK_SIZE;

int row , col;

Dir dir = Dir.L;

Node next = null;

Node prev = null;

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

this.row = row;

this.col = col;

this.dir = dir;

}

void draw(Graphics g) {

Color c = g.getColor();

g.setColor(Color.BLACK);

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

g.setColor(c);

}

}

public void eat(Egg e) {

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

e.reAppear();

this.addToHead();

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

}

}

private Rectangle getRect() {

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

}

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

switch(key) {

case KeyEvent.VK_LEFT :

if(head.dir != Dir.R)

head.dir = Dir.L;

break;

case KeyEvent.VK_UP :

if(head.dir != Dir.D)

head.dir = Dir.U;

break;

case KeyEvent.VK_RIGHT :

if(head.dir != Dir.L)

head.dir = Dir.R;

break;

case KeyEvent.VK_DOWN :

if(head.dir != Dir.U)

head.dir = Dir.D;

break;

}

}

}

第四个类:

import java.awt.Color;

import java.awt.Font;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

/**

* 这个类代表贪吃蛇的活动场所

* @author bjsxt

* @version 1.0

*/

public class Yard extends Frame {

PaintThread paintThread = new PaintThread();

private boolean gameOver = false; //游戏是否结束

/**

* 行数

*/

public static final int ROWS = 30;

public static final int COLS = 30;

public static final int BLOCK_SIZE = 15;

private Font fontGameOver = new Font("宋体", Font.BOLD, 50);

private int score = 0;

Snake s = new Snake(this);

Egg e = new Egg();

Image offScreenImage = null;

public void launch() {

this.setLocation(200, 200);

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

this.addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

this.setVisible(true);

this.addKeyListener(new KeyMonitor());

new Thread(paintThread).start();

}

public static void main(String[] args) {

new Yard().launch();

}

public void stop() {

gameOver = true;

}

@Override

public void paint(Graphics g) {

Color c = g.getColor();

g.setColor(Color.GRAY);

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

g.setColor(Color.DARK_GRAY);

//画出横线

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

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

}

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

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

}

g.setColor(Color.YELLOW);

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

if(gameOver) {

g.setFont(fontGameOver);

g.drawString("游戏结束", 120, 180);

paintThread.pause();

}

g.setColor(c);

s.eat(e);

e.draw(g);

s.draw(g);

}

@Override

public void update(Graphics g) {

if(offScreenImage == null) {

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

}

Graphics gOff = offScreenImage.getGraphics();

paint(gOff);

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

}

private class PaintThread implements Runnable {

private boolean running = true;

private boolean pause = false;

public void run() {

while(running) {

if(pause) continue;

else repaint();

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public void pause() {

this.pause = true;

}

public void reStart() {

this.pause = false;

s = new Snake(Yard.this);

gameOver = false;

}

public void gameOver() {

running = false;

}

}

private class KeyMonitor extends KeyAdapter {

@Override

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

if(key == KeyEvent.VK_F2) {

paintThread.reStart();

}

s.keyPressed(e);

}

}

/**

* 拿到所得的分数

* @return 分数

*/

public int getScore() {

return score;

}

/**

* 设置所得的分数

* @param score 分数

*/

public void setScore(int score) {

this.score = score;

}

}

仅供参考。

求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代码

自己写着玩的,很简单,你试一试哦...

主要用了javax.swing.Timer这个类:

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")

public class MainClass extends JFrame {

ControlSnake control;

Toolkit kit;

Dimension dimen;

public static void main(String[] args) {

new MainClass("my snake");

}

public MainClass(String s) {

super(s);

control = new ControlSnake();

control.setFocusable(true);

kit = Toolkit.getDefaultToolkit();

dimen = kit.getScreenSize();

add(control);

setLayout(new BorderLayout());

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

setSize(FWIDTH, FHEIGHT);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setResizable(false);

setVisible(true);

}

public static final int FWIDTH = 315;

public static final int FHEIGHT = 380;

}

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.Timer;

import java.util.Random;

@SuppressWarnings("serial")

public class ControlSnake extends JPanel implements ActionListener {

Random rand;

ArrayListPoint list, listBody;

String str, str1;

static boolean key;

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

int snakeBody;

int speed;

public ControlSnake() {

snakeBody = 1;

str = "上下左右方向键控制 P键暂停...";

str1 = "现在的长度为:" + snakeBody;

key = true;

flag = 1;

speed = 700;

rand = new Random();

list = new ArrayListPoint();

listBody = new ArrayListPoint();

x = 5;

y = 5;

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

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

dx = 10;

dy = 0;

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

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

setBackground(Color.WHITE);

setSize(new Dimension(318, 380));

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

time.start();

addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {

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

dx = -10;

dy = 0;

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

dx = 0;

dy = -10;

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

dx = 10;

dy = 0;

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

dx = 0;

dy = 10;

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

if (flag % 2 == 1) {

time.stop();

}

if (flag % 2 == 0) {

time.start();

}

flag++;

}

}

});

}

public void paint(Graphics g) {

g.setColor(Color.WHITE);

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

g.setColor(Color.DARK_GRAY);

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

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

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

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

g.setColor(Color.PINK);

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

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

}

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

g.setColor(Color.ORANGE);

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

g.setColor(Color.DARK_GRAY);

str1 = "现在的长度为:" + snakeBody;

g.drawString(str, 10, 320);

g.drawString(str1, 10, 335);

}

public void actionPerformed(ActionEvent e) {

x += dx;

y += dy;

if (makeOut() == false) {

JOptionPane.showMessageDialog(null, "重新开始......");

speed = 700;

snakeBody = 1;

x = 5;

y = 5;

list.clear();

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

listBody.clear();

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

dx = 10;

dy = 0;

}

addPoint(x, y);

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

speed = (int) (speed * 0.8);//速度增加参数

if (speed 200) {

speed = 100;

}

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

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

snakeBody++;// 2

} // 2

repaint();

}

public void addPoint(int xx, int yy) {

// 动态的记录最新发生的50步以内的移动过的坐标

// 并画出最新的snakeBody

if (list.size() 100) {//蛇身长度最长为100

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

} else {

list.remove(0);

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

}

if (snakeBody == 1) {

listBody.remove(0);

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

} else {

listBody.clear();

if (list.size() snakeBody) {

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

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

}

} else {

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

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

}

}

}

}

public boolean makeOut() {

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

return false;

}

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

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

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

return false;

}

}

}

return true;

}

}

怎么包装贪吃蛇项目

思路:

首先你要有一条贪吃蛇,哎,就是玩儿。

1.先用Java敲一个贪吃蛇小游戏的程序。

2.把Java程序打包成jar文件包,把jar包打包成exe应用程序

知道思路以后,接下来按照我的详细步骤走,能少踩坑,别问我怎么知道的!!!

一、Java“敲一个”贪吃蛇小游戏

废话不多说,本篇主要讲从java项目到exe应用程序,Java项目的代码在我上传的资源当中——代码-greedy snack.zip

二、将项目打成jar包

如何打包成jar包?

1.手动打可直接执行的jar包(本次不使用)2. 使用intellij idea工具打可直接执行的jar包

1) 打开项目

2)点击 File — 选择 Project Structure,找到“Artifacts” 点击 “+” 选择“JAR” —“Empty”。

3) Name栏可以填入自定义的名字,Output ditectory选择jar包生成目标目录,Available Elements里双击需要添加到jar包的文件,即可添加到左边的jar包目录,如图:

4)点击Create Manifest,选择放置MANIFEST.MF的文件路径,直接默认项目根目录就行,点击OK。

5) 点击Main Class后面选择按钮, 弹出框中选择需要运行程序入口main函数,点击OK,点击OK。

6) 点击菜单中“Build” - "Build Artifacts", 双击弹出框中待生成jar包下面的build即可,如下图

7)至此使用Intellij idea生成可直接执行jar包就完成了。

8)查看生成的jar包,并运行jar包。命令行运行jar包

java -jar xxx.jar

复制代码

三、打包成为exe应用程序

这里首先你要有:

上面生成的jar包 greedy snack.jar

工具:exe4j,一个将jar转换成exe的工具 链接:… 提取码:ijdv

1)安装exe4j,打开安装好的exe4j,进行注册

注册码:L-g782dn2d-1f1yqxx1rv1sqd

2) 点击 Next, 选择JAVA转EXE

3) Next,填入自定义的名字和生成目标文件目录

4) 继续Next,选择启动模式、设置程序名称和程序图标

5) 下方有个选项,需要设置打包后的程序兼容32和64位系统。

勾选,然后Next。

6)然后Next,直到出现如下界面,开始选择jar包以及配置

在VM参数配置的地方加上:-Dfile.encoding=utf-8

添加jar包

设置启动类

Next 配置JRE

Next 选择 Client VM

7)Next 直到如下图界面

桌面多了一个贪吃蛇小游戏3.0.exe文件,至此我们就成功的做出了一个Java贪吃蛇小游戏的exe应用程序

哪位能告诉我贪吃蛇游戏的全部代码?

//package main;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class TanChiShe implements KeyListener,ActionListener{

/**

* @param args

*/

int max = 300;//蛇长最大值

final int JianJu = 15; //设定蛇的运动网格间距(窗口最大32*28格)

byte fangXiang = 4; //控制蛇的运动方向,初始为右

int time = 500; //蛇的运动间隔时间

int jianTime = 2;//吃一个减少的时间

int x,y;//蛇的运动坐标,按网格来算

int x2,y2;//暂存蛇头的坐标

int jiFenQi = 0;//积分器

boolean isRuned = false;//没运行才可设级别

boolean out = false;//没开始运行?

boolean run = false;//暂停运行

String JiBie = "中级";

JFrame f = new JFrame("贪吃蛇 V1.0");

JPanel show = new JPanel();

JLabel Message = new JLabel("级别:中级 蛇长:5 时间500ms 分数:00");

// JButton play = new JButton("开始");

JLabel sheTou;

JLabel shiWu;

JLabel sheWei[] = new JLabel[max];

static int diJi = 4; //第几个下标的蛇尾要被加上

ImageIcon shang = new ImageIcon("tuPian\\isSheTouUp.png");//产生四个上下左右的蛇头图案

ImageIcon xia = new ImageIcon("tuPian\\isSheTouDown.png");

ImageIcon zhuo = new ImageIcon("tuPian\\isSheTouLeft.png");

ImageIcon you = new ImageIcon("tuPian\\isSheTouRight.png");

JMenuBar JMB = new JMenuBar();

JMenu file = new JMenu("开始游戏");

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

JMenuItem pause = new JMenuItem(" 暂停游戏 ");

JMenu hard = new JMenu("游戏难度");

JMenuItem gao = new JMenuItem("高级");

JMenuItem zhong = new JMenuItem("中级");

JMenuItem di = new JMenuItem("低级");

JMenu about = new JMenu(" 关于 ");

JMenuItem GF = new JMenuItem("※高分榜");

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

JMenuItem YX = new JMenuItem("关于游戏");

JMenuItem QK = new JMenuItem("清空记录");

static TanChiShe tcs = new TanChiShe();

public static void main(String[] args) {

// TanChiShe tcs = new TanChiShe();

tcs.f();

}

public void f(){

f.setBounds(250,100,515,530);

f.setLayout(null);

f.setAlwaysOnTop(true);//窗口始终保持最前面

f.setBackground(new Color(0,0,0));

f.setDefaultCloseOperation(0);

f.setResizable(false);

f.setVisible(true);

// f.getContentPane().setBackground(Color.BLACK);

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);//退出程序

}

});

f.setJMenuBar(JMB);

JMB.add(file);

file.add(play);

file.add(pause);

JMB.add(hard);

hard.add(gao);

hard.add(zhong);

hard.add(di);

JMB.add(about);

about.add(GF);

GF.setForeground(Color.blue);

about.add(ZZ);

about.add(YX);

about.add(QK);

QK.setForeground(Color.red);

f.add(show);

show.setBounds(0,f.getHeight()-92,f.getWidth(),35);

// show.setBackground(Color.green);

// f.add(play);

// play.setBounds(240,240,80,25);

play.addActionListener(this);

pause.addActionListener(this);

gao.addActionListener(this);

zhong.addActionListener(this);

di.addActionListener(this);

GF.addActionListener(this);

ZZ.addActionListener(this);

YX.addActionListener(this);

QK.addActionListener(this);

show.add(Message);

Message.setForeground(Color.blue);

f.addKeyListener(this);

// show.addKeyListener(this);

play.addKeyListener(this);

sheChuShi();

}

public void sheChuShi(){//蛇初始化

sheTou = new JLabel(you);//用向右的图来初始蛇头

f.add(sheTou);

sheTou.setBounds(JianJu*0,JianJu*0,JianJu,JianJu);

// System.out.println("ishere");

shiWu = new JLabel("■");

f.add(shiWu);

shiWu.setBounds(10*JianJu,10*JianJu,JianJu,JianJu);

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

sheWei[i] = new JLabel("■");

f.add(sheWei[i]);

sheWei[i].setBounds(-1*JianJu,0*JianJu,JianJu,JianJu);

}

while(true){

if(out == true){

yunXing();

break;

}

try{

Thread.sleep(200);

}catch(Exception ex){

ex.printStackTrace();

}

}

}

public void sheJiaChang(){//蛇的长度增加

if(diJi max){

sheWei[++diJi] = new JLabel(new ImageIcon("tuPian\\isSheWei.jpg"));

f.add(sheWei[diJi]);

sheWei[diJi].setBounds(sheWei[diJi-1].getX(),sheWei[diJi-1].getY(),JianJu,JianJu);

// System.out.println("diJi "+diJi);

}

}

public void pengZhuanJianCe(){//检测蛇的碰撞情况

if(sheTou.getX()0 || sheTou.getY()0 ||

sheTou.getX()f.getWidth()-15 || sheTou.getY()f.getHeight()-105 ){

gameOver();

// System.out.println("GameOVER");

}

if(sheTou.getX() == shiWu.getX() sheTou.getY() == shiWu.getY()){

out: while(true){

shiWu.setLocation((int)(Math.random()*32)*JianJu,(int)(Math.random()*28)*JianJu);

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

if(shiWu.getX()!= sheWei[i].getX() shiWu.getY()!=sheWei[i].getY()

sheTou.getX()!=shiWu.getX() sheTou.getY()!= shiWu.getY()){//如果食物不在蛇身上则退出循环,产生食物成功

break out;

}

}

}

sheJiaChang();

// System.out.println("吃了一个");

if(time100 ){

time -= jianTime;

}

else{}

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+" 时间:"+time+"ms 分数:"+(jiFenQi+=10)+"");

}

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

if(sheTou.getX() == sheWei[i].getX() sheTou.getY() == sheWei[i].getY()){

gameOver();

// System.out.println("吃到尾巴了");

}

}

}

public void yunXing(){

while(true){

while(run){

if(fangXiang == 1){//上

y-=1;

}

if(fangXiang == 2){//下

y+=1;

}

if(fangXiang == 3){//左

x-=1;

}

if(fangXiang == 4){//右

x+=1;

}

x2 = sheTou.getX();

y2 = sheTou.getY();

sheTou.setLocation(x*JianJu,y*JianJu); //设置蛇头的坐标 网格数*间隔

for(int i=diJi;i=0;i--){

if(i==0){

sheWei[i].setLocation(x2,y2);

// System.out.println(i+" "+sheTou.getX()+" "+sheTou.getY());

}

else{

sheWei[i].setLocation(sheWei[i-1].getX(),sheWei[i-1].getY());

// System.out.println(i+" "+sheWei[i].getX()+" "+sheWei[i].getY());

}

}

pengZhuanJianCe();

try{

Thread.sleep(time);

}catch(Exception e){

e.printStackTrace();

}

}

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+" 时间:"+time+"ms 分数:"+(jiFenQi+=10)+"");

try{

Thread.sleep(200);

}catch(Exception e){

e.printStackTrace();

}

}

}

public void gameOver(){//游戏结束时处理

int in = JOptionPane.showConfirmDialog(f,"游戏已经结束!\n是否要保存分数","提示",JOptionPane.YES_NO_OPTION);

if(in == JOptionPane.YES_OPTION){

// System.out.println("YES");

String s = JOptionPane.showInputDialog(f,"输入你的名字:");

try{

FileInputStream fis = new FileInputStream("GaoFen.ini");//先把以前的数据读出来加到写的数据前

InputStreamReader isr = new InputStreamReader(fis);

BufferedReader br = new BufferedReader(isr);

String s2,setOut = "";

while((s2=br.readLine())!= null){

setOut =setOut+s2+"\n";

}

FileOutputStream fos = new FileOutputStream("GaoFen.ini");//输出到文件流

s = setOut+s+":"+jiFenQi+"\n";

fos.write(s.getBytes());

}catch(Exception e){}

}

System.exit(0);

}

public void keyTyped(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void keyPressed(KeyEvent arg0) {

// System.out.println(arg0.getSource());

if(arg0.getKeyCode() == KeyEvent.VK_UP){//按上下时方向的值相应改变

if(fangXiang != 2){

fangXiang = 1;

// sheTou.setIcon(shang);//设置蛇的方向

}

// System.out.println("UP");

}

if(arg0.getKeyCode() == KeyEvent.VK_DOWN){

if(fangXiang != 1){

fangXiang = 2;

// sheTou.setIcon(xia);

}

// System.out.println("DOWN");

}

if(arg0.getKeyCode() == KeyEvent.VK_LEFT){//按左右时方向的值相应改变

if(fangXiang != 4){

fangXiang = 3;

// sheTou.setIcon(zhuo);

}

// System.out.println("LEFT");

}

if(arg0.getKeyCode() == KeyEvent.VK_RIGHT){

if(fangXiang != 3){

fangXiang = 4;

// sheTou.setIcon(you);

}

// System.out.println("RIGHT");

}

}

public void keyReleased(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void actionPerformed(ActionEvent arg0) {

// TODO 自动生成方法存根

JMenuItem JI = (JMenuItem)arg0.getSource();

if(JI == play){

out = true;

run = true;

isRuned = true;

gao.setEnabled(false);

zhong.setEnabled(false);

di.setEnabled(false);

}

if(JI == pause){

run = false;

}

if(isRuned == false){//如果游戏还没运行,才可以设置级别

if(JI == gao){

time = 200;

jianTime = 1;

JiBie = "高级";

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+" 时间:"+time+"ms 分数:"+jiFenQi);

}

if(JI == zhong){

time = 400;

jianTime = 2;

JiBie = "中级";

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+" 时间:"+time+"ms 分数:"+jiFenQi);

}

if(JI == di){

time = 500;

jianTime = 3;

JiBie = "低级";

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+" 时间:"+time+"ms 分数:"+jiFenQi);

}

}

if(JI == GF){

try{

FileInputStream fis = new FileInputStream("GaoFen.ini");

InputStreamReader isr = new InputStreamReader(fis);

BufferedReader br = new BufferedReader(isr);

String s,setOut = "";

while((s=br.readLine())!= null){

setOut =setOut+s+"\n";

}

if(setOut.equals("")){

JOptionPane.showMessageDialog(f,"暂无保存记录!","高分榜",JOptionPane.INFORMATION_MESSAGE);

}

else{

JOptionPane.showMessageDialog(f,setOut);

}

}catch(Exception e){

e.printStackTrace();

}

}

if(JI == ZZ){//关于作者

JOptionPane.showMessageDialog(f,"软件作者:申志飞\n地址:四川省绵阳市\nQQ:898513806\nE-mail:shenzhifeiok@126.com","关于作者",JOptionPane.INFORMATION_MESSAGE);

}

if(JI == YX){//关于游戏

JOptionPane.showMessageDialog(f,"贪吃蛇游戏\n游戏版本 V1.0","关于游戏",JOptionPane.INFORMATION_MESSAGE);

}

if(JI == QK){

try{

int select = JOptionPane.showConfirmDialog(f,"确实要清空记录吗?","清空记录",JOptionPane.YES_OPTION);

if(select == JOptionPane.YES_OPTION){

String setOut = "";

FileOutputStream fos = new FileOutputStream("GaoFen.ini");//输出到文件流

fos.write(setOut.getBytes());

}

}catch(Exception ex){}

}

}

}

//是我自己写的,本来里面有图片的,但无法上传,所以把图片去掉了,里面的ImageIcon等语句可以去掉。能正常运行。


网页名称:贪吃蛇java代码 Java贪吃蛇代码
文章起源:http://ybzwz.com/article/hephpd.html