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; ...
随机推荐
- MyBatis(十一):MyBatis架构流程浅析
架构分层 我们将MyBatis架构分为三层,分别为接口层.数据处理层和框架支撑层 接口层:提供外部接口调用的API,使用端通过这些API来操作数据库,接口层收到请求后会调用数据处理层完成具体的数据处理 ...
- golang 三维向量相关操作
package vector import ( "math" "fmt" )// 三维向量:(x,y,z) type Vector3 struct { X fl ...
- PTA 输出数组元素
7-3 输出数组元素 (15 分) 本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果. 输入格式: 输入的第一行给出正整数n(1).随后一行给出n个整 ...
- java例题_09 1000以内的完全数
1 /*9 [程序 9 求完数] 2 题目:一个数如果恰好等于它的所有因子之和,这个数就称为"完数". 3 例如 6=1+2+3.编程找出 1000 以内的所有完数. 4 */ 5 ...
- Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序
一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...
- flexbox(弹性盒布局模型),以及适用场景
一.是什么 Flexible Box 简称 flex,意为"弹性布局",可以简便.完整.响应式地实现各种页面布局 采用Flex布局的元素,称为flex容器container 它的所 ...
- Java性能调优实战,覆盖80%以上调优场景
Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...
- 「starter推荐」简单高效Excel 导出工具
EasyExcel EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. 64M内存1分钟内读取75M(46W行25列)的E ...
- BLE链路层状态机初探
状态机 BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能. 一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功. 广播和扫描是相对应的,一个设备广 ...
- Zookeeper基础原理&应用场景详解
简单了解Zookeeper Tips: 如果之前对Zookeeper不了解的话,这里大概留个印象就好了 Zookeeper是一个分布式协调服务,可以用于元数据管理.分布式锁.分布式协调.发布订阅.服务 ...