(假设有谁想要这个软件的话,在评论中留一个邮箱吧。)
上篇解说了我的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); }