控制臺(tái)2048游戲

眾所周知,unity中用的最多的腳本是C#。所以,為了鞏固大家的C#語(yǔ)法,特給大家?guī)?lái)一個(gè)練習(xí)c#函數(shù)和二維數(shù)組的實(shí)例——控制臺(tái)2048。
現(xiàn)將代碼貼出,大家來(lái)學(xué)習(xí)學(xué)習(xí)吧!代碼中有詳細(xì)的注釋,大家很容易理解噠!如果大家覺(jué)得太多一點(diǎn)一點(diǎn)翻看太麻煩的話,可以先復(fù)制到IDE里,然后在詳細(xì)的看哦!
這個(gè)是主類,“Program.cs”這個(gè)是整個(gè)游戲的邏輯代碼。
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool isReset = true;
while (isReset)
{
ArrayTwoMove move = new ArrayTwoMove();
int[,] map = new int[4, 4];//2048游戲地圖
map = CreateNewNumber(map);
map = CreateNewNumber(map);
bool b = true;
while (b)
{
Console.Clear();//控制臺(tái)清除
PrintMap(map);
Console.Write("請(qǐng)按“↑”、“↓”、“←”、“→”方向鍵執(zhí)行相對(duì)應(yīng)的操作!");
var v = Console.ReadKey();
switch (v.Key)
{
case ConsoleKey.UpArrow: map = move.MoveArray2Up(map); break;//上
case ConsoleKey.DownArrow: map = move.MoveArray2Down(map); break;//下
case ConsoleKey.LeftArrow: map = move.MoveArray2Left(map); break;//左
case ConsoleKey.RightArrow: map = move.MoveArray2Right(map); break;//右
}
if (IsGameOver(map)) { b = false; }
}
bool d=true ;
while (d)
{
Console.Clear();//控制臺(tái)清除
GameOverMap();
Console.WriteLine("\t\t ============是否重新開始游戲!============");
Console.WriteLine("\t\t ============Enter\"開始\",Esc\"結(jié)束\"============");
var xv = Console.ReadKey();
switch (xv.Key)
{
case ConsoleKey.Enter: isReset = true; d = false; break;
case ConsoleKey.Escape: isReset = false; d = false; break;
default: d = true; break;
}
}
}
}
/// <summary>
/// 2048地圖控制臺(tái)打印
/// </summary>
/// <param name="map"></param>
private static void PrintMap(int[,] map)
{
Console.Write("\n\n");
Console.WriteLine("\t\t ============控制臺(tái)2048游戲============");
for (int r = 0; r <= map.GetUpperBound(0); r++)
{
Console.Write("\n\n\t\t|----------|----------|----------|----------|\n");
Console.Write("\t\t| ");
for (int c = 0; c <= map.GetUpperBound(0); c++)
{
if (map[r, c] == 0)
{
//Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(" " + " | ");
}
else
{
switch (map[r, c])
{
case 2: Console.ForegroundColor = ConsoleColor.DarkGray; break;//深灰色
case 4: Console.ForegroundColor = ConsoleColor.Gray; break;//灰色
case 8: Console.ForegroundColor = ConsoleColor.White; break;//白色
case 16: Console.ForegroundColor = ConsoleColor.Blue; break;//藍(lán)色
case 32: Console.ForegroundColor = ConsoleColor.Cyan; break;//青色
case 64: Console.ForegroundColor = ConsoleColor.DarkYellow; break;//深黃色
case 128: Console.ForegroundColor = ConsoleColor.Yellow; break;//黃色
case 256: Console.ForegroundColor = ConsoleColor.Magenta; break;//紫紅色
case 512: Console.ForegroundColor = ConsoleColor.Red; break;//紅色
case 1024: Console.ForegroundColor = ConsoleColor.Green; break;//綠色
default: Console.ForegroundColor = ConsoleColor.Green; break;
}
Console.Write("{0,4} | ", map[r, c]);
}
}
//Console.Write("\n\t\t|----------|----------|----------|----------|\n");
//Console.Write("\n\t\t| | | | |\n");
}
Console.Write("\n\t\t|----------|----------|----------|----------|\n");
}
private static Random random = new Random();
/// <summary>
/// 在2048地圖上生成新的數(shù)組(2(80%)或4(20%))
/// </summary>
/// <param name="map"></param>
public static int[,] CreateNewNumber(int[,] map)
{
bool b = true;
while (b)
{
int x = random.Next(0, map.GetUpperBound(0) + 1);
int y = random.Next(0, map.GetUpperBound(0) + 1);
if (map[x, y] == 0)
{
b = false;
int res = random.Next(1, 6) == 1 ? 4 : 2;
map[x, y] = res;
}
}
return map;
}
/// <summary>游戲結(jié)束界面
/// 游戲結(jié)束界面
/// </summary>
private static void GameOverMap()
{
Console.Write("\n\n");
Console.WriteLine("\t\t ============游戲結(jié)束============\n\n\n\n");
}
/// <summary>查找2048地圖里面是否還有空的位置
/// 查找2048地圖里面是否還有空的位置
/// </summary>
/// <param name="map">2048地圖</param>
/// <returns></returns>
public static bool IsNull(int[,] map)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
tem[c] = map[r, c];
}
foreach (var item in tem)
{
if (item == 0) { return true; }
}
}
return false;
}
/// <summary>判斷2048游戲是否結(jié)束
/// 判斷2048游戲是否結(jié)束
/// </summary>
/// <param name="map">2048地圖</param>
/// <returns></returns>
private static bool IsGameOver(int[,] map)
{
if (IsNull(map)) { return false; }//地圖有空位置 不滿足游戲結(jié)束的條件
else//地圖沒(méi)有有空位置
{
if (IsHNoAdd(map) && IsVNoAdd(map))
{ return true; }
else { return false; }
}
}
/// <summary>判斷數(shù)組里面的所有成員有沒(méi)有符合相鄰相同非零的條件存在
/// 判斷數(shù)組里面的所有成員有沒(méi)有符合相鄰相同非零的條件存在
/// </summary>
/// <param name="array">數(shù)組</param>
/// <returns></returns>
private static bool IsAddOk(int[] array)
{
for (int i = 0; i < array.Length - 1; i++)
{
if (array[i] == array[i + 1] && array[i] != 0)
{
return true;
}
}
return false;
}
/// <summary>查閱2048地圖每一行有沒(méi)有符合相鄰相同非零的條件存在
/// 查閱2048地圖每一行有沒(méi)有符合相鄰相同非零的條件存在
/// </summary>
/// <param name="map">2048地圖</param>
/// <returns></returns>
public static bool IsHNoAdd(int[,] map)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
tem[c] = map[r, c];
}
if (IsAddOk(tem)) { return false; }
}
return true;
}
/// <summary>查閱2048地圖每一列有沒(méi)有符合相鄰相同非零的條件存在
/// 查閱2048地圖每一列有沒(méi)有符合相鄰相同非零的條件存在
/// </summary>
/// <param name="map">2048地圖</param>
/// <returns></returns>
public static bool IsVNoAdd(int[,] map)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
tem[c] = map[c, r];
}
if (IsAddOk(tem)) { return false; }
}
return true;
}
}
}

