Java小游戏之——贪吃蛇

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

代码:

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循环进行绘制,记得把小蛇的头部换个颜色,看起来更棒!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云性能监控的五大重要性

在当今数字化时代,企业越来越依赖云服务来支持其IT基础设施和业务运营。为了确保这些云服务的稳定性和性能,云性能监控变得至关重要。本文将探讨云性能监控的重要性。 一、实时可见性 云性能监控提供了对云基础设施和应用程序性能的实时可见性。这意味着…

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中,开发人员通常会展示新网站或应用程序的设计、功能和用户体验,并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件,吸…

【LeetCode刷题-滑动窗口】--487.最大连续1的个数II

487.最大连续1的个数II 方法&#xff1a;滑动窗口 维护一个区间&#xff0c;使得该区间中只包含一个0 class Solution {public int findMaxConsecutiveOnes(int[] nums) {int n nums.length;int left 0,right 0,sum 0;int zero 0; //计算0的个数while(right < n){if(…

基于JavaWeb+SpringBoot+Vue房屋租赁系统微信小程序系统的设计和实现

基于JavaWebSpringBootVue房屋租赁系统微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 21世纪是信息的时代&#xff0c;是网络的时代&#xff0c;进入信息社会高速…

(C++)把字符串转换成整数

把字符串转换成整数_牛客题霸_牛客网 愿所有美好如期而遇 思路 看到这个题目我们首先应该想到的就是去处理第一个字符&#xff0c;但是第一个字符也可能是数字字符&#xff0c;所以我们需要对他单独处理&#xff0c;如果他不符合条件&#xff0c;直接return&#xff0c;符合条…

java实现钉钉机器人消息推送

项目开发中需要用到钉钉机器人发送任务状态&#xff0c;本来想单独做一个功能就好&#xff0c;但是想着公司用到钉钉机器人发送项目挺多的。所以把这个钉钉机器人抽离成一个组件发布到企业maven仓库&#xff0c;这样可以给其他同事用提高工作效率。 1.目录结构 2.用抽象类&…

C语言加密字符(ZZULIOJ1064:加密字符)

题目描述 从键盘输入一批字符&#xff0c;以结束&#xff0c;按要求加密并输出。 输入&#xff1a;从键盘输入一批字符&#xff0c;占一行&#xff0c;以结束。 输出&#xff1a;输出占一行 加密规则: 1&#xff09;所有字母均转换为小写。 2&#xff09;若是字母a到y&#xff…

系列七、JVM的内存结构【堆(Heap)】

一、概述 一个JVM实例只存在一个堆内存&#xff0c;堆内存的大小是可以手动调节的。类加载器读取了类文件后&#xff0c;需要把类、方法、常变量放到堆内存中&#xff0c;保存所有引用类型的真实信息&#xff0c;以方便执行器执行&#xff0c;堆内存分为三个部分&#xff0c;即…

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大&#xff0c;但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频&#xff0c;比如用单反相机、无人机拍摄视频的时候&#xff0c;如果电池突然断电&#xff0c;或者突然炸机了&#xff0c;就非常有可能会得到一个损坏的视频文件&#xff0c;比如会产生…

网络安全(黑客技术)—高效自学

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

udp多点通信-广播-组播

单播 每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器&#xff08;只能做局域网通信&#xff09;只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…

Python Numpy.einsum

、 见 https://zhuanlan.zhihu.com/p/27739282

Resolume Arena 7.15.0(VJ音视频软件)

Resolume Arena 7是一款专业的实时视觉效果软件&#xff0c;用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具&#xff0c;可以将音频、视频和图像合成在一起&#xff0c;创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式&#xff0c;包括视频文…

微信@all bug复现及原理分析

1、复现 条件&#xff1a; 1、Windows PC 端微信 2、自建一个群聊拥有群管权限可以所有人 废话不多说&#xff0c;直接上图 所有人 剪切后&#xff0c;到另一个群中&#xff0c;引用任意一个群里成员的消息&#xff0c;并将刚才剪切的粘贴至此&#xff0c;发送 便可完成非群…

LeetCode之二叉树

发现更多计算机知识&#xff0c;欢迎访问Cr不是铬的个人网站 最近数据结构学到二叉树&#xff0c;就刷了刷力扣&#xff0c;写这篇文章也是辅助记忆。 103二叉树锯齿形遍历 要解出本道题&#xff0c;首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里…

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统&#xff08;Anolis OS&#xff09;8完成兼容性认证。测试结果显示&#xff0c;双方产品相互兼容&#xff0c;功能正常&#xf…