java课程设计报告拼图游戏文档格式.docx
- 文档编号:22598353
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:29
- 大小:1.47MB
java课程设计报告拼图游戏文档格式.docx
《java课程设计报告拼图游戏文档格式.docx》由会员分享,可在线阅读,更多相关《java课程设计报告拼图游戏文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
拼图游戏是一个简单的小程序,游戏规则如下:
将一张大图打散成9张小图,然后在游戏里任意挑8张图,贴在3行3列的矩阵中的任意位置。
通过鼠标或键盘的方向键移动打乱的8张图片,让其复原成原来的顺序,玩家就胜利了,游戏就结束了。
在游戏结束之后,算出玩家的得分。
三、概要设计
1、功能分析
由于要计算游戏的时间,需要引入线程,通过实现Runnable接口和创建Thread类来实现线程的功能。
使用多线程机制来计算时间的流逝。
引入AWT绘图包,实现图片的绘制。
引入事件处理机制,要求对鼠标事件,键盘事件进行相应,实现移动图片,预览全图等功能。
按键“Y”实现临时的原图整体预览。
按键“1或者2或者3”实现大图选择、
2、界面初始化
调用publicvoidinit()通过接收html数据,加载三张源图片,安装媒体监视器和鼠标键盘监听器,实现界面初始化;
调用publicvoidinitData()将加载的一张大图分割成九个随机分布的小图部分;
调用publicvoidpaint(Graphicsg)划分提示信息区域和拼图区域;
3、事件处理
(1)鼠标事件
调用publicvoidmouseClicked(MouseEvente)方法实现鼠标事件处理。
调用PublicintdirectionCanMove(intnCol,intnRow)方法检测那个方向没有拼图而可以向之移动。
调用publicvoidmove(intnCol,intnRow,intnDirection)方法实现鼠标激活拼图移动。
(2)键盘事件
调用publicvoidkeyPressed(KeyEvente)方法实现键盘事件处理。
调用publicvoidinitImageAgain(intnImgNo)方法实现重新加载另一张大图。
调用publicbooleanmove(intnDirection)方法实现判断指定拼图是否可以往方向nDirection移动。
4、状态判断
动过调用publicvoidcheckStatus()方法来
检测拼图状态,判断是否拼图成功,确定游戏是否结束。
5、附加功能
调用publicvoidrun()方法,给游戏过程添加计时进程。
6、程序流程图
4、详细设计
1、编写.html代码
<
html>
head>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=gb2312"
>
title>
拼图游戏
/title>
/HEAD>
body>
hr>
这是一个拼图游戏。
玩家应该将打散的小图拼成一张大图。
br>
玩家可以通过鼠标和键盘来移动小图,移动的次数和拼成<
一张大图所化费的时间作为游戏得分的依据。
成绩=1000-时间(秒)-移动步数*10<
按F1键重新开始该游戏,按Y健可以预览整个的图片
appletcode="
pintu.class"
width="
480"
height="
360"
!
--param标签NumOfImgparam的标签表示有多少张图片
剩下的param标签为每张图的名字
-->
paramname=NumOfImgvalue="
3"
paramname=Image1value="
pintu"
paramname=Image2value="
pintu2"
paramname=Image3value="
pintu3"
/applet>
/body>
/html>
2、编写.java代码
1、界面设计和附加功能
importjava.applet.*;
importjava.awt.*;
importjava.awt.event.*;
import.*;
//Downloadby
publicclasspintuextendsAppletimplementsMouseListener,KeyListener,Runnable
{
Image[]m_Image=newImage[9];
//9个用来装入每个拼图的图片对象
Imagem_ImgAll;
//总的大图片
intm_nImageNo[][]=newint[3][3];
////标志现在各个拼图的排列情况
finalintNO_IMAGE=-1;
//此位置没有拼图,表示空白拼图
finalintIMAGE_WIDTH=120;
//每张拼图的宽
finalintIMAGE_HEIGHT=120;
////每张拼图的高
finalintDIRECTION_UP=1;
finalintDIRECTION_DOWN=2;
finalintDIRECTION_LEFT=3;
finalintDIRECTION_RIGHT=4;
finalintDIRECTION_NONE=-1;
finalintDELTAX=120;
//标志提示信息区的宽度
booleanbWantStartNewGame=false;
//游戏是否结束,是否需要开始新游戏
intnStep=0;
//已经走的步数
intnTime=0;
//已经玩过的时间,以秒为单位
ThreadthTimer;
//计时器线程
intnScore=0;
//玩家所得的分数
intm_nNumOfImg=0;
//拼图底图所使用的图片的个数
Stringm_sImgName[]=newString[9];
//记录拼图底图的名字
booleanbOnShowAll=false;
//预览的开关
AudioClipm_audioClip1,m_audioClip2;
//装载要播放的声音对象
publicvoidinit()/
{
Stringparam=getParameter("
NumOfImg"
);
try
m_nNumOfImg=Integer.parseInt(param);
}
catch(Exceptione)
m_nNumOfImg=1;
System.out.println("
Can'
tconverttheparam'
snametoint."
for(inti=0;
i<
m_nNumOfImg;
i++)
m_sImgName[i]=getParameter("
Image"
+(i+1))+"
.jpg"
;
//用字符串数组m_sImgName分别保存三个大图及其规范命名:
p
//pintu.jpgpintu1.jpgpintu2.jpg
System.out.println(m_sImgName[i]);
System.out.println(param);
MediaTrackermediaTracker=newMediaTracker(this);
//为这个拼图界面设置一个监视器
m_ImgAll=getImage(getDocumentBase(),"
img/"
+m_sImgName[0]);
//从装载总的大图片
mediaTracker.addImage(m_ImgAll,1);
//为向此媒体跟踪器正在跟踪的图像列表中添加一个图像,
//并分配一个表示号1给这个图像
try
{
mediaTracker.waitForID
(1);
//加载所跟踪的图像列表中的某一个标识号所对应的的一个图像
}
catch(Exceptione)
System.out.println("
图片装载出错"
if(mediaTracker.isErrorAny())System.out.println("
9;
m_Image[i]=createImage(IMAGE_WIDTH,IMAGE_HEIGHT);
Graphicsg=m_Image[i].getGraphics();
intnRow=i%3;
intnCol=i/3;
g.drawImage(m_ImgAll,
0,
IMAGE_WIDTH,
IMAGE_HEIGHT,
nRow*IMAGE_WIDTH,
nCol*IMAGE_HEIGHT,
(nRow+1)*IMAGE_WIDTH,
(nCol+1)*IMAGE_HEIGHT,
this);
init"
+i);
//将一个大图切割成九个小图
initover"
thTimer=newThread(this);
//为线程分配内存空间
thTimer.start();
//开始线程
initData();
m_audioClip1=getAudioClip(getCodeBase(),"
au/move.au"
m_audioClip2=getAudioClip(getCodeBase(),"
au/notmove.au"
addMouseListener(this);
addKeyListener(this);
publicvoidinitData()
System.out.println("
runinitData"
int[]nHasDistrib=newint[9];
//为每个小图分配一个数字标识,用来判定该小图是否被随机编一个二维数组号
i++)nHasDistrib[i]=0;
for(intj=0;
j<
3;
j++)
for(inti=0;
{
intnCount=j*3+i;
intnImgNo=-1;
do
nImgNo=(int)(Math.random()*9);
}while(nHasDistrib[nImgNo]==1);
//1代表已经分配了这张图片到二维数组中的随机位置
m_nImageNo[i][j]=nImgNo;
nHasDistrib[nImgNo]=1;
test.."
}
m_nImageNo[(int)(Math.random()*3)][(int)(Math.random()*3)]=NO_IMAGE;
nStep=0;
nTime=0;
//清空计时器
publicvoidrun()
while(Thread.currentThread()==thTimer)
thTimer.sleep(990);
StringsTemp="
你玩了"
+nTime+"
秒的时间,"
if(nTime>
200)sTemp=sTemp+"
时间用的很长了,你可要加油啦!
"
elsesTemp=sTemp+"
别紧张,慢慢来。
showStatus(sTemp);
if(!
bWantStartNewGame)nTime++;
}
publicvoidpaint(Graphicsg)
g.setColor(Color.blue);
//将当前颜色变为蓝色
g.fillRect(0,0,DELTAX,IMAGE_HEIGHT*3);
//填充左边的提示信息区域
g.setFont(newFont("
宋体"
Font.PLAIN,15));
//设置字体
/*Font是一个字体类!
PLAIN是它的一个静态常量!
类似的还有BOLD,ITALIC
Font.PLAIN是一个普通的系统默认的字体!
jMenuSystem.setFont(newjava.awt.Font("
华文新魏"
Font.PLAIN,20));
设置字体为华文新魏类型:
普通系统默认大小为20
*/
g.setColor(Color.red);
//setColor函数对该函数调用的下文进行颜色设置
g.drawString("
步数:
+nStep,5,20);
现有图片"
+m_nNumOfImg+"
张"
5,60);
请按1-"
键改变图片"
5,100);
//在坐标(5,20)画出字串,来显示现在走了多少步。
if(bOnShowAll)
intx=DELTAX;
inty=0;
g.drawImage(m_ImgAll,x,y,this);
return;
for(intj=0;
intx=i*IMAGE_WIDTH+DELTAX;
inty=j*IMAGE_HEIGHT;
if(m_nImageNo[i][j]==NO_IMAGE)
g.fill3DRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT,false);
else
g.drawImage(m_Image[m_nImageNo[i][j]],x,y,this);
g.drawRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT);
checkStatus();
if(bWantStartNewGame)
//如果游戏结束,玩家将拼图的顺序排对之后
nScore=1000-nStep*10-nTime;
请按任意键重新开始"
5,140);
Font.PLAIN,40));
你赢了"
+nScore+"
分"
70+DELTAX,160);
祝贺你!
110+DELTAX,210);
publicvoidcheckStatus()
booleanbWin=true;
//定义成员,默认值为真
intnCorrectNum=0;
for(intj=0;
if(m_nImageNo[i][j]!
=nCorrectNum&
&
m_nImageNo[i][j]!
=NO_IMAGE)
bWin=false;
nCorrectNum++;
//比较拼图是否都放到了正确的位置上,如果,有一个没有放到正确位置上,则游戏就不能结束。
if(bWin)bWantStartNewGame=true;
2、鼠标事件处理
publicvoidmouseClicked(MouseEvente)
//Invokedwhenthemousehasbeenclickedonacomponent.
if(bOnShowAll)return;
repaint();
bWantStartNewGame=false;
intnX=e.getX()-DELTAX;
intnY=e.getY();
intnCol=nY/IMAGE_HEIGHT;
intnRow=nX/IMAGE_WIDTH;
System.out.println("
col:
+nCol+"
row:
+nRow);
intnDirection=directionCanMove(nCol,nRow);
if(nDirection!
=DIRECTION_NONE)
move(nCol,nRow,nDirection);
nStep++;
m_audioClip1.play();
else
m_audioClip2.play();
publicvoidmouseEntered(MouseEvente)
publicvoidmouseExited(MouseEvente)
publicvoidmousePressed(MouseEvente)
publicvoid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计 报告 拼图游戏