軟件工程——Java版2048遊戲學習報告
2048遊戲學習報告
姓名:王浩
專業:計算機科學與技術
年級:15級4班
學號:201510411420
目錄
一. 前言 3
二. 對遊戲的簡要分析 3
1. 遊戲的定位分析 3
2. 遊戲的構造分析及對應代碼 3
3.遊戲操作分析及其代碼 5
3遊戲結束及代碼 12
三. 運行結果 13
五.自我總結 13
一. 前言
這學期開設了軟件工程這門課程,但是由於自己的能力有限,未能在團隊項目中做出足夠的貢獻,於是上網找了一個2048代碼,對其進行分析、解讀、學習。因為本人對2048遊戲還是比較喜歡的,所以選擇了該遊戲作為本次學習報告的學習對象。
二. 對遊戲的簡要分析
1. 遊戲的定位分析
2048遊戲是一款主要應用在移動端的遊戲,所以需要提高遊戲的操作可行性,降低遊戲的操作難度,降低遊戲的上手難度,對使用設備的要求趨於簡單化和多樣化,遊戲界面更加人性化,功能更加貼合使用。
2. 遊戲的構造分析及對應代碼
首先要設置標題
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));//設定字體
setBackground(Color.gray);//設定初始顏色為灰色
}
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()//根據值的不同設定不同的背景顏色、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.遊戲操作分析及其代碼
基本的操作包括上下左右四個方向的移動,移動之後進行判斷,若是相同的分數塊則分數相加生成新的分數塊,若不同則該操作無效,不發生改變。詳細代碼如下:
import java.awt.event.*;
import javax.swing.*;
public class Operation implements KeyListener
{
Block[] block;//用於儲存16個數據
JPanel panel;
public boolean up,down,left,right;
int moveFlag;//用於累計移動的次數
boolean numFlag;//用於判斷是否還能加入新的數字
public Operation(JFrame frame)
{
this.panel = (JPanel)frame.getContentPane();//構造出panel
block = new Block[16];//構造出長度為16的數組
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);// 不透明的標簽
block[i].setOpaque(true);
panel.add(block[i]);
}
}
public void appearBlock()
{
while (numFlag) //當還能加入隨機的一個新的值得時候
{
int index = (int) (Math.random() * 16);//取一個0到15的隨機整數,這個數作為隨機加入盤中的2或4的位置
if (block[index].getValue() == 0)//如果這個數所在的block數組中值為0,即在為空的時候,加入一個2或4的數字
{
if (Math.random() < 0.5)
{
block[index].setValue(2);
}
else
{
block[index].setValue(4);
}
break;//跳出while
}
}
}
public void judgeAppear() //統計block數組中是否含有值為0的元素,若沒有,則numFlag變為false
{
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<b&&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<i+4;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遊戲結束及代碼
當窗口被填滿且無下一步操作可以進行時,遊戲結束並顯示“GAMEOVER”。詳細代碼如下:
public void over()
{
if (numFlag ==false&& up==false&&down==false&&left==false&&right==false) //當不能添加元素,並且不可移動的步數超過36就輸了,輸了的時候在盤中央顯示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();}});
}
}
三. 運行結果
五.自我總結
通過本次對2048遊戲分析、學習收獲了很多。比如在學習新知識之前首先要明確自己的興趣所在,然後進行相關的學習,在學習的過程中要制定相應的學習計劃。制定學習計劃的時候要切合自身實際,每天按照學習計劃嚴格要求自己。要多利用網絡解決遇到的問題,對每天遇到的問題進行記錄總結,定期對這些記錄進行回看、學習,確保自己掌握這些知識。學習結束之後要進行相對應的編程,以便進一步掌握所學知識。
軟件工程——Java版2048遊戲學習報告