小游戏设计.docx
《小游戏设计.docx》由会员分享,可在线阅读,更多相关《小游戏设计.docx(16页珍藏版)》请在冰豆网上搜索。
小游戏设计
2048小游戏
(1)程序介绍
2048是一款益智小游戏,玩家需要在l6个格子中通过数字叠加的方法将最初的数字2凑成数字2048。
有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数宇方块都会往滑动的方向靠拢外,系统也会在空自的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
2o48是比较流行的一款数字游成a本课程设计通过设计与开发JvM平台上的2048游戏,进一步掌握所学Java课程的知识,体验Java的跨平台性,同时将Java设计方面的知识拓展应用
(二)功能需求描述
l、图形用户界面:
2048的最大特点就是玩家对图形界面里的数字进行操作,也就是是玩家与游戏的互动
2、当前分数scoRE与最高分数的显示:
在我们设计的2048游戏中当前分数取了页面i内所有数字相加的值为分数,对玩家玩游戏的进展有直接性、客观性的展现,同时,最高分数取了以往玩家退出游戏时所保存分数的最高分
3、数字颜色‘游戏中数宇的颜色以2为首項的等比数列变化,即2、4、8、l6、32、“、128、256、5l2、l024、2048__.对应的数字卡片变色
4、游戏的退出:
游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏,当然这样做更符合游戏人性化设计的观念。
(三)玩法技巧:
1、最大数尽可能放在角落
2、数字按顺序紧邻排列
3、首先満足最大数和次大数在的那一列/行是满的
4、时刻注意活动较大数旁边要有相近的数
5、以大数所在的一行为主要移动方向
6、不要急于“清理桌面”
(四)程序说明
一个类Copy2048继承JFrame,类中包括,一个构造方法Copy2048,构造方法中设定游戏界面的大小,背景颜色,边框,字体,标签,布局,位置,记录剩
余空方块数目,记录分数,用于判断游成是否失败,用于判断游戏是否失败,设置字体类型和大小,为最高分标签添加接键监听器,一个KeyEvent按键事件,构造方法中创建游戏主面板,设置主面板位置尺寸,设置空布局,创建文本框二维数组,创建标签,调用时间处理方法,一个Create2方法,是在随机位置产生一个2号方块的方法,ll到l4同时被键盘赋値为1说明任何方向键都不能产生新的数字2,那就说明游戏失败GAMEOVER!
一个setColor方法,是为了产生2l:
)48小游戏方块的颜色。
(五)程序结构
l.重新开始,若是初次运行游戏,则从文件中读入最高分
voidrestart0
2.控制方法
ptlblicvoidkeyPtessed(KeyEvente)
3.结图方法
publicvoidpaint(〔iraphicsg)
4.判断是否己经失败,若失败则返回true,否则返回false
pablicbooleanjudgeFai10
5.向下滑动,若各列均投有方块相相或移动,则返回false,否则返回true;publicvoidmoveDown0
6.向左滑动,若各行均投有方块相相或移动,则返回false,否则返回true;ptlblicvoidmoveLeft0
7.向右滑动,若各行均投有方块相相或移动,则返回false,否则返回true,publicvoidmoveRight0
8.向上滑动,若各行均投有方块相消或移动,则返回false,否则返回true;PublicvoidmoveUp0
9.在游戏区空用处随机生成2publicvoidgenerateRandom20
(6)JAVA制作2048小游戏详细代码
importjava.awt.Color;
importjava.awt.EventOueue;
importjava.awt.BorderLayout;
impol1java.awt.FlowLayout;
importjava.awt.Font;
importjava.awt.event.';
importjava.util.Random;
importjavax.swing_BorderFactory;
importjavax.swing_lcon;
importjavax.swing.lmagelcon;
importjavax.swing_JFrame;
importjavax.swing.JLabel;
importjavax.swing_JPanel;
importjavax.swing.SwingConstants;
importjava)(.swing_border.*;
importjava)(.swing.JTextField;
publicclassCopy2048extendsJFrame{
privateJPanelscoresPane;
privateJPanelmainPane;
privateJLabellabelMaxScores;
privateJLabellabelScores;
privateJLabeltips;
privateJTextFieldtextMa)(Scores;privateJLabeltextScores;
privateJLabel[][]texts;
privatelcorlicon2;
privateinttimes=16;
privateintscores=0;
privateint11,l2,l3,l4,l5;
//提示操作t示签
//-记录剩余空方块数目
//-记最分数
//用-]-'判断游戏是否失败
Fontfont=newFont(”H,Font.BOLD,14);Fontfont2=newFont(-',Font.BOLD,30);Randomrandom=newRandom0;
/般置字体类型和大小//设置字体类型和大小
//随机类实例化
publicstaticvoidmain(StringI]args){
EventOueue.invokeLater(newRunnable0{
publicvoidrun0{
try{
Copy2048ffame=newCopy20480;
frame.setVisible(true);
}
catch(Exceptione1){
e1.prlntStact(Trace0;
}
}
});
}
publicCopy20480{
super0;
setFiesizable(false);
getContentPane0.setLayout(null);
setBounds(500,50,500,615);
setDefaultC⊠oseOperation(JFrame.EX「「0N_CLOSE);setTltle("2048PC版")
scoresPane=newJPanel0;
scoresPane.setBackground(Color.green);
scoresPane.setBounds(20,20,460,40);
scoresPane.setBorder(BorderFactory.createMatteBorder(2,2,2,2,,Color.YELLOW));
getContentPane0.add(scoresPane);
scoresPane.setLayout(null);
labelMaxScores=newJLabel("最高分:
");labelMaxScores.setFont(font);
labelMaxScores.setBounds(10,5,50,30);
scoresPane.add(labelMaxScores);
textMaxScores=newJTextField("");
textMaxScores.setBounds(60,5,150,30);
textMaxScores.setFont(font);
textMaxScores.setEditable(false);
scoresPane.add(textMaxScores);
数面ili,1'
labelScores=newJLabel(”得分:
");labelScores.setFont(font);
labelScores.setBounds(240,5,50,30);scoresPane.add(labelScores);
textSoores=newJLabe1(String.valueOf(scores));textSoores.setFont(font);
textSoores.setBounds(290,5,150,30);
scoresPane.add(textScores);
mainPane=newJPanel0;
mainPane.setBounds(20,70,460,500);
this.getContentPane0.add(mainPane);
mainPane.setLayout(null);//设置空布用
texts=newJLabel[4][4];
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
texts[ilm=newJLabel0;
texts[ilm.setFont(font2);
//创建文本框二维数组//遍历数组
//创建t示签
texts[ilm.setHorizontalAlignment(SwingConstants.CENTER);texts[ilm.setText(-);
texts[ilm.setBounds(120*j,120*i,100,100);//设置方块
的大小位置
setColor(l,j,"”);
te),(ts[ilm.setOpaque(true);
texts[ilm.setBorder(BorderFactory.createMatteBorder(2,2,2,,2,Color.green));//设置方決边框颜色
mainPane.add(texts[ilm);
文本框放在
tips=newJLabel(Tips:
使用上、下、左、右键或者W、S、A、D键控
制H);
tips.setFont(font);
tips.setBounds(60,480,400,20)
mainPane.add(tips);
textMaxScores.addKeyListe:
ner(newKeyAdapter0{
高分标签添加接键监所器
publicvoidkeyPressed(KeyEvente)(
do_label_keyPressed(e);
}
});
//调用时同处理方法
Create20;
Create20;}
/t*
*接键输入事件的处理方法
@parame
*/
protectedvoiddo_label_keyPressed(fina]KeyEvente){
intcode=e.getKeyCode0;//获取接键代码
inta;
Stringstr;
Strirlgstr1;
intnum;
switch(oode)(caseKeyEvent.VK_LEFT:
caseKeyEvent.VK_A:
或者A键
for(inti=0;i<:
4;i++){
a=5;
//a的引入是为了防止上连加的情況出现
//如果按键代码是左方向键
for(intk=0;k<3;k++){
for(intj=1;j<4;j++){
str=texts[ilm.getTe)(t0;
//遍历16个方块//获取当前方块标签文
本字符
str1=texts[i][j-1].getText0;//获取当前左1方块
r(l00.」;Ca-一sal0
本示:
整文本字特
if(pareTo(…')==0){
//如果左1方块
文本为空字符
texts[i][]-1].setText(str);setColor(i,,j-1,str);
texts[ilm.setText("");
//字符左移
//当前方.映字符
a-1)){
setColor(i,j,川');
}elseif((pareTo(str1)==0)&&0l=a)&&(j!
=
//如果当前方映和左1方块文本字fii:
相等
num=lnteger.parselnt(str);
scores+=num;
timeS十十;
str=String.valueOf(2num);
texts[i][]-1].setText(str);
setColor(i,,j-1,str);
texts[ilm.setTe)(t("”);
//当前方」央字符
l1=1;
Create20;break;
//用-]-'一判断游戏是否失败
caseKeyEvent.VK_RIGHT:
caseKeyEvent.VK_D:
for(inti=0;i<4;i++){
a=5;
for(intk,0;k<3;k++){
for(intj=2;j>=0;j--){
str=texts[ilm.getTe)(t0;
str1=texts[i][j+1].getText0;
if(pareTo(…')==0){
texts[i][j+1].setText(str);
setC0lor(i,j十1,str);
texts[i][n.setText(…');
setColor(i,j,川');
}
elself(pareTo(str1)==0&&j!
=a&&j!
=a+1){
num=lnteger.parselnt(str);
scores+=num;
timeS++;
str=String.valueOf(2num);
texts[i]l]+1].setText(str);
setC0lor(i,j十1,str);
texts[i]l]l.setTe)(t(…');
setColor(i,j,'');
a=j;
}
}
}
}
l2=1;
Create20;
break;
caseKeyEvent.VK_llP:
caseKeyEvent.VK_W:
for(intj=0;j<4;j十十){
a=5;
for(intk=0;k<3;k++){
for(inti=1;i<4;i++){
str=texts[ilm.getText0;
str1=texts[i-1]m.getTe)(t0;
if(pareTo(…')==0){
texts[i-1]m.setText(str);
setColor(i-1,j,str);
texts[i][jl.setTe)(t(…');
setColor(i,j,「);
}
elseif(pareTo(str1)==0&&i!
=a&&i!
=a-1){
num=lnteger.parselnt(str);
scores+=num;
times十十;
str=String.valueO,f(2num);
texts[i-1]m.setText(str);
setColor(i-1,j,str);
texts[i][jl.setTe)(t(…');
setColor(i,j,-');
a=i;
}
}
}
}
l3=1;
Create20;
break;
caseKeyEvent.VK_DOWN:
caseKeyEvent.VK_S:
for(intj=0;j<:
4;j十十)(
a=5;
for(intk=0;k<:
5;k++){
for(inti=2;i>=0;i--){
str=texts[ilm.getTe)(t0;
str1=texts[i+1]m.getText0;
if(pareTo("")==0){
te)(ts[i+1]m.setText(str);
setC0lor(i+1,j,str);
te)(ts[i][n.setText(-');
setColor(i,j,'');
}
elseif(pareTo(str1)==0&&i!
=a&&il=a+1){
num,lnteger.parselnt(str);
scores+=num;
timeS++;
str=String.valueOf(2num);
texts[i+1]m.setText(str);
setC0lor(i+1,j,str);
texts[i][n.setText("”);
setColor(i,j,…');
a=i;
}
}
}
}
l4=1;
Create20;
break;
default:
break;
}
textScores.setTe)(t(String.valueOf(soores));
在随机位皆产生一个2',1,方」ji的方法(fp'pa1-al1i,j
/
publicvoidCreate20{
inti,j;
booleanr=false;Stringstr;
if(times:
>0){
while(!
r){
i=random.ne)(tlnt(4);
j=random.ne)(tlnt(4);
str=texts[ilm.getText0;
if((pareTo("”)==0)){
texts[ilm.setlcon(icon2);
texts[ilm.setText(''2”);
setColor(i,j,"2");
times--;
r=true;
l1=i2=13=l4=0;
}
}
}
elseif(l1>0&&l2>0&&l3>0&&l4>0){//l1到l4同时被键盘賦值
为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText("GAMEOVER!
);
/tt
*设置标签颜色@parami,j,str*/
publicvoidsetCo1or(inti,intj,Stringstr){
if(str=="2")
te)(ts[ilm.setBackground(Color.yellow);
elseif(str=="4")
texts[ilm.setBackground(Color.red);
elseif(str==”8")
texts[ilm.setBackground(Color.plnk);
elseif(str=="16”)
texts[ilm.setBackground(Color.orange);
elseif(str=="32")
texts[ilm.setBackground(Color.magenta);
elseif(str=="64")
texts[ilm.setBackground(Color.LIGHT_GRAY);elseif(str=="128”)
texts[ilm.setBackground(Color.green);
elseif(str=="256”)
texts[i]m.setBackground(Color.gray);
elseif(str=="512”)
texts[ilm.setBackground(Color.DARK_GRAY);elseif(str=="1024'')
texts[i]m.setBackground(Color.cyan);
elseif(str=="2048'')
texts[ilm.setEiackground(Color.blue);
elseif(str=="4096'')
texts[i]m.setEiackground(Color.white);
}
(七)游戏测试截图
(八)游戏测试
1.测试的意义
游戏测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。
测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。
游戏测试是保证系统质量和可靠性的关键步骤,是对游戏开发过程中的系统分析游戏设计和实施的最后复查。
2.测试过程
(1)拟定测试计划。
根据游戏的总体情况,仔细分析游戏各个步骤的运行可能出现的状况,对各种情况进行汇总,然后拟定出一份具体测试步骤。
(2)初步测试。
根据拟定好的计划进行游戏调试,出现意外情况时及时记录。
测试完后对所记录的意外情况进行分析,然后提出改进的方案,再进行修改。
(3)深度测试。
对游戏进行最后的修改确认没有漏洞后再进行测试,从各个方面进行一次整体的排查,知道不再出现意料之外的情况。
(4)测试人员。
测试初级阶段主要由游戏主要编程员进行测试,以便能够全面的进行一次错误排查。
然后由不同的玩家进行测试,集众人之益,能够从不同的角度发现问题,以便更好地改进。
3.测试内容
(1)初始界面
打开游戏后,会弹出初始界面,显示按回车键退出此界面
(2)帮助界面
按回车后,进入正式游戏界面,可以使用F1键打开帮助,这时会弹出小对话框,提示各按键相应功能。
再次按回车键可以退出。
(3)正式游戏界面
每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
不断的叠加最终拼凑出2048这个数字就算成功。
但此时游戏不会停止,会继续直到无路可走,当游戏结束时,会自动截图,并将成绩保存在文件夹内。
4.测试结果
程序运行正常,没有发现什么错误。