java版贪吃蛇小游戏

合集下载

java版的贪吃蛇毕业论文

java版的贪吃蛇毕业论文

j a v a版的贪吃蛇毕业论文Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】贪吃蛇姓名:摘要:本文用J2SE实现大家耳熟能详的一个贪吃蛇游戏来综合运用所学知识,本游戏运用软件工程思想(螺旋模型),打好游戏主体框架,JAVA的面向对象思想,封装类,接口等概念,来完成本游戏,打到综合运用知识的目的。

⑴.本游戏开发平台:WINXP;⑵.JAVA开发环境: +Eclipse;⑶.开发语言:J2SE关键词:中央控制器;游戏面板;食物;蛇;石头The Greed SnakeAbstract: In this paper, J2SE implementation of a Snake game familiar to the integrated use of what they have learned, this game is the use of software engineering thinking (spiral model), the main framework of the fight game, JAVA object-oriented thinking, wrapper classes, interface concepts to complete this game, hitting the integrated use of knowledge and purpose.⑴. The game development platform: WINXP;⑵. JAVA Development Environment: + Eclipse;⑶. Development Languages: J2SEKeywords:Controller;GamePanel;Food;Snake;Ground前言贪吃蛇游戏背景:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征。

贪吃蛇(HTML小游戏使用JavaScript开发)

贪吃蛇(HTML小游戏使用JavaScript开发)

贪吃蛇(HTML小游戏使用JavaScript开发)贪吃蛇:HTML小游戏使用JavaScript开发在游戏界,贪吃蛇是非常经典和受欢迎的一款小游戏。

它的简单和上瘾性使得无数玩家沉迷其中。

今天,我们将学习如何使用HTML和JavaScript来开发一个贪吃蛇的小游戏。

一、游戏的基本思路贪吃蛇的游戏规则非常简单明了。

玩家控制蛇的移动,通过吃食物来不断增长蛇的长度。

当蛇碰到墙壁或者自己的身体时,游戏结束。

游戏的目标是使蛇长得尽可能长,挑战自己的最高得分。

二、HTML布局首先,我们需要在HTML文件中创建游戏画布。

这个画布将用于显示游戏的界面。

我们可以通过HTML的"canvas"元素来实现。

```html<!DOCTYPE html><html><head><title>贪吃蛇</title><style>#gameCanvas {border: 1px solid black;}</style></head><body><canvas id="gameCanvas" width="400" height="400"></canvas><script>// 在这里编写JavaScript代码</script></body></html>```上面的代码中,我们创建了一个宽高为400像素的画布,并给它设置了一个边框。

三、JavaScript逻辑接下来,我们需要使用JavaScript来实现游戏的逻辑。

我们将使用一个JavaScript类来表示贪吃蛇,并在其中实现移动、吃食物等功能。

```javascript<script>class SnakeGame {constructor(canvasId) {this.canvas = document.getElementById(canvasId);this.context = this.canvas.getContext("2d");this.snake = new Snake();this.food = new Food();// 在这里添加事件监听器,监听用户的方向键输入this.gameLoop();}// 游戏主循环gameLoop() {// 清空画布this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); // 更新蛇的位置this.snake.update();// 绘制蛇和食物this.snake.draw(this.context);this.food.draw(this.context);// 在下一帧时再次调用游戏主循环requestAnimationFrame(() => this.gameLoop()); }}class Snake {constructor() {// 在这里初始化蛇的位置和长度等信息}update() {// 在这里更新蛇的位置和长度等信息}draw(context) {// 在这里使用context绘制蛇的形状}}class Food {constructor() {// 在这里初始化食物的位置等信息}draw(context) {// 在这里使用context绘制食物的形状}}// 创建一个名为"game"的SnakeGame实例const game = new SnakeGame("gameCanvas");</script>```在上面的代码中,我们创建了一个`SnakeGame`类来表示游戏,`Snake`类来表示蛇,和`Food`类来表示食物。

java课程设计贪吃蛇小程序 附代码(2)

java课程设计贪吃蛇小程序 附代码(2)
}
public void keyPressed(KeyEvent e) {//按键响应
int keyCode=e.getKeyCode();
if(stat==1) switch(keyCode){
case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;
游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、游戏速度控制按钮、暂停游戏按钮、重新开始游戏按钮以及游戏排行榜按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的速度、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。
性能:
本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
自定义类说明
图3-1程序运行图
当蛇没有吃到食物且碰到边界或碰撞到自己的身体时,游戏结束,此时得分为0。如果想重新开始即按ENTER或S键,运行结果如图3-2所示:
图3-2程序结束图
程序异常处理
在蛇的运行线程过程中,当蛇撞到墙或自己的身体时,将抛出一个Exception类的异常对象,然后使用try-catch去捕捉这个异常,
2、课程设计的具体要求:
(1)界面美观大方,操作简单便捷,按键布局美观。

使用Java制作贪吃蛇游戏

使用Java制作贪吃蛇游戏
熟 悉 软 件 开 发 流程 的 目的 。
【 关键词】 J a v a ; E c l i p s e ; “ 贪吃 蛇” 游戏
近年来 . J a v a 作为一种新的编程语言 。 以其 简单性 、 可移植性 和平 i f ( g a me O v e r ) { 台无 关性等优点 . 得到 了广泛 地应用 . 特别是 J a v a与万维 网的完美结 la f g = f a l s e ; 合. 使其成 为网络 编程 和嵌入式编程领域 的首选编程语言 。 E c l i p s e 是 】 个 开放源代 码的 、 基于 J a y a 的可扩展开发平 台 . 同时它也是是著名 的跨平 台的 自由集 成开发环境 . 它 以其友 好的开发界 面、 强大 的组 件 支持等优点 . 得到广大程序员 的接受 和认可 。 J 贪吃蛇是 人们手 机中是一个很 常见 的一个 经典小游戏 . 人们对 它 } 并不陌生 . 在 紧张的现实生活 中给人们带来 了不少的乐趣 . 编写这个 通过在循环体 中设置每休眠 2 0 0毫秒则重画一次 界面 . 使 得界面 不断更新 . 当蛇移动时产生一个动画 的效果 。 贪吃蛇小游戏能让人 们在业余 时间里适 当的放松 . 保持好 的心态 。 在这个程序 中我采用 了 J a v a中 的图形 用户界面技术 .同时 引入 3 ) 绘 制 游 戏 界 面 了线 程来 编写。本次设计主要是对我之前所学 J a v a 知识 的一个巩 固 , p u b l i c v o i d p a i n t ( G r a p h i c s { 不仅 提高了我综合运 用以前 所学知识 的能力 . 同时也锻炼 了我 的实际 C o l o r c = g . g e t C o l o r 0 ; 动手 能力 整个游戏代码 简单易懂 . 用户在娱 乐的同时也可 以简单 的 g . s e t C o l o r ( C o l o r . c y a n ) ; 看一 下代码 . 有助 于初涉 J a v a者语 言水平 的提高。 g . i f l l R e c t ( O , 0 , RO WS B L OC K _ S I Z E, C O L S B L O C K _ S I Z E ) ; 贪吃蛇 的核心算法是如何实现移动和吃掉食 物 . 在当前运动方 向 g . s e t C o l o r ( C o l o r . b l a c k ) ; 上头指针所指的位置之前 添加一个节 点 , 然后删 除尾节 点 , 最后把链 f o r ( i n t i = l ; i < R O WS ; i + + ) { 表中的所有 节点依次 画出来 . 这样就可 以达 到移动的效果 。对是否吃 g . d r a w L i n e ( 0 , B L O C K _ S I Z E i , R O WS B L O C K _ S I Z E , OCK S 到食 物, 需要对 蛇和食物进行 碰撞检 测 . 检测 未碰撞 在一起则 只需要 BL I Z E* i ) ; 执行移 动操作 . 碰撞在一起时表示吃到食物 。 则 只需把食 物人队即可 , ) 即在 蛇的节 点链 表上再添加 一个节 点 , 从而达到身体增长 的效果 。 f o r ( i n t i = 1 ; i < C O L S ; i + + ) { 本次设计 的重 点之处在于 编程思想 的形 成 . 设计 图像 界面 . 产生 g . d r a w L i n e( i B L O C K _ S I Z E , 0 , B L O C K _ S I Z E i , C OL S 随机食 物及其 位置 。 难点在于程序编写中 , 整个程序框架的架构。 这就 BL OCK S I Z E ) ; 要求 我们不仅要对这个游戏 的玩 法特别 熟悉 . 而且还要熟 练掌握 J a v a } , , 每次重 画时 . 判 断蛇是否 吃到蛋 语言 。 实现贪 吃蛇的四个类模块 , 分别为游戏界 面 、 蛇、 食物和方 向。其 s . e a t ( e ) ; , 份 别 把 蛇 和 食 物 画 出来 具体设计 如下 :

贪吃蛇代码详解

贪吃蛇代码详解
}
}
private class SnakeDriver implements Runnable{
/*线程*/
public void run() {
// TODO Auto-generated method stub
while(life){
move();//不停的调用move的方法
/*循环所有的监听器*/
for(int x=0;x<Global.WIDTH;x++){
for(int y=0;y<Global.HIGHT;y++){
if(rocks[x][y]==1){
g.setColor(Color.DARK_GRAY);
g.fill3DRect(x*Global.CELL_SIZE,y*Global.CELL_SIZE, 20, 20, true);
public void newFood(Point p){
this.setLocation(p);
}
public boolean isSnakeEatFood(Snake snake){
System.out.println("Food's isSnakeEatFood");
return this.equals(snake.getHead());
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//蛇死的方法
void die(){
life=false;
}
private int [][] rocks=new int[Global.WIDTH] [Global.HIGHT];

JAVA贪吃蛇游戏设计文档

JAVA贪吃蛇游戏设计文档

《JA V A贪吃蛇游戏设计》目录《JA V A贪吃蛇游戏设计》 (1)目录 (1)摘要 (2)一.系统开发环境 (2)1.1 开发工具 (2)1.2 应用环境 (3)二.java介绍 (3)2.1java语言的特点 (3)2.2JA V A的主要特性 (4)2.3选题的意义 (5)2.4研究现状 (5)2.5研究目的 (6)三.系统需求分析 (6)3.1 需求分析 (6)3.2 可行性分析 (6)四.设计方案论证 (7)4.1设计思路 (7)4.2设计方法 (7)五.系统概要设计 (11)5.1 设计目标 (11)5.2 系统功能模块 (11)六.系统详细设计 (12)6.1 程序设计 (12)6.2 各功能界面截图 (15)七.系统测试 (20)7.1 测试的意义 (20)7.2 测试过程 (21)7.3 测试结果 (21)7.4设计体会 (21)7.5设计总结 (21)八.参考文献 (22)九.附录 (22)摘要近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。

JBuilder是Borland公司用于快速开发Java应用的一款优秀的集成开发环境,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。

“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。

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

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

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

本文在介绍Java相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。

首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。

JAVA开放性实验报告贪吃蛇

JAVA开放性实验报告贪吃蛇

JAVA开放性实验报告贪吃蛇实验目的:本实验旨在利用Java语言实现一个经典的贪吃蛇游戏,通过实践提升对面向对象程序设计的理解和应用能力,加深对Java语言的熟练程度,并提高解决问题的能力和编程实践经验。

实验内容:1.设计游戏界面:通过Java中的Swing库实现游戏窗口的设计,包括游戏区域、游戏开始按钮、得分显示等。

2.实现游戏逻辑:设计贪吃蛇的移动规则,食物的生成和吃掉判定,碰撞检测等游戏逻辑。

同时实现游戏的主循环,控制游戏的进行。

3.实现键盘控制:通过监听键盘事件,实现玩家控制贪吃蛇的移动方向。

4.设计游戏机制:设置游戏的难度等级,增加贪吃蛇的移动速度、食物生成间隔等参数,使游戏更具挑战性。

5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。

玩家可以选择重新开始游戏或退出。

实验步骤:1.设计游戏界面:创建一个JFrame窗口,在窗口中添加游戏画布,开始按钮和得分显示等组件。

2.实现游戏逻辑:设计Snake类和Food类,表示贪吃蛇和食物。

通过ArrayList存储贪吃蛇的身体节点,并实现移动、吃食物等方法。

3.实现键盘控制:通过实现KeyListener接口来监听键盘事件,根据按键控制贪吃蛇的移动方向。

4.设计游戏机制:设置贪吃蛇的移动速度、食物生成间隔等参数,根据难度级别逐步增加,使游戏更具挑战性。

5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。

提供重新开始游戏和退出游戏的选项。

实验结果:经过实验设计和编码实现,成功完成了Java贪吃蛇游戏的开发。

游戏界面美观,操作流畅,游戏逻辑完整,玩家能够通过控制贪吃蛇吃到食物并获得得分。

随着游戏的进行,贪吃蛇会不断变长,玩家需要避开障碍,控制蛇头移动,体验游戏的乐趣和挑战。

实验总结:通过本次实验,我深入学习了Java语言的面向对象编程思想和应用,掌握了Swing库的使用方法,加深了对Java语言的理解和应用。

JAVA小程序—贪吃蛇源代码

JAVA小程序—贪吃蛇源代码

JAVA贪吃蛇源代码SnakeGame。

javapackage SnakeGame;import javax.swing。

*;public class SnakeGame{public static void main( String[]args ){JDialog。

setDefaultLookAndFeelDecorated( true ); GameFrame temp = new GameFrame();}}Snake.javapackage SnakeGame;import java。

awt.*;import java。

util。

*;class Snake extends LinkedList{public int snakeDirection = 2;public int snakeReDirection = 4;public Snake(){this。

add( new Point( 3, 3 ));this。

add(new Point(4, 3 ));this.add( new Point(5,3 ) );this。

add( new Point(6,3 ) );this。

add(new Point(7,3 ));this。

add( new Point( 8,3 ) );this。

add( new Point( 9, 3 ));this。

add( new Point( 10,3 ));}public void changeDirection( Point temp, int direction ) {this。

snakeDirection = direction;switch(direction ){case 1://upthis.snakeReDirection = 3;this。

add( new Point(temp.x,temp.y - 1 ));break;case 2://rightthis。

使用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贪吃蛇 代码

代码:一:::::::public class Cell {// 格子:食物或者蛇的节点private int x;private int y;private Color color;// 颜色public Cell() {}public Cell(int x, int y) {this.x = x;this.y = y;}public Cell(int x, int y, Color color) { this.color = color;this.x = x;this.y = y;}public Color getColor() {return color;}public int getX() {return x;}public int getY() {return y;}public String toString() {return"[" + x + "]" + "[" + y + "]";}}二::::::::::public class Worm {private int currentDirection;// 蛇包含的格子private Cell[] cells;private Color color;public static final int UP = 1;public static final int DOWN = -1;public static final int RIGHT = 2;public static final int LEFT = -2;// 创建对象创建默认的蛇:(0,0)(1,0)(2,0)······(11,0)public Worm() {// 构造器初始化对象color = Color.pink;// 蛇的颜色cells = new Cell[12];// 创建数组对象for (int x = 0, y = 0, i = 0; x < 12; x++) { // for(int y=0;;){}cells[i++] = new Cell(x, y, color);// 添加数组元素}currentDirection = DOWN;}public boolean contains(int x, int y) {// 数组迭代for (int i = 0; i < cells.length; i++) {Cell cell = cells[i];if (cell.getX() == x && cell.getY() == y) {return true;}}return false;}public String toString() {return Arrays.toString(cells);}public void creep() {for (int i = this.cells.length - 1; i >= 1; i--) {cells[i] = cells[i - 1];}cells[0] = createHead(currentDirection);}// 按照默认方法爬一步private Cell createHead(int direction) {// 根据方向,和当前(this)的头结点,创建新的头结点int x = cells[0].getX();int y = cells[0].getY();switch (direction) {case DOWN:y++;break;case UP:y--;break;case RIGHT:x++;break;case LEFT:x--;break;}return new Cell(x, y);}/*** food 食物**/public boolean creep(Cell food) {Cell head = createHead(currentDirection);boolean eat = head.getX() == food.getX() && head.getY() == food.getY();if (eat) {Cell[] ary = Arrays.copyOf(cells, cells.length + 1);cells = ary;// 丢弃原数组}for (int i = cells.length - 1; i >= 1; i--) { cells[i] = cells[i - 1];}cells[0] = head;return eat;}// 吃到东西就变长一格public boolean creep(int direction, Cell food) {if (currentDirection + direction == 0) {return false;}this.currentDirection = direction;Cell head = createHead(currentDirection);boolean eat = head.getX() == food.getX() && head.getY() == food.getY();if (eat) {Cell[] ary = Arrays.copyOf(cells, cells.length + 1);cells = ary;// 丢弃原数组}for (int i = cells.length - 1; i >= 1; i--) { cells[i] = cells[i - 1];}cells[0] = head;return eat;}// 检测在新的运动方向上是否能够碰到边界和自己(this 蛇)public boolean hit(int direction) {// 生成下个新头节点位置// 如果新头节点出界返回true,表示碰撞边界// ···············if (currentDirection + direction == 0) {return false;}Cell head = createHead(direction);if(head.getX() < 0 || head.getX() >= WormStage.COLS || head.getY() < 0|| head.getY() >= WormStage.ROWS) {return true;}for (int i = 0; i < cells.length - 1; i++) { if (cells[i].getX() == head.getX()&& cells[i].getY() == head.getY()) {return true;}}return false;}public boolean hit() {return hit(currentDirection);}// 为蛇添加会制方法// 利用来自舞台面板的画笔绘制蛇public void paint(Graphics g) {g.setColor(this.color);for (int i = 0; i < cells.length; i++) {Cell cell = cells[i];g.fill3DRect(cell.getX() * WormStage.CELL_SIZE, cell.getY()* WormStage.CELL_SIZE, WormStage.CELL_SIZE,WormStage.CELL_SIZE, true);}}}三:::::::::public class WormStage extends JPanel {/** 舞台的列数 */public static final int COLS = 35;/** 舞台的行数 */public static final int ROWS = 35;/** 舞台格子的大小 */public static final int CELL_SIZE = 10;private Worm worm;private Cell food;public WormStage() {worm = new Worm();food = createFood();}/*** 随机生成食物,要避开蛇的身体 1 生成随机数 x, y 2 检查蛇是否包含(x,y)* 3 如果包含(x,y) 返回 1 4 创建食物节点* */private Cell createFood() {Random random = new Random();int x, y;do {x = random.nextInt(COLS);// COLS列数y = random.nextInt(ROWS);// WOWS行数} while (worm.contains(x, y));return new Cell(x, y, Color.green);// 食物颜色/** 初始化的舞台单元测试 */public static void test() {WormStage stage = new WormStage();System.out.println(stage.worm);System.out.println(stage.food);}/*** 重写JPanel绘制方法paint:绘制,绘画,涂抹Graphics 绘图,* 理解为:绑定到当前面板的画笔*/public void paint(Graphics g) {// 添加自定义绘制!// 绘制背景g.setColor(Color.darkGray);// 背景色g.fillRect(0, 0, getWidth(), getHeight());g.setColor(Color.cyan);// 边框上的颜色// draw 绘制 Rect矩形g.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1);// 绘制食物g.setColor(food.getColor());// fill 填充 3D 3维 Rect矩形突起的立体按钮形状g.fill3DRect(food.getX() * CELL_SIZE, food.getY() * CELL_SIZE,CELL_SIZE, CELL_SIZE, true);// 绘制蛇worm.paint(g);// 让蛇自己去利用画笔绘制private Timer timer;/*** 启动定时器驱动蛇的运行 1 检查碰撞是否将要发生* 2 如果发生碰撞:创建新的蛇和食物,重写开始* 3 如果没有碰撞就爬行,并检查是否能够吃到食物* 4如果吃到食物:重新创建新的食物* 5 启动重新绘制界面功能 repaint() 更新界面显示效果! repaint()* 方法会尽快调用paint(g) 更新界面!*/private void go() {if (timer == null)timer = new Timer();timer.schedule(new TimerTask() {public void run() {if (worm.hit()) {// 如果蛇碰到边界或自己worm = new Worm();// 创建新的蛇food = createFood();// 创建新食物} else {// 如果没有碰到自己boolean eat = worm.creep(food);// 蛇向前(当前方向)爬行,返回结果表示是否吃到食物if(eat) {// 如果吃到食物,就生成新食物food = createFood();}}repaint();}}, 0, 1000 / 5);this.requestFocus();this.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_UP:creepForFood(Worm.UP);break;case KeyEvent.VK_DOWN:creepForFood(Worm.DOWN);break;case KeyEvent.VK_LEFT:creepForFood(Worm.LEFT);break;case KeyEvent.VK_RIGHT:creepForFood(Worm.RIGHT);break;}}});}private void creepForFood(int direction) { if (worm.hit(direction)) {worm = new Worm();food = createFood();} else {boolean eat = worm.creep(direction, food);if (eat) {food = createFood();}}}/** 软件启动的入口方法 */public static void main(String[] args) {// 启动软件....JFrame frame = new JFrame("贪吃蛇");// 一个画框对象frame.setSize(450, 480);// size 大小,setSize 设置大小// frame.setLocation(100,50);//Locationq位置frame.setLocationRelativeTo(null);// 居中// 设置默认的关闭操作为在关闭时候离开软件frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);// Visible可见的设置可见性frame.setLayout(null);// 关闭默认布局管理,避免面板充满窗口WormStage stage = new WormStage();// System.out.println("CELL_SIZE * COLS:"+CELL_SIZE * COLS);stage.setSize(CELL_SIZE* COLS, CELL_SIZE* ROWS);stage.setLocation(40, 50);stage.setBorder(new LineBorder(Color.BLACK));frame.add(stage);// 在窗口添加舞台stage.go();// 启动定时器驱动蛇自动运行}}。

java课程设计-贪吃蛇代码

java课程设计-贪吃蛇代码

java课程设计-贪吃蛇代码importjava.awt.Color;importponent;importjava.awt.Graphic;importjava.awt.event.ActionEvent; importjava.awt.event.ActionLitener; importjava.awt.event.KeyEvent;importjava.awt.event.KeyLitener; importjava.util.ArrayLit;importjava某.wing.BorderFactory;importjava某.wing.JFrame;importjava某.wing.JLabel;importjava某.wing.JMenu;importjava某.wing.JMenuBar;importjava某.wing.JMenuItem;importjava某.wing.JPanel; publicclaSnakeGame{publictaticvoidmain(String[]arg){ SnakeFrameframe=newSnakeFrame();frame.etTitle("贪吃蛇");frame.etDefaultCloeOperation(JFrame.E某IT_ON_CLOSE);frame.etViible(true);}}//----------记录状态的线程claStatuRunnableimplementRunnable{publicStatuRunnable(Snakenake,JLabeltatuLabel,JLabelcoreLabe l){thi.tatuLabel=tatuLabel;thi.coreLabel=coreLabel;thi.nake=nake;}publicvoidrun(){Stringta="";Stringpe="";while(true){witch(nake.tatu){caeSnake.RUNNING:ta="Running";break;caeSnake.PAUSED:ta="Paued";break;caeSnake.GAMEOVER:ta="GameOver";break;}tatuLabel.etTe某t(ta); coreLabel.etTe某t(""+nake.core); try{Thread.leep(100);}catch(E某ceptione){}}}privateJLabelcoreLabel; privateJLabeltatuLabel; privateSnakenake;}//----------蛇运动以及记录分数的线程claSnakeRunnableimplementRunnable{ thi.nake=nake;}publicvoidrun(){while(true){try{nake.move();Thread.leep(nake.peed);}catch(E某ceptione){}}}privateSnakenake;}claSnake{booleaniRun;//---------是否运动中ArrayLit<Node>body;//-----蛇体Nodefood;//--------食物intderection;//--------方向intcore;inttatu;intpeed; publictaticfinalintSLOW=500; publictaticfinalintMID=300; publictaticfinalintFAST=100; publictaticfinalintRUNNING=1; publictaticfinalintPAUSED=2; publictaticfinalintGAMEOVER=3; publictaticfinalintLEFT=1; publictaticfinalintUP=2; publictaticfinalintRIGHT=3; publictaticfinalintDOWN=4; publicSnake(){peed=Snake.SLOW;core=0;iRun=fale;tatu=Snake.PAUSED;derection=Snake.RIGHT;body=newArrayLit<Nod e>();body.add(newNode(60,20));body.add(newNode(40,20));body.add(newNode(20,20));makeFood();}//------------判断食物是否被蛇吃掉//-------如果食物在蛇运行方向的正前方,并且与蛇头接触,则被吃掉privatebooleaniEaten(){Nodehead=body.get(0);if(derection==Snake.RIGHT&&(head.某+Node.W)==food.某&&head.y==food.y)returntrue;if(derection==Snake.LEFT&&(head.某-Node.W)==food.某&&head.y==food.y)returntrue;if(derection==Snake.UP&&head.某==food.某&&(head.y-Node.H)==food.y)returntrue;if(derection==Snake.DOWN&&head.某==food.某&&(head.y+Node.H)==food.y)returntrue;elereturnfale;}//----------是否碰撞privatebooleaniCollion(){Nodenode=body.get(0);//------------碰壁if(derection==Snake.RIGHT&&node.某==280) returntrue;if(derection==Snake.UP&&node.y==0) returntrue;if(derection==Snake.LEFT&&node.某==0) returntrue;if(derection==Snake.DOWN&&node.y==380) returntrue;//--------------蛇头碰到蛇身Nodetemp=null;inti=0;for(i=3;i<body.ize();i++){temp=body.get(i);if(temp.某==node.某&&temp.y==node.y) break;}if(i<body.ize())returntrue;elereturnfale;}//-------在随机的地方产生食物publicvoidmakeFood(){Nodenode=newNode(0,0); booleaniInBody=true;int某=0,y=0;int某=0,Y=0;inti=0;while(iInBody){某=(int)(Math.random()某15);y=(int)(Math.random()某20);某=某某Node.W;Y=y某Node.H;for(i=0;i<body.ize();i++){if(某==body.get(i).某&&Y==body.get(i).y)break; }if(i<body.ize())iInBody=true;eleiInBody=fale;}food=newNode(某,Y);}//---------改变运行方向publicvoidchangeDerection(intnewDer){if(derection%2!=newDer%2)//-------如果与原来方向相同或相反,则无法改变derection=newDer;}publicvoidmove(){if(iEaten()){//-----如果食物被吃掉body.add(0,food);//--------把食物当成蛇头成为新的蛇体core+=10;makeFood();//--------产生食物}eleif(iCollion())//---------如果碰壁或自身{iRun=fale;tatu=Snake.GAMEOVER;//-----结束}eleif(iRun){//----正常运行(不吃食物,不碰壁,不碰自身)Nodenode=body.get(0);int某=node.某;intY=node.y;//------------蛇头按运行方向前进一个单位witch(derection){cae1:某-=Node.W;break;cae2:Y-=Node.H;break;cae3:某+=Node.W;break;cae4:Y+=Node.H;break;}body.add(0,newNode(某,Y));//---------------去掉蛇尾body.remove(body.ize()-1);}}}//---------组成蛇身的单位,食物claNode{publictaticfinalintW=20;publictaticfinalintH=20;int某;inty;publicNode(int某,inty){thi.某=某;thi.y=y;}}//------画板claSnakePanele某tendJPanel{Snakenake;publicSnakePanel(Snakenake){thi.nake=nake;}Nodenode=null;for(inti=0;i<nake.body.ize();i++){//---黄绿间隔画蛇身if(i%2==0)g.etColor(Color.green);eleg.etColor(Color.yellow);node=nake.body.get(i);g.fillRect(node.某,node.y,node.H,某某某某某某某某某某某某某某某某某某某试用某某某某某某某某某某某某某某某某某某某某某}node=nake.food;node.W);//g.etColor(Color.blue);g.fillRect(node.某,node.y,node.H,node.W);}}claSnakeFramee某tendJFrame{privateJLabeltatuLabel;privateJLabelpeedLabel;privateJLabelcoreLabel;privateJPanelnakePanel;privateSnakenake;privateJMenuBarbar;JMenugameMenu;JMenuhelpMenu;JMenupeedMenu;JMenuItemnewItem;JMenuItempaueItem; JMenuItembeginItem; JMenuItemhelpItem; JMenuItemaboutItem;JMenuItemlowItem;JMenuItemmidItem;JMenuItemfatItem;publicSnakeFrame(){init();ActionLitenerl=newActionLitener(){ publicvoidactionPerformed(ActionEvente){ if(e.getSource()==paueItem)nake.iRun=fale;if(e.getSource()==beginItem)nake.iRun=true;if(e.getSource()==newItem){newGame();}//------------菜单控制运行速度if(e.getSource()==lowItem){ nake.peed=Snake.SLOW; peedLabel.etTe某t("Slow");}if(e.getSource()==midItem){ nake.peed=Snake.MID; peedLabel.etTe某t("Mid");}if(e.getSource()==fatItem){ nake.peed=Snake.FAST; peedLabel.etTe某t("Fat");}}};paueItem.addActionLitener(l); beginItem.addActionLitener(l);newItem.addActionLitener(l); aboutItem.addActionLitener(l);lowItem.addActionLitener(l);midItem.addActionLitener(l);fatItem.addActionLitener(l); addKeyLitener(newKeyLitener(){ publicvoidkeyPreed(KeyEvente){witch(e.getKeyCode()){//------------方向键改变蛇运行方向caeKeyEvent.VK_DOWN://nake.changeDerection(Snake.DOWN);break; caeKeyEvent.VK_UP://nake.changeDerection(Snake.UP);break; caeKeyEvent.VK_LEFT://nake.changeDerection(Snake.LEFT);break; caeKeyEvent.VK_RIGHT://nake.changeDerection(Snake.RIGHT);break; //空格键,游戏暂停或继续caeKeyEvent.VK_SPACE://if(nake.iRun==true){nake.iRun=fale;nake.tatu=Snake.PAUSED;break;}if(nake.iRun==fale){nake.iRun=true;nake.tatu=Snake.RUNNING;break; }}}publicvoidkeyReleaed(KeyEventk){ }publicvoidkeyTyped(KeyEventk){ }});}privatevoidinit(){peedLabel=newJLabel();nake=newSnake();etSize(380,460);etLayout(null);thi.etReizable(fale);bar=newJMenuBar();gameMenu=newJMenu("Game");newItem=newJMenuItem("NewGame");PaueItem=newJMenuItem("Paue");beginItem=newJMenuItem("Continue");gameMenu.add(paueItem);gameMenu.add(newItem);gameMenu.add(beginItem);helpMenu=newJMenu("Help");aboutItem= newJMenuItem("About");helpMenu.add(aboutItem);peedMenu=newJMenu("Speed");lowItem=newJMenuItem("Slow");fatItem=newJMenuItem("Fat");midItem=newJMenuItem("Middle");peedMenu.add(lowItem);peedMenu.add(midItem);peedMenu.add(fatItem);bar.add(gameMenu);bar.add(helpMenu);bar.add(peedMenu);etJMenuBar(bar);tatuLabel=newJLabel();coreLabel=newJLabel();nakePanel=newJPanel();nakePanel.etBound(0,0,300,400);nakePanel.etBorder(BorderFactory.createLineBorder(Color.dark Gray));add(nakePanel);tatuLabel.etBound(300,25,60,20);add(tatuLabel);coreLabel.etBound(300,20,60,20);add(coreLabel);JLabeltemp=newJLabel("状态");temp.etBound(310,5,60,20);add(temp);temp=newJLabel("速度");temp.etBound(310,105,60,20);add(temp);temp=newJLabel("分数");temp.etBound(310,55,60,20);add(temp);temp.etBound(310,155,60,20);add(temp);temp=newJLabel("14滕月"); temp.etBound(310,175,60,20);add(temp);peedLabel.etBound(310,75,60,20); add(peedLabel);}privatevoidnewGame(){thi.remove(nakePanel);thi.remove(tatuLabel);thi.remove(coreLabel); peedLabel.etTe某t("Slow"); tatuLabel=newJLabel();coreLabel=newJLabel();nakePanel=newJPanel();nake=newSnake();nakePanel=newSnakePanel(nake);nakePanel.etBound(0,0,300,400);nakePanel.etBorder(BorderFactory.createLineBorder(Color.dark Gray));Runnabler1=newSnakeRunnable(nake,nakePanel);Runnabler2=newStatuRunnable(nake,tatuLabel,coreLabel);Thread t1=newThread(r1);Threadt2=newThread(r2);t1.tart();t2.tart();add(nakePanel);tatuLabel.etBound(310,25,60,20);add(tatuLabel);coreLabel.etBound(310,125,60,20);add(coreLabel);}}。

贪吃蛇java实验报告doc

贪吃蛇java实验报告doc

贪吃蛇java实验报告doc贪吃蛇java实验报告篇一:JAVA贪吃蛇课程设计报告《Java应用开发》课程设计报告题目:指导老师:姓名:专业:班级:日期:JAVA小游戏 - 贪吃蛇目录一、系统总体设计 ................................. 1 (一)设计目标及完成功能 ........................ 1 (二)系统结构设计 .............................. 1 二、详细设计 ..................................... 2(一) 界面设计 ................................... 2 (二) 系统设计 ................................... 4 (三) 关键技术及算法 ............................. 6 四、测试 ......................................... 7五、安装使用说明 (7)总结(体会) ..................................... 8参考文献 .. (8)一、系统总体设计(一)设计目标及完成功能本软件是针对贪吃蛇小游戏的JAVA程序,利用上、下、左、右方向键来改变蛇的运动方向,长按某个方向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常进行游戏,在到达固定的分数后,游戏速度会加快。

1.窗口功能说明:设计了三个窗口,分别是游戏主窗口,成绩窗口,游戏帮助和关于作者窗口。

2.菜单栏分别为:游戏菜单和帮助菜单其中,游戏菜单包括开始游戏和退出游戏两项;帮助菜单包括游戏帮助和关于作者两项。

(二)系统结构设计图1-1 系统结构图二、详细设计(一) 界面设计贪吃蛇游戏的基本运行界面(1)生成初始界面:图2-1 初始界面(2)游戏菜单栏:图2-2 游戏菜单(2)积分排行菜单栏:图2-3 积分排行菜单(3)进行游戏界面:点击“游戏”,进入游戏菜单,选择“开始游戏”,或者。

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

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

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

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

培养自主学习的能力。

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

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

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

在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。

本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中所得的分数,不过缺点就是在退处程序后,下次打开程序时无法保存。

2、游戏的主界面设计游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、游戏分数的显示更新界面、游戏开始按钮、暂停游戏按钮、退出游戏按钮以及游戏排行榜按钮。

3、游戏控制模块设计这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出等功能。

为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。

(二)主界面设计游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮、困难程度、积分排行、关于作者。

(三)代码设计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代码--贪吃蛇
}
//******************菜单监听******************************
public void actionPerformed(ActionEvent e)
{
iHale Waihona Puke (e.getSource()==kaiShiYouXi)
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;//bojectX,Y为食物坐标,z为蛇前进方向
{
object=0;
growth=1;
toolkit.beep();
}
//****************产生食物坐标**********************
if(object==0)
{
object=1;
nanDuMenu.add(cPuTong);
nanDuMenu.add(cKunNan);
//******************设置分数菜单***************
fenShuMenu.add(fenShuItem);
//*****************设置游戏菜单****************
{
JOptionPane.showMessageDialog(this, "北京java编程爱好者制作"+"\n\n"+" "+"QQ号:860695120"+"\n");

Java贪吃蛇系统简历

Java贪吃蛇系统简历

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 贪吃蛇 课程设计报告
2.按下1键进入单人模式
单人模式界面的构图与双人模式与电脑对战的构图一样,分为3大块,左边的是关卡列表,右边上面的是地图预览,右边下面的是地图信息。在关卡列表中可以按上下方向键进行关卡选择,然后按下enter键进入游戏或者点击界面的按钮“开始游戏”进入游戏界面。
3.进入游戏界面
此界面中,分为两块,最上面一层黄色的是分数面板,下面一层是地图面板。如图所示,此时操纵的蛇就快吃到食物。
2.行走时不会撞墙,不撞移动障碍物,不咬自己
3.当新出食物更近选择这个,放弃原本想去吃的
4.没食物的时候攻击玩家
5.避免自己被对方攻击
九、比赛结果的面板
1.根据模式,再比较分得出结果
2.用户输入姓名,输出到排行榜文件,保存姓名、分数、时间
十、障碍物
1.普通障碍物墙
2.移动障碍物
3.移动障碍物可以一直往复一个方向来回,像角色扮演游戏中怪物往返一个范围巡逻
3.有毒食物
4.不出现障碍物中
5.被吃了可以再生成
六、关卡
1.关卡从地图文件读取
2.达到一定分数过关
3.过关时线程从左到右刷新
七、分数面板
1.当玩家操纵的蛇吃到了食物,进行加分
2.加分是先以粒子效果从中心往周围散发许多黑色小点,像是原来分数的数字炸裂开来一样。增加美感
八、电脑蛇AI
1.电脑自动行走,寻找最近食物并吃食
我将BFS算法带入游戏中,使用在电脑蛇自动行动寻找食物,原理就是根据蛇位置不断搜索地图中存在食物的坐标,然后保存在List中再读取路线从而达到寻路AI功能。
2.3Eclipse
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

课设贪吃蛇游戏

课设贪吃蛇游戏
{
flag[i]=true;
System.out.print(vertexs[i]+" ");
queue.add(i);
while (!queue.isEmpty())
{
int j=queue.poll();
for (int k=0;k<number;k++){
if (edges1[j][k]==1 && flag[k]==false){
本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中的移动和长度。
3.2 总设计模块的划分
根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2所示。
游戏控制模块的主要框架如图3所示。
游戏暂停控制:点击“F3”按钮,游戏暂停;再单击,游戏继续。
游戏重新开始控制:点击“F2”键后,点击确定,即游戏重新开始。
graph.DFSTraverse();
System.out.println("\n---------");
System.out.println("图的广度遍历操作:");
graph.BFSTraverse();
}
}
算法分析:
广度优先搜索A,B,F,G,C,I,E,D,H.
深度优先搜索A,B,C,D,E,F,G,H,I.
编程环境: JDK 1.6
开发工具:Eclipse jdk
2.3用例图
3
3.1程序概述
本程序是一个利用Java应用软件制作的贪食蛇小游戏。在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;游戏运行过程中,如果想暂停,只需要按F3键即可。重新开始游戏的按键为F2。当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。

贪吃蛇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的贪吃蛇游戏开发

论文编号:德州科技职业学院毕业论文题目姓名:____________________学号:____________________所在院系:____________________所学专业:____________________指导教师:____________________完成时间:____________________Java贪吃蛇游戏设计目录JAVA贪吃蛇游戏设计 (1)目录 (2)前言 (4)1.JAVA语言的概述及开发工具 (5)1.1Java语言特点 (5)1.1.1 平台无关性 (5)1.1.2安全性 (5)1.1.3面向对象 (5)1.1.4分布式 (5)1.1.5健壮性 (5)1.2 J2ME介绍 (6)1.3 关于ECLIPSE (7)1.4 WTK介绍 (8)2.需求分析 (8)2.1游戏的介绍 (8)2.2游戏开发的可行性 (9)2.3设计目的 (9)2.4游戏需求 (9)2.4.1游戏界面需求 (10)2.4.2游戏形状需求 (10)2.4.3键盘事件处理 (10)2.4.4显示需求 (10)2.4.5接口控制 (10)2.4.6环境介绍 (10)3.功能设计 (11)3.1 游戏的流程图 (11)3.详细设计 (12)3.1游戏主界面的开发 (12)3.2 绘制蛇身 (12)3.3创建初始“蛇”及“蛇”的移动 (13)3.4 吃掉食物,蛇身增长 (13)3.4随机产生食物 (14)3.5键盘事件处理 (15)3.6 判断游戏结束 (16)4游戏测试与发布 (18)4.1游戏运行的效果图 (18)4.2 测试结果 (19)5.自我评价和总结 (19)5.1遇到的问题及解决办法 (19)5.2 总结 (20)6.参考资料 (20)7.附加源代码 (20)前言随着3G的到来,让人们的目光聚集到一个新兴的互联网终端——手机上。

手机的随身性让玩家有了随时随地完游戏的可能。

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

辅助类 Coordinate.java复制代码package com.nn.util;/***坐标点*/public class Coordinate {public int x;public int y;public Coordinate(int newX, int newY) { x = newX;y = newY;}public boolean equals(Coordinate other) { if (x == other.x && y == other.y) {return true;}return false;}@Overridepublic String toString() {return "Coordinate: [" + x + "," + y + "]";}}复制代码接口Direction复制代码package com.nn.entity;public interface Direction {public class Dir{public static final int UP = 1;public static final int DOWN = 2;public static final int LEFT = 3;public static final int RIGHT = 4;}}复制代码实体类Snake.java复制代码package com.nn.entity;import java.util.ArrayList;import com.nn.entity.Direction.Dir; import com.nn.util.Coordinate;public class Snake{//小方块x坐标private int x;//小方块y坐标private int y;//宽度public static final int TILE_W = 10;//高度public static final int TILE_H = 10;//下一个方向private int mNextDirection = Dir.RIGHT;//游戏是否结束private boolean isEnd;//存放贪吃蛇private ArrayList<Coordinate> mSnakeTrail = new ArrayList<Coordinate>();//存放豆子private ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>();public Snake(){initNewGame();}//初始化新游戏public void initNewGame(){//初始化蛇身mSnakeTrail.add(new Coordinate(5, 7));mSnakeTrail.add(new Coordinate(6, 7));mSnakeTrail.add(new Coordinate(7, 7));mSnakeTrail.add(new Coordinate(8, 7));mSnakeTrail.add(new Coordinate(9, 7));mSnakeTrail.add(new Coordinate(10, 7));//初始化豆子mAppleList.add(new Coordinate(20,3));//设置初始状态为falseisEnd = false;}public ArrayList<Coordinate> getmSnakeTrail() { return mSnakeTrail;}public ArrayList<Coordinate> getmAppleList() { return mAppleList;}public boolean isEnd() {return isEnd;}public int getmNextDirection() {return mNextDirection;}public void setEnd(boolean isEnd) {this.isEnd = isEnd;}}复制代码frame类继承JFrame SnakeFrame.java复制代码package com.nn.ui;import java.awt.Dimension;import java.awt.Toolkit;import javax.swing.JFrame;/***游戏界面*/public class SnakeFrame extends JFrame{private static final long serialVersionUID = 1L;//宽度private static final int width = 530;//高度private static final int height = 450;//高度偏移量private static final int offset = 15;public SnakeFrame(){init();}/*** 初始化游戏界面*/private void init(){this.setTitle("Java版贪吃蛇_1.0");//frame的高度宽度this.setSize(width, height);//窗口居中显示Toolkit toolkit = Toolkit.getDefaultToolkit();Dimension screen = toolkit.getScreenSize();int w = screen.width;int h = screen.height;//计算左上角坐标点的x y值this.setLocation((w-this.getWidth())/2, (h-this.getHeight())/2-offset);//设置默认关闭的操作this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗口大小不可改变this.setResizable(false);//设置可见性this.setVisible(true);this.setLayout(null);}}复制代码panel j继承JPanel SnakePanel.java复制代码package com.nn.ui;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import javax.swing.JButton;import javax.swing.JPanel;import com.nn.control.PlayControl;import com.nn.entity.Snake;import com.nn.util.Coordinate;public class SnakePanel extends JPanel{private static final long serialVersionUID = 1L;//panel的宽度private static final int width = 400;//panel的高度private static final int height = 400;//坐标点xprivate static final int x = 10;//坐标点yprivate static final int y = 10;//方块尺寸private static final int SIZE = 10;//是否开启网格private boolean isOpen = false; private Snake snake;//开启作弊private JButton girdButton; private JButton aboutButton;//暂停继续按钮private JButton PauseButton;//重新开始游戏private JButton StartButton;public Snake getSnake() {return snake;}private ArrayList<Coordinate> mSnakeTrail = null; private ArrayList<Coordinate> mAppleList = null;public SnakePanel() {snake = new Snake();this.setLayout(null);StartButton = new JButton("重新开始");StartButton.setLocation(420,100);StartButton.setSize(90,26);this.add(StartButton);PauseButton = new JButton("暂停游戏");PauseButton.setLocation(420, 150);PauseButton.setSize(90,26);this.add(PauseButton);girdButton = new JButton("开启网格");girdButton.setLocation(420, 200);girdButton.setSize(90,26);this.add(girdButton);aboutButton = new JButton("关于游戏");aboutButton.setLocation(420, 250);aboutButton.setSize(90,26);this.add(aboutButton);girdButton.addActionListener(new GirdActionListener());aboutButton.addActionListener(new AboutActionListerner());}class GirdActionListener implements ActionListener{ int i = 1;public void actionPerformed(ActionEvent e) {if(i%2==1){girdButton.setText("关闭网格");isOpen = false;i++;}else if(i%2==0){girdButton.setText("开启网格");isOpen = true;i++;}}}class AboutActionListerner implements ActionListener{public void actionPerformed(ActionEvent e) {}}@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);creatGameWindow(g);if(snake.isEnd()){paintWords(g);}//将焦点定在Jpanel上this.requestFocus();}/*** 安装玩家控制器* @param control*/public void setGameControl(PlayControl control){ this.addKeyListener(control);}private void creatGameWindow(Graphics g) {g.setColor(Color.BLACK);g.drawRect(x, y, width, height);g.setColor(Color.WHITE);g.fillRect(x+1, y+1, width-1, height-1);g.setColor(Color.GRAY);/***************test******************/paintLine(g);/***************test******************/mSnakeTrail = snake.getmSnakeTrail();mAppleList = snake.getmAppleList();if(mSnakeTrail==null){return;}g.setColor(Color.BLACK);for(int i=0;i<mSnakeTrail.size();i++){g.fillRect(this.x+mSnakeTrail.get(i).x*SIZE, this.y+mSnakeTrail.get(i).y*SIZE,Snake.TILE_W, Snake.TILE_H);}//画豆子g.fillRect(this.x+mAppleList.get(0).x*SIZE, this.y+mAppleList.get(0).y*SIZE, Snake.TILE_W,Snake.TILE_H);}//画网格private void paintLine(Graphics g){for(int i = 1;i < 40;i++){g.drawLine(this.x, i*10+this.y, 400+this.x, i*10+this.y);}for(int i = 1;i < 40;i++){g.drawLine(i*10+this.x,this.y,i*10+this.x,400+this.y);}}//结束提示private void paintWords(Graphics g){Font font = new Font("宋体", Font.BOLD, 64);g.setFont(font);g.setColor(Color.RED);g.drawString("游戏结束",60,220);}}复制代码最关键的类控制类PlayControl.java复制代码package com.nn.control;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.Random;import com.nn.entity.Direction.Dir;import com.nn.ui.SnakePanel;import com.nn.util.Coordinate;public class PlayControl implements KeyListener{private SnakePanel panel;//蛇头在list中索引private int headIndex;/*** 贪吃蛇列表*/ArrayList<Coordinate> mSnakeTrail;/** 豆子列表*/private ArrayList<Coordinate> mAppleList;//新产生的豆子Coordinate newCoordinate;private int mNextDirection;//是否绘制出结束提示private boolean isDraw = false;private Random random = new Random();public PlayControl(SnakePanel panel){this.panel = panel;mSnakeTrail = panel.getSnake().getmSnakeTrail();mAppleList = panel.getSnake().getmAppleList();mNextDirection = panel.getSnake().getmNextDirection();headIndex = mSnakeTrail.size()-1;Thread thread = new Thread(runnable);thread.start();}//响应键盘按下事件public void keyPressed(KeyEvent e) {if(isDraw){return;}switch (e.getKeyCode()) {case KeyEvent.VK_UP:if(mNextDirection!=Dir.DOWN){mNextDirection = Dir.UP;//moveUp();}break;case KeyEvent.VK_DOWN:if(mNextDirection!=Dir.UP){mNextDirection = Dir.DOWN;//moveDown();}break;case KeyEvent.VK_LEFT:if(mNextDirection!=Dir.RIGHT){mNextDirection = Dir.LEFT;//moveLeft();}break;case KeyEvent.VK_RIGHT:if(mNextDirection!=Dir.LEFT){mNextDirection = Dir.RIGHT;//moveRight();}break;}}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}//向上移动private void moveUp(){if(!isEndGame()){//每移动一次先在头部加一块list增加一个元素mSnakeTrail.add(newCoordinate(mSnakeTrail.get(headIndex).x, mSnakeTrail.get(headIndex).y-1));//如果判断吃到豆子if(isEat()){//吃到豆子的处理afterEatApple();}//否则移除第一个元素else {mSnakeTrail.remove(0);}//重新绘制panel.repaint();}}//向下移动private void moveDown(){if(!isEndGame()){mSnakeTrail.add(new Coordinate(mSnakeTrail.get(headIndex).x, mSnakeTrail.get(headIndex).y+1));if(isEat()){afterEatApple();}else {mSnakeTrail.remove(0);}panel.repaint();}}//向左移动private void moveLeft(){if(!isEndGame()){mSnakeTrail.add(new Coordinate(mSnakeTrail.get(headIndex).x-1, mSnakeTrail.get(headIndex).y));if(isEat()){afterEatApple();}else {mSnakeTrail.remove(0);}panel.repaint();}}//向右移动private void moveRight(){if(!isEndGame()){mSnakeTrail.add(new Coordinate(mSnakeTrail.get(headIndex).x+1, mSnakeTrail.get(headIndex).y));if(isEat()){afterEatApple();}else {mSnakeTrail.remove(0);}panel.repaint();}}//增加一个坐标点到存放蛇的list 添加到list的末尾private void afterEatApple(){//每增加一个索引值加1 重新开始游戏时要回复初始值headIndex++;mAppleList.add(newCoordinate(random.nextInt(40), random.nextInt(40)));mAppleList.remove(0);newCoordinate = mAppleList.get(0);//System.out.println("蛇身长度:"+mSnakeTrail.size());}//判断蛇是否吃到豆子private boolean isEat(){returnmSnakeTrail.get(mSnakeTrail.size()-1).equals(mAppleLis t.get(0));}//判断是否到边界或者碰到自己的身体private boolean isEndGame(){int x = mSnakeTrail.get(headIndex).x;int y = mSnakeTrail.get(headIndex).y;if(touchBody()||x<0||x>39||y<0||y>39){afterEndGame();return true;}return false;}//碰到自己身体private boolean touchBody(){for(int i =0;i<mSnakeTrail.size()-1;i++){if(mSnakeTrail.get(headIndex).equals(mSnakeTrail.get(i)) ){return true;}}return false;}//游戏结束处理private void afterEndGame(){mSnakeTrail.remove(headIndex);panel.getSnake().setEnd(true);panel.repaint();this.isDraw = true;}Runnable runnable = new Runnable() {public void run() {moveRight();while(!isEndGame()){if(mNextDirection==Dir.UP) moveUp();else if(mNextDirection==Dir.DOWN) moveDown();else if(mNextDirection==Dir.LEFT) moveLeft();else if(mNextDirection==Dir.RIGHT) moveRight();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}};}复制代码最后是测试类SnakeTest.java复制代码package com.nn.main;import com.nn.control.PlayControl;import com.nn.ui.SnakeFrame;import com.nn.ui.SnakePanel;/**java版贪吃蛇小游戏*启动游戏**/public class SnakeTest {public static void main(String[] args) {SnakeFrame frame = new SnakeFrame();SnakePanel panel = new SnakePanel();PlayControl playControl = new PlayControl(panel);panel.setGameControl(playControl);//setContentPane()把panel设置为JFrame的内容面板frame.setContentPane(panel);}}31 / 31。

相关文档
最新文档