基于JavaGUI的贪吃蛇游戏
用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贪吃蛇游戏1. 背景贪吃蛇是一款经典的街机游戏,通过控制蛇的移动,吃掉食物,使蛇变得越来越长,直到触碰到边界或自己的身体为止。
该游戏在20世纪80年代流行起来,并成为了一种代表性的休闲娱乐方式。
贪吃蛇游戏可以提高玩家的反应能力、体力协调和空间感知能力。
本次课程设计旨在通过使用Java编程语言,设计实现一个简化版的贪吃蛇游戏,以加深学生对面向对象程序设计的理解和应用,并培养学生的逻辑思维能力和团队协作精神。
2. 分析2.1 游戏规则分析在贪吃蛇游戏中,玩家通过控制蛇的移动方向,使蛇吃到食物从而变长,直到游戏结束。
具体规则如下:•初始状态下,蛇由一个长度为3的身体组成,呈水平放置。
•蛇的移动方式为每个时间单位(通常为固定时间间隔)前进一格,移动方向由玩家通过键盘输入控制。
•蛇在吃到食物后,身体变长一节,并在地图上随机生成新的食物。
•蛇头碰到地图边界或自身身体的任意部分,游戏结束。
2.2 功能模块分析基于对游戏规则的分析,可以将贪吃蛇游戏的功能模块划分如下:•游戏初始化模块:初始化地图、蛇的初始位置和长度、生成初始食物等。
•用户输入模块:读取用户的键盘输入,控制蛇的移动方向。
•游戏逻辑模块:根据用户输入和游戏规则,更新蛇的位置、判断是否吃到食物或撞到障碍物等。
•地图绘制模块:将地图、蛇、食物等元素绘制到屏幕上。
•游戏循环模块:根据固定时间间隔循环执行游戏逻辑、用户输入和地图绘制等操作。
•游戏结束模块:在游戏结束时输出游戏得分等信息。
2.3 设计思路基于上述功能模块的分析,我设计了如下的实现思路:1.使用Java面向对象编程的思想,抽象出地图、蛇、食物等对象,并为其封装相应的属性和方法。
2.在游戏初始化模块中,创建地图对象、蛇对象,初始化位置和长度,并生成初始食物。
3.在用户输入模块中,利用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课程设计一、课程目标知识目标: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贪吃蛇课程设计一、课程目标知识目标: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初学者,这款游戏其实还是⾮常适合去⾃⼰实现⼀下的。
毕竟贪吃蛇游戏规则⾮常简单,游戏界⾯也⾮常简单,你不需要去花费时间去设计游戏的玩法和游戏UI如何设计,也不需要去为这个游戏需要很多素材。
在⼀定程度上也能锻炼初学者的编程能⼒,熟悉Java的语法。
初版(2017年7⽉15号)游戏界⾯如下:初版代码了⼤约是700⾏。
事实上初版的界⾯和代码我后来都做了⼀定的修改,因为刚开始的代码实在太烂了,我都不好意思发出来误导新⼈。
第⼀版整体界⾯很简单,因为当时就是想先快速实现出来看看效果,能玩就⾏。
这⼀版本的蛇没有⽤图⽚,⽽是直接⽤Java⾃带的函数画出来的。
所以游戏启动⾮常快,不需要加载图⽚资源。
设置⾥能把周围彩⾊的边框去掉,加上去只是让玩家知道边界在哪。
同时⽹格线也能去掉。
这⼀版玩家只有碰到周围的墙才会死,碰到⾃⼰是不会死的。
游戏界⾯按空格键可以暂停和开始,按ESC键可以重新开始。
(完整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贪吃蛇游戏设计课程设计一、课程目标知识目标: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编程基本语法和面向对象编程思想,使抽象的概念具体化,便于学生理解和掌握。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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:}// 删除蛇尾// 如果吃到食物。