1. 程式人生 > >我的改進版2048(2)

我的改進版2048(2)

void 必須 number 內存 font return nbsp water pan

技術分享

假設有誰想要這個軟件的話,在評論中留一個郵箱吧。)

上篇解說了我的2048的基本設計過程。

一開始的時候初始化,隨機填上兩個數字。

每次按方向鍵。16個方格就隨之改變,每次疊加同樣數字,分數就會添加;疊加的同樣數字越大,分數越大。分數會實時刷新。

最後另一個問題,就是怎麽推斷是否game over。事實上也是比較簡單,略微想想就知道。首先推斷16個方格是否已滿,如不滿,則肯定不會game over。否則,推斷不論什麽相鄰的兩個數字是否都不一樣,如是,則game over!

假設16個方格都已滿。就進行一下函數的推斷

public bool canContinue()//推斷是否還可以繼續完下去
        {
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    if (j + 1 < 4 && matrixValue[i, j] == matrixValue[i, j + 1])
                        return true;
                    if (i + 1 < 4 && matrixValue[i + 1, j] == matrixValue[i, j])
                        return true;
                }
            }
            return false;
        }

接下來說說怎麽實現的存檔、讀檔和後退一步功能。

由於要存儲數據,所以程序中用xml文件來存全部信息。

每個存檔的存儲格式例如以下:

<?xml version="1.0" encoding="utf-8"?

> <store> <record> <name>zwb4096new</name> <matrix>4096 2048 256 32 16 128 32 4 2 4 8 0 4 2 2 0</matrix> <score>33616</score> </record> </store>

一個全局變量存儲全部存檔信息:

public List<storeRecord> dataStoreRecord = new List<storeRecord>();//存儲全部存檔
從文件裏獲取全部存檔信息:

public void refreshDataStoreRecord()//從文件裏又一次獲取存檔信息
        {
            string storePath = System.Environment.CurrentDirectory + "\\record\\" + "store.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(storePath);
            XmlNodeList nodes = doc.SelectNodes("/store/record");
            listBox1.Items.Clear();
            dataStoreRecord.Clear();
            listBox2.Items.Clear();
            for (int i = 0; i < nodes.Count; i++)
            {
                storeRecord insert = new storeRecord();
                string name = nodes[i].ChildNodes[0].InnerText;//第一個結點名字
                string matrix = nodes[i].ChildNodes[1].InnerText;//第二個結點矩陣
                string score = nodes[i].ChildNodes[2].InnerText;//第三個結點分數
                insert.recordName = name;
                insert.recordScore = score;
                string[] numbers = matrix.Split(‘ ‘);
                for (int j = 0; j < numbers.Length; j++)
                {
                    insert.recordMatrix[j / 4, j % 4] = Convert.ToInt32(numbers[j]);
                }
                dataStoreRecord.Add(insert);
                listBox1.Items.Add(name);
                listBox2.Items.Add(name + "(Enter刪除)");
            }
        }
最後“後退一步”的功能。是通過用一個變量history存儲前十步的矩陣狀態來實現的。如果如果要實現無限制地後退,那就必須將全部經過的狀態壓入棧,每次後退就另棧頂出棧。可是考慮這樣占用了太多的內存空間,所以我限制了棧的大小,也就是最多能存10個值。

public List<int[,]> history = new List<int[,]>();//存近期10步操作

最多存十個記錄:

if (history.Count < 10)//最多存10個狀態
                {
                    history.Add(previous);
                }
                else
                {
                    history.RemoveAt(0);
                    history.Add(previous);
                }





我的改進版2048(2)