Java小游戏之——贪吃蛇

news2024/11/29 2:34:59

今天详细讲解写贪吃蛇的遇到的问题

代码:

Main类

GrameStart类

GamePanel类

启动main方法

    在写贪吃蛇的时候,我接触到了两个新东西:
1.定时器Timer类。
2.paint()绘图方法。第一次出现在java.awt.Component类中,当我们的类继承JFrame容器)或者JPanel(轻量级容器)时,我们可以通过重写paint()方法,去进行绘图。


关于paint()方法可以参考文章:https://blog.csdn.net/gydjsz/article/details/88924447


但是网上讲解的都比较简单,想系统学习还是要参考书籍《Java从入门到精通》。
        通过paint()方法,我们解决了绘图问题,可以通过paint()方法,实现小蛇,以及小蛇移动区域、计分器的绘制。
    首先,我们创建一个游戏界面。

int width = Toolkit.getDefaultToolkit().getScreenSize().width;

int height = Toolkit.getDefaultToolkit().getScreenSize().height;

 这两行代码是为了获取系统屏幕分辨率,从而来调整窗口位置居中。
然后,我们用画笔填充两个矩形,分别表示游戏区域和小蛇运动的区域,以及计分器 

 这样,我们的游戏基本界面就设置完毕。
然后,进行对小蛇移动、游戏机制的实现.
        那么,我们接下来的问题就是,如何表示小蛇的位置?如何实现小蛇的不间断移动?小蛇的转向?以及死亡判定,得分判定?
       关于小蛇的位置,我们可以通过坐标来进行表示,并通过坐标的改变来改变小蛇的位置。

数组空间设置为500,这样小蛇的最大长度为500。
       同时在游戏开始之前,我们要进行游戏的初始化操作。

 游戏开始之前,小蛇有头部和两节身子,长度为3,以及初始位置.游戏开始状态为false,死亡状态为false,分数为0,初始方向为向右.
       接下来,我们可以通过键盘监听,改变小蛇的移动方向,以及暂停、开始游戏。

我们GamePanel类里面添加一个键盘监听器,这里要注意的是,当一个类继承JPanel的时候,这个类就是一个面板,可以直接用this调用.
       并通过匿名内部类的方式来实现KeyAdapter的接口,并重写Keypressed()方法,并通过多级if的形式,进行键盘操作判断.
       当不是死亡状态的时候,按下空格会改变游戏状态为暂停或者开始,并赋值方向为\" \"(空格),至于为什么要让方向等于空格,后面会讲.
       如果是死亡状态,那么调用初始化方法和游戏状态,并进行重绘.
        W,S,A,D分别表示上下左右,对方向进行赋值.
这样,我们的键盘监听结束.
    然后,我们迎来了第一个难点.        如何让小蛇向前移动?

我们是否要不断地改变小蛇头部以及每节身体地坐标去实现它地移动?但是我们不可能对小蛇所有身体进行方向判断并改变,这样显得繁杂很多.
      于是,有了一个方案.我们是否可以只改变小蛇的头部的方向,让小蛇的头部去引导身体去移动?

以游戏状态为开始状态,并且小蛇存活为前提.
       刚开始,我在想如何让蛇头一直向前跑,我直接在定时器里面的事件监听器里面,不通过if条件语句,写下这样一行代码:
                snakeX[0]+=20;
      这样,不就实现了小蛇一直在往前走吗?
        结果,出现来搞笑的一幕,小蛇一旦转弯就会斜着走,当时我死活想不通,那天晚上,被窝里都是小蛇在斜着乱飞,哭死了.
        后来,我发现了这个问题,我设定一直往右走, 所以一旦转弯,就会斜着跑.
     我进行了改良,但由于时间问题,效果还并不是很满意.很多代码想法都是自己敲的,所以经常不尽如人意.
