要实现这个简单的小游戏主要在于实现一个方向移动
数字的移动及合并该如何处理
然后其它方向的逻辑是相同的
我做的这个基本功能实现了
主要分为三个类
Box.cs格子类(一些格子里保存的数据,行下标,列下标,是否合并过的开关。。)
Grid.cs网格类(主要算法在里面)
Manage2048.cs控制游戏类(控制游戏流程)
经过几次简单的右移,这是控制台实现的数字变化效果(左上角的4是随机产生的所以没向右靠)
代码供参考
Box.cs格子类
/// <summary>
/// 格子类
/// </summary>
class Box
{
//行下标
private int rowIndex;
//列下标
private int colsIndex;
public int RowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
//是否第一次合并
public bool isMerge = false;
public int ColsIndex
{
get
{
return colsIndex;
}
set
{
colsIndex = value;
}
}
//格子上的数字
public int Number { get; set; }
public Box(int row, int cols)
{
this.RowIndex = row;
this.ColsIndex = cols;
Number = 0;
}
}
Grid.cs网格类
/// <summary>
/// 网格类
/// </summary>
class Grid
{
int row = 0;//行
int clos = 0;//列
Box[,] boxes;
bool isEnableRandom = false;//是否还会产生随机数(默认不能)
int gridNum = 2;//格子上的随机数
bool isFirst = true; //是否是第一个
Queue<Box> boxisMerge;//队列存储合并过的数
Random ran;
public bool isGameover = false;//游戏是否结束
int total = 0;//计算格子的数
public Grid(int row, int clos)
{
this.row = row < 4 ? 4 : row;
this.clos = clos < 4 ? 4 : clos;
boxes = new Box[row, clos];
ran = new Random();
boxisMerge = new Queue<Box>();
}
/// <summary>
/// 初始化网格
/// </summary>
public void InitGrid()
{
for (int i = 0; i < boxes.GetLength(0); i++)
{
for (int j = 0; j < boxes.GetLength(1); j++)
{
boxes[i, j] = new Box(i, j);
}
}
this.RandomNum();
}
/// <summary>
/// 产生随机数
/// </summary>
public void RandomNum()
{
int count = 0;
//如果是第一个数 将随机出现两个数字
if (isFirst)
{
count = 2;
isFirst = false;
}
else
{
count = 1;
}
for (int i = 0; i < count;)
{
int r = ran.Next(0, row);
int c = ran.Next(0, clos);
//判断该格子上是否有数字了
if (boxes[r, c].Number != 0) continue;
//随机到4 那么下次必然出现2
if (gridNum == 4)
{
gridNum = 2;
}
else if (gridNum == 2)
{
//如果随机数是2 那么下次随机到2的概率为80%,随机到4的概率为20%
int num = ran.Next(0, 10);
if (num < 8)
{
gridNum = 2;
}
else
{
gridNum = 4;
}
}
boxes[r, c].Number = gridNum;//将随机数放在随机格子上
i++;
}
total += count;
}
/// <summary>
/// 控制向右移动
/// </summary>
public void MoveRight()
{
for (var i = 0; i < boxes.GetLength(0); i++)
{
for (var j = 0; j < boxes.GetLength(1); j++)
{
//一旦发现不为0的数
if (boxes[i, j].Number != 0)
{
//从右往左遍历到该数前一个
for (var k = boxes.GetLength(1) - 1; k > j; k--)
{
//如果最右边的数不等于0 && 最右边的数和最右边-1的数相等 说明可以合并
if (boxes[i, k].Number != 0 && boxes[i, k].Number == boxes[i, k - 1].Number && !boxes[i, k].isMerge && !boxes[i, k - 1].isMerge)
{
boxes[i, k].Number *= 2;
boxes[i, k - 1].Number = 0;
boxes[i, k].isMerge = true;
isEnableRandom = true;//如果产生合并就能产生随机数
boxisMerge.Enqueue(boxes[i, k]);//把合并过数的存入队列
total--;
}
//如果最右边的数等于0 && 最右边-1的数不为0 (向右移动)
if (boxes[i, k].Number == 0 && boxes[i, k - 1].Number != 0)
{
int temp = boxes[i, k - 1].Number;
boxes[i, k - 1].Number = boxes[i, k].Number;
boxes[i, k].Number = temp;
isEnableRandom = true;//如果移动就能产生随机数
}
}
}
}
}
this.ResetMegreList();//把所有数isMerge开关重置
EnableRandom();
}
/// <summary>
/// 控制向左移动
/// </summary>
public void MoveLeft()
{
for (var i = boxes.GetLength(0) - 1; i >= 0; i--)
{
for (var j = boxes.GetLength(1) - 1; j >= 0; j--)
{
if (boxes[i, j].Number != 0)
{
for (var k = 0; k < j; k++)
{
if (boxes[i, k].Number != 0 && boxes[i, k].Number == boxes[i, k + 1].Number && !boxes[i, k].isMerge && !boxes[i, k + 1].isMerge)
{
boxes[i, k].Number *= 2;
boxes[i, k + 1].Number = 0;
boxes[i, k].isMerge = true;
isEnableRandom = true;
boxisMerge.Enqueue(boxes[i, k]);//把合并过数的存入队列
total--;
}
if (boxes[i, k].Number == 0 && boxes[i, k + 1].Number != 0)
{
int temp = boxes[i, k + 1].Number;
boxes[i, k + 1].Number = boxes[i, k].Number;
boxes[i, k].Number = temp;
isEnableRandom = true;
}
}
}
}
}
this.ResetMegreList();//把所有数isMerge开关重置
EnableRandom();
}
/// <summary>
/// 控制向上移动
/// </summary>
public void MoveTop()
{
for (var j = boxes.GetLength(0) - 1; j >= 0; j--)
{
for (var i = boxes.GetLength(1) - 1; i >= 0; i--)
{
if (boxes[i, j].Number != 0)
{
for (var k = 0; k < i; k++)
{
if (boxes[k, j].Number != 0 && boxes[k, j].Number == boxes[k + 1, j].Number && !boxes[k, j].isMerge && !boxes[k + 1, j].isMerge)
{
boxes[k, j].Number *= 2;
boxes[k + 1, j].Number = 0;
boxes[k, j].isMerge = true;
isEnableRandom = true;
boxisMerge.Enqueue(boxes[k, j]);//把合并过数的存入队列
total--;
}
if (boxes[k, j].Number == 0 && boxes[k + 1, j].Number != 0)
{
int temp = boxes[k + 1, j].Number;
boxes[k + 1, j].Number = boxes[k, j].Number;
boxes[k, j].Number = temp;
isEnableRandom = true;
}
}
}
}
}
this.ResetMegreList();//把所有数isMerge开关重置
EnableRandom();
}
/// <summary>
/// 控制向下移动
/// </summary>
public void MoveDown()
{
for (var j = 0; j < boxes.GetLength(1); j++)
{
for (var i = 0; i < boxes.GetLength(0); i++)
{
if (boxes[i, j].Number != 0)
{
for (var k = boxes.GetLength(0) - 1; k > i; k--)
{
if (boxes[k, j].Number != 0 && boxes[k, j].Number == boxes[k - 1, j].Number && !boxes[k, j].isMerge && !boxes[k - 1, j].isMerge)
{
boxes[k, j].Number *= 2;
boxes[k - 1, j].Number = 0;
boxes[k, j].isMerge = true;
isEnableRandom = true;
boxisMerge.Enqueue(boxes[k, j]);//把合并过数的存入队列
total--;
}
if (boxes[k, j].Number == 0 && boxes[k - 1, j].Number != 0)
{
int temp = boxes[k - 1, j].Number;
boxes[k - 1, j].Number = boxes[k, j].Number;
boxes[k, j].Number = temp;
isEnableRandom = true;
}
}
}
}
}
this.ResetMegreList();//把所有数isMerge开关重置
EnableRandom();
}
/// <summary>
/// /把所有格子里的数isMerge开关重置
/// </summary>
public void ResetMegreList()
{
while (boxisMerge.Count > 0)
{
boxisMerge.Dequeue().isMerge = false;
}
}
/// <summary>
/// 判断是否还能移动
/// </summary>
public void EnableRandom()
{
//如果能移动和合并就产生随机数
if (isEnableRandom)
{
this.RandomNum();
}
else
{
Console.WriteLine("不能再向这个方向移动了");
}
//重置开关
isEnableRandom = false;
}
/// <summary>
/// 检查游戏是否结束
/// </summary>
public void CheckGanmeisOver()
{
if (total < row * clos)
{
isGameover = false;
return;
}
for (int i = 0; i < boxes.GetLength(0); i++)
{
for (int j = 0; j < boxes.GetLength(1); j++)
{
//上下左右判断
if (i >= 1&&boxes[i, j].Number == boxes[i - 1, j].Number )
{
isGameover = false;
return;
}
if (i < boxes.GetLength(0)-1 && boxes[i, j].Number == boxes[i + 1, j].Number)
{
isGameover = false;
return;
}
if (j >= 1 && boxes[i, j].Number == boxes[i, j-1].Number)
{
isGameover = false;
return;
}
if (j < boxes.GetLength(1)-1 && boxes[i, j].Number == boxes[i, j+1].Number)
{
isGameover = false;
return;
}
}
}
isGameover = true;
}
public void Test()
{
Console.WriteLine("-----------");
for (int i = 0; i < boxes.GetLength(0); i++)
{
for (int j = 0; j < boxes.GetLength(1); j++)
{
Console.Write(boxes[i, j].Number + " ");
}
Console.WriteLine();
}
Console.WriteLine("-----------");
}
}
Manage2048.cs控制游戏类
/// <summary>
/// 管理类控制游戏
/// </summary>
class Manage2048
{
Grid g;
public Manage2048()
{
g = new Grid(4, 4);
}
public void StartGame()
{
g.InitGrid();
g.Test();
}
public void PlayGame()
{
while (!g.isGameover)
{
string op = Console.ReadLine();
switch (op)
{
case "w": g.MoveTop(); break;
case "s": g.MoveDown(); break;
case "a": g.MoveLeft(); break;
case "d": g.MoveRight(); break;
default: Console.WriteLine("输入错误"); break;
}
Console.Clear();
g.Test();
g.CheckGanmeisOver();
}
Console.WriteLine("Game Over!");
}
}