Java开发贪吃蛇小游戏

文章目录

  • Java开发贪吃蛇小游戏
    • 一、开发思路
    • 二、具体开发过程
      • 1.绘制静态游戏窗口
      • 2.导入素材图标
      • 3.绘制游戏面板
      • 4.绘制一条静态的小蛇
      • 5.让小蛇动起来
        • ①监听键盘输入
        • 实现Keylistener接口,重写KeyPressed()方法(键盘按下)
        • ②构造定时器监听时间
        • ③实现ActionListener接口(事件监听)
      • 6.使用户能通过键盘控制蛇的方向
      • 7.加入食物和积分系统
      • 8.失败判定
    • 三、效果截图
    • 四、源码

一、开发思路

  • 设定一个一定大小的且大小不可变的游戏窗口

  • 在创建的窗口上绘制游戏的基本面板样式

  • 使用提前保存的素材图标绘制一条静态的小蛇

  • 使小蛇能够移动;实际只需蛇头坐标移动,每节身体覆盖前一节身体坐标,设置定时器Timer timer =new Timer();监听时间让小蛇能移动

  • 监听键盘操作,使用户能通过键盘控制蛇的方向

  • 定义一个食物坐标,用random随机数类实现食物随机生成

  • 小蛇吃到食物时身体长度+1,实际是蛇头坐标与食物坐标重合时

  • boolean定义游戏失败的判断,当蛇头与任何身体部位坐标重合(或撞到边界)则游戏失败,可再设置积分系统,每吃到一次食物加一定分数

二、具体开发过程

1.绘制静态游戏窗口

JFrame jFrame = new JFrame("Greedy Snake");//绘制一个静态窗口
jFrame.setBounds(10,10,900,720);//设置界面大小
jFrame.setResizable(false);//窗口大小不可改变
jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置窗口关闭事件
jFrame.setVisible(true);//窗口显示
jFrame.add(new GamePanel());//面板添加到窗口

2.导入素材图标

public class Data {public static URL headerUrl = Data.class.getResource("/statics/header.png");//定位图片地址public static ImageIcon header =new ImageIcon(headerUrl);//通过图片地址绘制图片
}

3.绘制游戏面板

@Overrideprotected void paintComponent(Graphics g) {         //Graphics:画笔super.paintComponent(g);//清屏this.setBackground(Color.darkGray);//设置背景颜色Data.header.paintIcon(this,g,25,11);//绘制头部广告栏g.fillRect(25,75,850,600);//绘制游戏区域

4.绘制一条静态的小蛇

定义

int length;//蛇的长度int[] snakeX=new int[600];int[] snakeY=new int[500];//蛇的坐标String dir;//脑袋方向boolean isStart=false;boolean isFail for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}}repaint();=false;

绘制

if (dir.equals("R")) {Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);} else if (dir.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);}//脑袋(上下左右4个方向)for (int i = 1; i < length; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//通过循环绘制身体长度

5.让小蛇动起来

①监听键盘输入
实现Keylistener接口,重写KeyPressed()方法(键盘按下)
public void keyPressed(KeyEvent e) {   //键盘按下未释放int keyCode = e.getKeyCode();if(keyCode==KeyEvent.VK_SPACE){//空格键if (isFail){isFail=false;init();//重新初始化}else {//暂停游戏isStart=!isStart;}repaint();//刷新界面}
}
②构造定时器监听时间
Timer timer =new Timer(50,this);//定时器
③实现ActionListener接口(事件监听)

重写actionPerformed(ActionEvent e)方法

@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//游戏处于开始状态并且游戏没有失败for (int i = length-1; i >0; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];//身体移动}if (dir.equals("R")) {snakeX[0]=snakeX[0]+25;//脑袋移动} else if (dir.equals("L")){snakeX[0]=snakeX[0]-25;} else if (dir.equals("U")){snakeY[0]=snakeY[0]-25;} else if (dir.equals("D")){snakeY[0]=snakeY[0]+25;}repaint();//刷新页面}timer.start();//令时间开始动起来}

