2048java课程设计报告_软件工程——Java版2048游戏学习报告
2048游戲?qū)W習(xí)報(bào)告
姓名:王浩
專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)
年級(jí):15級(jí)4班
學(xué)號(hào):201510411420
目錄
一. 前言 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3
二. 對(duì)游戲的簡(jiǎn)要分析 ? ? ? ? ? ? ? ? ? ? ? ?3
1. 游戲的定位分析 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3
2. 游戲的構(gòu)造分析及對(duì)應(yīng)代碼 ? ? ? ? ? ?3
3.游戲操作分析及其代碼 5
3游戲結(jié)束及代碼 12
三. 運(yùn)行結(jié)果 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?13
五.自我總結(jié)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?13
一.?前言
這學(xué)期開設(shè)了軟件工程這門課程,但是由于自己的能力有限,未能在團(tuán)隊(duì)項(xiàng)目中做出足夠的貢獻(xiàn),于是上網(wǎng)找了一個(gè)2048代碼,對(duì)其進(jìn)行分析、解讀、學(xué)習(xí)。因?yàn)楸救藢?duì)2048游戲還是比較喜歡的,所以選擇了該游戲作為本次學(xué)習(xí)報(bào)告的學(xué)習(xí)對(duì)象。
二.?對(duì)游戲的簡(jiǎn)要分析
1.?游戲的定位分析
2048游戲是一款主要應(yīng)用在移動(dòng)端的游戲,所以需要提高游戲的操作可行性,降低游戲的操作難度,降低游戲的上手難度,對(duì)使用設(shè)備的要求趨于簡(jiǎn)單化和多樣化,游戲界面更加人性化,功能更加貼合使用。
2.?游戲的構(gòu)造分析及對(duì)應(yīng)代碼
首先要設(shè)置標(biāo)題——“2048”、窗口的大小以及窗口的起始位置,然后設(shè)定背景的顏色、label字體。詳細(xì)代碼如下:
import?javax.swing.*;
import?java.awt.*;
public?class?Block extends?JLabel
{
private?int?value;
public?Block()
{
value = 0;//初始化值為0
setFont(new?Font("font", Font.PLAIN, 40));//設(shè)定字體
setBackground(Color.gray);//設(shè)定初始顏色為灰色
}
public?int?getValue()//獲取值
{
return?value;
}
public?void?setValue(int?value)
{
this.value = value;
String text = String.valueOf(value);
if?(value != 0)
setText(text);
else
setText("");//如果值為0則不顯示
setColor();
}
public?void?setColor()//根據(jù)值的不同設(shè)定不同的背景顏色、label字體
{
switch?(value)
{
case?0:
setBackground(Color.gray);
break;
case?2:
setBackground(new?Color(238, 228, 218));
break;
case?4:
setBackground(new?Color(238, 224, 198));
break;
case?8:
setBackground(new?Color(243, 177, 116));
break;
case?16:
setBackground(new?Color(243, 177, 116));
break;
case?32:
setBackground(new?Color(248, 149, 90));
break;
case?64:
setBackground(new?Color(249, 94, 50));
break;
case?128:
setBackground(new?Color(239, 207, 108));
break;
case?256:
setBackground(new?Color(239, 207, 99));
break;
case?512:
setBackground(new?Color(239, 203, 82));
break;
case?1024:
setBackground(new?Color(239, 199, 57));
break;
case?2048:
setBackground(new?Color(239, 195, 41));
break;
case?4096:
setBackground(new?Color(255, 60, 57));
break;
}
}
}
3.游戲操作分析及其代碼
基本的操作包括上下左右四個(gè)方向的移動(dòng),移動(dòng)之后進(jìn)行判斷,若是相同的分?jǐn)?shù)塊則分?jǐn)?shù)相加生成新的分?jǐn)?shù)塊,若不同則該操作無(wú)效,不發(fā)生改變。詳細(xì)代碼如下:
import?java.awt.event.*;
import?javax.swing.*;
public?class?Operation implements?KeyListener
{
Block[] block;//用于儲(chǔ)存16個(gè)數(shù)據(jù)
JPanel panel;
public?boolean?up,down,left,right;
int?moveFlag;//用于累計(jì)移動(dòng)的次數(shù)
boolean?numFlag;//用于判斷是否還能加入新的數(shù)字
public?Operation(JFrame frame)
{
this.panel = (JPanel)frame.getContentPane();//構(gòu)造出panel
block = new?Block[16];//構(gòu)造出長(zhǎng)度為16的數(shù)組
numFlag = true;//初始化
moveFlag = 0;
up=true;down=true;left=true;right=true;
addBlock();
for?(int?i = 0; i < 2; i++)
appearBlock();
frame.addKeyListener(this);
}
private?void?addBlock()
{
for?(int?i = 0; i < 16; i++) //往panel里加入block
{
block[i] = new?Block();
block[i].setHorizontalAlignment(JLabel.CENTER);// 不透明的標(biāo)簽
block[i].setOpaque(true);
panel.add(block[i]);
}
}
public?void?appearBlock()
{
while?(numFlag) //當(dāng)還能加入隨機(jī)的一個(gè)新的值得時(shí)候
{
int?index = (int) (Math.random() * 16);//取一個(gè)0到15的隨機(jī)整數(shù),這個(gè)數(shù)作為隨機(jī)加入盤中的2或4的位置
if?(block[index].getValue() == 0)//如果這個(gè)數(shù)所在的block數(shù)組中值為0,即在為空的時(shí)候,加入一個(gè)2或4的數(shù)字
{
if?(Math.random() < 0.5)
{
block[index].setValue(2);
}
else
{
block[index].setValue(4);
}
break;//跳出while
}
}
}
public?void?judgeAppear() //統(tǒng)計(jì)block數(shù)組中是否含有值為0的元素,若沒有,則numFlag變?yōu)閒alse
{
int?sum = 0;
for?(int?i = 0; i < 16; i++)
{
if?(block[i].getValue() != 0)
{
sum++;
}
}
if?(sum == 16)
numFlag = false;
}
public?int?Find(int?i,int?j,int?a,int?b)
{
while(i=a)
{
if(block[i].getValue()!=0)
{
return?i;
}
i=i+j;
}
return?-1;
}
public?void?upBlock()
{
int?i=0,j=0;int?t=0;int?valueJ=0;int?valueI=0;int?index=0;
for(i=0;i<4;i++)
{
index=i;
for(j=i+4;j<16;j+=4)
{
valueJ=0; valueI=0;
if(block[index].getValue()==0)
{
t=Find(index,4,0,16);
if(t!=-1)
{
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0)
{
t=Find(j,4,0,16);
if(t!=-1)
{
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0)
{
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public?void?downBlock() {
int?i=0,j=0;int?t=0;int?valueJ=0;int?valueI=0;int?index=0;
for(i=12;i<16;i++)
{
index=i;
for(j=i-4;j>=0;j-=4)
{
valueJ=0; valueI=0;
if(block[index].getValue()==0)
{
t=Find(index,-4,0,16);
if(t!=-1)
{
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0)
{
t=Find(j,-4,0,16);
if(t!=-1)
{
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0)
{
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public?void?rightBlock()
{
int?i=0,j=0;int?t=0;int?valueJ=0;int?valueI=0;int?index=0;
for(i=3;i<16;i+=4)
{
index=i;
for(j=i-1;j>i-4;j--)
{
valueJ=0; valueI=0;
if(block[index].getValue()==0)
{
t=Find(index,-1,i-3,index+1);
if(t!=-1)
{
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0)
{
t=Find(j,-1,i-3,j+1);
if(t!=-1)
{
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0)
{
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public?void?leftBlock()
{
int?i=0,j=0;int?t=0;int?valueJ=0;int?valueI=0;int?index=0;
for(i=0;i<16;i+=4)
{
index=i;
for(j=i+1;j
{
valueJ=0; valueI=0;
if(block[index].getValue()==0)
{
t=Find(index,1,index,i+4);
if(t!=-1)
{
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0)
{
t=Find(j,1,j,i+4);
if(t!=-1)
{
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else
{
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0)
{
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
}
3游戲結(jié)束及代碼
當(dāng)窗口被填滿且無(wú)下一步操作可以進(jìn)行時(shí),游戲結(jié)束并顯示“GAMEOVER”。詳細(xì)代碼如下:
public?void?over()
{
if?(numFlag ==false&& up==false&&down==false&&left==false&&right==false) //當(dāng)不能添加元素,并且不可移動(dòng)的步數(shù)超過(guò)36就輸了,輸了的時(shí)候在盤中央顯示GAMEOVER
{
block[4].setText("G");
block[5].setText("A");
block[6].setText("M");
block[7].setText("E");
block[8].setText("O");
block[9].setText("V");
block[10].setText("E");
block[11].setText("R");
block[11].addMouseListener(new?MouseAdapter() {public?void?mousePressed(MouseEvent e){reStart();}});
}
}
三.?運(yùn)行結(jié)果
五.自我總結(jié)
通過(guò)本次對(duì)2048游戲分析、學(xué)習(xí)收獲了很多。比如在學(xué)習(xí)新知識(shí)之前首先要明確自己的興趣所在,然后進(jìn)行相關(guān)的學(xué)習(xí),在學(xué)習(xí)的過(guò)程中要制定相應(yīng)的學(xué)習(xí)計(jì)劃。制定學(xué)習(xí)計(jì)劃的時(shí)候要切合自身實(shí)際,每天按照學(xué)習(xí)計(jì)劃嚴(yán)格要求自己。要多利用網(wǎng)絡(luò)解決遇到的問(wèn)題,對(duì)每天遇到的問(wèn)題進(jìn)行記錄總結(jié),定期對(duì)這些記錄進(jìn)行回看、學(xué)習(xí),確保自己掌握這些知識(shí)。學(xué)習(xí)結(jié)束之后要進(jìn)行相對(duì)應(yīng)的編程,以便進(jìn)一步掌握所學(xué)知識(shí)。
總結(jié)
以上是生活随笔為你收集整理的2048java课程设计报告_软件工程——Java版2048游戏学习报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql和ORTHOMCL_Ortho
- 下一篇: java逻辑编程题_用Java编程解决一