×

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

java贪吃蛇代码注释求解?如何用Java语言写一个贪吃蛇游戏

admin admin 发表于2022-07-12 15:53:42 浏览84 评论0

抢沙发发表评论

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 List《Node》 nodes = new ArrayList《Node》();
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语言写一个贪吃蛇游戏

首先,要设计游戏,必须设计设计界面。首先查看我设计的界面。将界面分为左侧和右侧的控制区域。游戏区域包含“得分信息”的游戏区域。和贪婪的蛇。右侧的控制区域具有“启动”,“悬架”和“停止”按钮,级别选择单选举框和游戏排名。

  • 因此,我们需要定义秋千组件并在类初始化时初始化这些组件,并添加组件。由于以后设计游戏时,我们必须准确地知道游戏区域的大小,因此请在此处设置游戏区域的固定值。最初,我想使用布局来更好地管理,但是作者没有掌握足够的布局,因此请先设置固定尺寸。-贪吃蛇代码java

  • 定义我们的游戏。贪婪的蛇游戏包含许多小网格,然后蛇在网格中移动。蛇由一系列网格组成。对于视觉效果,蛇用蓝色标记,食物标有红色,背景为白色。如第一张图片所示。因此,我们需要定义一个两个维数阵列,保存网格信息,保存网格信息,保存蛇身体和食物的位置信息。初始化时,您需要添加键盘事件以控制,向下,左右。-java贪吃蛇

  • 食物的位置信息为两个维度,因此我只是定义一个课程来保存两个维信息。

  • 然后是游戏的函数。开始,暂停,停止按钮添加事件控制游戏。级别按钮定义了游戏难度等。

  • 开始游戏后,我们定义了一个计时器。蛇的身体朝指定的方向移动。该方向由键盘的初始化和向上,向下,左和右键在键盘上添加的键盘事件控制。蛇形是连续的位置信息,保存到队列,因此蛇的运动是要增加团队的位置,请减少团队结束时的位置,然后重新绘制比赛区域。-贪吃蛇代码java

    当蛇的身体移动时,您可以吃食物,撞墙并打动自己的治疗。这是游戏的主要逻辑。

  • 最后,游戏结束了一个对话框,以提示是否保存游戏得分。我们制作了排名信息,仅保留了前10名的游戏分数。首先,游戏的游戏得分分类,它实现了比较界面是最早的。得分,时间首先分类。

  • 在游戏结束时保存分数信息,以查看是否进入排名。在先前加载初始化排名时,将加载游戏排名信息。

    通过保存和阅读排名信息,我们还熟悉文件阅读操作以及收集和分类算法的功能。

  • 求一份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 ArrayList《Rectangle》 list;
    public MySnake() {
    list = new ArrayList《Rectangle》();
    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贪吃蛇