6.使用户能通过键盘控制蛇的方向

 @Overridepublic void keyPressed(KeyEvent e) {if (keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){if (!dir.equals("D")){//使小蛇不能直接回头dir="U";}}else if (keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){if (!dir.equals("U")){dir="D";}}else if (keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){if (!dir.equals("R")){dir="L";}}else if (keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D) {if (!dir.equals("L")) {dir = "R";}}
}

7.加入食物和积分系统

int foodX;int foodY;//定义食物坐标Random random=new Random();//随机数类//绘制食物Data.food.paintIcon(this,g,foodX,foodY);if (snakeX[0]==foodX&&snakeY[0]==foodY){//脑袋和食物坐标重合length++;//长度+1score+=10;//分数+10foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//重新生成食物}

8.失败判定

 for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}//蛇头坐标与身体重合}
if (snakeX[0]>=850||snakeX[0]<=25||snakeY[0]<=75||snakeY[0]>=650){isFail=true;}//设定撞墙失败

三、效果截图

  • 开始

  • 失败

四、源码

StartGames.Java

package com.wx.snake;
import javax.swing.*;
public class StartGames {public static void main(String[] args) {JFrame jFrame = new JFrame("Greedy Snake");//绘制一个静态窗口jFrame.setBounds(10,10,900,720);//设置界面大小jFrame.setResizable(false);//窗口大小不可改变jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置窗口关闭事件jFrame.setVisible(true);//窗口显示 jFrame.add(new GamePanel());//面板添加到窗口}
}

GamePanel.java

package com.wx.snake;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.Random;public class GamePanel extends JPanel implements KeyListener, ActionListener {//JPanel:面板容器类,可以加入到JFrameint length;//蛇的长度int[] snakeX=new int[600];int[] snakeY=new int[500];//蛇的坐标String dir;//脑袋方向boolean isStart=false;Timer timer =new Timer(50,this);//定时器int foodX;int foodY;//定义食物坐标Random random=new Random();//随机数类boolean isFail=false;//死亡判断int score;//积分系统//构造器public GamePanel(){init();//获取键盘的监听事件this.setFocusable(true);//聚集键盘焦点在游戏界面this.addKeyListener(this);//添加监听timer.start();//令时间开始动起来}//初始化public void init(){length=3;snakeX[0]=100;snakeY[0]=100;//头部坐标snakeX[1]=snakeX[0]-25;snakeY[1]=snakeY[0];//第一节身体坐标snakeX[2]=snakeX[0]-50;snakeY[2]=snakeY[0];//第二节身体坐标dir="R";foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//食物随机坐标score=0;}//画板(画界面、画蛇)@Overrideprotected void paintComponent(Graphics g) {         //Graphics:画笔super.paintComponent(g);//清屏this.setBackground(Color.darkGray);//设置背景颜色Data.header.paintIcon(this,g,25,11);//绘制头部广告栏g.fillRect(25,75,850,600);//绘制游戏区域//绘制静态小蛇if (dir.equals("R")) {Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);} else if (dir.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);}//脑袋(上下左右4个方向)for (int i = 1; i < length; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//通过循环绘制身体长度if(isStart==false){//游戏提示:是否开始g.setColor(Color.ORANGE); //设置画笔颜色g.setFont(new Font("黑体",Font.BOLD,40));//设置字体g.drawString("按下空格开始游戏",300,300);  //画一个文字}//绘制食物Data.food.paintIcon(this,g,foodX,foodY);//失败提醒if (isFail){g.setColor(Color.red); //设置画笔颜色g.setFont(new Font("楷体",Font.BOLD,40));//设置字体g.drawString("  游戏失败",335,300);  //画一个文字g.drawString("你的分数 "+score,333,350);g.drawString("按空格重新开始",310,400);}//积分g.setColor(Color.CYAN); //设置画笔颜色g.setFont(new Font("方正粗黑宋简体",Font.BOLD,20));//设置字体g.drawString("长度:"+length,750,34);  //画一个文字g.drawString("分数:"+score,750,59);}//接收键盘输入:监听@Overridepublic void keyPressed(KeyEvent e) {   //键盘按下未释放int keyCode = e.getKeyCode();if(keyCode==KeyEvent.VK_SPACE){//空格键if (isFail){isFail=false;init();//重新初始化}else {//暂停游戏isStart=!isStart;}repaint();//刷新界面}if (keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){if (!dir.equals("D")){dir="U";}}else if (keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){if (!dir.equals("U")){dir="D";}}else if (keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){if (!dir.equals("R")){dir="L";}}else if (keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D) {if (!dir.equals("L")) {dir = "R";}}}//定时器,监听时间,帧:执行定时操作@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//游戏处于开始状态并且游戏没有失败for (int i = length-1; i >0; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];//身体移动}if (dir.equals("R")) {snakeX[0]=snakeX[0]+25;//脑袋移动//if (snakeX[0]>850){snakeX[0]=25;}//边界判断} else if (dir.equals("L")){snakeX[0]=snakeX[0]-25;//if (snakeX[0]<25){snakeX[0]=850;}//边界判断} else if (dir.equals("U")){snakeY[0]=snakeY[0]-25;// if (snakeY[0]<75){snakeY[0]=650;}//边界判断} else if (dir.equals("D")){snakeY[0]=snakeY[0]+25;//if (snakeY[0]>650){snakeY[0]=75;}//边界判断}if (snakeX[0]>=850||snakeX[0]<=25||snakeY[0]<=75||snakeY[0]>=650){isFail=true;}//设定撞墙失败if (snakeX[0]==foodX&&snakeY[0]==foodY){//脑袋和食物坐标重合length++;//长度+1score+=10;foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//重新生成食物}//失败判断for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}}repaint();}timer.start();//令时间开始动起来}@Overridepublic void keyTyped(KeyEvent e) {}//键盘按下弹起@Overridepublic void keyReleased(KeyEvent e) {}//键盘释放
}

Java开发贪吃蛇小游戏相关推荐

  1. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  2. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

  3. 用 Java 实现贪吃蛇小游戏

    程序说明 这是一个用 Java Awt 实现的贪吃蛇小游戏的完整代码 算法分析 (一)启动一个独立线程根据 direction 重绘面板实现蛇身移动效果,运行过程: 记录上次头部的坐标到 tempBo ...

  4. Java实现贪吃蛇小游戏(附完整源码)

    今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现. 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的.因此,第一步就是写一个小界面. 实现代码 ...

  5. Java Swing 贪吃蛇小游戏

    静态资源参考: 注:实际上没有用到header.png. 工程目录: 源码: package snake;import javax.swing.*; import java.net.URL;/*** ...

  6. java 实现贪吃蛇小游戏

    在贪吃蛇游戏中,贪吃蛇的移动可以看作是一个先进先出的队列(从蛇尾的角度看),因此我们在C语言实现贪吃蛇小游戏一文中使用了循环链接表作为队来存储蛇身节点,在 python实现贪吃蛇小游戏一文中,使用列表 ...

  7. python贪吃蛇小游戏_python开发贪吃蛇小游戏

    3.概要设计 3.1 程序功能模块 由设计应解决的问题可知,本次的设计是使用用方向键来实现一个简易的贪吃蛇小游戏的程序,具体的功能模块如图3-1所示. 图3-1 程序功能模块 Fig.3-1 prog ...

  8. 初识Java之贪吃蛇小游戏

    一.绘制静态窗口 这是一个简陋的窗口 package Snake;import javax.swing.*;public class StartGames {public static void ma ...

  9. JavaSE项目 | 纯Java实现贪吃蛇小游戏

    目录 一:贪吃蛇游戏的实现步骤 1. 画出窗口 2. 在窗口上添加画布 3. 在画布上添加黑色游戏区 4. 放静态蛇 5. 定义蛇的数据结构 6. 控制蛇头方向 7. 放上开始提示信息 8. 按空格键 ...

最新文章

  1. 打包几乎各程序都需要用到的宏命令和使用名空间
  2. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
  3. 实战:基于深度学习和几何的3D边界框估计
  4. react开发教程(十)redux结合react
  5. 正则表达式笔试题php,2017年初级PHP程序员笔试题
  6. jmeter展示内存cpu_基于Docker的jmeter弹性压测(2)监控
  7. 【Go语言】【2】Sublime配置GO开发环境
  8. java第三次实验作业
  9. Linux LVS Keepalived实现Httpd服务器80端口的负载均衡
  10. java修改cookie的值_Java管理Cookie增删改查操作。
  11. outermost shell_outermost是什么意思_outermost的翻译_音标_读音_用法_例句_爱词霸在线词典...
  12. 关于svn汉化包安装无效的解决办法
  13. Linux下的虚拟光驱和虚拟软驱
  14. 文本到图像模型,如何快速生成高质量图片? #Google Muse AI
  15. VRP介绍以及AC初始化配置介绍
  16. gcc开启C99或C11标准支持
  17. 博瑞云音箱云喇叭开发文档API接口文档开发指南(21-12-20)
  18. 月薪13k的腾讯测试岗,面试原来这么简单
  19. Fitbit面临着对女性时期设定限制的愤怒
  20. 关于我一不小心拆了个USB2.0拓展坞这件事——浅谈HS8836A芯片

热门文章

  1. 3D建模软件小技巧:如何提高纹理贴图清晰度
  2. Bobi‘s Blog个人博客
  3. 计算机考试慢跑运动,每周4次,每次30分钟,跑步真的会让你变得更聪明
  4. JSP基础程序以及指令的使用
  5. 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程
  6. MySQL 根据关键字(keyword)查询
  7. Emlog调用数据库加速显示标签tag缓存优化方法教程
  8. Vue el-table实现拖曳调整顺序
  9. DevOps Master课程总结:知否知否,应是DevOps肥ITIL瘦
  10. 关于Android项目相机使用(一)-------相机调用