贪吃蛇游戏

1、界面绘制

  • startGame(启动器界面)
package com.company.snake;import javax.swing.*;
import java.awt.*;public class startGame {public static void main(String[] args) {JFrame jFrame = new JFrame("贪吃蛇小游戏");jFrame.setBounds(10, 10, 900, 720);jFrame.setResizable(false);//窗口大小不可变jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//正常游戏界面应该出现在面上jFrame.add(new gamePanel());jFrame.setVisible(true);}
}
  • gamePanel (面板绘制)
package com.company.snake;import javax.swing.*;
import java.awt.*;public class gamePanel extends JPanel {//绘制面板,我们游戏中所有东西,都是用这个画笔画@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);Data.header.paintIcon(this,g,25,11);g.fillRect(25,75,850,600);}
}
  • Data(数据中心)
package com.company.snake;import javax.swing.*;
import java.net.URL;public class Data {//相对路径 直接取jpg//绝对路径  /相当于当前目录public static URL headerURL= Data.class.getResource("/statics/header.png");public static URL upURL= Data.class.getResource("/statics/up.png");public static URL downURL= Data.class.getResource("/statics/down.png");public static URL leftURL= Data.class.getResource("/statics/left.png");public static URL rightURL= Data.class.getResource("/statics/right.png");public static ImageIcon header=new ImageIcon(headerURL);public static ImageIcon up=new ImageIcon(upURL);public static ImageIcon down=new ImageIcon(downURL);public static ImageIcon left=new ImageIcon(leftURL);public static ImageIcon right=new ImageIcon(rightURL);public static URL bodyURL= Data.class.getResource("/statics/body.png");public static ImageIcon body=new ImageIcon(bodyURL);public static URL foodURL= Data.class.getResource("/statics/food.png");public static ImageIcon food=new ImageIcon(foodURL);}

2、绘制静态小蛇

这里没有使用面向对象思想,直接在面板gamePanel进行初始化静态小蛇

package com.company.snake;import javax.swing.*;
import java.awt.*;public class gamePanel extends JPanel {//定义蛇的数据结构int length;int[] snakeX=new int[600];//蛇的x坐标int[] snakeY=new int[500];//蛇的y坐标String fx;//当前游戏状态boolean isStart=false;//构造器public gamePanel(){init();}//初始化方法public void init(){length=3;snakeX[0]=100;snakeY[0]=100;//脑袋坐标snakeX[1]=75;snakeY[1]=100;//第一个身体坐标snakeX[2]=50;snakeY[2]=100;//第二个身体坐标fx="R";//初始方法向右}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);Data.header.paintIcon(this,g,25,11);g.fillRect(25,75,850,600);//画小蛇 通过方向来判断初始化头朝向if(fx.equals("R")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(fx.equals("L")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(fx.equals("U")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(fx.equals("D")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}for (int i = 1; i <length ; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//游戏状态if(isStart==false){g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,40));//字体g.drawString("按下空格开始游戏",300,400);}}
}

3、游戏开始与停止

1、实现监听(仍然在面板gamePanel操作)

public class gamePanel extends JPanel implements KeyListener

2、重写方法

    //键盘监听事件@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//获得键盘按钮是哪一个if (keyCode ==KeyEvent.VK_SPACE){isStart=!isStart;//取反,可以实现停止和开始repaint();}}@Overridepublic void keyReleased(KeyEvent e) {}
}

3、构造器获取监听事件

public gamePanel() {init();//获得焦点和键盘事件this.setFocusable(true);//获得焦点事件this.addKeyListener(this);//获得键盘监听事件
}

4、小蛇移动

  • 实现一个计时器监听
implements KeyListener, ActionListener
  • 定时器
//定时器 以ms为单位1000ms=1s
Timer timer=new Timer(100,this);//100毫秒一次
  • 重写计时器代码,让小蛇移动
  //事件监听---需要通过固定时间刷新,1s10次@Overridepublic void actionPerformed(ActionEvent e) {if(isStart){//如果开始,就动起来//右移for (int i = length-1; i >0 ; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];}//走向if(fx.equals("R")){snakeX[0]=snakeX[0]+25;if(snakeX[0]>850){ snakeX[0]=25; } //边界判断}else if(fx.equals("L")){snakeX[0]=snakeX[0]-25;if(snakeX[0]<25){ snakeX[0]=850; } //边界判断}else if(fx.equals("U")){snakeY[0]=snakeY[0]-25;if(snakeY[0]<75){ snakeY[0]=650; } //边界判断}else if(fx.equals("D")){snakeY[0]=snakeY[0]+25;if(snakeY[0]>650){ snakeY[0]=75; } //边界判断}repaint();//重画画面}timer.start();//计时器}
}

