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; ...
随机推荐
- FreeBSD ports 多线程编译
FreeBSD ports 多线程编译FORCE_MAKE_JOBS=yesMAKE_JOBS_NUMBER=4写入/etc/make.conf没有就新建.4是处理器核心数,不知道就别改.
- Andrew BP 神经网络详细推导
Lec 4 BP神经网络详细推导 本篇博客主要记录一下Coursera上Andrew机器学习BP神经网络的前向传播算法和反向传播算法的具体过程及其详细推导.方便后面手撸一个BP神经网络. 目录 Lec ...
- 2017算法期末复习练习赛-G Beihang Couple Pairing Comunity 2017 题解(网络流)
理解不够透彻.好题不可浪费,写题解以增进理解.会陆续补充题目.(咕咕咕) G Beihang Couple Pairing Comunity 2017 题目链接 Beihang Couple Pair ...
- Oauth2协议那些事
1. 背景 首先,设想一种情境:你平常会使用一款照片存储App(以下照片服务指代),用来将自己喜欢的照片存放在上面以备随时查看.假如有一天,你想要打印其中的某张照片而且你找到了一款打印照片App(以下 ...
- InfluxDB、Grafana等开源软件的监控后门
在使用手机APP的过程中,用户信息会不知不觉的被APP悄无声息的收集到云端,然后进行各种用户行为分析以及智能推荐,这是众所周知但秘而不宣的事. 在使用开源软件时,也存在悄悄收集用户使用信息,并且上报到 ...
- 第22 章 : 有状态应用编排 StatefulSet
有状态应用编排 StatefulSet 本文将主要分享以下四方面的内容: "有状态"需求 用例解读 操作演示 架构设计 "有状态"需求 课程回顾 我们之前讲到过 ...
- Logtash遇到的异常和注意点
1.Logtash遇到的异常和注意点 1.1 logstash使用kafka插件和es集成 如果logstash使用kafka插件和es集成,必须设置kafka插件参数 session_timeout ...
- $(( )) 与 $( ) 还有${ } 差在哪?-- Shell十三问<第八问>
$(( )) 与 \(( ) 还有\){ } 差在哪?-- Shell十三问<第八问> 我们上一章介绍了 ( ) 与 { } 的不同,这次让我们扩展一下,看看更多的变化:$( ) 与 \( ...
- Java利用线程工厂监控线程池
目录 ThreadFactory 监控线程池 扩展线程池 扩展线程池示例 优化线程池大小 线程池死锁 线程池异常信息捕获 ThreadFactory 线程池中的线程从哪里来呢?就是ThreadFoct ...
- 201871030117-李亚楠 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 课程班级 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两个人合作.练习结对编程:2.掌握Github协作开发程序的操作方法:3.熟悉编程语言的综 ...