基于JavaGUI的贪吃蛇游戏

合集下载

用Java做的贪吃蛇,简单版......

用Java做的贪吃蛇,简单版......

⽤Java做的贪吃蛇,简单版......效果图⽚::话不多说,上代码:⼀共三个类:①public class Body {int x;int y;public Body(int x, int y) {this.x = x;this.y = y;}}②import java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Random;import javax.swing.JFrame;public class BallThread extends JFrame {/****/private static final long serialVersionUID = 1L;private static int RedX = 120; // ⼩球初始位置private static int RedY = 120;private Color color = Color.RED; // ⼩球初始颜⾊private Thread run;private String direction;private Body[] body = new Body[100];int body_length = 1;int randomx = 40, randomy = 40;private boolean pause = false;// 有参构造⽅法public BallThread() {// 实例化数组for (int i = 0; i < 100; i++) {body[i] = new Body(0, 0);}body[0].x = RedX;body[0].y = RedY;setSize(400, 400); // 设置⼤⼩setLocationRelativeTo(null);setTitle("贪吃球");setResizable(false);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {System.out.println("到这来.........");super.keyPressed(e);// System.out.println(e.getKeyCode());if (e.getKeyCode() == KeyEvent.VK_LEFT) { direction = "L";}if (e.getKeyCode() == KeyEvent.VK_RIGHT) { direction = "R";}if (e.getKeyCode() == KeyEvent.VK_UP) {direction = "U";}if (e.getKeyCode() == KeyEvent.VK_DOWN) { direction = "D";}if (e.getKeyCode() == KeyEvent.VK_SPACE) {if (pause == false) {pause = true;} else {pause = false;}}}});}public void paint(Graphics g) {// 必须传递给⽗类super.paint(g);// System.out.println("运⾏到这来");// 画⽹格// g.drawLine(500, 500, 600, 400);g.clipRect(1, 1, 400, 400);// 1.画⽅格// 竖线for (int i = 1; i < 500; i = i + 20) {g.setColor(Color.BLACK);g.drawLine(i, 1, i, i + 400);// 填充g.setColor(Color.GREEN);// 画横墙g.fill3DRect(i + 1, 20 + 1, 20, 20, true);g.fill3DRect(i + 1, 380 + 1, 20, 20, true);}// 横线for (int i = 1; i < 500; i = i + 20) {g.setColor(Color.BLACK);g.drawLine(1, i, i + 400, i);// 填充g.setColor(Color.green);g.fill3DRect(1, i + 1, 20, 20, true);g.fill3DRect(382, i + 1, 20, 20, true);}// 画颜⾊圈g.setColor(Color.blue);g.drawRoundRect(20, 40, 20, 20, 20, 20);g.setColor(Color.RED);g.drawRoundRect(80, 120, 20, 20, 20, 20);g.setColor(Color.PINK);g.drawRoundRect(220, 220, 20, 20, 20, 20);if (isEated()) {produceFood();g.setColor(Color.yellow);g.fillRect(randomx, randomy, 20, 20);} else {g.setColor(Color.yellow);g.fillRect(randomx, randomy, 20, 20);}// ⼩球g.setColor(color); // 颜⾊g.drawRoundRect(RedX, RedY, 20, 20, 20, 20);g.fillRoundRect(RedX, RedY, 20, 20, 20, 20);body[0].x = RedX;body[0].y = RedY;for (int i = 1; i < body_length; i++) {System.out.println("⾝体显⽰了");System.out.println("X==" + body[i].x + " Y======" + body[i].y);g.setColor(Color.BLACK);g.drawRect(body[i].x, body[i].y, 20, 20);g.fillRect(body[i].x, body[i].y, 20, 20);}g.setColor(color); // 颜⾊g.drawRoundRect(RedX, RedY, 20, 20, 20, 20);g.fillRoundRect(RedX, RedY, 20, 20, 20, 20);}// 消除闪烁(下⾯这两⾏代码可写可不写,因为还没实现解决闪烁这个问题,有兴趣的可以⾃⼰解决闪烁问题)public void update(Graphics g) {paint(g);}private boolean isEated() {// TODO Auto-generated method stubif (RedX == randomx && RedY == randomy) {return true;} else {return false;}}// ⼩球移动public void move() {System.out.println(body.length);long millis = 600; // 每隔300毫秒刷新⼀次run = new Thread() {public void run() {while (true) {try {System.out.println("public void Thread:" + Thread.currentThread().getName());Thread.sleep(millis);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (!pause) {// 移动if (direction == "L") {if (RedX >= 40)RedX -= 20;}if (direction == "R") {if (RedX <= 340)RedX += 20;}if (direction == "U") {if (RedY >= 60)RedY -= 20;}if (direction == "D") {if (RedY <= 340)RedY += 20;}System.out.println("body_length====" + body_length);if (RedX == randomx && RedY == randomy) {body_length++;body[body_length - 1].x = randomx;body[body_length - 1].y = randomy;System.out.println("body[body_length-1].x" + body[body_length - 1].x); System.out.println(body[body_length - 1].y);}// ⾝体刷新for (int i = body_length - 1; i > 0; i--) {body[i].x = body[i - 1].x;body[i].y = body[i - 1].y;}// 给球头换颜⾊if (RedY == 40 && RedX == 20) {color = Color.blue;}if (RedX == 80 && RedY == 120) {color = Color.RED;}if (RedY == 220 && RedX == 220) {color = Color.PINK;}repaint();}}}};run.start();}// ⽣产⾷物public void produceFood() {boolean flag = true;Random r = new Random();randomx = (r.nextInt(18) + 1) * 20;randomy = (r.nextInt(17) + 2) * 20;while (flag) {for (int i = 0; i < body_length; i++) {if (body[i].x == randomx && body[i].y == randomy) {// 如果⽣产的⾷物在球⾝上,那么就重新⽣产randomx = (r.nextInt(18) + 1) * 20;randomy = (r.nextInt(17) + 2) * 20;flag = true;break;} else {if (i == body_length - 1) {flag = false;}}}}}}③public class BallMove {public static void main(String[] args) {BallThread Ball = new BallThread();Ball.move();}}如果你有其他想法或建议,写下来:我们⼀块讨论啊。

java贪吃蛇课程设计报告总结

java贪吃蛇课程设计报告总结

课程设计报告:Java贪吃蛇游戏1. 背景贪吃蛇是一款经典的街机游戏,通过控制蛇的移动,吃掉食物,使蛇变得越来越长,直到触碰到边界或自己的身体为止。

该游戏在20世纪80年代流行起来,并成为了一种代表性的休闲娱乐方式。

贪吃蛇游戏可以提高玩家的反应能力、体力协调和空间感知能力。

本次课程设计旨在通过使用Java编程语言,设计实现一个简化版的贪吃蛇游戏,以加深学生对面向对象程序设计的理解和应用,并培养学生的逻辑思维能力和团队协作精神。

2. 分析2.1 游戏规则分析在贪吃蛇游戏中,玩家通过控制蛇的移动方向,使蛇吃到食物从而变长,直到游戏结束。

具体规则如下:•初始状态下,蛇由一个长度为3的身体组成,呈水平放置。

•蛇的移动方式为每个时间单位(通常为固定时间间隔)前进一格,移动方向由玩家通过键盘输入控制。

•蛇在吃到食物后,身体变长一节,并在地图上随机生成新的食物。

•蛇头碰到地图边界或自身身体的任意部分,游戏结束。

2.2 功能模块分析基于对游戏规则的分析,可以将贪吃蛇游戏的功能模块划分如下:•游戏初始化模块:初始化地图、蛇的初始位置和长度、生成初始食物等。

•用户输入模块:读取用户的键盘输入,控制蛇的移动方向。

•游戏逻辑模块:根据用户输入和游戏规则,更新蛇的位置、判断是否吃到食物或撞到障碍物等。

•地图绘制模块:将地图、蛇、食物等元素绘制到屏幕上。

•游戏循环模块:根据固定时间间隔循环执行游戏逻辑、用户输入和地图绘制等操作。

•游戏结束模块:在游戏结束时输出游戏得分等信息。

2.3 设计思路基于上述功能模块的分析,我设计了如下的实现思路:1.使用Java面向对象编程的思想,抽象出地图、蛇、食物等对象,并为其封装相应的属性和方法。

2.在游戏初始化模块中,创建地图对象、蛇对象,初始化位置和长度,并生成初始食物。

3.在用户输入模块中,利用Java的键盘事件监听机制,获取用户的方向输入,并通过调用蛇对象的移动方法实现控制蛇的移动方向。

使用Java制作贪吃蛇游戏

使用Java制作贪吃蛇游戏

近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。

Eclipse是一个开放源代码的、基于Java的可扩展开发平台,同时它也是是著名的跨平台的自由集成开发环境,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。

贪吃蛇是人们手机中是一个很常见的一个经典小游戏,人们对它并不陌生,在紧张的现实生活中给人们带来了不少的乐趣,编写这个贪吃蛇小游戏能让人们在业余时间里适当的放松,保持好的心态。

在这个程序中我采用了Java中的图形用户界面技术,同时引入了线程来编写。

本次设计主要是对我之前所学Java知识的一个巩固,不仅提高了我综合运用以前所学知识的能力,同时也锻炼了我的实际动手能力。

整个游戏代码简单易懂,用户在娱乐的同时也可以简单的看一下代码,有助于初涉Java者语言水平的提高。

贪吃蛇的核心算法是如何实现移动和吃掉食物,在当前运动方向上头指针所指的位置之前添加一个节点,然后删除尾节点,最后把链表中的所有节点依次画出来,这样就可以达到移动的效果。

对是否吃到食物,需要对蛇和食物进行碰撞检测,检测未碰撞在一起则只需要执行移动操作,碰撞在一起时表示吃到食物,则只需把食物入队即可,即在蛇的节点链表上再添加一个节点,从而达到身体增长的效果。

本次设计的重点之处在于编程思想的形成,设计图像界面,产生随机食物及其位置。

难点在于程序编写中,整个程序框架的架构。

这就要求我们不仅要对这个游戏的玩法特别熟悉,而且还要熟练掌握Java 语言。

实现贪吃蛇的四个类模块,分别为游戏界面、蛇、食物和方向。

其具体设计如下:1产生游戏界面Yard.java包括界面的位置、大小的设定,绘制游戏界面,启动键盘监听器。

1)在launch()中添加代码:this.setBounds(200,200,COLS*BLOCK_SIZE,ROWS*BLOCK _SIZE);设定界面的位置、大小。

