前言
大一学期末的时候,用Winform做过一个2048👉传送门,移动时没有动画,游戏界面还算美观,但核心逻辑嘛,嘿嘿
最近工作不忙,闲来无事,打算重构一个带动画的。
鲁迅说过,生命在于折腾,废话不多说,开搞!
构思一下
框框先搭起来,后面再实现。
将一局游戏简单抽象为一个类
class G2048
,所有逻辑在这个类里实现。
属性
用一个二维数组来存储基本的信息
int[,] Map
- 后续要加上动画效果,所以加一个移动路径的字典
Dictionary<Point,Point>
,用来存储每一步操作后产生变化的坐标,key中存原始坐标,value中存移动后坐标。 - 两种方案:①直接设为属性,每次操作后更新。②在每一步操作时返回一个路径字典。
- 第二种看起来合理一些,但我选择第一种,是的,这就是任性。
/// <summary>
/// 存储每个方块内容
/// </summary>
public int[,] Map { get; private set; }
/// <summary>
/// Log,用来存储一步操作后每个方块的变化
/// </summary>
public Dictionary<Point, Point> Moved = new Dictionary<Point, Point>();
/// <summary>
/// 行数
/// </summary>
public int Row { get; private set; }
/// <summary>
/// 列数
/// </summary>
public int Colum { get; private set; }
/// <summary>
/// 得分
/// </summary>
public int Score { get; set; }
/// <summary>
/// 步数
/// </summary>
public int StepNum { get; set; }
/// <summary>
/// 新增加的方块坐标
/// </summary>
public Point LastBlockPoint { get; private set; }
/// <summary>
/// 目前Map中不为0的方块数量
/// </summary>
private int blockCount = 0;
构造函数
不局限于4*4的棋盘,添加一个带参的构造函数来定义棋盘
public G2048()
{
Row = 4;
Colum = 4;
Map = new int[4, 4];
this.newBlock();
}
public G2048(int i, int j)
{
Row = i;
Colum = j;
Map = new int[i, j];
this.newBlock();
}
枚举
移动方向弄个枚举,让代码看起来舒服一些
public enum Direction
{
Up = 1,
Down = 2,
Left = 3,
Right = 4
}
方法的定义
/// <summary>
/// 生成一个新的方块
/// </summary>
private void newBlock()
/// <summary>
/// 向某个方向移动
/// </summary>
/// <param name="direction"></param>
/// <returns>是否是有效的操作(游戏是否产生了变化)</returns>
public bool Operate(Direction direction)
/// <summary>
/// 一行或一列坐标的移动
/// </summary>
/// <param name="points"></param>
private void singleMove(Point[] points)
/// <summary>
/// 是否GameOver
/// </summary>
/// <returns>res</returns>
private bool isGameOver()
/// <summary>
/// 打印游戏
/// </summary>
/// <returns>格式化字符串</returns>
public override string ToString()
{
string res = "";
foreach (var v in Moved)
{
res+=v.Key.ToString() + "-->" + v.Value.ToString()+"\n";
}
res += "blockCount:" + blockCount + "\t" +"newBlockPoint:"+ LastBlockPoint.ToString()+"\n";
res += "StepNum:"+StepNum+"\t"+"Score:" + Score + "\n";
res += "isGameOver:" + isGameOver() + "\n";
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Colum; j++)
{
res += Map[i, j] + "\t";
}
res += "\n";
}
return res;
}
委托
加个游戏结束的委托
public delegate void GameOverDelegate();
/// <summary>
/// 委托 游戏结束后
/// </summary>
public GameOverDelegate GameOvered;
具体实现
经过了上面的梳理,发现基本上已经完成了嘛,只需要稍稍补充一下细节,嘿嘿嘿
听说PDD又开直播了?!
溜了溜了,改日吧。