我是这样解决这个问题的:
      只有当我们开始游戏的时候,我们会按下空格,这个时候方向direction就被赋值为空格.用if语言判断direction是否为空格,如果是空格说明游戏开始,小蛇可以开始向右移动了,如果direction不是空格,即进行了转向,并按照转向后的方向跑,那么我们的自动向右跑的条件就不会符合,也就不会自动向右跑了.

通过for循环,让蛇的后一节身体去继承上一节身体的坐标.

接下来,是我们的第二个难点.如何让小蛇不间断的移动,并且时刻监测到我们是否进行了转向、吃到食物、是否撞到自己死亡?    我们可以通过定时器和事件监听器的组合使用,实现对定时器内线程任务的不断检测,进而是实现小蛇的不间断移动以及各种判定.    我们要明确监听器和定时器它们各自的作用.

通过for循环进行绘制,记得把小蛇的头部换个颜色,看起来更棒!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HackTheBox-Starting Point--Tier 2---Included

文章目录 一 Included 测试过程1.1 打点1.2 横向移动1.3 权限提升 二 题目 一 Included 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.193.212.访问web站点 3.文件包含漏洞探测 观察请求地址:http://10.129.193.21/?filehome.php,利用file参数动…

【ISP图像处理】Demosaic去马赛克概念介绍以及相关方法整理

1. 基本定义 使用彩色滤光器阵列(CFA)的数码相机需要一个去马赛克程序来形成完整的RGB图像。一般的相机传感器都是采用彩色滤光片阵列(CFA)放置在光感测单元上,在每个像素处仅捕获三种原色成分中的一种。 去马赛克方法主要关注于复原非常规区域,比如边缘…

解决:Error: Missing binding xxxxx\node_modules\node-sass\vendor\win32-x64-83\

一、具体报错 二、报错原因 这个错误是由于缺少 node-sass 模块的绑定文件引起的。 三、导致原因 3.1、环境发生了变化 3.2、安装过程出现问题 四、解决方法步骤: 4.1、重新构建 node-sass 模块 npm rebuild node-sass 4.2、清除缓存并重新安装依赖 npm c…

通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件

与传统证券一样,基于区块链技术发展出来的虚拟资产交易所经历了快速发展而缺乏有效监管的行业早期。除了科技光环加持的各种区块链项目方、造富神话之外,交易所遭到黑客攻击、内部偷窃作恶、甚至经营主体异常而致使投资人血本无归的案例亦令人触目惊心。…

Unity中Shader矩阵的转置矩阵

文章目录 前言一、转置的表示二、转置矩阵三、转置矩阵的总结1、(A^T^)^T^ A2、(A B)^T^ A^T^ B^T^3、(kA)^T^ kA^T^ (k为实数)4、(AB)^T^ B^T^A^T^5、如果 A A^T^ 则称A为对称矩阵6、如果 AA^T^ I(单位矩阵),则称 A 为正交矩阵,同时 A^T^ A^-1…

Day32力扣打卡