贪吃蛇游戏java课程设计

贪吃蛇游戏java课程设计

贪吃蛇游戏java课程设计一、课程目标知识目标:1. 让学生掌握Java基本语法和面向对象编程思想;2. 让学生了解贪吃蛇游戏的基本规则和逻辑;3. 让学生掌握使用Java编写贪吃蛇游戏的方法和技巧。

技能目标:1. 培养学生独立分析问题、解决问题的能力;2. 培养学生运用所学知识进行实际项目开发的能力;3. 培养学生团队协作、沟通表达的能力。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学生主动学习的动力;2. 培养学生面对困难和挑战时,保持积极的心态和坚持不懈的精神;3. 培养学生遵守编程规范,养成良好的编程习惯。

课程性质:本课程为实践性较强的课程,旨在通过贪吃蛇游戏的设计与实现,让学生将所学的Java编程知识运用到实际项目中,提高学生的编程能力和实际操作能力。

学生特点:学生已具备一定的Java编程基础,对游戏开发有一定兴趣,但可能缺乏实际项目经验。

教学要求:注重理论与实践相结合,引导学生主动探究,培养其独立解决问题的能力。

在教学过程中,关注学生的个体差异,提供个性化指导,确保每位学生都能在课程中取得进步。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. Java基本语法复习:变量、数据类型、运算符、控制结构等;2. 面向对象编程:类与对象、继承、封装、多态等;3. Java图形用户界面(GUI):Swing组件、事件处理、布局管理器等;4. 游戏设计基础:游戏循环、碰撞检测、游戏逻辑等;5. 贪吃蛇游戏设计与实现:游戏规则、界面设计、蛇的移动与增长、食物的生成与消失、得分与结束条件等。

教学大纲安排如下:第一周:Java基本语法复习,面向对象编程基础;第二周:Java图形用户界面(GUI)设计与事件处理;第三周:游戏设计原理与贪吃蛇游戏分析;第四周:贪吃蛇游戏设计与实现,包括界面设计、游戏逻辑开发等;第五周:课程总结与展示,学生互评、教师点评。

教学内容关联教材章节:1. Java基本语法复习:教材第1-3章;2. 面向对象编程:教材第4-6章;3. Java图形用户界面(GUI):教材第7章;4. 游戏设计基础:教材第8章;5. 贪吃蛇游戏设计与实现:教材第9章及课外拓展内容。

java贪吃蛇课程设计

java贪吃蛇课程设计

java贪吃蛇课程设计一、课程目标知识目标:1. 让学生掌握Java基础语法,包括变量、数据类型、运算符、控制结构等。

2. 让学生理解面向对象编程的基本概念,如类、对象、封装、继承、多态。

3. 让学生学会使用Java编写图形用户界面(GUI)程序,运用事件处理机制。

技能目标:1. 培养学生运用Java编程解决问题的能力,特别是解决逻辑性和结构性问题。

2. 培养学生分析问题、设计算法、编写程序、调试程序的能力。

3. 提高学生的团队协作能力,通过分组合作完成课程设计。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生学习Java的热情。

2. 培养学生勇于尝试、不怕失败的精神,面对编程难题保持积极的态度。

3. 培养学生的创新意识,鼓励他们在编程实践中尝试新思路、新方法。

分析课程性质、学生特点和教学要求,本课程目标具体、可衡量,旨在让学生通过学习Java编程,完成贪吃蛇游戏的设计与实现。

将目标分解为以下具体学习成果:1. 知识方面:学生能熟练运用Java语法和面向对象编程知识,掌握贪吃蛇游戏的基本逻辑。

2. 技能方面:学生具备编写、调试贪吃蛇游戏的能力,能通过团队协作解决问题。

3. 情感态度价值观方面:学生对编程产生浓厚兴趣,愿意主动探索、创新,培养良好的编程习惯。

二、教学内容根据课程目标,教学内容主要包括以下部分:1. Java基础语法:- 变量、数据类型、常量- 运算符、表达式、语句- 控制结构(顺序、分支、循环)2. 面向对象编程:- 类与对象- 封装、继承、多态- 抽象类与接口3. Java图形用户界面(GUI)编程:- AWT与Swing概述- 常用组件的使用- 事件处理机制4. 贪吃蛇游戏设计与实现:- 游戏逻辑分析- 界面设计与实现- 控制算法编写- 游戏优化与调试教学大纲安排如下:1. 第一周:Java基础语法学习,复习相关概念。

2. 第二周:面向对象编程知识学习,案例分析。

3. 第三周:Java GUI编程入门,编写简单的图形界面程序。

Java实现贪吃蛇游戏

Java实现贪吃蛇游戏

Java实现贪吃蛇游戏相信很多⼈⼤学时候都学过Java这门语⾔吧,这门课⼀般最后有⼀个⼤作业,就是⽤Java写⼀个⼩软件,⽐⽅说简单的聊天软件、贪吃蛇、计算器等等。

这个游戏就是我⾃⼰刚学习Java的时候写的,当然刚开始都是边百度边写,很多功能当时就是只考虑了如何实现,⽽没有考虑这样实现合不合理。

所以⼀开始的代码是写的⾮常烂的,主要是当时⾃⼰也才开始学习Java不久,所以对Java的很多语法和特性并不熟悉。

后来⾃⼰闲得⽆聊的时候⼜对程序更改过很多次了,其中有过对程序结构的调整,接⼝的重新设计,以及很多不合理代码的改写。

所以放在这⾥,也是给那些或许需要学习Java的同学⼀点参考吧。

作为以前诺基亚⼿机上的经典游戏,贪吃蛇和俄罗斯⽅块⼀样,都曾经在我们的童年给我们带来了很多乐趣。

世间万物⽃转星移,诺基亚曾经作为⼿机业的龙头⽼⼤,现如今也⼀步步⾛向衰落,被收购,最后都退出⼿机业务了,⽽贪吃蛇这款游戏也基本上没⼈玩了,甚⾄在新⼀代⼈的印象中都已毫⽆记忆。

但是,作为Java初学者,这款游戏其实还是⾮常适合去⾃⼰实现⼀下的。

毕竟贪吃蛇游戏规则⾮常简单,游戏界⾯也⾮常简单,你不需要去花费时间去设计游戏的玩法和游戏UI如何设计,也不需要去为这个游戏需要很多素材。

在⼀定程度上也能锻炼初学者的编程能⼒,熟悉Java的语法。

初版(2017年7⽉15号)游戏界⾯如下:初版代码了⼤约是700⾏。

事实上初版的界⾯和代码我后来都做了⼀定的修改,因为刚开始的代码实在太烂了,我都不好意思发出来误导新⼈。

