Java实现贪吃蛇
游戏界面基本布局
贪吃蛇是基于JFrame的一款小游戏。它主要有两部分组成,一个是显示区域,一个是按钮区域。这两个区域都用JPanel来实现。
首先需要创建一个基于JFrame的类,例如创建一个MyFrame,让其继承于JFrame。
然后创建一个显示区域的类MyPanel,一个按钮区域的类Button,当然了这两个类都基于JPanel。
第三步:在MyFrame类中实例化两个JPanel类。并在MyFrame构造方法中设置窗体的logo、窗体的标题、窗体初始位置、窗体的大小、窗体的背景颜色、窗体的关闭方式等。
第四步:继续清空MyFrame的布局管理器、设置窗体为固定大小不可更改、添加两个区域并显示、设置键盘监听焦点(控制贪吃蛇的移动)等。
游戏显示区域
MyPanle实现思路:
- 在构造方法中注册键盘监听事件、设置容器的坐标及大小、设置容器的背景颜色。如果想要添加背景图片,可以重写paintComponent方法。
- 创建一个食物类Food,创建一个贪吃蛇类Snake,并在MyPanel里实例化这两个类。
- 在MyPanel里创建一个贪吃蛇的线程,并在构造方法里启动该线程。
- 重写paint方法,绘制容器。并设置相应的颜色、画线、调用贪吃蛇的移动方法和绘画方法、调用食物的绘画方法。
配置文件类:
- 定义布局所需要的行和列,定义上下左右四个方向
- 定义死亡检测标识、定义游戏状态检测标识。
贪吃蛇线程类:
- 重写线程启动的方法
- 在启动方法里时刻检测贪吃蛇是否死亡,如果死亡则弹出“游戏结束”的对话框。
食物类:
- 定义食物的坐标。
- 定义食物的绘画方法
- 当食物被吃掉后,我们需要随机生成一个位置来展示食物,因此需要一个生成随机位置的方法repair()
- 定义获取食物坐标的方法。在构造方法里随机生成食物的坐标
结点类:
蛇有蛇头和蛇身、蛇尾,我们用节点来实现。
- 创建一个结点类,属性包括所在行、所在列、上个结点、下个节点、前进方向。
- 在有参构造方法中初始化贪吃蛇的位置信息,指定贪吃和前进的方向。
- 定义绘画方法,蛇头颜色为黄色、其余为蓝色。
贪吃蛇类
- 创建一个贪吃蛇类,属性包括头、身、尾、食物。
- 定义有参构造方法,参数为食物。并初始化贪吃蛇的初始坐标、以及设置结点之间的关系。
- 定义绘画方法,遍历贪吃蛇的每个节点,然后把每个节点绘画出来。
- 定义获取贪吃蛇坐标的方法,用于获取贪吃蛇的坐标。
- 定义贪吃蛇的移动方法。贪吃蛇怎么移动?添加蛇头——去蛇尾——吃食物——死亡检测
- 定义添加蛇头的方法,设置一个Node临时变量。根据前进方向判断,如何添加蛇头。
- 定义去除蛇尾的方法,把蛇尾的前一个结点的后指针设置为空,把蛇尾的前一个结点设置为蛇尾即可。
- 定义吃食物的方法,三步走。首先判断贪吃蛇坐标和食物坐标是否重合,如果重合就添加蛇头然后重新布局食物。
- 定义死亡检测方法,两步走。第一步判断是否越界,第二步判断头是否和尾重合。
- 定义键盘控制方法。当用户按下WASD键,贪吃蛇才可改变方向移动且不能逆向移动。(比如开始向上移动,我不能直接按S键让它向下移动)。
按钮区域
- 创建属性:myPanel、暂停、继续、重新开始、退出。
- 创建带参数的构造方法,参数为myPanel.
- 在构造方法中设置初始位置及大小、创建四个按钮并添加。
- 在构造方法里注册按钮监听。
- 重写actionPerformed方法。检测按下按钮。
- 如果按下继续游戏,那么需要重写设置键盘监听焦点
- 如果是重新开始游戏,那么需要停止当前线程,然后重新生成蛇和食物,并把控制条件还原到初始状态。最后创建新的线程对象并启动,最后再设置键盘监听焦点。
代码获取
https://github.com/XinPingLover/MyCode.git
Java实现贪吃蛇的更多相关文章
- java实现贪吃蛇游戏
最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...
- Java实现贪吃蛇游戏【代码】
花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...
- 用Java开发贪吃蛇游戏
贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...
- java 简单贪吃蛇
1. [代码]java 简单程序 跳至 [1] [全屏预览]package com.snake;import java.awt.*;import javax.swing.*;import ja ...
- Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)
这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Android实现贪吃蛇游戏
[绥江一百]http://www.sj100.net 欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...
- 贪吃蛇的java代码分析(一)
自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...
- 贪吃蛇的java代码分析(二)
代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...
随机推荐
- BZOJ3998 弦论 【SAM】k小子串
BZOJ3998 弦论 给一个字符串,问其第\(K\)小字串是什么 两种形式 1.不同起始位置的相同串只算一次 2.不同起始位置的相同串各算一次 首先建\(SAM\) 所有串的数量就是\(SAM\)中 ...
- 【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)
题目链接: 51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1 ...
- hdu3577 Fast Arrangement
Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...
- Codeforces Round #673 (Div. 2) B. Two Arrays (贪心)
题意:给你一组数\(a\)和一个数\(T\),将这组数分为两组\(c\)和\(d\),定义\(f(x)\)为数组\(x\)中任意两个不同元素的和为\(T\)的个数,问为了使\(min(f(c)+f(d ...
- Educational DP Contest G - Longest Path (dp,拓扑排序)
题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...
- 一张图解决ThreadLocal
一张图解决ThreadLocal 一.前言 年底梳理知识体系时,研究了一下ThreadLocal的源码,整理了一张核心图. 想着,都走到这一步了,那就写一篇深度解读的文章吧.看过我之前文章的小伙伴都知 ...
- Vue UI lib missing vue bug
Vue UI lib missing vue bug Error Uncaught TypeError: Cannot read property 'prototype' of undefined a ...
- GitHub Actions in Action
GitHub Actions in Action https://lab.github.com/githubtraining/github-actions:-hello-world https://g ...
- Web 实时通信方案 All In One
Web 实时通信方案 All In One HTTP 轮询, 单向通信,开销大 HTTP 长轮询, 单向通信,开销较小 WebSocket,双向通信,开销小 (TCP 高延迟,保证数据完整性) Ser ...
- Koa & node.js
KOA https://github.com/koajs/koa https://koajs.com/ $ nvm install 7 # node.js 7 + $ nvm install 10 $ ...