package test002;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/*
* 1--窗口+面板+固定
* 2--在界面上画出蛇
* 3--让蛇动起来
* 4--让蛇听键盘的方向键指挥
* 5--随机产生豆子并画在界面上
* 6--指挥蛇吃到豆子并长长身体
* 7--撞墙GAME OVER !
* 8--咬到自己的尾巴 GAME OVER !
* 9--修复BUG
*/
public class SnakeGame extends JFrame implements KeyListener{
private static final long serialVersionUID = 1L;
private int fw = 800 ;
private int fh = 600 ;
private SP sp = null ;
private int sex = 200 ; //蛇关节元素属性
private int sey = 200 ;
private int sesize = 20 ;
private SE se = null ;
private Timer timer = new Timer();
private LinkedList<SE> ses = new LinkedList<SE>();
private String direction = "up" ; //蛇行走的方向
private int bx ; //豆子属性
private int by ;
private int bsize = sesize ;
private Bean bean = null ;
private Random rand = new Random();
private boolean bean_is_eated = false ;
public SnakeGame() {
this.setAlwaysOnTop(true);
this.setUndecorated(true);
this.getContentPane().setBackground(Color.BLACK);
this.setSize(800, 600);
this.setLocationRelativeTo(null);
sp = new SP();
this.add(sp);
this.setVisible(true);
this.addKeyListener(this);
}
class SP extends JPanel{
private static final long serialVersionUID = 1L;
public SP() {
this.setOpaque(false);
this.getSE() ; //调用创建蛇的方法
this.getBean_not_on_snakebody() ;//调用创建豆子的方法
timer.schedule(new TimerTask() {
@Override
public void run() { //需要执行的任务
if("up".equalsIgnoreCase(direction)){
ses.removeLast() ; // 移除最后一个元素
//在原来第一个元素的基础上 新增一个元素
ses.addFirst(new SE(ses.getFirst().getSex(),ses.getFirst().getSey()-ses.getFirst().getSesize() , ses.getFirst().getSesize()));
//在原来方向的基础上 尾部增长一个关节元素对象
if(bean_is_eated){
ses.addLast(new SE(ses.getLast().getSex(),ses.getLast().getSey()+ses.getLast().getSesize(),ses.getLast().getSesize()));
bean_is_eated = false ;
}
//判断是否撞墙 撞墙 GAME OVER !
if(ses.getFirst().getSey()<0){
JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
Runtime.getRuntime().exit(0);
}
}
if("left".equalsIgnoreCase(direction)){
ses.removeLast() ; // 移除最后一个元素
//在原来第一个元素的基础上 新增一个元素
ses.addFirst(new SE(ses.getFirst().getSex()-ses.getFirst().getSesize(),ses.getFirst().getSey() , ses.getFirst().getSesize()));
//在原来方向的基础上 尾部增长一个关节元素对象
if(bean_is_eated){
ses.addLast(new SE(ses.getLast().getSex()+ses.getLast().getSesize(),ses.getLast().getSey(),ses.getLast().getSesize()));
bean_is_eated = false ;
}
//判断是否撞墙 撞墙 GAME OVER !
if(ses.getFirst().getSex()<0){
JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
Runtime.getRuntime().exit(0);
}
}
if("down".equalsIgnoreCase(direction)){
ses.removeLast() ; // 移除最后一个元素
//在原来第一个元素的基础上 新增一个元素
ses.addFirst(new SE(ses.getFirst().getSex(),ses.getFirst().getSey()+ses.getFirst().getSesize() , ses.getFirst().getSesize()));
//在原来方向的基础上 尾部增长一个关节元素对象
if(bean_is_eated){
ses.addLast(new SE(ses.getLast().getSex(),ses.getLast().getSey()-ses.getLast().getSesize(),ses.getLast().getSesize()));
bean_is_eated = false ;
}
//判断是否撞墙 撞墙 GAME OVER !
if(ses.getFirst().getSey()+sesize>fh){
JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
Runtime.getRuntime().exit(0);
}
}
if("right".equalsIgnoreCase(direction)){
ses.removeLast() ; // 移除最后一个元素
//在原来第一个元素的基础上 新增一个元素
ses.addFirst(new SE(ses.getFirst().getSex()+ses.getFirst().getSesize(),ses.getFirst().getSey() , ses.getFirst().getSesize()));
//在原来方向的基础上 尾部增长一个关节元素对象
if(bean_is_eated){
ses.addLast(new SE(ses.getLast().getSex()-ses.getLast().getSesize(),ses.getLast().getSey(),ses.getLast().getSesize()));
bean_is_eated = false ;
}
//判断是否撞墙 撞墙 GAME OVER !
if(ses.getFirst().getSex()+sesize>fw){
JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
Runtime.getRuntime().exit(0);
}
}
//蛇咬到自己身体的判断
for (int i = 1; i < ses.size(); i++) {
if(ses.getFirst().getSex()==ses.get(i).getSex() && ses.getFirst().getSey()==ses.get(i).getSey()){
JOptionPane.showMessageDialog(sp, "你是猪啊,咬到自己身体啦!", "自残了,兄弟!", JOptionPane.DEFAULT_OPTION);
Runtime.getRuntime().exit(0);
}
}
sp.eatBean(); //调用吃豆子的方法
sp.repaint() ;
}
} , 0 , 200 );
}
@Override
public void paint(Graphics g) {
for (int i = 0; i < ses.size(); i++) {
//画出豆子
g.setColor(Color.WHITE);
g.fill3DRect(bean.getBx(), bean.getBy(), bean.getBsize(), bean.getBsize(), true);
//画出蛇
if(i==0){
g.setColor(Color.RED);
}else{
g.setColor(Color.GREEN);
}
g.fill3DRect(ses.get(i).getSex(), ses.get(i).getSey(), ses.get(i).getSesize(), ses.get(i).getSesize(), true);
}
}
public void eatBean(){
//豆子被到了 //蛇的头部坐标和豆子的坐标重合
if(ses.getFirst().getSex()==bean.getBx() && ses.getFirst().getSey()==bean.getBy()){
bean = new Bean() ;
sp.getBean_not_on_snakebody() ;
bean_is_eated = true ;
}
}
public void getBean_not_on_snakebody(){
this.getBean() ;
// * 豆子不能出现在蛇的身体上 用 bx 、by 同时和蛇的身体每一个元素进行比较 保证没有全等
for (int i = 0; i < ses.size(); i++) {
if(ses.get(i).getSex() == bean.getBx() && ses.get(i).getSey() == bean.getBy()){
this.getBean() ;
}
}
}
public void getBean(){
// * 不能出现在右边的边界上 bx != fw
// * 豆子的x坐标必须能够整除(余数为0 )蛇身体元素的尺寸 bx % sesize == 0
while(true){
bx = rand.nextInt(fw);
System.out.println(bx);
if(bx != fw && bx%sesize==0){
break ;
}
}
// * 不能出现在下边的边界上 by != fh
// * 豆子的y坐标必须能够整除(余数为0) 蛇身体元素的尺寸 by % sesize == 0
for(;;){
by = rand.nextInt(fh);
if(by != fh && by%sesize==0){
break ;
}
}
bean = new Bean(bx, by, bsize);
System.out.println(bean);
}
public void getOneSEData(){ //获取一个蛇关节元素的数据
}
public void getSE(){//获取一个蛇关节对象
for (int i = 0; i < 4; i++) {
se = new SE(sex, sey+sesize*i, sesize) ;
ses.add(se);
}
}
public void getSnake(){ //获取一整条蛇
}
}
@Override
public void keyPressed(KeyEvent e) {
//方向 不能改变为相反的方向 例如:left 不能 修改为 right
if(e.getKeyCode()==KeyEvent.VK_LEFT && !"right".equalsIgnoreCase(direction)){
direction = "left" ;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN && !"up".equalsIgnoreCase(direction)){
direction = "down" ;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT && !"left".equalsIgnoreCase(direction)){
direction = "right" ;
}
if(e.getKeyCode()==KeyEvent.VK_UP && !"down".equalsIgnoreCase(direction)){
direction = "up" ;
}
if(e.getKeyCode()==32){
Runtime.getRuntime().exit(0);
}
}
public static void main(String[] args) {
new SnakeGame();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
class SE implements Serializable{
/**
* 蛇的关节对象
*/
private static final long serialVersionUID = 1L;
private int sex ;
private int sey ;
private int sesize ;
public SE() {
super();
// TODO Auto-generated constructor stub
}
public SE(int sex, int sey, int sesize) {
super();
this.sex = sex;
this.sey = sey;
this.sesize = sesize;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getSey() {
return sey;
}
public void setSey(int sey) {
this.sey = sey;
}
public int getSesize() {
return sesize;
}
public void setSesize(int sesize) {
this.sesize = sesize;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + sesize;
result = prime * result + sex;
result = prime * result + sey;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SE other = (SE) obj;
if (sesize != other.sesize)
return false;
if (sex != other.sex)
return false;
if (sey != other.sey)
return false;
return true;
}
@Override
public String toString() {
return "SE [sesize=" + sesize + ", sex=" + sex + ", sey=" + sey + "]";
}
}
class Bean implements Serializable {
/**
* 豆子对象
*/
private static final long serialVersionUID = 1L;
private int bx ;
private int by ;
private int bsize ;
public Bean() {
super();
// TODO Auto-generated constructor stub
}
public Bean(int bx, int by, int bsize) {
super();
this.bx = bx;
this.by = by;
this.bsize = bsize;
}
public int getBx() {
return bx;
}
public void setBx(int bx) {
this.bx = bx;
}
public int getBy() {
return by;
}
public void setBy(int by) {
this.by = by;
}
public int getBsize() {
return bsize;
}
public void setBsize(int bsize) {
this.bsize = bsize;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + bsize;
result = prime * result + bx;
result = prime * result + by;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Bean other = (Bean) obj;
if (bsize != other.bsize)
return false;
if (bx != other.bx)
return false;
if (by != other.by)
return false;
return true;
}
@Override
public String toString() {
return "Bean [bsize=" + bsize + ", bx=" + bx + ", by=" + by + "]";
}
}相关推荐
基于Java Swing的贪食蛇小游戏开发实战
Java 的图形界面程序基于事件驱动模型构建,这意味着程序的执行流程不是线性推进的,而是由用户或系统的事件触发。Swing 框架提供了丰富的事件监听器接口,如和,开发者通过实现这些接口来响应不同的用户操作。Java 的 I/O 操作主要通过java.io包来实现。根据数据操作的单位不同,Java 的 I/O 分为字节流(InputStream / OutputStream)和字符流(Reader / Writer)。
使用Java实现一个简单的贪吃蛇小游戏
贪吃蛇小游戏
基于Java的贪食蛇游戏开发实战项目
贪食蛇这个游戏,代码量可能不到1000行,但它涵盖了:✅ 面向对象设计✅ 数据结构选择✅ 性能优化技巧✅ GUI 编程模型✅ 事件驱动架构✅ 状态管理与错误处理✅ 可扩展性与解耦设计它是程序员成长路上的一块“试金石”。下次当你接到一个“看起来很简单”的需求时,不妨多问一句:“这个系统十年后会长成什么样?我现在写的这一行代码,还能不能用?这才是真正的工程师思维。🧠💡🎮 所以,别再说“我只是写个贪食蛇”了。你写的,是一个微型操作系统。
JavaSE项目 | 纯Java实现贪吃蛇小游戏
JavaSE项目 | 纯Java实现贪吃蛇小游戏
MySnake 贪吃蛇游戏:Java Swing实现与实战
Java Swing 是一种用于创建图形用户界面(GUI)的工具包,它提供了丰富的组件,用于设计和构建窗口化的应用程序。作为Java的一部分,Swing基于AWT(Abstract Window Toolkit)构建,但提供了比AWT更为强大和灵活的用户界面。Swing 以其轻量级组件而著称,这些组件并非直接与本地窗口系统相连,而是采用纯粹的Java代码实现,从而提高了跨平台的兼容性。它的出现推动了Java桌面应用程序的发展,使开发者能够创建美观、功能丰富的桌面软件。
java编写简易贪吃蛇游戏
主要为大家详细介绍了java编写简易贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
详解Java实现简易贪吃蛇
今天详解我在写贪吃蛇的时候遇到的问题。Main类 GameStart类 GamePanel类 在写贪吃蛇的时候,我接触到了两个新东西:1.定时器Timer类。 2.paint()绘图方法。第一次出现在java.awt.Component类中,当我们的类继承JFrame(容器)或者JPanel(轻量级容器)时,我们可以通过重写paint()方法,去进行绘图。关于paint()方法可以参考文章:https://blog.youkuaiyun.com/gydjsz/article/details/
手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码)
本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。
JAVA贪吃蛇(简易版)
实战练习java--贪吃蛇小游戏简易版
软件缺陷(定义+表现形式+优先级+信息+产生原因),看完这篇文章就懂了
软件缺陷软件缺陷的定义软件缺陷的表现形式软件缺陷产生的原因软件缺陷的根源软件缺陷的费用软件缺陷的信息 软件缺陷的定义 IEEE 1983 of IEEE Stardard 729中软件缺陷做了一个标准的定义: 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。 因此软件缺陷就是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求。 缺陷不是bug,缺陷包含bug,缺陷的范围更大。 软件缺陷
注意力机制详解
注意力机制详解Attention机制由来Attention定义Encoder-Decoder框架存在问题:Attenion机制的引入Attention机制的类别Hard AttentionSoft AttentionGlobal AttentionLocal AttentionSelf AttentionMulti-head Attention附录—Transformer全局视角Tensor视角Encoder部分Self-AttentionSelf-Attention向量计算Self-Attention的矩
简单的 Java 贪吃蛇游戏实现
在SnakeGame类中定义了snake列表,表示贪吃蛇的身体,头部在列表的最后一个位置;在SnakeGame类中定义了常量DIR_NONE、DIR_UP、DIR_DOWN、DIR_LEFT和DIR_RIGHT,表示贪吃蛇的移动方向。在SnakeGame类中,定义了getRandomFoodLocation()方法,用于随机生成食物的位置。在SnakeGame类中定义了常量WIDTH和HEIGHT,表示游戏区域的宽度和高度。在SnakeGame类中定义了常量DELAY,表示游戏运行的速度(毫秒)。
思科网络进阶——多生成树协议(MSTP)配置的一课一得
三、实验拓扑1)设计一个网络架构,要有核心层和接入层,都使用思科交换机。2)企业有4个部门,要求这四个部门都可以上网,但分属不同的VLAN中,这样今后可以做其它安全策略以确保网络安全,这些策略如今后学到的访问控制列表ACL。3)网络架构的设计要具有冗余,防止一条线路或一台设备终端导致的业务中断。4)由于硬件冗余而产生的环路要处理好,也就是要在逻辑上(或者说通过配置)防止物理环路的产生。5)不能因为防止物理环路而导致某端口没有流量,这样浪费端口资源及设备间互联的带宽资源。
基于Java+Swing贪吃蛇小游戏(含课程报告)
本游戏开始运行时贪吃蛇即开始运动,游戏过程中可点击“暂停”、“继续”按钮控制游戏进行,同时显示当前贪吃蛇长度及历史最高贪吃蛇长度,通过判断蛇头是否碰到身体或墙壁判断长度+1或是结束游戏,判断是否为最高记录并显示游戏解释对话框。2.4关键类设计2.4.1 MyDialog类。
Android应用加固脱壳实战:从爱加密原理到Frida内存Dump与修复
在移动应用安全领域,代码加固与动态加载是保护核心逻辑的关键技术。其原理在于通过修改应用启动流程,将原始DEX加密隐藏,并注入包含解密逻辑的壳DEX,实现运行时动态加载。这项技术的核心价值在于防止应用被逆向分析、二次打包或恶意篡改,广泛应用于金融、游戏等高安全要求场景。对于安全研究、漏洞挖掘或历史版本审计,掌握脱壳技能至关重要。本文聚焦于**爱加密**等主流加固方案,深入探讨如何利用**Frida**框架在内存中精准捕获解密后的DEX数据,并解决脱壳后常见的签名校验等运行问题,提供一套从原理到实践的完整攻防思
langchain入门学习笔记
langchain快速入门
java贪吃蛇代码加背景图_【项目实践】java开发贪食蛇小游戏【附源码】
一、实验内容1、实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏 结束界面。2、进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。二、贪食蛇游戏逻辑架构...
PythonOCC基础使用:建模——倒角倒圆(二维+三维)
占坑
贪吃蛇小游戏
开始写第一篇博客。 先从Java的基础开始,写的这个贪食蛇小游戏只是一个最简化的,利用Java自带的图形来构建的,所以比较简陋一些。 主要是运用了Swing里面的一些知识,Swing相对awt来说,兼容性以及对于画面的呈现等方面都有优势,因此,大多数图形界面都是用Swing去编写。 贪吃蛇,可以用几个部分去写,先构造界面、蛇身、球的属性,然后对三个部分详细写,增加事件监听,用画板画出来。最难...
基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真
新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
贪吃蛇小游戏总论
引言:一个月前完成了贪吃蛇小游戏,作为一个用来练手的项目,自己的确成长了不少,打算就这个项目写点东西,后来工作太忙,再加上一些原因,一直到现在才有空写下来,贪吃蛇小游戏分为总论,分论三篇和反思一篇,五篇文章来写,总论主要说明贪吃蛇小游戏主要实现了那些功能,以及贪吃蛇小游戏的算法分析,设计原理等等,分论主要讲贪吃蛇小游戏的各个组成部分原理,反思主要复盘自己在设计这个游戏中的错误和自我成长。 (一)贪...
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
自己写了一个贪食蛇,大家玩玩吧
断断续续花了三天,写了这个贪食蛇,个人觉得还是蛮复杂的。游戏功能不少,也希望第一次做就做的专业点,游戏不大, 有效代码不到750行,不过面向对象思想体现的还不错。复杂度也不次于一般的中小网站开发了。swing前些天简单学了一下,小试牛刀 吧。目录结构: 游戏截图: 游戏画面简介大方,突出游戏而不是一堆按钮,所有功能浓缩...
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
JAVA贪吃蛇小游戏分论(一)
引言:Java贪吃蛇小游戏是一款非常经典的小游戏,在总论中分析了我的贪吃蛇小游戏的运行过程,以及贪吃蛇的算法分析等等,对于贪吃蛇的移动原理,随机点的出现等有了一定的了解,那么,分论三篇将从我写的代码出发,分析贪食蛇小游戏的具体组成原理和代码实现,分论一主要说明贪吃蛇小游戏的界面设计,贪吃蛇的设计,和随机点出现等,分论二来分析贪吃蛇移动方式的分析,分论三主要介绍贪吃蛇小游戏辅助类,即圆角按钮和音乐类...
解决java 中JFame,运行后控件不显示,窗口执行最小化或者最大化操作后控件才显示问题
在用Java的swing做贪食蛇小游戏,运行之后控件死活不能正常显示,需要窗口执行最小化或者最大化操作后控件才显示问题,找了一个小时的bug,总算找着bug了............... 其实很简单 就是我们对JFrame的设置要放到最后面,即放在组件加入之后,在设置可见性,大小等等... 首先有创建JPanel并加入对象之后,再设置可见性、大小! ...
Java中关于贪吃蛇的实现源代码
小游戏(贪食蛇) 线程 面向对象 文件操作 内部类 数据库 目标: 可娱乐 记录娱乐的结果 步骤: 1--了解swing相关知识和小游戏设计 通过main方法启动初始化界面 逐步添加界面元素 蛇的构成(多个关节组成)和运动方式(确认好方向,去尾...
909



被折叠的 条评论
为什么被折叠?



