//类1
///游戏类核心算法,与平台无关
class GameCore
{
private int[,] map; //地图的字段
private int[] mergeArray; //合并数组
private int[] removeZeroArray; //用来进行移动的辅助数组
private int[,] originalMap; //原地图,用于比较移动后地图是否变化
public bool IsChange { get; set; } // 用于判断地图是否发生改变
private List<Location> emptyLOC;//用于统计空位置的List(长度可变数组)
private Random random; //用于生成随机位置和随机数
public int[,] Map //地图的属性
{
get { return map; }
}
public GameCore() //构造函数
{
map = new int[4, 4];
mergeArray = new int[map.GetLength(0)];
removeZeroArray = new int[4];
emptyLOC = new List<Location>(16);
random = new Random();
originalMap = new int[4, 4];
}
private void RemovwZero() //把零调整到后边,非零数按顺序调整到左边
{
Array.Clear(removeZeroArray, 0, 4);
int index = 0;
for (int i = 0; i < mergeArray.Length; i++)
{
if (mergeArray[i] != 0)
removeZeroArray[index++] = mergeArray[i];
}
removeZeroArray.CopyTo(mergeArray, 0);
}
private void Merge() //合并,即相同的数字相加
{
RemovwZero();
for(int i=0;i<mergeArray.Length-1;i++)
{
if(mergeArray[i]!=0&&mergeArray[i+1]==mergeArray[i])
{
mergeArray[i] += mergeArray[i + 1];
mergeArray[i + 1] = 0;
//加分
}
}
RemovwZero();//把0全部移到右边
}
//上移,下移,左移,右移
private void MoveUp()
{
for(int c=0;c<map.GetLength(1);c++)
{
for(int r=0;r<map.GetLength(0);r++)
mergeArray[r] = map[r, c];
Merge();
for (int r = 0; r < map.GetLength(0); r++)
map[r, c] = mergeArray[r];
}
}
private void MoveDown()
{
for(int c=0;c<map.GetLength (1);c++)
{
for (int r = map.GetLength(0) - 1; r >= 0; r--)
mergeArray[3 - r] = map[r, c];
Merge();
for (int r = map.GetLength(0) - 1; r >= 0; r--)
map[r, c] = mergeArray[3 - r];
}
}
private void MoveLeft()
{
for(int r=0;r<4;r++)
{
for (int c = 0; c < 4; c++)
mergeArray[c] = map[r, c];
Merge();
for (int c = 0; c < 4; c++)
map[r, c] = mergeArray[c];
}
}
private void MoveRight()
{
for(int r=0;r<4;r++)
{
for (int c = 3; c >= 0; c--)
mergeArray[3-c] = map[r, c];
Merge();
for(int c=3;c>=0;c--)
{
map[r, c] = mergeArray[3 - c];
}
}
}
//将移动的调用简化的函数
public void Move(MoveDirection direction)
{
Array.Copy(map, originalMap, map.Length);
IsChange = false;
switch(direction)
{
case MoveDirection.Up: MoveUp();break;
case MoveDirection.Down: MoveDown(); break;
case MoveDirection.Left: MoveLeft(); break;
case MoveDirection.Right: MoveRight(); break;
}
//移动后对比
CheckMapChange();
}
private void CheckMapChange()
{
for(int r=0;r<map.GetLength(0);r++)
{
for(int c=0;c<map.GetLength(1);c ++)
{
if(map[r,c]!=originalMap[r,c])
{
IsChange = true;
return;
}
}
}
}
// 找出空位置
public void GetEmpty()
{
emptyLOC.Clear();
for(int r=0;r<map.GetLength(0);r++)
{
for(int c=0;c<map.GetLength(1);c++)
{
if (map[r, c] == 0)
emptyLOC.Add(new Location(r, c));
}
}
}
// 在空白位置上, 随机生成数字(2 (90%) 4(10%))
public void GenerateNumber()
{
GetEmpty();
int emptyLocIndex = random.Next(1, emptyLOC.Count);
Location loc = emptyLOC[emptyLocIndex];
map[loc.RIndex, loc.CIndex] = random.Next(1, 11) == 1 ? 4 : 2;
emptyLOC.RemoveAt(emptyLocIndex);
}
// 判断游戏是否结束
public bool IsOver()
{//既没有空位置,又不能合并
if (emptyLOC.Count > 0) return false;
for(int r=0;r<4;r++)
for(int c=0;c<3;c++)
{
if (map[r,c]==map[r,c+1]||map[c,r]==map[c+1,r])
return false;
}
return true;
}
}
//类2
//用于计算空白位置时的辅助类
class Location
{
public int RIndex { get; set; }
public int CIndex { get; set; }
public Location(int r,int c)
{
RIndex = r;
CIndex = c;
}
}
//枚举,用于表示方向
enum MoveDirection
{
Up,
Down,
Left,
Right
}
//主函数
class Program
{
private static GameCore core; //全局静态变量
static void Main(string[] args)
{
core = new GameCore();
core.GenerateNumber();
core.GenerateNumber();
PrintMap();
while (true)
{
KeyDown(); //输入“w”、“s”、“a”、“d”,并发生移动
if(core.IsChange) //如果地图改变
{
core.GenerateNumber(); //生成随机数
PrintMap(); //打印地图
if(core.IsOver())
{
Console.WriteLine("游戏结束");
}
}
}
}
private static void PrintMap() //打印地图
{
Console.Clear(); //清空控制台
for(int r=0;r<4;r++)
{
for(int c=0;c<4;c++)
{
Console.Write(core.Map[r, c] + "\t");
}
Console.WriteLine();
}
}
private static void KeyDown()
{
switch(Console.ReadLine())
{
case"w":
core.Move(MoveDirection.Up);break;
case"s":
core.Move(MoveDirection.Down); break;
case"a":
core.Move(MoveDirection.Left); break;
case"d":
core.Move(MoveDirection.Right); break;
}
}
}
C#/游戏2048的核心代码
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 今天闲来无聊,带着大家编写黑窗口版本的2048,效果如下: 一、游戏介绍 《2048》是最近比较流行的一款数字游戏...
- 学习C语言/C++已经接近一个月了,在老师的带领下,我们已经学习了c语言数据的基本类型、变量的输入输出、进制转换、...
- 学习C/C++一个多月了,我们已经学习了c语言数据的基本类型、变量的输入输出、进制转换、运算符和分支结构、循环结构...
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...