第⼀版整体界⾯很简单,因为当时就是想先快速实现出来看看效果,能玩就⾏。

这⼀版本的蛇没有⽤图⽚,⽽是直接⽤Java⾃带的函数画出来的。

所以游戏启动⾮常快,不需要加载图⽚资源。

设置⾥能把周围彩⾊的边框去掉,加上去只是让玩家知道边界在哪。

同时⽹格线也能去掉。

这⼀版玩家只有碰到周围的墙才会死,碰到⾃⼰是不会死的。

游戏界⾯按空格键可以暂停和开始,按ESC键可以重新开始。

(完整word版)java课程设计之贪吃蛇

(完整word版)java课程设计之贪吃蛇

目录一系统描述 (1)1.1 本设计的目的和意义 (1)1.2 设计的主要内容 (1)1.3 设计要达到的目标 (2)1.4设计需要实现的功能和目标 (2)1.5 游戏设计环境 (2)二分析与设计 (3)2.1游戏处理流程 (3)2.2需求分析 (4)2.3 功能模块设计 (4)2.4 详细设计 (8)三系统测试 (19)四心得体会 (21)五参考文献 (22)六附录 (24)基于Java的游戏“贪吃蛇”的设计和实现内容提要:“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。

本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。

整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。

通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

一系统描述1.1 本设计的目的和意义贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。

贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。

贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。

在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。

因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。

在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。

正是因为如此,本次毕业设计的目的在于学习Java程序设计基本技术,学习用JBuilder开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。

学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握JBuilder环境的使用方法,培养起初步的项目分析能力和程序设计能力。

java贪吃蛇游戏设计课程设计

java贪吃蛇游戏设计课程设计

java贪吃蛇游戏设计课程设计一、课程目标知识目标:1. 让学生掌握Java编程语言的基本语法和面向对象编程思想。

2. 使学生了解贪吃蛇游戏的基本规则和设计原理。

3. 帮助学生理解游戏开发中坐标系的应用、事件处理和循环结构的使用。

技能目标:1. 培养学生运用Java语言编写简单游戏的能力。

2. 提高学生分析问题、解决问题的能力,学会运用编程思维解决实际问题。

3. 培养学生团队协作和沟通表达的能力,能在团队中发挥各自优势,共同完成项目。

情感态度价值观目标:1. 激发学生对编程的兴趣,提高学习积极性,培养自主学习能力。

2. 培养学生勇于尝试、不断探索的精神,增强面对困难的信心。

3. 引导学生关注计算机技术在日常生活中的应用,认识到科技改变生活的力量。

分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 知识方面:学生能熟练使用Java语言编写贪吃蛇游戏,掌握相关概念和原理。

2. 技能方面:学生能独立分析游戏需求,设计合适的算法和数据结构,完成游戏功能。

3. 情感态度价值观方面:学生通过团队协作,体验编程带来的成就感,培养积极向上的学习态度。

二、教学内容根据课程目标,教学内容主要包括以下几部分:1. Java基本语法与面向对象编程:- 变量、数据类型、运算符- 控制结构:条件语句、循环语句- 面向对象编程:类、对象、方法、继承、封装、多态2. 游戏设计原理与实现:- 贪吃蛇游戏规则及设计思路- 坐标系的应用- 事件处理机制- 游戏循环结构设计3. 游戏编程实践:- 编程环境配置- 贪吃蛇游戏项目搭建- 游戏功能模块开发:食物、贪吃蛇、碰撞检测等- 游戏优化与调试教学内容安排与进度:1. Java基本语法与面向对象编程(第1-2周)2. 游戏设计原理与实现(第3-4周)3. 游戏编程实践(第5-8周)教材章节关联:1. 《Java编程思想》第1-4章:Java基本语法与面向对象编程2. 《Java游戏编程》第3章:游戏设计原理与实现3. 《Java游戏编程实战》第5-7章:游戏编程实践三、教学方法为了提高教学效果,激发学生的学习兴趣和主动性,本课程采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言、形象的比喻,讲解Java编程基本语法和面向对象编程思想,使抽象的概念具体化,便于学生理解和掌握。

Java贪吃蛇系统简历

Java贪吃蛇系统简历

Java贪吃蛇系统简历
“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。

通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。

需要满足以下几点要求:
(1)利用方向键来改变蛇的运行方向。

(2)空格键暂停或继续游戏,并在随机的地方产生食物。

