一、项目准备

需求分析:
实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏结束界面。
编程语言及开发工具:
java 基于IDEA

二、实现过程

在屏幕区域内绘制出一条小蛇,并且在与蛇不重合的屏幕区域内随机出现一个食物,游戏者通过键盘操纵游戏小蛇上下左右移动来吃到食物,当食物成功被小蛇吃到后,会在另外的区域重新刷新出食物,而小蛇由于吃到食物,身体会增长。

具体情况详见代码及其注释。由于时间关系,我所做的贪吃蛇略去了拓展功能部分。

三、代码部分

Main类

package com.company;import javax.swing.*;public class Main {public static void main(String[] args) {// 创建窗口JFrame frame = new JFrame("贪吃蛇");// 固定窗口大小frame.setResizable(false);// 设置窗口出现位置和大小frame.setBounds(540,10,675,675);// 让窗口可关闭frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 添加游戏面板的组件frame.add(new GamePanel());// 设置窗口可见性frame.setVisible(true);}
}

DATA类

package com.company;import javax.swing.*;
import java.net.URL;public class DATA {private static URL bodyURL = (Main.class.getResource("绿块.png"));private static ImageIcon body = new ImageIcon(bodyURL);private static ImageIcon food = new ImageIcon(Main.class.getResource("蛋.png"));private static ImageIcon up = new ImageIcon(Main.class.getResource("蛇向上.png"));private static ImageIcon down = new ImageIcon(Main.class.getResource("蛇向下.png"));private static ImageIcon left = new ImageIcon(Main.class.getResource("蛇向左.png"));private static ImageIcon right = new ImageIcon(Main.class.getResource("蛇向右.png"));public static ImageIcon getBody() {return body;}public static void setBody(ImageIcon body) {DATA.body = body;}public static ImageIcon getUp() {return up;}public static void setUp(ImageIcon up) {DATA.up = up;}public static ImageIcon getDown() {return down;}public static void setDown(ImageIcon down) {DATA.down = down;}public static ImageIcon getLeft() {return left;}public static void setLeft(ImageIcon left) {DATA.left = left;}public static ImageIcon getRight() {return right;}public static void setRight(ImageIcon right) {DATA.right = right;}public static ImageIcon getFood() {return food;}public static void setFood(ImageIcon food) {DATA.food = food;}
}

此部分用于存放游戏所需外部素材,例如蛇头、蛇身图片等。

GamePanel类

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.Random;public class GamePanel extends JPanel implements KeyListener, ActionListener {// 设置蛇头的方向String snakeHead;// 蛇的长度int length;int[] snakeX;int[] snakeY;// 游戏状态:开始=true - 停止=falseboolean isStart = false;// 定时器:第一个参数就是定时执行时间Timer timer = new Timer(170, this);// 食物int foodX;int foodY;// 让食物出现的位置随机Random random = new Random();// 游戏是否结束:结束为=true - 游戏中=falseboolean isFail = false;// 游戏是否胜利:胜利为true - 没胜利为falseboolean isVictory = false;// 游戏分数int score;public GamePanel() {// 初始化面板init();// 设置焦点事件this.setFocusable(true);// 给面板添加键盘监听事件this.addKeyListener(this);timer.start();}public void init() {// 初始化蛇头向右snakeHead = "right";// 初始化蛇有三节,包括小脑袋length = 3;snakeX = new int[1000];snakeY = new int[1000];snakeX[0] = 75;snakeY[0] = 75;snakeX[1] = 50;snakeY[1] = 75;snakeX[2] = 25;snakeY[2] = 75;// 初始化实物数据foodX = 75 + 25 * random.nextInt(21);foodY = 75 + 25 * random.nextInt(19);// 让生成的食物不会和蛇重合for (int i = 0; i < length; i++) {if (foodX == snakeX[i] && foodY == snakeY[i]) {foodX = 75 + 25 * random.nextInt(21);foodY = 100 + 25 * random.nextInt(19);i = 0;}}// 初始化游戏分数score = 0;}// 画组件@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 设置面板背景色this.setBackground(Color.white);// 绘制游戏区域g.fillRect(25, 50, 600, 575);// 绘制蛇头if (snakeHead.equals("up")) {DATA.getUp().paintIcon(this, g, snakeX[0], snakeY[0]);} else if (snakeHead.equals("down")) {DATA.getDown().paintIcon(this, g, snakeX[0], snakeY[0]);} else if (snakeHead.equals("left")) {DATA.getLeft().paintIcon(this, g, snakeX[0], snakeY[0]);} else if (snakeHead.equals("right")) {DATA.getRight().paintIcon(this, g, snakeX[0], snakeY[0]);}// 绘制蛇的身体for (int i = 1; i < length; i++) {DATA.getBody().paintIcon(this, g, snakeX[i], snakeY[i]);}// 画食物DATA.getFood().paintIcon(this, g, foodX, foodY);// 绘制局内游戏信息g.setColor(Color.black);g.setFont(new Font("仿宋", Font.BOLD, 15));g.drawString("长度:" + length, 25, 20);g.drawString("分数:" + score, 25, 40);// 绘制游戏暂停时的 提示信息if (!isStart) {g.setColor(Color.white);g.setFont(new Font("仿宋", Font.BOLD, 40));g.drawString("按下空格开始游戏!", 125, 300);}// 绘制游戏失败时的 提示信息if (isFail) {g.setColor(Color.red);g.setFont(new Font("仿宋", Font.BOLD, 40));g.drawString("失败,按下空格重新开始", 125, 300);}// 绘制游戏胜利时的 提示信息if (isVictory) {g.setColor(Color.red);g.setFont(new Font("宋体", Font.BOLD, 35));g.drawString("胜利,你是为数不多的天才", 125, 300);g.drawString("按下空格重新开始新一轮游戏", 100, 350);}}// 键盘监听事件,某个键按下执行方法@Overridepublic void keyPressed(KeyEvent e) {/*当用户按下空格时:先判断游戏有没有结束,如果游戏结束那么就重新开始如果游戏没有结束那么就继续原来的游戏*/if (e.getKeyCode() == KeyEvent.VK_SPACE) {if (isFail || isVictory) {isFail = false;isVictory = false;init();} else {isStart = !isStart;}repaint();}// 让用户用键盘的上下左右键来操作蛇头,// 并且让蛇不能直接回头,当蛇在往上走,那么就不能立刻往下走if (e.getKeyCode() == KeyEvent.VK_UP) {snakeHead = snakeHead.equals("down") ? "down" : "up";} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {snakeHead = snakeHead.equals("up") ? "up" : "down";} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {snakeHead = snakeHead.equals("right") ? "right" : "left";} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {snakeHead = snakeHead.equals("left") ? "left" : "right";}}// 定时执行的操作@Overridepublic void actionPerformed(ActionEvent e) {// 如果游戏处于开始状态,并且没有结束,则小蛇可以移动if (isStart && !isFail && !isVictory) {// 身体移动:右移:即让后一个移到前一个的位置即可!for (int i = length - 1; i > 0; i--) {snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}//  头部移动,通过方向控制,;if (snakeHead.equals("right")) {snakeX[0] = snakeX[0] + 25;if (snakeX[0] > 600) snakeX[0] = 25;} else if (snakeHead.equals("left")) {snakeX[0] = snakeX[0] - 25;if (snakeX[0] < 25) snakeX[0] = 600;} else if (snakeHead.equals("up")) {snakeY[0] = snakeY[0] - 25;if (snakeY[0] < 50) snakeY[0] = 600;} else if (snakeHead.equals("down")) {snakeY[0] = snakeY[0] + 25;if (snakeY[0] > 600) snakeY[0] = 50;}// 吃食物:当蛇头和食物的坐标一致时,算吃到食物if (snakeX[0] == foodX && snakeY[0] == foodY) {length++;// 每吃一个食物,增加10积分score = score + 10;// 长度等于300,游戏获胜// 当length到达一定的值,蛇移动的速度就变快if (length == 300) {isVictory = true;} else if (length == 25) {timer = new Timer(145, this);} else if (length == 50) {timer = new Timer(125, this);} else if (length == 100) {timer = new Timer(100, this);} else if (length == 200) {timer = new Timer(70, this);}// 重新生成食物foodX = 75 + 25 * random.nextInt(21);foodY = 75 + 25 * random.nextInt(19);// 让生成的食物不会和蛇重合for (int i = 0; i < length; i++) {if (foodX == snakeX[i] && foodY == snakeY[i]) {foodX = 75 + 25 * random.nextInt(21);foodY = 75 + 25 * random.nextInt(19);i = 0;}}}// 结束判断,头和身体的坐标一致时,游戏结束for (int i = 2; i < length; i++) {if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {System.out.println(Arrays.toString(snakeX));System.out.println(Arrays.toString(snakeY));timer.setDelay(170);//死亡重置定时器isFail = true;}}// 需要不断的更新页面实现动画repaint();}// 让时间动起来!timer.start();}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}}

游戏面板类,包含各种操作功能,是游戏的主要模块。

四、程序演示

界面:

功能介绍:

一、蛇初始长度为三,按下空格后开始游戏,默认向右移动。
二、蛇越过边界后会从另一边的边界返回游戏区域。当蛇头触碰到蛇身时,游戏结束。
三、按下空格暂停、继续游戏。
四、当蛇身长度分别为达到、十、十五、二十时,蛇的移动速度都会增加,上限约为初始速度的3倍,死亡后速度重置。当长度达到30时,默认玩家达成游戏胜利。

遇到的问题:

如图

当蛇吃到食物的瞬间,长度并未增长,同时界面左上角固定出现一瞬间的身体方块。推测是画笔模块每次渲染间隔的原因。由于快要考试,没有时间修改,先挖个坑以后再说。

【使用java swing制作简易贪吃蛇游戏】软件实习项目二相关推荐

  1. JAVA简易贪吃蛇游戏实现

    JAVA简易贪吃蛇游戏实现 自学java不久,最近看了些GUI编程,就拿贪吃蛇练个手,很基础 刚学的 也是最简易的版本.纯粹就想通过博客记录来巩固自己的学习效果. 游戏介绍 玩家通过按键控制蛇身的移动 ...

  2. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇

    作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...

  3. java超级简单贪吃蛇_java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; pu ...

  4. java从零开发贪吃蛇游戏全流程

    java从零开始开发贪吃蛇 1.游戏介绍 贪吃蛇是一款经典的益智类小游戏,是最初的翻盖机里面最常见的小游戏之一,学过编程的你有没有想过自己尝试着制作一款自己的贪吃蛇呢. 接下来我将从零开始带着大家做一 ...

  5. 贪吃蛇 java下载_Java实现贪吃蛇游戏源码

    本文实例为大家分享了Java实现贪吃蛇游戏源码的具体代码,供大家参考,具体内容如下 1.StartGame package com.qiang.snake; import javax.swing.*; ...

  6. 软件实习项目二:贪吃蛇的游戏开发

    目录 一.实验内容: 二.实验准备 三.程序代码 四.成果展示 一.实验内容: 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子.玩家能利用上下左右键控制" ...

  7. 贪吃蛇计时器怎么编写java_java编写简易贪吃蛇游戏

    本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下 程序共包含以下两个文件: 文件:ShellWin.java import java.awt.Color; import java ...

  8. 贪吃蛇游戏java代码_Java实现贪吃蛇游戏

    最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现 * 蛇: 采用单链表记录首尾,整个蛇被分为lattic ...

  9. Java的GUI编程---贪吃蛇游戏实现

    绘制静态窗口 代码实现 package com.akita.snake;import javax.swing.*;public class StartGames {public static void ...

最新文章

  1. 观察者模式(Observer)
  2. java singleton 多线程_Java创建线程安全的单例singleton
  3. leetcode-Symmetric Tree 对称树
  4. java反射机制原理详解_java反射机制的详细讲解
  5. oracle的排序分页,oracle 排序分页 高效sql语句
  6. pdo oracle返回参数游标,PDOStatement::closeCursor
  7. org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result
  8. JavaScript Tree 功能强大,包含checkbox,自动选择子节点和父节点.
  9. mongodb创建超级管理员_MongoDB 用户、库、表的管理
  10. VMware centos7配置以及SecureCRT连接
  11. linux中grep命令,Linux下grep命令详解
  12. tomcat加载出现找不到web
  13. 华为日历怎么显示一月_华为10手机日历图标在哪 华为日历怎么显示
  14. error: exportArchive: No signing certificate “iOS Distribution“ found
  15. CF小组训练赛 Holiday 19
  16. HTML元素分类:inline、inline-block、block
  17. java.sql.SQLException: 无效的列类型: 1111 报错问题解决
  18. 伯克利『全栈深度学习』2022最新课程;谷歌『基于Transformers的通用超参数优化』经验分享;动图编辑器;前沿论文 | ShowMeAI资讯日报
  19. 学生成绩预测模型_华中农大学子在美国大学生数学建模竞赛中获佳绩
  20. Verilog实现一个8位带进位全加器

热门文章

  1. 去除Opera与迅雷的关联
  2. mysql 悲观锁实现
  3. javaSocket基础
  4. 幼儿园案例经验迁移_幼儿园教学案例分析
  5. Deepsentibank
  6. 串的基本操作及统计字符频度-数据结构类C语言
  7. 计算机组成原理实验-logisim实现自动售糖机
  8. kotlin协程+retrofit简单取消接口回调
  9. 介绍计算机专业说明文,介绍电脑的说明文600字
  10. 17开头的是什么号码?为什么17开头手机号最好不要用