java贪吃蛇源代码

时间: 2023-11-24 20:51:23 浏览: 42
以下是Java贪吃蛇的源代码,包括注释,希望对你有所帮助: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; public class Snake extends JPanel implements KeyListener, Runnable { private static final long serialVersionUID = 1L; // 游戏区域的宽度和高度 private static final int WIDTH = 800; private static final int HEIGHT = 600; // 蛇的初始长度 private static final int INIT_LENGTH = 3; // 蛇的每个方块的大小 private static final int BLOCK_SIZE = 20; // 游戏区域的行数和列数 private static final int ROWS = HEIGHT / BLOCK_SIZE; private static final int COLS = WIDTH / BLOCK_SIZE; // 蛇的移动速度 private static final int SPEED = 100; // 游戏区域 private Point[][] area = new Point[ROWS][COLS]; // 蛇的身体 private Point[] body = new Point[ROWS * COLS]; // 蛇的长度 private int length = INIT_LENGTH; // 蛇的方向 private int direction = KeyEvent.VK_RIGHT; // 食物的位置 private Point food = new Point(); // 游戏是否结束 private boolean gameOver = false; // 游戏是否暂停 private boolean paused = false; // 游戏得分 private int score = 0; // 随机数生成器 private Random random = new Random(); // 构造函数 public Snake() { // 初始化游戏区域 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { area[i][j] = new Point(j * BLOCK_SIZE, i * BLOCK_SIZE); } } // 初始化蛇的身体 for (int i = 0; i < INIT_LENGTH; i++) { body[i] = new Point(COLS / 2 - i, ROWS / 2); } // 初始化食物的位置 generateFood(); } // 生成食物的位置 private void generateFood() { int x = random.nextInt(COLS); int y = random.nextInt(ROWS); // 如果食物的位置和蛇的身体重合,则重新生成食物的位置 while (area[y][x].equals(food) || contains(body, length, new Point(x, y))) { x = random.nextInt(COLS); y = random.nextInt(ROWS); } food.setLocation(x, y); } // 判断点是否在数组中 private boolean contains(Point[] array, int length, Point point) { for (int i = 0; i < length; i++) { if (array[i].equals(point)) { return true; } } return false; } // 绘制游戏区域 private void drawArea(Graphics g) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { g.setColor(Color.WHITE); g.drawRect(area[i][j].x, area[i][j].y, BLOCK_SIZE, BLOCK_SIZE); } } } // 绘制蛇的身体 private void drawBody(Graphics g) { for (int i = 0; i < length; i++) { g.setColor(Color.GREEN); g.fillRect(body[i].x * BLOCK_SIZE, body[i].y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); } } // 绘制食物 private void drawFood(Graphics g) { g.setColor(Color.RED); g.fillOval(food.x * BLOCK_SIZE, food.y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); } // 绘制得分 private void drawScore(Graphics g) { g.setColor(Color.BLACK); g.setFont(new Font("宋体", Font.BOLD, 20)); g.drawString("得分:" + score, 20, 30); } // 绘制游戏结束 private void drawGameOver(Graphics g) { g.setColor(Color.BLACK); g.setFont(new Font("宋体", Font.BOLD, 40)); g.drawString("游戏结束!", WIDTH / 2 - 120, HEIGHT / 2); } // 绘制游戏暂停 private void drawPaused(Graphics g) { g.setColor(Color.BLACK); g.setFont(new Font("宋体", Font.BOLD, 40)); g.drawString("游戏暂停!", WIDTH / 2 - 120, HEIGHT / 2); } // 绘制界面 private void draw(Graphics g) { drawArea(g); drawBody(g); drawFood(g); drawScore(g); if (gameOver) { drawGameOver(g); } if (paused) { drawPaused(g); } } // 移动蛇的身体 private void move() { // 记录蛇尾的位置 Point tail = body[length - 1]; // 将蛇的身体向前移动一格 for (int i = length - 1; i > 0; i--) { body[i] = body[i - 1]; } // 根据方向移动蛇头 switch (direction) { case KeyEvent.VK_UP: body[0] = new Point(body[0].x, body[0].y - 1); break; case KeyEvent.VK_DOWN: body[0] = new Point(body[0].x, body[0].y + 1); break; case KeyEvent.VK_LEFT: body[0] = new Point(body[0].x - 1, body[0].y); break; case KeyEvent.VK_RIGHT: body[0] = new Point(body[0].x + 1, body[0].y); break; } // 如果蛇头和食物重合,则蛇的长度加1,得分加10,并重新生成食物的位置 if (body[0].equals(food)) { body[length++] = tail; score += 10; generateFood(); } // 如果蛇头撞到游戏区域外或者撞到自己的身体,则游戏结束 if (body[0].x < 0 || body[0].x >= COLS || body[0].y < 0 || body[0].y >= ROWS || contains(body, length - 1, body[0])) { gameOver = true; } } // 处理键盘事件 @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); // 如果按下空格键,则暂停或继续游戏 if (key == KeyEvent.VK_SPACE) { paused = !paused; } // 如果游戏结束或暂停,则不处理键盘事件 if (gameOver || paused) { return; } // 如果按下方向键,则改变蛇的方向 switch (key) { case KeyEvent.VK_UP: case KeyEvent.VK_DOWN: case KeyEvent.VK_LEFT: case KeyEvent.VK_RIGHT: if (Math.abs(key - direction) != 2) { direction = key; } break; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } // 游戏循环 @Override public void run() { while (true) { try { Thread.sleep(SPEED); } catch (InterruptedException e) { e.printStackTrace(); } // 如果游戏结束或暂停,则不移动蛇的身体 if (gameOver || paused) { continue; } move(); repaint(); } } // 创建窗口并启动游戏 public void myJFrame() { JFrame frame = new JFrame("贪吃蛇"); frame.setSize(WIDTH, HEIGHT); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.addKeyListener(this); frame.add(this); frame.setVisible(true); new Thread(this).start(); } public static void main(String[] args) { Snake snake = new Snake(); snake.myJFrame(); } } ```

相关推荐

最新推荐

recommend-type

贪吃蛇源代码(c语言)

#include "graphics.h" #include "stdio.h" #define MAX 200 #define MAXX 30 #define MAXY 30 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #define RIGHT 19712 #define ESC 283 ...
recommend-type

C语言实现贪吃蛇游戏代码

本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 //------------------------------------------problm区------------------------------ //①思考typedef 定义的变量如何利用fwrite...
recommend-type

基于Java的贪吃蛇设计

基于java的贪吃蛇设计,简单实现,文档, ecplise编程 附录源码
recommend-type

CSharp 贪吃蛇源代码

注释明了,并有图片参考。初学者容易接受!! 注意:如有什么疑问,请留言!
recommend-type

2024华为OD机试D卷 - 最多购买宝石数目 - 免费看解析和代码.html

私信博主免费获取真题解析以及代码
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。