(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。

实现过程
(1)绘制窗体对象。

(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。

(3)使用键盘监听事件和定时器实现小蛇的移动。

(4)小蛇与食物碰撞的实现。

(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。

(6)退出条件:当游戏积分到达指定分数,游戏退出。

总结
本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大
的提升。

在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。

Java语言程序设计的课程设计项目——利用Java实现吞(贪)食蛇游戏项目完整实现实例(第3部分)

Java语言程序设计的课程设计项目——利用Java实现吞(贪)食蛇游戏项目完整实现实例(第3部分)

1.1利用Java实现吞(贪)食蛇游戏项目完整实现实例(第3部分)1.1.1扩展主窗口的GUI及交换功能7.添加GreedSnakeMainToolBar工具条类(1)添加GreedSnakeMainToolBar工具条类,包名称为com.px1987.greedsnake.mainframe.toolbar,继承javax.swing.JToolBar类(2)编程该GreedSnakeMainToolBar工具条类package com.px1987.greedsnake.mainframe.toolbar;import javax.swing.JLabel;import javax.swing.JToolBar;import com.px1987.greedsnake.util.GreedSnakeAppVO;import com.px1987.greedsnake.thread.*;public class GreedSnakeMainToolBar extends JToolBar { private static final long serialVersionUID = 1L;private JLabel gameResultScoreLabel=null;private JLabel snakeMovingStepCounterLabel=null;public JLabel getSnakeMovingStepCounterLabel() {return snakeMovingStepCounterLabel;}public JLabel getGameResultScoreLabel() {return gameResultScoreLabel;}public GreedSnakeMainToolBar() {}public GreedSnakeMainToolBar(String toolBarWindowTitle){ super(toolBarWindowTitle);this.setFloatable(false); //设置该工具条不可拖动createAllButtonsInMainToolBar();}public void createAllButtonsInMainToolBar(){for(int index=0; index <5; index++){this.addSeparator();}gameResultScoreLabel = new JLabel("本次游戏结果: 0 分");this.add(gameResultScoreLabel);for(int index=0; index <30; index++){this.addSeparator();}snakeMovingStepCounterLabel = new JLabel("步数:");this.add(snakeMovingStepCounterLabel);}public void updateThisGameScoreResult(SnakeMoveThread oneSnakeMoveThread){ String scoreResultTextInfo = "本次游戏结果: " +GreedSnakeAppVO.getGreedSnakeAppVO().getGameScoreResult()+" 分";gameResultScoreLabel.setText(scoreResultTextInfo);}}8、扩展GreedSnakeMainFrame类以包含工具条(1)添加如下的成员属性private GreedSnakeMainToolBar oneGreedSnakeMainToolBar=null;public GreedSnakeMainToolBar getOneGreedSnakeMainToolBar() {return oneGreedSnakeMainToolBar;}private SnakeMoveThread oneSnakeMoveThread = null;public SnakeMoveThread getOneSnakeMoveThread() {return oneSnakeMoveThread;}(2)添加下面的成员方法public void createMainToolBarPanel(JPanel contentPanel){oneGreedSnakeMainToolBar=new GreedSnakeMainToolBar("主工具条");contentPanel.add(oneGreedSnakeMainToolBar, BorderLayout.NORTH);}(3)GreedSnakeMainFrame类最终的代码如下package com.px1987.greedsnake.mainframe;import java.awt.BorderLayout;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JPanel;import com.px1987.greedsnake.mainframe.toolbar.GreedSnakeMainToolBar; import com.px1987.greedsnake.util.GreedSnakeAppVO;public class GreedSnakeMainFrame extends JFrame {private static final long serialVersionUID = 1L;private JPanel contentPanel=null;private GreedSnakeMainToolBar oneGreedSnakeMainToolBar=null;public GreedSnakeMainToolBar getOneGreedSnakeMainToolBar() { return oneGreedSnakeMainToolBar;}private SnakeMoveThread oneSnakeMoveThread = null;public SnakeMoveThread getOneSnakeMoveThread() {return oneSnakeMoveThread;}public GreedSnakeMainFrame(){super();loadGreenGrassBackgroundImage();initThisMainFrame();contentPanel=new JPanel();contentPanel.setLayout(new BorderLayout());this.setContentPane(contentPanel);this.setSize(AllGreedSnakeGameAppConstant.greedSnakePanelWidth+5,AllGreedSnakeGameAppConstant.greedSnakePanelHeight+5);createMainToolBarPanel(contentPanel);this.setLocationRelativeTo(null); //将窗口居中显示}public void initThisMainFrame(){this.setTitle("吞(贪)食蛇游戏");Image oneIconImage=Toolkit.getDefaultToolkit().getImage(getClass().getResource("/images/mainframeIconImage.jpg"));this.setIconImage(oneIconImage);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setAlwaysOnTop(true);}public void createMainToolBarPanel(JPanel contentPanel){oneGreedSnakeMainToolBar=new GreedSnakeMainToolBar("主工具条");contentPanel.add(oneGreedSnakeMainToolBar, BorderLayout.NORTH); }private Image greenGrassBackGroundImage=null;public Image getGreenSnakeGrassBackGroundImage() {return greenGrassBackGroundImage;}private void loadGreenGrassBackgroundImage(){ //由于背景图片比较大,需要进行跟踪greenGrassBackGroundImage=Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/images/greengrass.jpg"));MediaTracker oneMediaTracker=new MediaTracker(this);int trackedImageID=0;oneMediaTracker.addImage(greenGrassBackGroundImage,trackedImageID);try{oneMediaTracker.waitForID(trackedImageID);// oneMediaTracker.waitForAll();}catch(Exception e){e.printStackTrace();}}}9.再添加CenterGreedSnakePanel面板类(1)添加CenterGreedSnakePanel面板类,继承于javax.swing.JPanel,包名称为com.px1987.greedsnake.mainframe.panel(2)编程CenterGreedSnakePanel面板类package com.px1987.greedsnake.mainframe.panel; import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import java.util.Iterator;import java.util.LinkedList;import javax.swing.JPanel;import com.px1987.greedsnake.mainframe.GreedSnakeMainFrame;import com.px1987.greedsnake.util.AllGreedSnakeGameAppConstant;import com.px1987.greedsnake.util.GreedSnakeAppVO;import com.px1987.greedsnake.util.NodeEntity;public class CenterGreedSnakePanel extends JPanel {private static final long serialVersionUID = 1L;private Image littelMouseImage=null;private GreedSnakeMainFrame oneGreedSnakeMainFrame=null;public CenterGreedSnakePanel() {}public CenterGreedSnakePanel(GreedSnakeMainFrame oneGreedSnakeMainFrame) { this.oneGreedSnakeMainFrame=oneGreedSnakeMainFrame;littelMouseImage=Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/images/mouse.jpg"));initThisSnakePanel();}public void initThisSnakePanel(){}public void repaintSnakePanel(){Graphics currentGraphics = this.getGraphics();/** 画背景草地*/if(oneGreedSnakeMainFrame.getGreenSnakeGrassBackGroundImage()!=null){currentGraphics.drawImage(oneGreedSnakeMainFrame.getGreenSnakeGrassBackGroundImag e(),0,0,this);}/** 画出贪食蛇身*/currentGraphics.setColor(GreedSnakeAppVO.getGreedSnakeAppVO().getSnakeBodyColor());LinkedList<NodeEntity> snakeBodyNodeLinkedList =oneGreedSnakeMainFrame.getOneSnakeMoveThread().getOneSnakeBodyAllNodeVO().getSn akeBodyNodeLinkedList();Iterator<NodeEntity> someOneNodeInSnakeBody = snakeBodyNodeLinkedList.iterator();while(someOneNodeInSnakeBody.hasNext()){NodeEntity someOneNode = (NodeEntity)someOneNodeInSnakeBody.next();drawSomeOneNode(currentGraphics,someOneNode);}/** 首先画出老鼠*/NodeEntity foodNode = oneGreedSnakeMainFrame.getOneSnakeMoveThread().getOneSnakeBodyAllNodeVO().getSnake FoodTargetNode();intcurrentFoodNodePosX=foodNode.getNodeColNo()*AllGreedSnakeGameAppConstant.someOneN odeWidth;intcurrentFoodNodePosY=foodNode.getNodeRowNo()*AllGreedSnakeGameAppConstant.someOne NodeHeight;currentGraphics.drawImage(littelMouseImage,currentFoodNodePosX,currentFoodNodePosY,t his);/** 然后再画目标点*/currentGraphics.setColor(GreedSnakeAppVO.getGreedSnakeAppVO().getMouseTargetPointC olor());drawSomeOneNode(currentGraphics,foodNode);oneGreedSnakeMainFrame.getOneGreedSnakeMainToolBar().updateThisGameScoreResult(on eGreedSnakeMainFrame.getOneSnakeMoveThread());}private void drawSomeOneNode(Graphics oneGraphics, NodeEntity someOneNode){ intcurrentNodePosX=someOneNode.getNodeColNo()*AllGreedSnakeGameAppConstant.someOneN odeWidth;intcurrentNodePosY=someOneNode.getNodeRowNo()*AllGreedSnakeGameAppConstant.someOne NodeHeight;if(currentNodePosX>=AllGreedSnakeGameAppConstant.greedSnakePanelWidth){ currentNodePosX=AllGreedSnakeGameAppConstant.greedSnakePanelWidth-AllGreedSnakeG ameAppConstant.someOneNodeWidth;}if(currentNodePosX <=0 ){currentNodePosX=AllGreedSnakeGameAppConstant.someOneNodeWidth;}if(currentNodePosY>=AllGreedSnakeGameAppConstant.greedSnakePanelHeight){ currentNodePosY=AllGreedSnakeGameAppConstant.greedSnakePanelHeight-AllGreedSnake GameAppConstant.someOneNodeHeight;}if(currentNodePosY <= 0){currentNodePosY=AllGreedSnakeGameAppConstant.someOneNodeHeight;}oneGraphics.fillOval(currentNodePosX,currentNodePosY,AllGreedSnakeGameAppConstant.someOneNodeWidth-1,AllGreedSnakeGameAppConstant.someOneNodeHeight-1);}}10、添加GreedSnakeStatusPanel状态条面板(1)添加GreedSnakeStatusPanel状态条面板类,继承于javax.swing.JPanel类,包名称为com.px1987.greedsnake.mainframe.panel(2)编程GreedSnakeStatusPanel类package com.px1987.greedsnake.mainframe.panel;import java.awt.BorderLayout;import javax.swing.JLabel;import javax.swing.JPanel;public class GreedSnakeStatusPanel extends JPanel {private static final long serialVersionUID = 1L;public GreedSnakeStatusPanel() {this.createStatusBarLabelInThisPanel();}public void createStatusBarLabelInThisPanel(){this.setLayout(new BorderLayout());JLabel labelHelp = new JLabel("按PageUp或PageDown键可以加、减速;按回车键开始游戏;按空格键可以暂停", JLabel.CENTER);this.add(labelHelp, BorderLayout.CENTER);}}11、修改GreedSnakeMainFrame主窗口类(1)添加下面的属性private CenterGreedSnakePanel oneGreedSnakePanel;public CenterGreedSnakePanel getOneGreedSnakePanel() {return oneGreedSnakePanel;}(2)添加下面的方法public void createCenterGreedSnakePanel(JPanel contentPanel){oneGreedSnakePanel = new CenterGreedSnakePanel(this);oneGreedSnakePanel.setSize(AllGreedSnakeGameAppConstant.greedSnakePanelWidth, AllGreedSnakeGameAppConstant.greedSnakePanelHeight);contentPanel.add(oneGreedSnakePanel, BorderLayout.CENTER);}public void createBottomStatusPanel(JPanel contentPanel){GreedSnakeStatusPanel oneGreedSnakeStatusPanel = new GreedSnakeStatusPanel();contentPanel.add(oneGreedSnakeStatusPanel,BorderLayout.SOUTH);}(3)修改GreedSnakeMainFrame构造方法public GreedSnakeMainFrame() throws HeadlessException {super();loadGreenGrassBackgroundImage();initThisMainFrame();contentPanel=new JPanel();contentPanel.setLayout(new BorderLayout());this.setContentPane(contentPanel);this.setSize(AllGreedSnakeGameAppConstant.greedSnakePanelWidth+5,AllGreedSnakeGameAppConstant.greedSnakePanelHeight+5);createMainToolBarPanel(contentPanel);createCenterGreedSnakePanel(contentPanel);createBottomStatusPanel(contentPanel);this.setLocationRelativeTo(null); //将窗口居中显示}(4)GreedSnakeMainFrame窗口类的代码如下package com.px1987.greedsnake.mainframe;import java.awt.BorderLayout;import java.awt.HeadlessException;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JPanel;import com.px1987.greedsnake.mainframe.panel.CenterGreedSnakePanel; import com.px1987.greedsnake.mainframe.panel.GreedSnakeStatusPanel; import com.px1987.greedsnake.mainframe.toolbar.GreedSnakeMainToolBar; import com.px1987.greedsnake.util.GreedSnakeAppVO;public class GreedSnakeMainFrame extends JFrame {private static final long serialVersionUID = 1L;private JPanel contentPanel=null;private CenterGreedSnakePanel oneGreedSnakePanel;public CenterGreedSnakePanel getOneGreedSnakePanel() { return oneGreedSnakePanel;}private GreedSnakeMainToolBar oneGreedSnakeMainToolBar=null;public GreedSnakeMainToolBar getOneGreedSnakeMainToolBar() { return oneGreedSnakeMainToolBar;}public GreedSnakeMainFrame() throws HeadlessException {super();loadGreenGrassBackgroundImage();initThisMainFrame();contentPanel=new JPanel();contentPanel.setLayout(new BorderLayout());this.setContentPane(contentPanel);this.setSize(AllGreedSnakeGameAppConstant.greedSnakePanelWidth+5,AllGreedSnakeGameAppConstant.greedSnakePanelHeight+5);createMainToolBarPanel(contentPanel);createCenterGreedSnakePanel(contentPanel);createBottomStatusPanel(contentPanel);this.setLocationRelativeTo(null); //将窗口居中显示}public void initThisMainFrame(){this.setTitle("吞(贪)食蛇游戏");this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setAlwaysOnTop(true);}public void createMainToolBarPanel(JPanel contentPanel){oneGreedSnakeMainToolBar=new GreedSnakeMainToolBar("主工具条");contentPanel.add(oneGreedSnakeMainToolBar, BorderLayout.NORTH);}public void createCenterGreedSnakePanel(JPanel contentPanel){oneGreedSnakePanel = new CenterGreedSnakePanel(this);oneGreedSnakePanel.setSize(AllGreedSnakeGameAppConstant.greedSnakePanelWidth, AllGreedSnakeGameAppConstant.greedSnakePanelHeight);contentPanel.add(oneGreedSnakePanel, BorderLayout.CENTER);}public void createBottomStatusPanel(JPanel contentPanel){GreedSnakeStatusPanel oneGreedSnakeStatusPanel = new GreedSnakeStatusPanel();contentPanel.add(oneGreedSnakeStatusPanel,BorderLayout.SOUTH);}private Image greenGrassBackGroundImage=null;public Image getGreenSnakeGrassBackGroundImage() {return greenGrassBackGroundImage;}private void loadGreenGrassBackgroundImage(){ //由于背景图片比较大,需要进行跟踪greenGrassBackGroundImage=Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/images/greengrass.jpg"));MediaTracker oneMediaTracker=new MediaTracker(this);int trackedImageID=0;oneMediaTracker.addImage(greenGrassBackGroundImage,trackedImageID);try{oneMediaTracker.waitForID(trackedImageID);// oneMediaTracker.waitForAll();}catch(Exception e){e.printStackTrace();}}}。

基于Java的游戏设计——贪吃蛇

基于Java的游戏设计——贪吃蛇

毕业设计论文基于Java的游戏设计——贪吃蛇毕业设计(论文)中文摘要毕业设计(论文)外文摘要目录1 绪论 (1)1.1J AVA语言的特点 (1)1.2开发工具E CLIPSE介绍 (2)1.3开发工具JDK介绍 (3)1.4应用环境 (3)2 系统需求分析 (3)2.1需求分析 (4)2.2可行性分析 (4)3 系统概要设计 (5)3.1游戏流程图 (5)3.2设计目标 (6)3.3系统功能模块 (6)3.4系统数据结构设计 (8)4 系统详细设计 (12)4.1程序设计 (12)4.2贪吃蛇游戏各功能界面截图 (16)5 系统测试 (19)5.1测试的意义 (19)5.2测试过程 (19)5.3测试结果 (20)结论 (21)致谢 (22)参考文献 (23)1 绪论贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面是为了将我们自己的所学知识加以运用;另一方面,我希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。

希望通过这次实践,能从中提高自己的编程能力。

并从中学会从零开始分析设计程序,达到学以致用,活学活用的目的。

另外,通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

本游戏的开发语言为Java,开发工具选用Eclipse。

Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。

这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。

Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。

就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

1.1 Java语言的特点1.1.1 简单性Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。

java实现贪吃蛇游戏代码(附完整源码)

java实现贪吃蛇游戏代码(附完整源码)

java实现贪吃蛇游戏代码(附完整源码)先给⼤家分享源码,喜欢的朋友。

游戏界⾯GUI界⾯java实现贪吃蛇游戏需要创建⼀个桌⾯窗⼝出来,此时就需要使⽤java中的swing控件创建⼀个新窗⼝JFrame frame = new JFrame("贪吃蛇游戏");//设置⼤⼩frame.setBounds(10, 10, 900, 720);向窗⼝中添加控件可以直接⽤add⽅法往窗⼝中添加控件这⾥我创建GamePanel类继承⾃Panel,最后使⽤add⽅法添加GamePanel加载图⽚图⽚加载之后可以添加到窗⼝上public static URL bodyUrl = GetImage.class.getResource("/picture/body.png");public static ImageIcon body = new ImageIcon(bodyUrl);逻辑实现//每次刷新页⾯需要进⾏的操作@Overridepublic void actionPerformed(ActionEvent e) {//当游戏处于开始状态且游戏没有失败时if(gameStart && !isFail) {//蛇头所在的位置就是下⼀次蛇⾝体的位置bodyX[++bodyIndexRight] = headX;bodyY[bodyIndexRight] = headY;//bodyIndexLeft++;//长度到达数组的尾部if(bodyIndexRight==480) {for(int i=bodyIndexLeft, j=0; i<=bodyIndexRight; i++,j++) {bodyX[j]=bodyX[i];bodyY[j]=bodyY[i];}bodyIndexLeft=0;bodyIndexRight=length-1;}//更新头部位置if(fdirection==1) {//头部⽅向为上,将蛇头向上移动⼀个单位headY-=25;}else if(fdirection==2) {//头部⽅向为下,将蛇头向下移动⼀个单位headY+=25;}else if(fdirection==3) {//头部⽅向为左,将蛇头向左移动⼀个单位headX-=25;}else if(fdirection==4) {//头部⽅向为右,将蛇头向右移动⼀个单位headX+=25;}//当X坐标与Y坐标到达极限的时候,从另⼀端出来if(headX<25)headX = 850;if(headX>850)headX = 25;if(headY<75)headY = 650;if(headY>650)headY = 75;//当头部坐标和⾷物坐标重合时if(headX==foodX && headY==foodY){length++;score+=10;//重新⽣成⾷物,判断⾷物坐标和蛇⾝坐标是否重合,效率较慢while(true) {foodX = 25 + 25* random.nextInt(34);foodY = 75 + 25* random.nextInt(24);//判断⾷物是否和头部⾝体重合boolean isRepeat = false;//和头部重合if(foodX == headX && foodY == headY)isRepeat = true;//和⾝体重合for(int i=bodyIndexLeft; i<=bodyIndexRight; i++) {if(foodX == bodyX[i] && foodY == bodyY[i]){isRepeat = true;}}//当不重复的时候,⾷物⽣成成功,跳出循环if(isRepeat==false)break;}}else bodyIndexLeft++;//判断头部是否和⾝体重合for(int i=bodyIndexLeft; i<=bodyIndexRight;i++) {if(headX==bodyX[i] && headY==bodyY[i]){//游戏失败isFail = true;break;}}repaint();}timer.start();}键盘监听实现KeyListener接⼝,重写KeyPressed⽅法,在其中写当键盘按下时所对应的操作。

JAVA设计贪吃蛇游戏

JAVA设计贪吃蛇游戏

JAVA设计贪吃蛇游戏下面是一个简单的贪吃蛇游戏的JAVA设计示例,该示例包括游戏画面的显示、控制蛇的移动、食物的生成与吃掉、以及游戏的结束等基本功能。

首先,我们需要创建一个Snake类来表示蛇的身体。

Snake类包括一个ArrayList作为蛇的身体部分,以及一个方向变量来表示蛇的移动方向。

Snake类还有一个方法来控制蛇的移动,根据方向变量移动蛇的身体。

```javaimport java.util.ArrayList;public class Snakeprivate ArrayList<Cell> body;private Direction direction;public Snakbody = new ArrayList<>(;body.add(new Cell(10, 10)); // 初始化蛇的初始位置direction = Direction.RIGHT; // 蛇的初始方向为向右}public void movCell head = body.get(0); // 蛇头Cell newHead;//根据方向变量移动蛇头的位置switch (direction)case UP:newHead = new Cell(head.getX(, head.getY( - 1); break;case DOWN:newHead = new Cell(head.getX(, head.getY( + 1); break;case LEFT:newHead = new Cell(head.getX( - 1, head.getY(); break;case RIGHT:newHead = new Cell(head.getX( + 1, head.getY(); break;default:newHead = head; // 默认不移动}//添加新的蛇头body.add(0, newHead);//删除尾部,即移动效果body.remove(body.size( - 1);}// getter和setter方法```接下来,我们创建一个Cell类来表示每一个游戏格子的位置。

Java程序设计报告《贪吃蛇》

Java程序设计报告《贪吃蛇》

Java程序设计报告《贪吃蛇》《Java程序设计》课程设计报告题目:贪吃蛇游戏的设计与实现指导老师:沈泽刚专业:计算机科学与技术班级:10-3姓名:梁潇一、课程设计目的贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。

目的是更好地了解和掌握java语言,并熟练的运用java语言来实现项目。

培养自主学习的能力。

本软件在设计方面本着方便、实用及娱乐性高的宗旨,在外界进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。

二、课程设计要求贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块、游戏控制模块。

三、课程设计报告内容(一) 系统设计1、程序概述本程序是一个利用Java应用软件制作的贪吃蛇小游戏。

按钮、暂停按钮、游戏的退出按钮、困难程度、积分排行、关于作者。

(二)代码设计import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class TanChiShe extends JFrame implements ActionListener, KeyListener,Runnable{private JMenuBar menuBar;private JMenu youXiMenu,nanDuMenu,fenShuMenu,guanYuMenu; private JMenuItem kaiShiYouXi,exitItem,zuoZheItem,fenShuItem;private JCheckBoxMenuItem cJianDan,cPuTong,cKunNan; private int length = 6;private Toolkit toolkit;private int i,x,y,z,objectX,objectY,object=0,growth=0,time;private int difficult=2;private int m[]=new int[50];private int n[]=new int[50];private Thread she = null;private int life=0;private int foods = 0;private int fenshu=0;public void run() //运行{time=500;for(i=0;i<=length-1;i++){m[i]=90-i*10;n[i]=60;}x=m[0];y=n[0];z=4;while(she!=null){check();try{she.sleep(time);}catch(Exception ee){System.out.println(z+"");}}}public TanChiShe(){//***************创建新对象**************setVisible(true);menuBar = new JMenuBar();Container con=getContentPane();toolkit=getToolkit();//**************游戏菜单对象***************** youXiMenu = new JMenu("游戏");kaiShiYouXi = new JMenuItem("开始游戏");exitItem = new JMenuItem("退出游戏");//***************困难程度对象**************** nanDuMenu = new JMenu("困难程度");cJianDan = new JCheckBoxMenuItem("简单");cPuTong = new JCheckBoxMenuItem("普通");cKunNan = new JCheckBoxMenuItem("困难");//*****************分数菜单对象****************fenShuMenu = new JMenu("积分排行");fenShuItem = new JMenuItem("最高记录");//****************关于对象*********************guanYuMenu = new JMenu("关于");zuoZheItem = new JMenuItem("关于作者");//***************设置关于菜单*******************guanYuMenu.add(zuoZheItem);//****************设置困难程度菜单**************nanDuMenu.add(cJianDan);nanDuMenu.add(cPuTong);nanDuMenu.add(cKunNan);//******************设置分数菜单***************fenShuMenu.add(fenShuItem);//*****************设置游戏菜单****************youXiMenu.add(kaiShiYouXi);youXiMenu.add(exitItem);//******************设置主菜单********************menuBar.add(youXiMenu);menuBar.add(nanDuMenu);menuBar.add(fenShuMenu);menuBar.add(guanYuMenu);//*********************监听注册*****************zuoZheItem.addActionListener(this);kaiShiYouXi.addActionListener(this);exitItem.addActionListener(this);addKeyListener(this);fenShuItem.addActionListener(this);//*********************加快捷键********************KeyStroke keyOpen = KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK);kaiShiYouXi.setAccelerator(keyOpen);KeyStroke keyExit = KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK);exitItem.setAccelerator(keyExit);//*****************设置框架**********************setJMenuBar(menuBar);setTitle("贪吃蛇");setResizable(false);setBounds(300,200,400,400);validate();setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String args[]){new TanChiShe();}//******************菜单监听****************************** public void actionPerformed(ActionEvent e){if(e.getSource()==kaiShiYouXi){length = 6;life = 0;foods = 0;if(she==null){she=new Thread(this);she.start();}else if(she!=null){she=null;she= new Thread(this);she.start();}}if(e.getSource()==exitItem){System.exit(0);}if(e.getSource()==zuoZheItem)JOptionPane.showMessageDialog(this, "梁潇"+"\n\n");}if(e.getSource()==fenShuItem){JOptionPane.showMessageDialog(this,"最高记录为"+fenshu+"");}}//**************检查一下******************************* public void check(){isDead();if(she!=null){if(growth==0){reform();}else{upgrowth();}if(x==objectX&&y==objectY){object=0;growth=1;toolkit.beep();}//****************产生食物坐标**********************if(object==0){object=1;objectX=(int)Math.floor(Math.random()*39)*10;objectY=(int)Math.floor(Math.random()*29)*10+50;}this.repaint();}}void isDead()if(z==4){x=x+10;}else if(z==3){x=x-10;}else if(z==2){y=y+10;}else if(z==1){y=y-10;}if(x<0||x>390||y<50||y>390) {she=null;}for(i=1;i<length;i++){if(m[i]==x&&n[i]==y){she=null;}}}public void upgrowth(){if(length<50){length++;}growth--;time=time-10;reform();life+=100;if(fenshu<life){fenshu = life;}foods++;}public void reform(){for(i=length-1;i>0;i--){m[i]=m[i-1];n[i]=n[i-1];}if(z==4){m[0]=m[0]+10;}if(z==3){m[0]=m[0]-10;}if(z==2){n[0]=n[0]+10;}if(z==1){n[0]=n[0]-10;}}public void keyPressed(KeyEvent e){if(she!=null){if(e.getKeyCode()==KeyEvent.VK_UP){if(z!=2){z=1;check();}}else if(e.getKeyCode()==KeyEvent.VK_DOWN) {if(z!=1){z=2;check();}}else if(e.getKeyCode()==KeyEvent.VK_LEFT){if(z!=4){z=3;check();}}else if(e.getKeyCode()==KeyEvent.VK_RIGHT) {if(z!=3){z=4;check();}}}}public void keyReleased(KeyEvent e){// TODO 自动生成方法存根}public void keyTyped(KeyEvent e){// TODO 自动生成方法存根}public void paint(Graphics g){//*******************画图********************** g.setColor(Color.DARK_GRAY);g.fillRect(0,50,400,400);g.setColor(Color.pink);for(i=0;i<=length-1;i++){g.fillRect(m[i],n[i],10,10);}g.setColor(Color.green);g.fillRect(objectX,objectY,10,10);g.setColor(Color.white);g.drawString("当前分数"+this.life,6,60);g.drawString("当前已吃食物数"+this.foods,6,72); }}(三)测试(四)使用说明在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。

JAVA开放性实验报告贪吃蛇

JAVA开放性实验报告贪吃蛇

JA V A程序设计开放性实验报告专业:计算机科学与技术班级:2012级2班学号:姓名:实验2贪吃蛇游戏设计(4学时)1.实验内容(1)创建软件主窗体和相关控制菜单;在窗体中以图形模拟蛇的形状,使用键盘控制图形在窗体中任意移动,模拟贪吃蛇的行为.(2)在窗体中可以设置障碍或奖励物品,以达到游戏的娱乐性。

2.预习内容Java GUI编程;鼠标和键盘的事件处理;Java多媒体编程。

3.实验类型综合性4.实验目的(1)了解JavaGUI编程特别是窗体,菜单;熟悉Java的事件委托处理机制,能完成鼠标和键盘的事件处理;(2)熟悉Java中的多媒体技术如:音频文件的播放控制,游戏中各种事件的音效添加。

熟悉Java中的绘图操作,可以使用绘图函数进行图形的绘制和重绘等基本操作;(3)熟悉模块的划分及游戏控制类的编写,了解相关的游戏设计和实现模式;(4)设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,依据实验内容结合自己的设计想法,实现模拟贪吃蛇的游戏效果。

5.实验要求依据实验内容,编写相关类,实现所需软件功能。

6.实验过程(分析设计、源文件、执行结果)代码如下:1、Node类public class Node {private int x;private int y;public Node(){}public Node(int x,int y){this.x=x;this.y=y; }public int getX(){return x;}public void setX(int x){ this.x=x;}public int getY(){return y;}public void setY(int y){this.y=y;}public String toString(){//方便类型转换//括号里不是String类型通过toString来转换,不然会输出一个地址return"("+x+","+y+")";}@Override//伪代码可以理解为注释,重写:下面的方法名是否在父类中存在,如果没有//的话会报错。

贪吃蛇JAVA源代码完整版

贪吃蛇JAVA源代码完整版

游戏贪吃蛇的JAVA源代码一.文档说明a)本代码主要功能为实现贪吃蛇游戏,GUI界面做到尽量简洁和原游戏相仿。

目前版本包含计分,统计最高分,长度自动缩短计时功能。

b)本代码受计算机系大神指点,经许可后发布如下,向Java_online网致敬c)运行时请把.java文件放入default package 即可运行。

二.运行截图a)文件位置b)进入游戏c)游戏进行中三.JAVA代码import java.awt.*;import java.awt.event.*;import static ng.String.format;import java.util.*;import java.util.List;import javax.swing.*;public class Snake extends JPanel implements Runnable { enum Dir {up(0, -1), right(1, 0), down(0, 1), left(-1, 0);Dir(int x, int y) {this.x = x; this.y = y;}final int x, y;}static final Random rand = new Random();static final int WALL = -1;static final int MAX_ENERGY = 1500;volatile boolean gameOver = true;Thread gameThread;int score, hiScore;int nRows = 44;int nCols = 64;Dir dir;int energy;int[][] grid;List<Point> snake, treats;Font smallFont;public Snake() {setPreferredSize(new Dimension(640, 440));setBackground(Color.white);setFont(new Font("SansSerif", Font.BOLD, 48));setFocusable(true);smallFont = getFont().deriveFont(Font.BOLD, 18);initGrid();addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {if (gameOver) {startNewGame();repaint();}}});addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_UP:if (dir != Dir.down)dir = Dir.up;break;case KeyEvent.VK_LEFT:if (dir != Dir.right)dir = Dir.left;break;case KeyEvent.VK_RIGHT:if (dir != Dir.left)dir = Dir.right;break;case KeyEvent.VK_DOWN:if (dir != Dir.up)dir = Dir.down;break;}repaint();}});}void startNewGame() {gameOver = false;stop();initGrid();treats = new LinkedList<>();dir = Dir.left;energy = MAX_ENERGY;if (score > hiScore)hiScore = score;score = 0;snake = new ArrayList<>();for (int x = 0; x < 7; x++)snake.add(new Point(nCols / 2 + x, nRows / 2));doaddTreat();while(treats.isEmpty());(gameThread = new Thread(this)).start();}void stop() {if (gameThread != null) {Thread tmp = gameThread;gameThread = null;tmp.interrupt();}}void initGrid() {grid = new int[nRows][nCols];for (int r = 0; r < nRows; r++) {for (int c = 0; c < nCols; c++) {if (c == 0 || c == nCols - 1 || r == 0 || r == nRows - 1)grid[r][c] = WALL;}}}@Overridepublic void run() {while (Thread.currentThread() == gameThread) {try {Thread.sleep(Math.max(75 - score, 25));} catch (InterruptedException e) {return;}if (energyUsed() || hitsWall() || hitsSnake()) {gameOver();} else {if (eatsTreat()) {score++;energy = MAX_ENERGY;growSnake();}moveSnake();addTreat();}repaint();}}boolean energyUsed() {energy -= 10;return energy <= 0;}boolean hitsWall() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;return grid[nextRow][nextCol] == WALL;}boolean hitsSnake() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;for (Point p : snake)if (p.x == nextCol && p.y == nextRow)return true;return false;}boolean eatsTreat() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;for (Point p : treats)if (p.x == nextCol && p.y == nextRow) {return treats.remove(p);}return false;}void gameOver() {gameOver = true;stop();}void moveSnake() {for (int i = snake.size() - 1; i > 0; i--) {Point p1 = snake.get(i - 1);Point p2 = snake.get(i);p2.x = p1.x;p2.y = p1.y;}Point head = snake.get(0);head.x += dir.x;head.y += dir.y;}void growSnake() {Point tail = snake.get(snake.size() - 1);int x = tail.x + dir.x;int y = tail.y + dir.y;snake.add(new Point(x, y));}void addTreat() {if (treats.size() < 3) {if (rand.nextInt(10) == 0) { // 1 in 10if (rand.nextInt(4) != 0) { // 3 in 4int x, y;while (true) {x = rand.nextInt(nCols);y = rand.nextInt(nRows);if (grid[y][x] != 0)continue;Point p = new Point(x, y);if (snake.contains(p) || treats.contains(p))continue;treats.add(p);break;}} else if (treats.size() > 1)treats.remove(0);}}}void drawGrid(Graphics2D g) {g.setColor(Color.lightGray);for (int r = 0; r < nRows; r++) {for (int c = 0; c < nCols; c++) {if (grid[r][c] == WALL)g.fillRect(c * 10, r * 10, 10, 10);}}}void drawSnake(Graphics2D g) {g.setColor(Color.blue);for (Point p : snake)g.fillRect(p.x * 10, p.y * 10, 10, 10);g.setColor(energy < 500 ? Color.red : Color.orange);Point head = snake.get(0);g.fillRect(head.x * 10, head.y * 10, 10, 10);}void drawTreats(Graphics2D g) {g.setColor(Color.green);for (Point p : treats)g.fillRect(p.x * 10, p.y * 10, 10, 10);}void drawStartScreen(Graphics2D g) {g.setColor(Color.blue);g.setFont(getFont());g.drawString("Snake", 240, 190);g.setColor(Color.orange);g.setFont(smallFont);g.drawString("(click to start)", 250, 240);}void drawScore(Graphics2D g) {int h = getHeight();g.setFont(smallFont);g.setColor(getForeground());String s = format("hiscore %d score %d", hiScore, score);g.drawString(s, 30, h - 30);g.drawString(format("energy %d", energy), getWidth() - 150, h - 30); }@Overridepublic void paintComponent(Graphics gg) {super.paintComponent(gg);Graphics2D g = (Graphics2D) gg;g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);drawGrid(g);if (gameOver) {drawStartScreen(g);} else {drawSnake(g);drawTreats(g);drawScore(g);}}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame f = new JFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setTitle("Snake");f.setResizable(false);f.add(new Snake(), BorderLayout.CENTER);f.pack();f.setLocationRelativeTo(null);f.setVisible(true);});}}。

基于java的贪吃蛇游戏设计课设

基于java的贪吃蛇游戏设计课设

成绩评定表课程设计任务书目录1.Java语言特点.................. 错误!未定义书签。

1.1Java简介.................. 错误!未定义书签。

1.2应用环境 (2)2.需求分析 (3)2.1游戏开发可行性 (3)2.2设计目的 (3)3.功能设计及源程序的主要部分. ... 错误!未定义书签。

3.1游戏流程图 (4)3.2功能的实现,类的实现及类层次 (5)4.游戏运行及分析 (16)4.1游戏运行结果 (16)4.2测试结果 (19)5.设计总结与体会 (19)5.1遇到的问题及解决办法 (19)5.2心得体会 (19)6.参考文献 (21)1.Java语言的特点1.1 Java简介Sun Microsystems公司在推出Java语言的同时,推出了一套开发工具JDK。

Sun提供的基于字符模式的Java开发工具包JDK: Java开发工具(JDK)是许多Java专家最初使用的开发环境。

Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。

Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具。

所有的Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。

JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。

其核心JavaAPI是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。

JDK 是整个Java的核心,包括了Java运行环境(Java RuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。

不论什么Java应用服务器实质都是内置了某个版本的JDK。

因此掌握JDK是学好Java的第一步。

JDK里面是java类库和java的语言规范,它提供的是无论你用何种开发软件写java程序都必须用到的类库和java语言规范.没有jdk,你的java程序根本就不能用。

基于Java的贪吃蛇开发文档

基于Java的贪吃蛇开发文档

中南林业科技大学《小组软件过程实验》实验报告题目:2D游戏贪食蛇软件开发专业班级:11级软件工程2班组长:xxx成员:xxxx指导教师:xxxxx完成日期:2014/4/15目录1 软件项目开发计划………………………………………………(页码)2 软件需求规格说明书……………………………………………(页码)3 软件配置管理计划……………………………………………(页码)4 软件设计规格说明………………………………………………(页码)5 软件测试计划……………………………………………………(页码)6 软件测试分析报告………………………………………………(页码)7 软件项目开发总结报告…………………………………………(页码)附件A:小组制定的软件过程规范……………………………………(页码)附件B:其他软件开发过程记录信息……………………………………(页码)小组成员角色与分工情况表一、软件项目开发计划完成人:xxxx1引言1.1编写目的本文档的目的是明确基于JAVA的贪吃蛇项目的基本需求分析,明确项目中各个任务系统的不同分工,分析项目的核心功能和项目所需要达到的预期目标。

期望读者包括:项目发起人、项目执行团队、指导老师。

1.2 背景近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。

贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。

在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。

因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。

在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

开发背景作为一个经典的游戏,贪吃蛇设计简单,实用和娱乐性高,是90后童年的美好回忆。

对于贪吃蛇传统的玩法,大家众所周知,即:玩家通过控制游戏手柄上下左右四个方向控制蛇的前进方向,每当吃到一个东西就会增加相应的分数,蛇的身子会越吃越长,蛇身越长游戏的难度就越大,不能咬到自己的身体,也不能碰到墙壁,积累到一定分数就可以通过此关,进入到下一关。

需求分析该次小游戏程序设计包含二维数组、方向键操作及图形化函数等方面知识。

具体需求概要如下:1、游戏界面初始化,显示背景区域和活动区域2、按方向键上下左右进行游戏的控制3、当蛇头吃到食物时,蛇身长度加一,分数增加4、当蛇头撞墙或者碰到自身时,游戏结束,显示“GAME OVER”和累加得分里面存在的事物:地图、蛇、食物游戏规则:1.蛇初始化时是3个节点,一开始蛇是出现在地图中间位置的2.蛇吃到食物会长一节3.蛇咬到自己会死4.蛇撞墙会死5.食物随机生成的,食物不长在背景上,不长在蛇身上。

使用技术本次课程使用JAVA来完成游戏的设计,使用二维数组存储背景信息,使用List存储蛇身信息,使用Swing完成图形界面化。

功能开发概要设计1、初始化模块:屏幕初始化,屏幕初始化用于显示游戏信息“贪吃蛇”。

2、游戏界面模块:设计边框和贪吃蛇活动区域3、游戏运行模块:运用函数控制蛇长及吃食物关系,使用方向键控制方向。

4、判断模块:蛇头撞墙或者碰到自己身体,则游戏结束,显示分数实现步骤本节分为两个部分,一部分为核心逻辑,即算法处理逻辑;另一部分为界面搭建。

游戏最核心的部分为算法逻辑部分。

先讲算法逻辑,最后再进行界面的搭建。

第一部分分为几个小节第二部分分为几个小节创建工程本次小游戏是一个单独的项目,所以需要创建单独的工程。

地图首先定义地图的长宽,定义数组存放地图上的点// 地图的宽(行)public static final int width = 35;// 地图的高(列)public static final int heigth = 8;//二维数组存放地图上的点private char[][] background = new char[heigth][width];我们需要的地图为:所以需要初始化地图,四周为墙壁,中间为空白部分,供蛇移动。

这里使用’*’代表墙壁,使用’ ’代表空白部分。

边界值判定:二维数组的第一行和最后一行,其余行的第一列和最后一列均为墙壁。

初始化方法:// 初始化地图public void initBackground() {for (int rows = 0; rows < background.length; rows++) {for (int cols = 0; cols < background[rows].length; cols++) {if (rows == 0 || rows == (heigth - 1) || cols == 0 || cols == (width - 1)) {background[rows][cols] = '*';} else {background[rows][cols] = ' ';}}}}展示,在控制台循环打印。

showBackground方法:public void showBackground() {for (int rows = 0; rows < background.length; rows++) {for (int cols = 0; cols < background[rows].length; cols++) {System.out.print(background[rows][cols]);}System.out.println();}}运行main方法,查看效果。

Main方法:public static void main(String[] args) throws Exception {SnakeGame snake = new SnakeGame();snake.initBackground();snake.showBackground();}控制台效果图:蛇前面已经初始化完成地图,然后进行蛇的初始化。

蛇的初始大小为3,一个蛇头两节身体。

为位置位于屏幕的正中央。

代码:// 集合保存节点信息LinkedList<Point> snake = new LinkedList<Point>();// 初始化蛇public void initSnake() {int x = width / 2;int y = heigth / 2;snake.add(new Point(x + 1, y));snake.add(new Point(x, y));snake.add(new Point(x - 1, y));}初始化蛇之后,要进行蛇的展示,蛇身用’#’,蛇头用’¥’表述。

这里写showSnake方法。

// 显示蛇public void showSnake() {// 蛇头Point head = snake.getFirst();background[head.y][head.x] = '¥';// 蛇身for (int i = 1; i < snake.size(); i++) {Point body = snake.get(i);background[body.y][body.x] = '#';}}修改main方法,将初始化蛇的方法和展示蛇的方法添加进main方法中:public static void main(String[] args) throws Exception {SnakeGame snake = new SnakeGame();snake.initBackground();snake.initSnake();snake.showSnake();snake.showBackground();}运行main方法及效果图:食物蛇的食物时随机出现的,位置不在墙壁上。

写方法createFood,判断位置是否在墙上,不在则可以创建食物,在则重新随机。

//食物Point food;public void createFood() {//食物随机,创建随机对象Random ra = new Random();while(true) {int x = ra.nextInt(width);int y = ra.nextInt(heigth);if(background[y][x] != '*') {food = new Point(x,y);break;}}}显示食物,用’@’符号表示食物。

//显示食物public void showFood() {background[food.y][food.x] = '@';}main方法加入食物创建和显示食物方法:public static void main(String[] args) throws Exception {SnakeGame snake = new SnakeGame();snake.initBackground();snake.initSnake();snake.showSnake();//初始化食物snake.createFood();snake.showFood();snake.showBackground();}运行main方法,查看效果:多运行几次,可以看到食物时随机出现的。

移动与吃食物蛇的移动分为四个方向,向上、向下、向左和向右。

移动的方式有两种,第一种,蛇的每一节都向前移动一格;第二种:添加蛇头,移除蛇尾。

我们这里采用添加蛇头,移除蛇尾的方式。

向上的时候,纵坐标减一://向上移动public void moveUp() {//获取蛇头Point head = snake.getFirst();//添加新蛇头snake.addFirst(new Point(head.x,head.y-1));//删除蛇尾snake.removeLast();}向下的时候,纵坐标加一://向下移动public void moveDown() {//获取蛇头Point head = snake.getFirst();//添加新蛇头snake.addFirst(new Point(head.x,head.y+1));//删除蛇尾snake.removeLast();}向左的时候,横坐标减一://向左移动public void moveLeft() {//获取蛇头Point head = snake.getFirst();//添加新蛇头snake.addFirst(new Point(head.x-1,head.y));//删除蛇尾snake.removeLast();}向右的时候,横坐标加一://向右移动public void moveRight() {//获取蛇头Point head = snake.getFirst();//添加新蛇头snake.addFirst(new Point(head.x+1,head.y));//删除蛇尾snake.removeLast();}在移动时,记录一个方向,如果按下的是反向键,则不改变方向。

public static final int UP_DIRECTION = 1;public static final int DOWN_DIRECTION = -1;public static final int LEFT_DIRECTION = 2;public static final int RIGHT_DIRECTION = -2;//默认为向右int currentDirection = -2;//相反方向public void changeDirection(int newDirection) {//判断当前方向与所按方向是否相反if(newDirection + currentDirection !=0) {this.currentDirection = newDirection;}}在移动的时候,要判读是否吃到食物。

public boolean eatFood() {Point head = snake.getFirst();//吃到食物if(head.equals(food)) {return true;}return false;}对移动进行优化,四个方法合并成一个:public void move() {if (!isGameOver) {Point head = snake.getFirst();// 蛇根据当前方向移动switch (currentDirection) {case UP_DIRECTION:snake.addFirst(new Point(head.x, head.y - 1));break;case DOWN_DIRECTION:snake.addFirst(new Point(head.x, head.y + 1));break;case RIGHT_DIRECTION:snake.addFirst(new Point(head.x + 1, head.y));break;case LEFT_DIRECTION:snake.addFirst(new Point(head.x - 1, head.y));break;default:}// 删除蛇尾// 如果吃到食物。

相关文档
最新文档