5、吃食物变长

  • 在实体类定义食物坐标
//食物坐标
int foodX;
int foodY;
Random random=new Random();//随机生成
  • 初始化方法里面
foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);
  • 画板里面画食物
//画食物Data.body.paintIcon(this,g,foodX,foodY);
  • 最后在事件监听里面写上吃食物变长的方法
//吃食物
if(snakeX[0]==foodX&&snakeY[0]==foodY){length++;//两次随机食物foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);
}

6、积分和失败判定

  • 定义一个变量score
//积分
int score;
  • 初始值
score=0;
  • 画积分
//画积分
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度" + length, 300, 35);
g.drawString("分数" + score, 300, 52);
  • 在事件监听的位置加上吃到食物就加10分的方法
//分数加10
score=score+10;

7、gamePlanel完整代码

package com.company.snake;import sun.security.util.Length;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 {//定义蛇的数据结构int length;int[] snakeX = new int[600];//蛇的x坐标int[] snakeY = new int[500];//蛇的y坐标String fx;//食物坐标int foodX;int foodY;Random random=new Random();//随机生成//积分int score;//当前游戏状态boolean isStart = false;//游戏失败状态boolean isFail = false;//定时器 以ms为单位1000ms=1sTimer timer=new Timer(100,this);//100毫秒一次//构造器public gamePanel() {init();//获得焦点和键盘事件this.setFocusable(true);//获得焦点事件this.addKeyListener(this);//获得键盘监听事件timer.start();}//初始化方法public void init() {length = 3;snakeX[0] = 100;snakeY[0] = 100;//脑袋坐标snakeX[1] = 75;snakeY[1] = 100;//第一个身体坐标snakeX[2] = 50;snakeY[2] = 100;//第二个身体坐标fx = "R";//初始方法向右foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);score=0;}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);Data.header.paintIcon(this, g, 25, 11);g.fillRect(25, 75, 850, 600);//画小蛇 通过方向来判断初始化头朝向if (fx.equals("R")) {Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);} else if (fx.equals("L")) {Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);} else if (fx.equals("U")) {Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);} else if (fx.equals("D")) {Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);}for (int i = 1; i < length; i++) {Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);}//画积分g.setColor(Color.WHITE);g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度" + length, 300, 35);g.drawString("分数" + score, 300, 52);//画食物Data.food.paintIcon(this,g,foodX,foodY);//游戏状态if (isStart == false) {g.setColor(Color.white);g.setFont(new Font("微软雅黑", Font.BOLD, 40));//字体g.drawString("按下空格开始游戏", 300, 400);}//游戏失败if (isFail) {g.setColor(Color.red);g.setFont(new Font("微软雅黑", Font.BOLD, 50));//字体g.drawString("游戏失败", 360, 400);}}//键盘监听事件@Overridepublic void keyTyped(KeyEvent e) {}@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){fx="U";}else if (keyCode == KeyEvent.VK_DOWN){fx="D";}else if (keyCode == KeyEvent.VK_LEFT){fx="L";}else if (keyCode == KeyEvent.VK_RIGHT){fx="R";}}@Overridepublic void keyReleased(KeyEvent e) {}//事件监听---需要通过固定时间刷新,1s10次@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//如果开始,就动起来//吃食物if(snakeX[0]==foodX&&snakeY[0]==foodY){length++;//分数加10score=score+10;//两次随机食物foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);}//右移for (int i = length-1; i >0 ; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];}//走向if(fx.equals("R")){snakeX[0]=snakeX[0]+25;if(snakeX[0]>850){ snakeX[0]=25; } //边界判断}else if(fx.equals("L")){snakeX[0]=snakeX[0]-25;if(snakeX[0]<25){ snakeX[0]=850; } //边界判断}else if(fx.equals("U")){snakeY[0]=snakeY[0]-25;if(snakeY[0]<75){ snakeY[0]=650; } //边界判断}else if(fx.equals("D")){snakeY[0]=snakeY[0]+25;if(snakeY[0]>650){ snakeY[0]=75; } //边界判断}//失败的判定for (int i = 1; i <length ; i++) {if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){isFail=true;}}repaint();//重画画面}timer.start();//计时器}
}

总结

  • 写一个事件的时候步骤

    • 定义数据
    • 监听事件
      • 键盘监听
      • 事件监听
  • 在src目录下创建一个statics包来存放图片(用ps自己制作)
    • 蛇头身体和食物(25*25)像素
    • 上面的条幅 (850*53)像素

swing 简易贪吃蛇小游戏开发相关推荐

  1. GUI编程---贪吃蛇小游戏开发

    学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...

  2. python快速实现简易贪吃蛇小游戏

    贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长.  贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式.赏金模 ...

  3. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

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

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

  5. Qt入门开发__贪吃蛇小游戏

    qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序(比如控制台工具和服务器).在图形用户界面开发相比MFC更加 ...

  6. Java开发贪吃蛇小游戏

    Java开发贪吃蛇小游戏 文章目录 Java开发贪吃蛇小游戏 一.开发思路 二.具体开发过程 1.绘制静态游戏窗口 2.导入素材图标 3.绘制游戏面板 4.绘制一条静态的小蛇 5.让小蛇动起来 ①监听 ...

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

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

  8. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  9. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

最新文章

  1. Git-remote Incorrect username or password ( access token )
  2. boost::asio与ACE的对比
  3. qemu模拟执行固件文件(解决 Invalid ELF image for this architecture 问题)
  4. taglist go语言支持
  5. Python基础(1) - 初识Python
  6. win7 下的open live writer代码插件
  7. python 3.6.5 shell_Linux 安装 Python3.6.5
  8. 1.5编程基础之循环控制 37 雇佣兵
  9. chrome插件分享
  10. nginx之头部变量x_forwarded_for
  11. docker如何搭建sftp服务器
  12. linux,centos7环境下,安装RabbitMQ
  13. 见面会 | 创新工场执行董事王嘉平:高性能可伸缩性区块链系统揭秘!
  14. js worker使用总结
  15. ios开发之简单的TableView
  16. 科学论文1-软件缺陷预测中基于聚类分析的特征选择方法
  17. 美图秀秀网页版新功能上线 新增磨皮祛痘
  18. 学计算机英语的好方法,好的英语学习方法总结
  19. 顾颖琼:我也曾为贾跃亭自豪过,被告之后只剩崩溃 | 独家专访
  20. MSproject软件在项目管理中实际操作干货

热门文章

  1. MinGw 和 cygwin 的区别和联系
  2. JavaFx-桌面应用开发利器(三)FXML和Scene Builder
  3. 如何摆脱wmpscfgs.exe病毒,《读者贡献指南》
  4. 如何看待竞业禁止协议
  5. 计算机图像学试题,计算机图形学题库及答案
  6. qt显示中文乱码,编译提示常量中有换行符,文本后缀“xxx”无效,未找到文本运算符或者文本运算符模板“xxx”
  7. win10 安装mujoco,mujoco_py,gym
  8. 最小二乘法在ISP CCM标定中的简介
  9. 如何申请pmp认证考试-游峰-专题视频课程
  10. c#读取CSV格式文件