打卡记录 买卖股票的最佳时机 IV(状态机DP) 链接 class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:n len(prices)max lambda x, y: x if x > y else yf [[-0x3f3f3f3f] * 2 for _ in range(k 2)]for i in range(k 2…

web 前台页面内弹出框(一)

本文已经不推荐在使用了,有更加优秀的 ,详情参考layui弹出层 前端当前页面编辑一些数据时,往往会用到弹出窗口,但每个页面单独修改有显得比较麻烦,因此,可以建立一个公用的方法,去掉用就可以了&…

深度学习之基于YoloV5苹果新鲜程度检测识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 深度学习之基于 YOLOv5 苹果新鲜程度检测识别系统介绍YOLOv5 简介苹果新鲜程度检测系统系统架构应用场景 二、功能三、系统四. 总结 一项目简介 深度学习之…

5.0 Java API

API(Application Programming Interface)指的是应用程序编程接口,API可以让编程变得更加方便简单。Java也提供了大量API供程序开发者使用,即Java API。Java API指的就是JDK提供的各种功能的Java类库,如之前所讲的Array…

C++运算符重载详解(日期类实操)

前言&#xff1a;为什么要实现运算符重载&#xff1f; 在C语言中&#xff0c;对于内置类型&#xff0c;我们可以根据符号>、<、等去直接比较大小&#xff0c;但是对于自定义来说&#xff0c;肯定不能直接比较大小&#xff0c;例如下面的日期类&#xff0c;想要比较两个两…

Genio 500_MT8385安卓核心板:功能强大且高效

Genio 500(MT8385)安卓核心板是一款功能强大且高效的AIoT平台&#xff0c;内置的AI处理器(APU)工作频率可达500MHz&#xff0c;支持深度学习、神经网络加速和计算机视觉应用。配合高达2500万像素的摄像头&#xff0c;可以为AI相机应用提供清晰、精确的图像&#xff0c;如人脸识…

vscode中Chinese (Simplified)汉化无效解决方法

问题复现 之前已经下载了 Chinese (Simplified)插件并启用了&#xff0c;都是正常的中文简体。有时候打开vscode的时候&#xff0c;会发现汉化失效了&#xff0c;如图&#xff1a; 解决方法 依次点击 扩展&#xff08;Extensions&#xff09;— Chinese (Simplified) — 选…

Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.

场景&#xff1a;在Banana Pi BPI-W3 RK3588上做qt开发工作RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 硬件环境&#xff1a; Banana Pi BPI-W3RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 )软件版本&#xff1a; OS&#xff1a;ArmSoM-W3 Debian11 QT&#xff1a;QT5…

LeetCode(20)最长公共前缀【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 14. 最长公共前缀 1.题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow&qu…

【计算机组成原理】定点加法、减法运算

系列文章目录 绘制出纯整数(1字节)和纯小数的数轴 将十进制数20.59375&#xff0c;转换成754标准的32位浮点数的二进制存储格式 用双符号位补码求 x 0.1010011, y -0.1001010, 分别求出 x y, x - y&#xff0c;并判溢出

求10的阶乘之和

这个问题很简单&#xff0c;我们用for循环就可以做到&#xff01; 目录 1.用两个for循环求值 2.用一个for循环求值 1.用两个for循环求值 int main() {int i 1;int ret 1;int sum 0;int n 0;for (n 1; n < 10; n){ret 1;for (i 1; i < n; i){ret ret * i;}sum …

Linux_/proc目录_查看处理器的信息/proc/cpuinfo

1、cat /proc/cpuinfo_查看/proc/cpuinfo文件的内容 可以看到板卡有4个处理器&#xff0c;剩下的信息emmm...... 2、BogoMIPS_反映CPU运算速率 MIPS是millions of instructions per second(百万条指令每秒)的缩写&#xff0c;其代表CPU的运算速率。 BogoMIPS是Linux大致计算…

elementplus DateTimePicker 日期范围选择器 设置默认时间范围为当前月的起始时间到结束时间

代码如下&#xff1a; <el-date-pickerv-model"value"type"datetimerange"start-placeholder"Start Date"end-placeholder"End Date":default-time"defaultTime" />const defaultTime: [Date, Date] [new Date(2000…

el-table中el-popover失效问题

场景&#xff1a;先有一个数据表格&#xff0c;右侧操作栏为固定列&#xff0c;另外有一个字段使用了el-popover来点击弹出框来修改值&#xff0c;发现不好用&#xff0c;点击后无法显示弹出框&#xff0c;但当没有操作栏权限时却意外的生效了。 这种问题真是不常见&#xff0…

蓝桥杯 vector

vector的定义和特性 注意&#xff1a;vector需要开C11标准 vector的常用函数 push_back():将元素添加到vector末尾 pop_back():删除vector末尾的元素 begin()和end():返回指向vector第一个元素和最后一个元素之后一个位置的迭代器。 示例 vector<int> vec{10,20,30};f…