class App
{
int[,] map = new int[4, 4];
Random rand = new Random();
public App()
{
AddNumber();
AddNumber();
Field();
while (true)
{
ConsoleKeyInfo info = Console.ReadKey();
Console.WriteLine();
switch (info.Key.ToString())
{
case "RightArrow":
Push(0, 1);
Sum(0, 1);
break;
case "LeftArrow":
Push(0, -1);
Sum(0, -1);
break;
case "DownArrow":
Push(1, 0);
Sum(1, 0);
break;
case "UpArrow":
Push(-1, 0);
Sum(-1, 0);
break;
}
AddNumber();
Field();
GameOverCheck();
}
}
void GameOverCheck()
{
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (x == 0 && y == 0)
{
if (map[y, x] == 0 || map[y, x] == map[y, x + 1] || map[y, x] == map[y + 1, x])
{
return;
}
}
else if (y == 0 && x == map.GetLength(1) - 1)
{
if (map[y, x] == 0 || map[y, x] == map[y + 1, x] || map[y, x] == map[y, x - 1])
{
return;
}
}
else if (y == map.GetLength(0) - 1 && x == 0)
{
if (map[y, x] == 0 || map[y, x] == map[y - 1, x] || map[y, x] == map[y, x + 1])
{
return;
}
}
else if (y == map.GetLength(0) - 1 && x == map.GetLength(1) - 1)
{
if (map[y, x] == 0 || map[y, x] == map[y - 1, x] || map[y, x] == map[y, x - 1])
{
return;
}
}
else if (x == 0)
{
if (map[y, x] == 0 || map[y, x] == map[y, x + 1])
{
return;
}
}
else if (y == 0)
{
if (map[y, x] == 0 || map[y, x] == map[y + 1, x])
{
return;
}
}
else if (y == map.GetLength(0) - 1)
{
if (map[y, x] == 0 || map[y, x] == map[y - 1, x])
{
return;
}
}
else if (x == map.GetLength(1) - 1)
{
if (map[y, x] == 0 || map[y, x] == map[y, x - 1])
{
return;
}
}
else
{
if (map[y, x] == 0 || map[y, x] == map[y, x - 1] || map[y, x] == map[y, x + 1] || map[y, x] == map[y - 1, x] || map[y, x] == map[y + 1, x])
{
return;
}
}
}
}
Console.WriteLine("게임오버");
}
void Push(int valueY, int valueX)
{
while (true)
{
int n = 0;
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (valueX == 1 && map[y, x] != 0 && x != map.GetLength(1) - 1) // RightArrow입력(x:1): map[y, x]가 0이 아니고 오른쪽 끝자리가 아닐때
{
if (map[y, x + valueX] == 0) // map[y, x]의 오른쪽자리의 값이 0일때
{
map[y, x + valueX] = map[y, x];
map[y, x] = 0;
n++;
}
}
else if (valueX == -1 && map[y, x] != 0 && x != 0) // LeftArrow입력(x:-1): map[y, x]가 0이 아니고 왼쪽 끝자리가 아닐때
{
if (map[y, x + valueX] == 0) // map[y, x]의 왼쪽자리의 값이 0일때
{
map[y, x + valueX] = map[y, x];
map[y, x] = 0;
n++;
}
}
else if (valueY == 1 && map[y, x] != 0 && y != map.GetLength(0) - 1) // DownArrow입력(y:-1): map[y, x]가 0이 아니고 아래쪽 끝자리가 아닐때
{
if (map[y + valueY, x] == 0) // map[y, x]의 아래쪽자리의 값이 0일때
{
map[y + valueY, x] = map[y, x];
map[y, x] = 0;
n++;
}
}
else if (valueY == -1 && map[y, x] != 0 && y != 0) // UpArrow입력(y:1): map[y, x]가 0이 아니고 위쪽 끝자리가 아닐때
{
if (map[y + valueY, x] == 0) // map[y, x]의 위쪽자리의 값이 0일때
{
map[y + valueY, x] = map[y, x];
map[y, x] = 0;
n++;
}
}
}
}
if (n == 0)
{
break;
}
}
}
void Sum(int valueY, int valueX)
{
if (valueX == 1) // RightArrow입력(x:1)
{
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = map.GetLength(1) - 1; x >= 0; x--)
{
if (map[y, x] != 0 && x != map.GetLength(1) - 1) // map[y, x]가 0이 아니고 오른쪽 끝자리가 아닐때
{
if (map[y, x] == map[y, x + valueX]) // map[y, x]랑 오른쪽자리의 값이 같을때
{
map[y, x + valueX] += map[y, x];
map[y, x] = 0;
}
}
}
}
}
else if (valueX == -1) // LeftArrow입력(x:-1)
{
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (map[y, x] != 0 && x != 0) // map[y, x]가 0이 아니고 왼쪽 끝자리가 아닐때
{
if (map[y, x] == map[y, x + valueX]) // map[y, x]랑 왼쪽자리의 값이 같을때
{
map[y, x + valueX] += map[y, x];
map[y, x] = 0;
}
}
}
}
}
else if (valueY == 1) // DownArrow입력(y:1)
{
for (int y = map.GetLength(0) - 1; y >= 0; y--)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (map[y, x] != 0 && y != map.GetLength(0) - 1) // map[y, x]가 0이 아니고 아래쪽 끝자리가 아닐때
{
if (map[y, x] == map[y + valueY, x]) // map[y, x]랑 아래쪽자리의 값이 같을때
{
map[y + valueY, x] += map[y, x];
map[y, x] = 0;
}
}
}
}
}
else if (valueY == -1) // UpArrow입력(y:-1)
{
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (map[y, x] != 0 && y != 0) // map[y, x]가 0이 아니고 위쪽 끝자리가 아닐때
{
if (map[y, x] == map[y + valueY, x]) // map[y, x]랑 위쪽자리의 값이 같을때
{
map[y + valueY, x] += map[y, x];
map[y, x] = 0;
}
}
}
}
}
Push(valueY, valueX);
}
void Field()
{
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
Console.Write(" {0} ", map[y, x]);
}
Console.WriteLine();
}
Console.WriteLine();
}
void AddNumber()
{
int blankCheck = 0;
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
if (map[y, x] != 0)
{
blankCheck++;
}
}
}
if (blankCheck == map.GetLength(0) * map.GetLength(1))
{
return;
}
while (true)
{
int y, x;
y = rand.Next(0, map.GetLength(0));
x = rand.Next(0, map.GetLength(1));
if (map[y, x] == 0)
{
map[y, x] = 2;
break;
}
}
}
}
무한루프 수정, 게임오버 체크 추가
'C# > 수업 내용' 카테고리의 다른 글
| [C#] 2021-09-01 2차원 배열 캐릭터 이동 (0) | 2021.09.01 |
|---|---|
| [C#] 2021-09-01 1차원 배열 복습 (0) | 2021.09.01 |
| [C#] 2021-08-31 1차원 배열 2048 (0) | 2021.08.31 |
| [C#] 2021-08-31 1차원 배열 캐릭터 이동 (0) | 2021.08.31 |
| [C#] 2021-08-30 배열 연습 (0) | 2021.08.31 |