项目结构

  1. 新建一个JFrame窗口,作为程序入口
public class GameStart{
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setBounds(100,100,900,720);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setResizable(false);
jFrame.add(new GameJPanel());
jFrame.setVisible(true);
}
}
  1. 创建一个面板类
//面板
public class GameJPanel extends JPanel implements ActionListener { int length;//蛇的长度
int[] snakeX = new int[600];//蛇的X的最大长度
int[] snakeY = new int[500];//蛇的Y的最大长度
String fx = "R";
boolean isStart = false;//默认不开始
//定时器
Timer timer = new Timer(100, this);//100毫秒=1秒
int foodX;
int foodY;
Random random = new Random();//随机数
boolean isFail = false;//失败条件
int score; public GameJPanel() {
init();
this.setFocusable(true);//获取焦点事件
addKeyListener(new GameKeyListener(this));
//开启定时器
timer.start();
}
//初始化
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;
}
//绘制面板,所有东西都是通过graphics这个画笔绘制
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);//清屏
//添加静态布局
GameData.header.paintIcon(this, graphics, 25, 11);
graphics.fillRect(25, 75, 850, 600);
//积分板
graphics.setColor(Color.white);
graphics.setFont(new Font("微软雅黑", Font.BOLD, 18));
graphics.drawString("长度:"+length,750,35);
graphics.drawString("得分:"+score,750,55);
//先画食物,防止吃掉有延迟
GameData.food.paintIcon(this, graphics, foodX, foodY);
//画小蛇
switch (fx) {
case "R":
GameData.right.paintIcon(this, graphics, snakeX[0], snakeY[0]);
break;
case "L":
GameData.left.paintIcon(this, graphics, snakeX[0], snakeY[0]);
break;
case "U":
GameData.up.paintIcon(this, graphics, snakeX[0], snakeY[0]);
break;
case "D":
GameData.down.paintIcon(this, graphics, snakeX[0], snakeY[0]);
break;
}
//身体
for (int i = 1; i < length; i++) {
GameData.body.paintIcon(this, graphics, snakeX[i], snakeY[i]);
}
//游戏状态
if (!isStart) {
graphics.setColor(Color.white);
graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));//设置字体
graphics.drawString("按下空格,开始游戏", 300, 300);
}
//游戏失败
if (isFail) {
graphics.setColor(Color.red);
graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));
graphics.drawString("游戏失败,请按空格继续", 300, 300);
}
}
//事件监听--固定事件刷新一次,1s=100ms
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (isStart && !isFail) {
//吃食物
if (snakeX[0] == foodX && snakeY[0] == foodY) {
//长度+1
length++;
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];
}
switch (fx) {
case "R":
snakeX[0] += 25;//头部移动
// 边界判断
if (snakeX[0] > 850) { snakeX[0] = 25; }
break;
case "L":
snakeX[0] -= 25;//头部移动
if (snakeX[0] < 25) { snakeX[0] = 850; }
break;
case "U":
snakeY[0] -= 25;//头部移动
if (snakeY[0] < 75) { snakeY[0] = 650; }
break;
case "D":
snakeY[0] += 25;//头部移动
if (snakeY[0] > 650) { snakeY[0] = 75; }
break;
}
//失败判定
for (int i = 1; i < length; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
isFail = true;
break;
}
}
repaint();//重绘
}
//开启定时器
timer.start();
}
}

所有组件添加流程基本一致,即先定义数据,然后在画笔paintComponent方法中绘制,最后添加到监听事件。

完整代码请参考:

GitHub完整贪吃蛇小游戏链接

用GUI实现java版贪吃蛇小游戏的更多相关文章

  1. c语言版贪吃蛇小游戏

    编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...

  2. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  3. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  4. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  5. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  6. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  7. Java贪吃蛇小游戏

    贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...

  8. JavaScript版—贪吃蛇小组件

    最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...

  9. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

随机推荐

  1. SQL修改列名,增加列,删除列语句的写法

    1.修改数据表名 ALTER TABLE [表名.]OLD_TABLE_NAME RENAME TO NEW_TABLE_NAME; 2.修改列名 ALTER TABLE [表名.]TABLE_NAM ...

  2. 《深入剖析Tomcat》源码

    <深入剖析Tomcat>翻译自<How Tomcat Works> 可以到官网下载:https://brainysoftware.com/download 官网下载比较慢,我就 ...

  3. 使用js实现全选功能。(全选,全不选,反选)

    作业210721 提交代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. fiddle手机抓包配置

    第一步:打开Fiddler,配置参数: 1. 配置fiddler允许监听到https 打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS, 勾 ...

  5. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

  6. CTF_论剑场-web26

    is_numeric() 函数用于检测变量是否为数字或数字字符串.如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE isset() - 检测变量是否设置. $str进行正则表达式 ...

  7. [C++]-vector 向量

    什么是向量容器 向量容器是一种支持高效的随机访问和高效的尾部插入新元素的容器. 向量容器一般实现为一个动态分配的数组,向量中的元素连续的存放在这个数组中,因此对向量容器进行随机访问具有和动态访问动态数 ...

  8. SunOS与Solaris系统的对应关系

    下文绝大部分译自维基百科Solaris词条的"历史"部分: http://en.wikipedia.org/wiki/Solaris_(operating_system)#Hist ...

  9. Speed up Downloading Files on Linux

    Compared aria2c, axel and wget, aria2c is the best. It support multi-thread download (with "-s ...

  10. 【动画消消乐|CSS】086.炫酷水波浪Loading过渡动画

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...