java gui 贪吃蛇_GitHub - hellodz/greedySnakeGUI: 用java的GUI实现一个简单的贪吃蛇项目...

将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目

项目功能

用键盘上下左右实现贪吃蛇的自动移动

贪吃蛇吃到食物后,长度加一,分数加一

贪吃蛇吃到自己的身体,则游戏结束

按空格键实现游戏的暂停和继续

效果截图

c3d59e32ac69e8e1dc726d40e42a9e27.png

逻辑分析

需要Main.class中有public static void main(String[] args)来启动游戏

需要写一个GameFrame extends JFrame界面

注意:游戏的界面的大小,JFrame 显示大小与设置的不同。==需要严格规定窗口的大小,因为小蛇的移动是固定一个格子的大小==(比如:25)

设置游戏的==窗口不可拉伸==

定义一个贪吃蛇对象类,将小蛇划分成蛇头和蛇身两个部分,此外,小蛇的方向需要对应不同的蛇头图片

定义一个食物对象类,食物每次被吃到后,需要随机再次出现位置

定义一个数据类,专门来存放一些数据,比如说图片信息,窗口宽高

游戏面板,重中之重。需要继承一个JPanel类,二个接口ActionListener(事件监听), KeyListener(键盘监听)

在初始化函数中,需要获得焦点,添加键盘监听,开启定时器

在画笔中需要画黑框,贪吃蛇,食物,提示

在键盘监听中,空格键处理暂停和继续,方向键处理蛇头和方向

在事件监听中需要对得分进行判断,蛇头和蛇身移动处理,蛇头穿过边界的处理,游戏结束判断处理

repaint 重画页面

代码分析

注释很详细

踩坑

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);//右

}

}

f3c3052502b295214a4c965b6248fc7f.png

==得到窗口的边界区域,需要放在setVisible下面输出的4个结果才不是0,不能在setSize中直接Datas.GameWidth+insets.left+insets.right==

ImageDemo.class.getResource路径问题

两个例子给你就很理解了

fb8e9eb9b89c8bfefb59bbfc160206a9.png

681e48c3921432550259d698494f4bbd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值