最近2048非常热门,所以我用C#在移动端自己做了一个wp的2048来玩玩一下。
2048其实是一个很简单的小游戏,在实现过程中主要是要实现移动整合。唯一的难点就是怎么判断移动一下然后整合。我采取的是逐个判断然后逐行判断的形式。代码如下:
private void OneMove(MoveDict dict)
{
bool needGetNext1 = false, needGetNext2 = false, needGetNext3 = false, needGetNext4 = false;
switch (dict)
{
case MoveDict.Up:
score += MoveLine(textblocks[13], textblocks[9], textblocks[5], textblocks[1], out needGetNext1) + MoveLine(textblocks[14], textblocks[10], textblocks[6], textblocks[2], out needGetNext2) + MoveLine(textblocks[15], textblocks[11], textblocks[7], textblocks[3], out needGetNext3) + MoveLine(textblocks[16], textblocks[12], textblocks[8], textblocks[4], out needGetNext4);
break;
case MoveDict.Down:
score += MoveLine(textblocks[1], textblocks[5], textblocks[9], textblocks[13], out needGetNext1) + MoveLine(textblocks[2], textblocks[6], textblocks[10], textblocks[14], out needGetNext2) + MoveLine(textblocks[3], textblocks[7], textblocks[11], textblocks[15], out needGetNext3) + MoveLine(textblocks[4], textblocks[8], textblocks[12], textblocks[16], out needGetNext4);
break;
case MoveDict.Right:
score += MoveLine(textblocks[1], textblocks[2], textblocks[3], textblocks[4], out needGetNext1) + MoveLine(textblocks[5], textblocks[6], textblocks[7], textblocks[8], out needGetNext2) + MoveLine(textblocks[9], textblocks[10], textblocks[11], textblocks[12], out needGetNext3) + MoveLine(textblocks[13], textblocks[14], textblocks[15], textblocks[16], out needGetNext4);
break;
case MoveDict.Left:
score += MoveLine(textblocks[4], textblocks[3], textblocks[2], textblocks[1], out needGetNext1) + MoveLine(textblocks[8], textblocks[7], textblocks[6], textblocks[5], out needGetNext2) + MoveLine(textblocks[12], textblocks[11], textblocks[10], textblocks[9], out needGetNext3) + MoveLine(textblocks[16], textblocks[15], textblocks[14], textblocks[13], out needGetNext4);
break;
}
textBlock_Score.Text = score.ToString(); //显示总分
if (needGetNext1 || needGetNext2 || needGetNext3 || needGetNext4)
{
getNext();//取下一个方块
}
else
{
if (!CanMove())
{
MessageBox.Show("Game Over!");
}
}
}
private int MoveLine(TextBlock t1, TextBlock t2, TextBlock t3, TextBlock t4, out bool canGetCube)
{
canGetCube = false;
int score1 = 0;
if (t1.Text.Equals("") && t2.Text.Equals("") && t3.Text.Equals("") && t4.Text.Equals(""))
return 0;
if ((t4.Text.Equals("") && (!t1.Text.Equals("") || !t2.Text.Equals("") || !t3.Text.Equals(""))) ||
(t3.Text.Equals("") && (!t1.Text.Equals("") ||!t2.Text.Equals(""))) ||
(t2.Text.Equals("") && !t1.Text.Equals(""))
)
canGetCube = true;
TextBlock[] textb = { t1,t2,t3,t4 };
int[] num = new int[4];
for (int i = 0; i < 4; i++)
{
num[i] = 0;
}
for (int j = 0; j < 4; j++)
{
if (!textb[j].Text.Equals(""))
num[j] = Convert.ToInt32(textb[j].Text.ToString());
}
int[] over = new int[4];
int count = 0;
for (int i = 0; i < 4; i++)
over[i] = 0;//去除0之后的方块
for (int i = 0; i < 4; i++)
if (num[i] != 0)
{
over[count] = num[i];
count++;
}
for (int i = 0; i < 4 - count; i++)
textb[i].Text = "";
for (int i = 0; i < count; i++)
{
textb[i + textb.Length - count].Text = over[i].ToString();
}
//先移动
for (int i = 0; i < 4; i++)
{
num[i] = 0;
}
for (int j = 0; j < 4; j++)
{
if (!textb[j].Text.Equals(""))
num[j] = Convert.ToInt32(textb[j].Text.ToString());
}//将移动好的数冲洗排好
if (num[2] != 0)//如果等于0,说明该行只有一个非0的数,则不需要再移动和累加分值了。
{
if (num[3] == num[2])
{
score1 += 2 * num[2];
int a = 2 * num[3];
textb[3].Text =a.ToString();
canGetCube = true;
if (num[1] == num[0])
{
score1 += 2 * num[1];
int b = 2 * num[1];
if (b == 0)
{
textb[0].Text = "";
textb[1].Text = "";
textb[2].Text = "";
}
else
{
canGetCube = true;
textb[2].Text = b.ToString();
textb[1].Text = "";
textb[0].Text = "";
}
}
else
{
textb[2].Text = textb[1].Text;
textb[1].Text = textb[0].Text; ;
textb[0].Text = "";
}
}
else
{
if (num[2] == num[1])
{
score1 += 2 * num[2];
int c = 2 * num[2];
if (c == 0)
{
textb[2].Text = "";
textb[1].Text = "";
textb[0].Text = "";
}
else
{
textb[2].Text = c.ToString();
canGetCube = true;
textb[1].Text = textb[0].Text;
textb[0].Text = "";
}
}
else
{
if (num[1] == num[0])
{
score1 += 2 * num[1];
int d = 2 * num[1];
if (d == 0)
{
textb[1].Text = "";
textb[1].Text = "";
}
else
{
textb[1].Text = d.ToString();
canGetCube = true;
textb[0].Text = "";
}
}
}
}
}
return score1;
}
其实就是逐个判断然后处理。
最后效果如下: