java设计报告Word文档下载推荐.docx
《java设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java设计报告Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
本游戏编写的形式是对书本上知识的巩固,如果读者在这之中有什么不懂的地方,可以问我们或者查阅其他图书,进而成为一名基础理论扎实、实践经验丰富的Java高级程序设计人才。
目录
第一章游戏简介1
一、功能及规则1
二、游戏中涉及的类1
三、类之间的关系1
四、游戏界面2
五、任务书2
第二章代码部分3
一、控制层(Controller)3
二、实体层7
1、蛇(Snack)7
2、食物(Food)9
3、地形或地面(Ground)10
三、游戏界面设置11
1、主Frame(MainFrame)11
2、游戏设置面板(GameOptionPanel)14
3、游戏显示面板(GamePanel)15
四、监听器16
1、蛇的监听器16
2、游戏监听器16
五、工具类16
第三章总结18
附录19
第一章游戏简介
一、功能及规则
本次java课程设计采用面向对象的思想编写一个贪吃蛇的小游戏,该游戏的功能及规则如下:
1、蛇具有吃食物的功能
2、当蛇吃到食物后自己的身体就会加长一节
3、当蛇吃到自己的身体或者是石头自己就会死掉
4、该游戏具有暂停、开始新游戏、停止游戏的功能
5、方向键控制蛇移动的方向、回车键或空格键暂停/开始游戏、pageuppagedown使蛇加速或减速移动
二、游戏中涉及的类
1、控制器(Controller):
控制Ground、Snake、Food,负责游戏的逻辑,处理按键事件,实现了SnakeListener接口,可以处理Snake触发的事件等。
2、食物(Food):
有x、y坐标和颜色等属性。
3、地形或地面(Ground):
在游戏开始的时候画一个地图。
4、蛇(Snack):
其中包括蛇移动的方法、画自己身体等方法。
5、游戏设置面板(GameOptionPanel):
其中包括游戏开始、暂停、停止按钮及图片等的添加。
6、主界面(MainFrame):
实现GameListener接口、让主界面居中显示等操作。
7、游戏监听器(GameListener):
包括游戏开始、暂停、停止、继续事件。
8、蛇的监听器(SnakeListener):
包括蛇移动事件、蛇吃到食物事件。
9、工具类(Global):
此类中存放了其他类中用到的一些常量。
10、游戏的显示界面(GamePanel):
设置游戏面板的大小和颜色等。
三、类之间的关系
四、游戏界面
五、任务书
设计题目
设计内容
小组成员
分工
贪吃蛇小游戏
用java语言编写一个贪吃蛇的游戏,并运行所实现的功能
组长:
杨茂科
控制器游戏的设置和显示面板设计
杨胜文
食物、石头设计
王明
主frame监听程序的工具类设计
第二章代码部分
一、控制层(Controller)
importjava.awt.event.*;
importjava.awt.*;
importjava.util.*;
importjavax.swing.*;
publicclassControllerextendsKeyAdapterimplementsSnakeListener{
privateGroundground;
//地形
privateSnakesnake;
//蛇
privateFoodfood;
//食物
privateGamePanelgamePanel;
//显示
privateJLabelgameInfoLabel;
//提示信息
privatebooleanplaying;
privateintmap;
//控制器监听器
privateSet<
GameListener>
listeners=newHashSet<
();
publicvoidkeyPressed(KeyEvente){
if(e.getKeyCode()!
=KeyEvent.VK_Y&
&
!
playing)
return;
switch(e.getKeyCode()){//方向键上
caseKeyEvent.VK_UP:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.UP);
break;
caseKeyEvent.VK_DOWN:
//方向键下
snake.changeDirection(Snake.DOWN);
caseKeyEvent.VK_LEFT:
//方向键左
snake.changeDirection(Snake.LEFT);
caseKeyEvent.VK_RIGHT:
//方向键右
snake.changeDirection(Snake.RIGHT);
break;
caseKeyEvent.VK_ENTER:
caseKeyEvent.VK_SPACE:
//回车或空格(暂停)
snake.changePause();
for(GameListenerl:
if(snake.isPause())
l.gamePause();
else
caseKeyEvent.VK_PAGE_UP:
//PAGE_UP加速
snake.speedUp();
caseKeyEvent.VK_PAGE_DOWN:
//PAGE_DOWN减速
snake.speedDown();
}
if(gamePanel!
=null)//重新显示/
gamePanel.redisplay(ground,snake,food);
if(gameInfoLabel!
=null)//更新提示/
gameInfoLabel.setText(getNewInfo());
}
//处理Snake触发的snakeMoved事件
publicvoidsnakeMoved(){
//判断是否吃到食物
if(food!
=null&
food.isSnakeEatFood(snake)){
//吃到食物后,蛇增加身体,再重新丢一个食物
snake.eatFood();
food.setLocation(ground==null?
food.getNew():
ground
.getFreePoint());
}
//如果吃到食物,就肯定不会吃到石头
elseif(ground!
ground.isSnakeEatRock(snake)){
//如果吃到的是石头,或吃到自己的身体,就让蛇死掉
stopGame();
}
if(snake.isEatBody())
=null)
//更新提示
//开始一个新游戏
publicvoidnewGame(){
if(ground!
=null){
switch(map){
default:
ground.init();
break;
}}
playing=true;
snake.reNew();
for(GameListenerl:
l.gameStart();
}
//结束游戏
publicvoidstopGame(){
if(playing){
playing=false;
snake.dead();
l.gameOver();
}}
//暂停游戏
publicvoidpauseGame(){
snake.setPause(true);
l.gamePause();
//继续游戏
publicvoidcontinueGame(){
snake.setPause(false);
l.gameContinue();
//接受Snake,Food,Ground的构造器
publicController(Snakesnake,Foodfood,Groundground,GamePanelgamePanel){
this.snake=snake;
this.food=food;
this.ground=ground;
this.gamePanel=gamePanel;
//先丢一个食物
if(ground!
food!
food.setLocation(ground.getFreePoint());
this.snake.addSnakeListener(this);
}//注册监听器
//多接受一个显示提示信息的JLabel
publicController(Snakesnake,Foodfood,Groundground,
GamePanelgamePanel,JLabelgameInfoLabel){
this(snake,food,ground,gamePanel);
this.setGameInfoLabel(gameInfoLabel);
//得到最新的提示信息return蛇的最新信息
publicStringgetNewInfo(){
if(!
snake.isLive())
return"
"
;
//"
提示:
按Y开始新游戏"
else
returnnewStringBuffer().append("
提示:
).append("
速度"
).append(
snake.getSpeed()).toString()+"
毫秒/格"
//添加监听器paraml
publicsynchronizedvoidaddGameListener(GameListenerl){
if(l!
this.listeners.add(l);
}
//移除监听器
publicsynchronizedvoidremoveGameListener(GameListenerl){
this.listeners.remove(l);
}
publicSnakegetSnake(){returnthis.snake;
publicFoodgetFood(){returnthis.food;
publicGroundgetGround(){returnthis.ground;
//处理蛇吃到食物后触发的snakeEatFood事件
publicvoidsnakeEatFood(){System.out.println("
吃到食物!
"
);
}
publicGamePanelgetGamePanel(){returngamePanel;
//设置GamePanel
publicvoidsetGamePanel(GamePanelgamePanel){this.gamePanel=gamePanel;
publicJLabelgetGameInfoLabel(){returngameInfoLabel;
publicvoidsetGameInfoLabel(JLabelgameInfoLabel){
this.gameInfoLabel=gameInfoLabel;
this.gameInfoLabel.setSize(Global.WIDTH*Global.CELL_WIDTH,20);
this.gameInfoLabel.setFont(newFont("
宋体"
Font.PLAIN,12));
gameInfoLabel.setText(this.getNewInfo());
publicvoidsetGround(Groundground){this.ground=ground;
publicvoidsetSnake(Snakesnake){this.snake=snake;
publicvoidsetFood(Foodfood){this.food=food;
publicintgetMap(){returnmap;
publicvoidsetMap(intmap){this.map=map;
publicbooleanisPlaying(){returnplaying;
publicvoidsetPlaying(booleanplaying){this.playing=playing;
publicbooleanisPausingGame(){returnsnake.isPause();
}}
二、实体层
1、蛇(Snack)
importjava.awt.*;
publicclassSnake{
publicstaticfinalintUP=1;
//方向上
publicstaticfinalintDOWN=-1;
//方向下
publicstaticfinalintLEFT=2;
//方向左
publicstaticfinalintRIGHT=-2;
//方向右
privateLinkedList<
Point>
body=newLinkedList<
//蛇(多个节点)
privateintoldDirection;
//上一次的移动方向
privateintnewDirection;
//下一步的方向(有效方向)
privatePointhead;
//临时存放蛇头的坐标
privatePointtail;
//临时存放蛇尾巴的坐标
privateintspeed;
//移动速度
privatebooleanlive;
//生命,是否活着
privatebooleanpause;
//是否暂停
privateSet<
SnakeListener>
publicstaticfinalColorDEFAULT_HEAD_COLOR=newColor(0xcc0033);
privateColorheadColor=DEFAULT_HEAD_COLOR;
//蛇头的颜色
publicstaticfinalColorDEFAULT_BODY_COLOR=newColor(0xcc0033);
privateColorbodyColor=DEFAULT_BODY_COLOR;
//蛇身体的颜色
publicvoidmove(){//忽略相反方向
if(oldDirection+newDirection!
=0)
oldDirection=newDirection;
//把蛇尾巴拿出来重新设置坐标作为新蛇头,etLocation将返回一个新的Point,tail把尾巴坐标保存下来,吃到食物时再加上
tail=(head=takeTail()).getLocation();
head.setLocation(getHead());
//根据蛇头的坐标再上下左右
switch(oldDirection){//根据方向让蛇移动
caseUP:
head.y--;
break;
caseDOWN:
head.y++;
caseLEFT:
head.x--;
caseRIGHT:
head.x++;
body.addFirst(head);
}//添加到头上去
//一个内部类,驱动蛇定时移动
privateclassSnakeDriverimplementsRunnable{
publicvoidrun(){
while(live){
if(!
pause){
move();
//ControllerListener的状态改变事件
for(SnakeListenerl:
l.snakeMoved();
}
try{
Thread.sleep(speed);
}catch(InterruptedExceptione){
//在尾巴上增加一个节点
publicvoideatFood(){
//把上一次移动拿掉的节点再加上
body.addLast(tail.getLocation());
//触发SnakeListener的snakeEatFood事件
for(SnakeListenerl:
listeners)l.snakeEatFood();
publicvoidchangeDirection(intdirection){this.newDirection=direction;
}//改变方向
publicPointgetHead(){returnbody.getFirst();
}//得到蛇头节点
publicPointtakeTail(){returnbody.removeLast();
}//去掉蛇尾巴
publicintgetLength(){returnbody.size();
}//得到蛇的长度
publicvoidbegin(){newThread(newSnakeDriver()).start();
}//让蛇开始运动
publicvoidreNew(){init();
begin();
}//让蛇复活,并开始运动
//初始化蛇的信息、长度,位置,方向,速度,生命和暂停状态
publicvoidinit(){
body.clear();
//初始化位置在中间
intx=Global.WIDTH/2-Global.INIT_LENGTH/2;
inty=Global.HEIGHT/2;
for(inti=0;
i<
Global.INIT_LENGTH;
i++)
this.body.addFirst(newPoint(x++,y));
oldDirection=newDirection=RIGHT;
//设置默认方向为向右
speed=Global.SPEED;
//初始化速度