接下來(lái)是游戲數(shù)據(jù)的處理。即交換數(shù)字,移動(dòng)數(shù)字,合并數(shù)字等等。
using System;
namespace ConsoleApplication1
{
class ArrayTwoMove
{ // 去零 相加 去零
// 0,2,2,4 ==> 2,2,4,0 ==> 4,0,4,0 ==> 4,4,0,0
private int[]MoveLeftOrUp(int[]array)//去零
{
int[] newA = new int[array.Length];// 0,0,0,0
int index=0;
for (int i = 0; i < array .Length; i++)
{
if(array [i]!=0)
{
newA[index] = array[i];// 2,0,0,0
index++;
}
}
return newA;
}
private int[] Add(int[] array)//相鄰相同非零相加 2,2,4,0 4,0,4,0
{
for (int i = 0; i < array.Length-1; i++)
{
if(array [i]==array [i+1]&&array [i]!=0)
{
array[i] *= 2;
array[i + 1] = 0;
}
}
return array;
}
/// <summary>2048左移動(dòng)算法
/// 2048左移動(dòng)算法
/// </summary>
/// <param name="map">地圖二維數(shù)組</param>
/// <returns></returns>
public int[,] MoveArray2Left(int[,]map)
{
//0,2,2,4 4,4,0,0
//2,0,8,4 2,8,4,0
//0,0,2,2 4,0,0,0
//2,4,4,4 2,8,4,0
bool b = true;
if (Program.IsHNoAdd(map)&&!Program .IsNull(map)) { b = false; }
if (b)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
tem[c] = map[r, c];
}
tem = MoveLeftOrUp(tem);
tem = Add(tem);
tem = MoveLeftOrUp(tem);
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
map[r, c] = tem[c];
}
}
map = Program.CreateNewNumber(map);
return map;
}
return map;
}
/// <summary>2048右移動(dòng)算法
/// 2048右移動(dòng)算法
/// </summary>
/// <param name="map">地圖二維數(shù)組</param>
/// <returns></returns>
public int[,] MoveArray2Right(int[,] map)
{
//0,2,2,4 0,0,4,4
//2,0,8,4 0,2,8,4
//0,0,2,2 0,0,0,4
//2,4,4,4 0,2,4,8
bool b = true;
if (Program.IsHNoAdd(map) && !Program.IsNull(map)) { b = false; }
if (b)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 3; c >= 0; c--)
{
tem[3 - c] = map[r, c];
}
tem = MoveLeftOrUp(tem);
tem = Add(tem);
tem = MoveLeftOrUp(tem);
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
map[r, c] = tem[3 - c];
}
}
map = Program.CreateNewNumber(map);
return map;
}
return map;
}
/// <summary> 2048上移動(dòng)算法
/// 2048上移動(dòng)算法
/// </summary>
/// <param name="map">地圖二維數(shù)組</param>
/// <returns></returns>
public int[,] MoveArray2Up(int[,] map)
{
bool b = true;
if (Program.IsVNoAdd(map) && !Program.IsNull(map)) { b = false; }
if (b)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
tem[c] = map[c, r];
}
tem = MoveLeftOrUp(tem);
tem = Add(tem);
tem = MoveLeftOrUp(tem);
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
map[c, r] = tem[c];
}
}
map = Program.CreateNewNumber(map);
return map;
}
return map;
}
/// <summary>2048下移動(dòng)算法
/// 2048下移動(dòng)算法
/// </summary>
/// <param name="map">地圖二維數(shù)組</param>
/// <returns></returns>
public int[,] MoveArray2Down(int[,] map)
{
bool b = true;
if (Program.IsVNoAdd(map) && !Program.IsNull(map)) { b = false; }
if (b)
{
int[] tem = new int[map.GetUpperBound(0) + 1];
for (int r = 0; r < map.GetUpperBound(0) + 1; r++)
{
for (int c = 3; c >= 0; c--)
{
tem[3 - c] = map[c, r];
}
tem = MoveLeftOrUp(tem);
tem = Add(tem);
tem = MoveLeftOrUp(tem);
for (int c = 0; c < map.GetUpperBound(0) + 1; c++)
{
map[3 - c, r] = tem[c];
}
}
map = Program.CreateNewNumber(map);
return map;
}
return map;
}
}
}

好啦,今天的分享就到這里,內(nèi)容可能有點(diǎn)多,大家可以直接復(fù)制到IDE里面測(cè)試,在IDE里面具體查看代碼喲!我們下期再見(jiàn)吧??!