在下面贪吃蛇游戏中增加记分机制import javaxswing;import javaawt;import javaawteventKeyEvent;import javaawteventKeyListener;import javautilArrayList;import javautilRandom;public class SnakeGame extends JFrame implemen
在贪吃蛇游戏中增加记分机制,可以按照以下步骤进行:
-
在 SnakeGame 类中添加一个 int 类型的变量 score,用于记录玩家得分。
-
在 initFood() 方法中,每次生成新的食物时,将 score 的值加上 10。
-
在 moveSnake() 方法中,判断蛇头是否与食物相撞,如果相撞,则将 score 的值加上 100。
-
在 paint() 方法中,添加显示得分的代码,可以使用 g.drawString() 方法将得分显示在游戏界面的某个位置上。
下面是修改后的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
public class SnakeGame extends JFrame implements KeyListener {
// 游戏界面大小
private final int WIDTH = 800;
private final int HEIGHT = 800;
// 网格大小
private static final int GRID_SIZE = 40;
// 贪吃蛇移动速度
private static final int SNAKE_SPEED = GRID_SIZE;
// 贪吃蛇
private ArrayList<Point> snake = new ArrayList<>();
private Point direction = new Point(1, 0); // 贪吃蛇移动方向
private Point food; // 食物
// 记录玩家得分
private int score = 0;
public SnakeGame() {
// 设置窗口大小和标题
setSize(WIDTH, HEIGHT);
setTitle("贪吃蛇小游戏");
// 设置窗口居中
setLocationRelativeTo(null);
// 添加键盘监听器
addKeyListener(this);
// 初始化贪吃蛇和食物
initSnake();
initFood();
// 显示窗口
setVisible(true);
}
// 初始化贪吃蛇
private void initSnake() {
// 初始长度为3
snake.add(new Point(2, 0));
snake.add(new Point(1, 0));
snake.add(new Point(0, 0));
}
// 初始化食物
private void initFood() {
Random random = new Random();
int x = random.nextInt(WIDTH / GRID_SIZE);
int y = random.nextInt(HEIGHT / GRID_SIZE);
food = new Point(x, y);
// 每次生成新的食物时,将 score 的值加上 10
score += 10;
}
// 绘制游戏界面
@Override
public void paint(Graphics g) {
// 清空画布
g.clearRect(0, 0, WIDTH, HEIGHT);
// 绘制网格
g.setColor(Color.GRAY);
for (int i = 0; i < WIDTH / GRID_SIZE; i++) {
g.drawLine(i * GRID_SIZE, 0, i * GRID_SIZE, HEIGHT);
}
for (int i = 0; i < HEIGHT / GRID_SIZE; i++) {
g.drawLine(0, i * GRID_SIZE, WIDTH, i * GRID_SIZE);
}
// 绘制贪吃蛇
g.setColor(Color.GREEN);
for (Point p : snake) {
g.fillRect(p.x * GRID_SIZE, p.y * GRID_SIZE, GRID_SIZE, GRID_SIZE);
}
// 绘制食物
g.setColor(Color.RED);
g.fillOval(food.x * GRID_SIZE, food.y * GRID_SIZE, GRID_SIZE, GRID_SIZE);
// 显示得分
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.PLAIN, 20));
g.drawString("得分:" + score, 20, 30);
}
// 贪吃蛇移动
private void moveSnake() {
// 计算新的蛇头位置
Point head = new Point(snake.get(0).x + direction.x, snake.get(0).y + direction.y);
// 判断是否撞墙
if (head.x < 0 || head.x >= WIDTH / GRID_SIZE || head.y < 0 || head.y >= HEIGHT / GRID_SIZE) {
JOptionPane.showMessageDialog(this, "你是真的菜");
System.exit(0);
}
// 判断蛇头是否与蛇身相撞
for (int i = 1; i < snake.size(); i++) {
if (head.equals(snake.get(i))) {
JOptionPane.showMessageDialog(this, "你是真的菜");
System.exit(0);
}
}
// 判断是否吃到食物
if (head.equals(food)) {
snake.add(0, head);
initFood();
// 如果吃到食物,则将 score 的值加上 100
score += 100;
} else {
snake.add(0, head);
snake.remove(snake.size() - 1);
}
// 刷新游戏界面
repaint();
}
// 键盘按下事件处理
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
if (direction.y != 1) {
direction.x = 0;
direction.y = -1;
}
break;
case KeyEvent.VK_DOWN:
if (direction.y != -1) {
direction.x = 0;
direction.y = 1;
}
break;
case KeyEvent.VK_LEFT:
if (direction.x != 1) {
direction.x = -1;
direction.y = 0;
}
break;
case KeyEvent.VK_RIGHT:
if (direction.x != -1) {
direction.x = 1;
direction.y = 0;
}
break;
}
}
// 必须实现的方法
@Override
public void keyTyped(KeyEvent e) {
}
// 必须实现的方法
@Override
public void keyReleased(KeyEvent e) {
}
public static void main(String[] args) {
SnakeGame game = new SnakeGame();
// 游戏循环
while (true) {
game.moveSnake();
try {
Thread.sleep(8000 / SNAKE_SPEED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/fGd0 著作权归作者所有。请勿转载和采集!