【Java】Java实现贪吃蛇小游戏(带详细注释)

源码

源码来源:Java swing 写的贪吃蛇代码200行
前段时间在博客上看到了这段源码,由于自己没有用Java做过小游戏,于是就copy了一下,然后在自己电脑上运行,顺便加上了注释。

代码

greedySnackMain.java

import javax.swing.JFrame;

public class greedySnackMain extends JFrame {
   
    snackWin snackwin;
    static final int Width = 800 , Height = 600 , LocX = 200 , LocY = 80;

    public greedySnackMain() {
        super("GreedySncak_SL");
        snackwin = new snackWin();
        //在JFrame窗口容器里添加其他组件
        add(snackwin);
        //设置组件的大小
        this.setSize(Width, Height);
        //设置组件的可见性
        this.setVisible(true);
        //设置组件的位置
        this.setLocation(LocX, LocY);
        //snackwin.requestFocus();
    }

    public static void main(String[] args) {
        new greedySnackMain();
    }
}

snackWin.java

import java.awt.Color;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class snackWin extends JPanel implements ActionListener, KeyListener {
   

//     用数字代表方向
    static final int Up = 0 , Down = 1 , Left = 2 , Right = 3;
//    GameWidth/GameHeight :游戏区域的宽、高
//    GameLocX / GameLocY:游戏区域的左上角位置的坐标
    static final int GameLocX = 50, GameLocY = 50 , GameWidth = 700 , GameHeight = 500 , Size = 10;//Size:每次移动的位置大小以及增加的长度
 //    rx,ry:食物的坐标
    static 
好的,下面是Java实现贪吃蛇小游戏代码,并附有详细注释: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.LinkedList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; // 游戏主体类 public class SnakeGame extends JPanel implements KeyListener { private static final long serialVersionUID = 1L; // 游戏区域的大小 private static final int WIDTH = 800; private static final int HEIGHT = 800; // 蛇的移动速度 private static final int SPEED = 100; // 蛇身的长度 private static final int LENGTH = 20; // 蛇头的初始位置 private static final int HEAD_X = WIDTH / 2; private static final int HEAD_Y = HEIGHT / 2; // 食物的初始位置 private static final int FOOD_X = 100; private static final int FOOD_Y = 100; // 蛇的移动方向 private static final int DIR_UP = 1; private static final int DIR_DOWN = -1; private static final int DIR_LEFT = 2; private static final int DIR_RIGHT = -2; // 随机数生成器 private Random random = new Random(); // 记录蛇的身体 private LinkedList<Point> snake = new LinkedList<Point>(); // 记录蛇的移动方向 private int direction = DIR_UP; // 记录游戏是否结束 private boolean isGameOver = false; // 记录当前得分 private int score = 0; // 构造方法 public SnakeGame() { // 设置游戏区域的大小 setPreferredSize(new java.awt.Dimension(WIDTH, HEIGHT)); // 添加键盘事件监听器 addKeyListener(this); // 初始化蛇的身体 snake.add(new Point(HEAD_X, HEAD_Y)); snake.add(new Point(HEAD_X, HEAD_Y + LENGTH)); snake.add(new Point(HEAD_X, HEAD_Y + LENGTH * 2)); // 开始游戏循环 new Thread(new Runnable() { @Override public void run() { while (!isGameOver) { try { // 暂停一定时间,控制蛇的移动速度 Thread.sleep(SPEED); // 移动蛇的身体 move(); // 重绘游戏区域 repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } // 绘制游戏区域 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制蛇的身体 for (Point p : snake) { g.setColor(Color.GREEN); g.fillRect(p.x, p.y, LENGTH, LENGTH); } // 绘制食物 g.setColor(Color.RED); g.fillRect(FOOD_X, FOOD_Y, LENGTH, LENGTH); // 绘制得分 g.setColor(Color.BLACK); g.drawString("Score: " + score, 10, 20); // 绘制游戏结束的提示信息 if (isGameOver) { g.setColor(Color.BLACK); g.drawString("Game Over", WIDTH / 2 - 30, HEIGHT / 2); } } // 移动蛇的身体 private void move() { // 计算蛇头的新位置 Point head = snake.getFirst(); Point newHead = new Point(head); switch (direction) { case DIR_UP: newHead.y -= LENGTH; break; case DIR_DOWN: newHead.y += LENGTH; break; case DIR_LEFT: newHead.x -= LENGTH; break; case DIR_RIGHT: newHead.x += LENGTH; break; } // 判断蛇头是否撞到墙壁 if (newHead.x < 0 || newHead.x >= WIDTH || newHead.y < 0 || newHead.y >= HEIGHT) { isGameOver = true; return; } // 判断蛇头是否撞到自己的身体 for (Point p : snake) { if (p.equals(newHead)) { isGameOver = true; return; } } // 判断蛇头是否吃到了食物 if (newHead.x == FOOD_X && newHead.y == FOOD_Y) { score += 10; genFood(); } else { snake.removeLast(); } // 将新的蛇头加入到蛇的身体中 snake.addFirst(newHead); } // 生成食物的位置 private void genFood() { int x = random.nextInt(WIDTH / LENGTH) * LENGTH; int y = random.nextInt(HEIGHT / LENGTH) * LENGTH; FOOD_X = x; FOOD_Y = y; } // 处理键盘事件,改变蛇的移动方向 public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (direction != DIR_DOWN) { direction = DIR_UP; } break; case KeyEvent.VK_DOWN: if (direction != DIR_UP) { direction = DIR_DOWN; } break; case KeyEvent.VK_LEFT: if (direction != DIR_RIGHT) { direction = DIR_LEFT; } break; case KeyEvent.VK_RIGHT: if (direction != DIR_LEFT) { direction = DIR_RIGHT; } break; } } // 必须实现的方法,用于处理键盘事件 public void keyReleased(KeyEvent e) { } // 必须实现的方法,用于处理键盘事件 public void keyTyped(KeyEvent e) { } // 游戏的入口方法 public static void main(String[] args) { JFrame frame = new JFrame("贪吃蛇小游戏"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new SnakeGame()); frame.pack(); frame.setVisible(true); } } ``` 以上就是Java实现贪吃蛇小游戏代码注释,希望能对你有所帮助!
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值