using System;
namespace _2048
{
class Game
{
private const int row = 4;
private const int col = 4;
private const int initCount = 4;
private const int result = 2048;
private const float getTwoRate = 0.8f;
private int[][] map;
private int[] mergeArray;
public Game()
{
map = new int[row][];
for (int i = 0; i < col; i++)
{
map[i] = new int[col];
}
mergeArray = new int[col];
}
private void initMap()
{
Random random = new Random();
for (int i = 0; i < initCount; i++)
{
setNextPoint(getNextPoint(), getNextValue());
}
}
private void setNextPoint(Point point, int value)
{
map[point.x][point.y] = value;
}
private Point getNextPoint()
{
Random random = new Random();
int n_row = random.Next(0, row), n_col = random.Next(0, col);
while (map[n_row][n_col] != 0)
{
n_row = random.Next(0, row);
n_col = random.Next(0, col);
}
return new Point(n_row, n_col);
}
private int getNextValue()
{
Random random = new Random();
return random.NextDouble() <= getTwoRate ? 2 : 4;
}
private void display()
{
foreach (int[] t in map)
{
foreach (int value in t)
{
Console.Write(value + " ");
}
Console.WriteLine();
}
}
private void help()
{
Console.WriteLine("1:向上");
Console.WriteLine("2:向下");
Console.WriteLine("3:向左");
Console.WriteLine("4:向右");
Console.WriteLine("-1:退出游戏");
}
public void Play()
{
int op;
bool isWin = false;
initMap();
display();
Console.WriteLine("请输入操作码:(若需要帮助请输入0)");
while((op = int.Parse(Console.ReadLine())) != -1){
int res = check();
if (res == -1)
{
isWin = false;
break;
}
else if (res == 1)
{
isWin = true;
break;
}
switch (op)
{
case 0:
help();
continue;
break;
case 1:
Move(Direction.Up);
break;
case 2:
Move(Direction.Down);
break;
case 3:
Move(Direction.Left);
break;
case 4:
Move(Direction.Rigth);
break;
default:
Console.WriteLine("您的输入有误,请重新输入!");
break;
}
Console.WriteLine("更新坐标前:");
display();
setNextPoint(getNextPoint(), getNextValue());
Console.WriteLine("更新坐标后");
display();
Console.WriteLine("------------------------------");
}
if (op == -1) Console.WriteLine("游戏结束");
else if (isWin) Console.WriteLine("您赢了!");
else if (!isWin) Console.WriteLine("您输了。");
}
private void Move(Direction direction)
{
switch (direction)
{
case Direction.Up:
toUp();
break;
case Direction.Down:
toDown();
break;
case Direction.Left:
toLeft();
break;
case Direction.Rigth:
toRight();
break;
}
}
/// <summary>
/// 返回值为-1代表输了,0代表继续游戏,1代表赢了
/// </summary>
/// <returns></returns>
private int check()
{
bool isFull = true;
for(int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (map[i][j] == result) return 1;
if (map[i][j] == 0) isFull = false;
}
}
return isFull ? -1 : 0;
}
private void toRight()
{
for (int i = 0; i < row; i++)
{
int prevValue = -1, prevDis = col - 1;
for (int j = col - 1; j >= 0; j--)
{
if(prevValue != map[i][j])
{
if(map[i][j] != 0)
{
prevValue = map[i][j];
prevDis = j;
}
}
else
{
setNextPoint(new Point(i, prevDis), prevValue * 2);
setNextPoint(new Point(i, j), 0);
break;
}
}
int pos = col - 1;
for (int k = col - 1; k >= 0; k--)
{
if (map[i][k] != 0)
{
mergeArray[pos--] = map[i][k];
}
}
for (; pos >= 0; pos--)
{
mergeArray[pos] = 0;
}
mergeArray.CopyTo(map[i], 0);
}
}
private void toLeft()
{
for (int i = 0; i < row; i++)
{
int prevValue = -1, prevDis = 0;
for (int j = 0; j < col; j++)
{
if (prevValue != map[i][j])
{
if (map[i][j] != 0)
{
prevValue = map[i][j];
prevDis = j;
}
}
else
{
setNextPoint(new Point(i, prevDis), prevValue * 2);
setNextPoint(new Point(i, j), 0);
break;
}
}
int pos = 0;
for (int k = 0; k < col; k++)
{
if (map[i][k] != 0)
{
mergeArray[pos++] = map[i][k];
}
}
for (; pos < col; pos++)
{
mergeArray[pos] = 0;
}
mergeArray.CopyTo(map[i], 0);
}
}
private void toDown()
{
for (int j = 0; j < col; j++)
{
int prevValue = -1, prevDis = row - 1;
for (int i = row - 1; i >= 0; i--)
{
if (prevValue != map[i][j])
{
if (map[i][j] != 0)
{
prevValue = map[i][j];
prevDis = i;
}
}
else
{
setNextPoint(new Point(prevDis, j), prevValue * 2);
setNextPoint(new Point(i, j), 0);
break;
}
}
int pos = row - 1;
for (int k = row - 1; k >= 0; k--)
{
if (map[k][j] != 0)
{
mergeArray[pos--] = map[k][j];
}
}
for (; pos >= 0; pos--)
{
mergeArray[pos] = 0;
}
for (int k = row - 1; k >= 0; k--)
{
map[k][j] = mergeArray[k];
}
}
}
private void toUp()
{
for (int j = 0; j < col; j++)
{
int prevValue = -1, prevDis = 0;
for (int i = 0; i < row; i++)
{
if (prevValue != map[i][j])
{
if (map[i][j] != 0)
{
prevValue = map[i][j];
prevDis = i;
}
}
else
{
setNextPoint(new Point(prevDis, j), prevValue * 2);
setNextPoint(new Point(i, j), 0);
break;
}
}
int pos = 0;
for (int k = 0; k < row; k++)
{
if (map[k][j] != 0)
{
mergeArray[pos++] = map[k][j];
}
}
for (; pos < row; pos++)
{
mergeArray[pos] = 0;
}
for (int k = 0; k < row; k++)
{
map[k][j] = mergeArray[k];
}
}
}
}
class Point
{
public int x { get; set; }
public int y { get; set; }
public Point(int sx, int sy)
{
x = sx;
y = sy;
}
public Point() { x = -1; y = -1; }
}
class Program
{
static void Main(string[] args)
{
Game game = new Game();
game.Play();
}
}
}
用C#实现2048小游戏
于 2022-01-04 12:32:48 首次发布