游戏界面基本布局

贪吃蛇是基于JFrame的一款小游戏。它主要有两部分组成,一个是显示区域,一个是按钮区域。这两个区域都用JPanel来实现。

首先需要创建一个基于JFrame的类,例如创建一个MyFrame,让其继承于JFrame。

然后创建一个显示区域的类MyPanel,一个按钮区域的类Button,当然了这两个类都基于JPanel。

第三步:在MyFrame类中实例化两个JPanel类。并在MyFrame构造方法中设置窗体的logo、窗体的标题、窗体初始位置、窗体的大小、窗体的背景颜色、窗体的关闭方式等。

第四步:继续清空MyFrame的布局管理器、设置窗体为固定大小不可更改、添加两个区域并显示、设置键盘监听焦点(控制贪吃蛇的移动)等。

游戏显示区域

MyPanle实现思路:

  1. 在构造方法中注册键盘监听事件、设置容器的坐标及大小、设置容器的背景颜色。如果想要添加背景图片,可以重写paintComponent方法。
  2. 创建一个食物类Food,创建一个贪吃蛇类Snake,并在MyPanel里实例化这两个类。
  3. 在MyPanel里创建一个贪吃蛇的线程,并在构造方法里启动该线程。
  4. 重写paint方法,绘制容器。并设置相应的颜色、画线、调用贪吃蛇的移动方法和绘画方法、调用食物的绘画方法。

配置文件类:

  1. 定义布局所需要的行和列,定义上下左右四个方向
  2. 定义死亡检测标识、定义游戏状态检测标识。

贪吃蛇线程类:

  1. 重写线程启动的方法
  2. 在启动方法里时刻检测贪吃蛇是否死亡,如果死亡则弹出“游戏结束”的对话框。

食物类:

  1. 定义食物的坐标。
  2. 定义食物的绘画方法
  3. 当食物被吃掉后,我们需要随机生成一个位置来展示食物,因此需要一个生成随机位置的方法repair()
  4. 定义获取食物坐标的方法。在构造方法里随机生成食物的坐标

结点类:

蛇有蛇头和蛇身、蛇尾,我们用节点来实现。

  1. 创建一个结点类,属性包括所在行、所在列、上个结点、下个节点、前进方向。
  2. 在有参构造方法中初始化贪吃蛇的位置信息,指定贪吃和前进的方向。
  3. 定义绘画方法,蛇头颜色为黄色、其余为蓝色。

贪吃蛇类

  1. 创建一个贪吃蛇类,属性包括头、身、尾、食物。
  2. 定义有参构造方法,参数为食物。并初始化贪吃蛇的初始坐标、以及设置结点之间的关系。
  3. 定义绘画方法,遍历贪吃蛇的每个节点,然后把每个节点绘画出来。
  4. 定义获取贪吃蛇坐标的方法,用于获取贪吃蛇的坐标。
  5. 定义贪吃蛇的移动方法。贪吃蛇怎么移动?添加蛇头——去蛇尾——吃食物——死亡检测
  6. 定义添加蛇头的方法,设置一个Node临时变量。根据前进方向判断,如何添加蛇头。
  7. 定义去除蛇尾的方法,把蛇尾的前一个结点的后指针设置为空,把蛇尾的前一个结点设置为蛇尾即可。
  8. 定义吃食物的方法,三步走。首先判断贪吃蛇坐标和食物坐标是否重合,如果重合就添加蛇头然后重新布局食物。
  9. 定义死亡检测方法,两步走。第一步判断是否越界,第二步判断头是否和尾重合。
  10. 定义键盘控制方法。当用户按下WASD键,贪吃蛇才可改变方向移动且不能逆向移动。(比如开始向上移动,我不能直接按S键让它向下移动)。

按钮区域

  1. 创建属性:myPanel、暂停、继续、重新开始、退出。
  2. 创建带参数的构造方法,参数为myPanel.
  3. 在构造方法中设置初始位置及大小、创建四个按钮并添加。
  4. 在构造方法里注册按钮监听。
  5. 重写actionPerformed方法。检测按下按钮。
  6. 如果按下继续游戏,那么需要重写设置键盘监听焦点
  7. 如果是重新开始游戏,那么需要停止当前线程,然后重新生成蛇和食物,并把控制条件还原到初始状态。最后创建新的线程对象并启动,最后再设置键盘监听焦点。

代码获取

https://github.com/XinPingLover/MyCode.git

Java实现贪吃蛇的更多相关文章

  1. java实现贪吃蛇游戏

    最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...

  2. Java实现贪吃蛇游戏【代码】

    花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...

  3. 用Java开发贪吃蛇游戏

    贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...

  4. java 简单贪吃蛇

    1. [代码]java 简单程序     跳至 [1] [全屏预览]package com.snake;import java.awt.*;import javax.swing.*;import ja ...

  5. Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)

    这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...

  6. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  7. Android实现贪吃蛇游戏

    [绥江一百]http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...

  8. 贪吃蛇的java代码分析(一)

    自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...

  9. 贪吃蛇的java代码分析(二)

    代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...

随机推荐

  1. POJ - 3376 Finding Palindromes(拓展kmp+trie)

    传送门:POJ - 3376 题意:给你n个字符串,两两结合,问有多少个是回文的: 题解:这个题真的恶心,我直接经历了5种错误类型 : ) ... 因为卡内存,所以又把字典树改成了指针版本的. 字符串 ...

  2. zoj3777 Problem Arrangement(状压dp,思路赞)

    The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward i ...

  3. 牛客小白月赛17 G 区间求和

    传送门 题意: 题解: 原本想着使用暴力方法: 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream& ...

  4. Codeforces ECR 83 C. Adding Powers (位运算)

    题意:给你n个数和一个底数k,每个数每次能减去k^i(i=0,1,2,....),每个k^i只能用一次,问是否能够将每个数变为0. 题解:我们将每个数转化为k进制,因为每个k^i只能用一次,所以我们统 ...

  5. Codeforces Round #672 (Div. 2 B. Rock and Lever (位运算)

    题意:给你一组数,求有多少对\((i,j)\),使得\(a_{i}\)&\(a_{j}\ge a_{i}\ xor\ a_{j}\). 题解:对于任意两个数的二进制来说,他们的最高位要么相同要 ...

  6. Codeforces Round #650 (Div. 3) D. Task On The Board (构造,贪心)

    题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解 ...

  7. 自动生成requirements.txt

    Python 自动生成当前项目的requirements.txt 通常我们开发一个python项目时都会用conda 或者 virtualenv 等虚拟环境管理工具来创建一个虚拟环境,在这个虚拟环境中 ...

  8. NLP论文阅读一:Paper阅读方法

    参考:https://pan.baidu.com/s/1MfcmXKopna3aLZHkD3iL3w 一.为什么要读论文? 基础技术:读论文中的related works可以帮助了解该领域的一些主要的 ...

  9. leetcode29 两数相除 int 与移位

    难受啊 考虑越界 考虑dividend为-2^31,用负数移位运算 class Solution { public: int divide(int dividend, int divisor) { i ...

  10. CodeForces - 13E(分块)

    Little Petya likes to play a lot. Most of all he likes to play a game «Holes». This is a game for on ...