GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目
项目功能
用键盘上下左右实现贪吃蛇的自动移动
贪吃蛇吃到食物后,长度加一,分数加一
贪吃蛇吃到自己的身体,则游戏结束
按空格键实现游戏的暂停和继续
效果截图
逻辑分析
需要Main.class中有public static void main(String[] args)来启动游戏
需要写一个GameFrame extends JFrame界面
- 注意:游戏的界面的大小,JFrame 显示大小与设置的不同。需要严格规定窗口的大小,因为小蛇的移动是固定一个格子的大小(比如:25)
- 设置游戏的窗口不可拉伸
定义一个贪吃蛇对象类,将小蛇划分成蛇头和蛇身两个部分,此外,小蛇的方向需要对应不同的蛇头图片
定义一个食物对象类,食物每次被吃到后,需要随机再次出现位置
定义一个数据类,专门来存放一些数据,比如说图片信息,窗口宽高
游戏面板,重中之重。需要继承一个JPanel类,二个接口ActionListener(事件监听), KeyListener(键盘监听)
在初始化函数中,需要获得焦点,添加键盘监听,开启定时器
在画笔中需要画黑框,贪吃蛇,食物,提示
在键盘监听中,空格键处理暂停和继续,方向键处理蛇头和方向
在事件监听中需要对得分进行判断,蛇头和蛇身移动处理,蛇头穿过边界的处理,游戏结束判断处理
repaint 重画页面
代码分析
已经在代码上传到github上面注释很详细
踩坑
JFrame的窗口大小
窗口宽度= 输入宽度+窗口左边框+窗口右边框
窗口高度= 输入高度+窗口上边框+窗口下边框
jframe.setSize(Datas.GameWidth+3+3,Datas.GameHeight+32+3);
需要加上窗口左边框+窗口右边框和窗口上边框+窗口下边框,但是每一个项目的边框大小都是不一样的。所以需要先去测试边框大小
package com.greedy_snake;
import java.awt.*;
public class Main {
public static void main(String[] args) {
//创建一个窗口
GameFrame gameFrame = new GameFrame();
Dimension di = gameFrame.getContentPane().getSize();
System.out.println("内容面板宽度"+di.width);//宽
System.out.println("内容面板的高度"+di.height);//高
}
}
package com.greedy_snake;
import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
public GameFrame(){
//1 设置标题
this.setTitle("贪吃蛇");
//2 设置宽高 6 35是通过insets得到的
this.setSize(Datas.GameWidth+3+3,Datas.GameHeight+32+3);
//3 设置窗口居中
this.setLocationRelativeTo(null);
//4 设置点击窗口的×关闭
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//5 设置游戏窗口大小不可拉伸
this.setResizable(false);
//6 设置可见
this.setVisible(true);
/*7 得到窗口的边界区域
需要放在setVisible下面输出的4个结果才不是0*/
Insets insets = getInsets();
System.out.println("窗口边框上"+insets.top);//上
System.out.println("窗口边框下"+insets.bottom);//下
System.out.println("窗口边框左"+insets.left);//左
System.out.println("窗口边框右"+insets.right);//右
}
}
得到窗口的边界区域,需要放在setVisible下面输出的4个结果才不是0,不能在setSize中直接Datas.GameWidth+insets.left+insets.right
ImageDemo.class.getResource路径问题
两个例子给你就很理解了
GUI简单实战——贪吃蛇的更多相关文章
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- Java一个简单的贪吃蛇
Java一个简单的贪吃蛇 虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口.有助于半初学者强化理解. 直接上代码 游戏主体类: package ...
- TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...
- 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏
详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- JavaScript实践-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- d3.js 制作简单的贪吃蛇
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- js编写简单的贪吃蛇游戏
css代码 *{ margin:; padding:; } td{ width: 4px; height: 4px; background: #ccc; border: 2px solid #ccc; ...
随机推荐
- POJ_1227 Jack Straws 【二维平面判两线段相交】
一 题面 POJ1127 二 分析 在平面几何中,判断两线段相交的方法一般是使用跨立实验.但是这题考虑了非严格相交,即如何两个线段刚好端点相交则也是相交的,所以还需要使用快速排斥实验. 这里参考并引用 ...
- vue全家桶常用命名
1,版本查看 node -vnpm -v2,修改NPM的缓存目录和全局目录路径 D盘node目录下创建两个目录,分别是node_cache和node_global,这是用来放安装过程的缓存文件以及最终 ...
- 文件锁fcntl
一.python中的文件锁 我们在写python应用的时候,当涉及到多个进程向同一个文件write(或者read)的情况,如果几个进程同时都对这个文件进行写操作,那么文件的内容就会变得非常混乱,这个时 ...
- 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017
8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...
- CQGUI框架之阴影圆角窗口实现
CQGUI框架之阴影圆角窗口实现 大家好,我是IT文艺男,来自一线大厂的一线程序员 今天给大家讲解基于C++/Qt的CQGUI框架的阴影圆角窗口实现,实现效果如下图所示:: CQGUI开发环境:: M ...
- Redis系列-存储篇string主要操作命令
Redis系列-存储篇string主要操作命令 通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简 ...
- 《基于Kubernetes舵手集群的设计与实现》
前言 <基于Kubernetes舵手集群的设计与实现>是我的毕业设计项目.本系统采用Kubernetes容器编排.基于Jenkins\Gitlab的CICD技术.EFK日志收集.Prome ...
- Dynamics CRM使用JS隐藏自定义按钮
在我们平时客制化开发的时候会经常遇到要制作自定义按钮的情况,而这个自定义按钮的功能又经常会有一些隐藏逻辑需要实现,所以每次通过获取控件查找这个按钮再隐藏比较麻烦,而且偶尔会出现代码没起作用的效果.下面 ...
- hello world!goodbye world~
我有个朋友,做ios开发做了5年,年前回家转行赚大钱去了,这个标题,其实就是因他而生. 我本人做的.net开发,也差不多快5年时间了,在这个时候暂借博客园这个平台说几句心里话,骚了勿喷:) 其实我是个 ...
- 后续来啦:Winform/WPF中快速搭建日志面板
后续来啦:Winform/WPF中快速搭建日志面板 继昨天发文ASP.NET Core 可视化日志组件使用(阅读文章,查看视频)后,视频下有朋友留言 "Winform客户端的程序能用它不?& ...