java小游戏设计电子版本.docx
《java小游戏设计电子版本.docx》由会员分享,可在线阅读,更多相关《java小游戏设计电子版本.docx(14页珍藏版)》请在冰豆网上搜索。
java小游戏设计电子版本
java小游戏设计
华北科技学院计算机学院综合性实验
实验报告
课程名称JAVA程序设计
实验学期2014至2015学年第1学期
学生所在院部计算机学院
年级专业班级
学生姓名学号
任课教师
实验成绩
计算机学院制
《Java程序设计》课程综合性实验报告
开课实验室:
基础四2016年11月28日
实验题目
基于java的拼图游戏
一、实验目的
程序使用Eclipse集成开发环境完成,熟悉并掌握在Eclipse开发环境下编写Java程序。
二、设备与环境
硬件:
多媒体计算机
软件:
Windows系列操作系统、JDK开发包、Eclipse开发环境
三、实验内容及要求
1.实验要求
使用Javaswing编程实现拼图游戏。
游戏功能是将一幅图片分割成5*5的规则小图片,游戏开始时将25个小图片随机摆放,玩家能够参考原图拼接出正确的图片。
游戏规则:
在25个小图片中有一个为空白图片,玩家可以单击和空白小图片相邻的任一个小图片(上、下、左、右均可),即可将单击的小图片与空白小图片交换位置。
通过有限次的移动,即可将随机分布的小图片恢复成原图的样式。
2.实验内容
(1)各类及主要成员函数的功能:
java源代码及其功能
序号
类名
主要功能
1
GreedSnake
该类为程序入口,含有main方法。
2
SnakeControl
实现控制运行等总体要求,实现方向键控制蛇的方向,空格键控制游戏暂停或继续,还有分数等。
3
SnakeModel
该类实现蛇的结构和具体运动,如判断食物是否和怎样被吃掉及判断后的动作。
4
Node
该类实现组成蛇身的单位-食物。
5
SnakeView
该类实现画板功能,用黑色画蛇身,红色画食物。
(2)具体代码及实现如下:
程序入口主方法:
//第一部分
publicclassGreedSnake{//建立主类GreeSnake
publicstaticvoidmain(String[]args){
SnakeModelmodel=newSnakeModel(20,30);//初始化蛇出现的位置
SnakeControlcontrol=newSnakeControl(model);
SnakeViewview=newSnakeView(model,control);
//添加一个观察者,让view成为model的观察者
model.addObserver(view);
(newThread(model)).start();
}
}
实现对蛇身的控制要求:
//第二部分
//游戏的Model类,负责所有游戏相关数据及运行
classSnakeControlimplementsKeyListener{//SnakeControl实现接口KeyListener,键盘监听
SnakeModelmodel;
publicSnakeControl(SnakeModelmodel){
this.model=model;
}
publicvoidkeyPressed(KeyEvente){
intkeyCode=e.getKeyCode();
if(model.running){//运行状态下,处理的按键
switch(keyCode){
caseKeyEvent.VK_UP:
model.changeDirection(SnakeModel.UP);
break;
caseKeyEvent.VK_DOWN:
model.changeDirection(SnakeModel.DOWN);
break;
caseKeyEvent.VK_LEFT:
model.changeDirection(SnakeModel.LEFT);
break;
caseKeyEvent.VK_RIGHT:
model.changeDirection(SnakeModel.RIGHT);
break;
caseKeyEvent.VK_ADD:
caseKeyEvent.VK_PAGE_UP:
//向上翻加速
model.speedUp();
break;
caseKeyEvent.VK_SUBTRACT:
caseKeyEvent.VK_PAGE_DOWN:
//减速
model.speedDown();
break;
caseKeyEvent.VK_SPACE:
caseKeyEvent.VK_P:
model.changePauseState();//暂停进入睡眠状态
break;
default:
}
}
//任何情况下处理的按键,按键导致重新启动游戏
if(keyCode==KeyEvent.VK_R||
keyCode==KeyEvent.VK_S||
keyCode==KeyEvent.VK_ENTER){
model.reset();
}
}
publicvoidkeyReleased(KeyEvente){
}
publicvoidkeyTyped(KeyEvente){
}
}
实现蛇的结构和具体运动:
//第三部分
@SuppressWarnings(“unchecked”)
classSnakeModelextendsObservableimplementsRunnable{//SnakeModel继承Observable类并且实现接口Runnable
ainfra[][]matrix;//指示位置上有没蛇体或食物
LinkedListnodeArray=newLinkedList();//蛇体
Nodefood;
intmaxX;
intmaxY;
intdirection=2;//蛇运行的方向
ainfrarunning=false;//运行状态
inttimeInterval=200;//时间间隔,毫秒
doublespeedChangeRate=0.75;//每次得速度变化率
ainfrapaused=false;//暂停标志
intscore=0;//得分
intcountMove=0;//吃到食物前移动的次数
//UPandDOWNshouldbeeven
//RIGHTandLEFTshouldbeodd
publicstaticfinalintUP=2;
publicstaticfinalintDOWN=4;
publicstaticfinalintLEFT=1;
publicstaticfinalintRIGHT=3;
publicSnakeModel(intmaxX,intmaxY){
this.maxX=maxX;
this.maxY=maxY;
reset();
}
publicvoidreset(){
direction=SnakeModel.UP;//蛇运行的方向
timeInterval=500;//时间间隔,毫秒
paused=false;//暂停标志
score=0;//得分
countMove=0;//吃到食物前移动的次数
//initialainfr,全部清0
matrix=newainfra[maxX][];
for(intI=0;Imatrix[i]=newainfra[maxY];
Arrays.fill(matrix[i],false);
}
//initialthesnake
//初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
intinitArrayLength=maxX>20?
10:
maxX/2;
nodeArray.clear();
for(intI=0;Iintx=maxX/2+I;//maxX被初始化为20
inty=maxY/2;//maxY被初始化为30
//nodeArray[x,y]:
[10,15]-[11,15]-[12,15]~~[20,15]
//默认的运行方向向上,所以游戏一开始nodeArray就变为:
//[10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
nodeArray.addLast(newNode(x,y));
matrix[x][y]=true;
}
//创建食物
food=createFood();
matrix[food.x][food.y]=true;
}
publicvoidchangeDirection(intnewDirection){//改变的方向不能与原来方向同向或反向
if(direction%2!
=newDirection%2){
direction=newDirection;
}
}
publicainframoveOn(){
Noden=nodeArray.getFirst();
intx=n.x;
inty=n.y;
//根据方向增减坐标值
switch(direction){
caseUP:
y--;
break;
caseDOWN:
y++;
break;
caseLEFT:
x--;
break;
caseRIGHT:
x++;
break;
}
//如果新坐标落在有效范围内,则进行处理
if((0<=x&&xif(matrix[x][y]){//如果新坐标的点上有东西(蛇体或者食物)
if(x==food.x&&y==food.y){//吃到食物,成功
nodeArray.addFirst(food);//从蛇头赠长
//分数规则,与移动改变方向的次数和速度两个元素有关
intscoreGet=(10000–200*countMove)/timeInterval;
score+=scoreGet>0?
scoreGet:
10;
countMove=0;
food=createFood();//创建新的食物
matrix[food.x][food.y]=true;//设置食物所在位置
returntrue;
}
else//吃到蛇体自身,失败
returnfalse;
}
else{//如果新坐标的点上没有东西(蛇体),移动蛇体
nodeArray.addFirst(newNode(x,y));
matrix[x][y]=true;
n=nodeArray.removeLast();
matrix[n.x][n.y]=false;
countMove++;
returntrue;
}
}
returnfalse;//触到边线,失败
}
publicvoidrun(){//运行方法
running=true;
while(running){
try{
Thread.sleep(timeInterval);
}
catch(Exceptione){
break;
}
if(!
paused){
if(moveOn()){
setChanged();//Model通知View数据已经更新
notifyObservers();
}
else{
JoptionPane.showMessageDialog(null,
“你输了”,
“GameOver”,
JoptionPane.INFORMATION_MESSAGE);
break;
}
}
}
running=false;
}
privateNodecreateFood(){
intx=0;
inty=0;
//随机获取一个有效区域内的与蛇体和食物不重叠的位置
do{
Randomr=newRandom();
x=r.nextInt(maxX);
y=r.nextInt(maxY);
}
while(matrix[x][y]);
returnnewNode(x,y);
}
publicvoidainfra(){
timeInterval*=speedChangeRate;
}
publicvoidspeedDown(){
timeInterval/=speedChangeRate;
}
publicvoidchangePauseState(){
paused=!
paused;
}
publicStringtoString(){
Stringresult=“”;
for(intI=0;INoden=nodeArray.get(i);
result+=“[“+n.x+“,”+n.y+“]”;
}
returnresult;
}
}
实现组成蛇身的单位-食物:
//第四部分
classNode{//Node子类
intx;
inty;
Node(intx,inty){
this.x=x;
this.y=y;
}
}
实现画板功能,黑色为蛇身,红色为食物:
//第五部分
classSnakeViewimplementsObserver{//SnakeView实现接口Observer
SnakeControlcontrol=null;
SnakeModelmodel=null;
Jframeainframe;//窗口
CanvaspaintCanvas;//图像背景
JlabellabelScore;//分数
publicstaticfinalintcanvasWidth=300;//窗口宽度
publicstaticfinalintcanvasHeight=300;//窗口高度
}
(3)游戏运行结果如图:
初始游戏界面及蛇出现的位置,最后三行英文字母为帮助菜单:
第一次吃到食物加10分,增长1个食物的长度:
第二次吃到食物加14分,蛇身增加1个食物的长度,两次加分说明游戏分数不仅和食物有关还和所走路径有关:
游戏失败两种情况:
咬到蛇尾或者自身:
四、实验结果及分析
此处写自己通过学习本课程所得到的收获、感想以及对课程教学的看法等内容,要写自己的真实想法,不要写套话。
至少200字。
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
实验结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日
考查报告内容必须自己独立完成,如果发现雷同现象,双方成绩都将认定为不及格!
最后要把课程考查报告电子文档及程序压缩文件上传到FTP服务器上,并提交打印稿。
打印报告时删除此红色提示