軟件工程——Java版2048游戲學習報告


2048游戲學習報告

 

 

 

 

 

 

 

 

 

 

 

姓名:王浩

專業:計算機科學與技術

年級:15級4班

學號:201510411420

目錄

. 前言                                             3 

. 對游戲的簡要分析                        3

1. 游戲的定位分析                             3

2. 游戲的構造分析及對應代碼            3

3.游戲操作分析及其代碼        5

3游戲結束及代碼            12

. 運行結果                                      13

.自我總結                                       13

 

一. 前言

這學期開設了軟件工程這門課程,但是由於自己的能力有限,未能在團隊項目中做出足夠的貢獻,於是上網找了一個2048代碼,對其進行分析、解讀、學習。因為本人對2048游戲還是比較喜歡的,所以選擇了該游戲作為本次學習報告的學習對象。

二. 對游戲的簡要分析

1. 游戲的定位分析

2048游戲是一款主要應用在移動端的游戲,所以需要提高游戲的操作可行性,降低游戲的操作難度,降低游戲的上手難度,對使用設備的要求趨於簡單化和多樣化,游戲界面更加人性化,功能更加貼合使用。

2. 游戲的構造分析及對應代碼

首先要設置標題——“2048”、窗口的大小以及窗口的起始位置,然后設定背景的顏色、label字體。詳細代碼如下:

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游戲分析、學習收獲了很多。比如在學習新知識之前首先要明確自己的興趣所在,然后進行相關的學習,在學習的過程中要制定相應的學習計划。制定學習計划的時候要切合自身實際,每天按照學習計划嚴格要求自己。要多利用網絡解決遇到的問題,對每天遇到的問題進行記錄總結,定期對這些記錄進行回看、學習,確保自己掌握這些知識。學習結束之后要進行相對應的編程,以便進一步掌握所學知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM