-
03/19 2차원 배열 2048 구현C#/수업과제 2021. 3. 22. 00:58
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Study06 { class Program { static void Main(string[] args) { Console.WriteLine("Main"); new App(); } } }
App.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Study06 { public class App { public App() { Console.WriteLine("App"); GameLauncher gameLauncher = new GameLauncher(); gameLauncher.Init(); gameLauncher.PrintPlate(); //gameLauncher.StartGame(); } } }
GameLauncher.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Study06 { public class GameLauncher { public enum eDirection { Left, Right, Up, Down } private int[,] arrPlate; public GameLauncher() { } //초기화 public void Init() { this.CreatePlate(); } //새로운 판을 생성 public void CreatePlate() { Console.WriteLine("새로운 판을 생성합니다."); this.arrPlate = new int[4, 4]; CreateBlock(); } //빈 자리 중 한 칸에 랜점하게 2 또는 4가 나온다. public void CreateBlock() { List<Brock> listTmp = new List<Brock>(); Random random = new Random(); for (int y = 0; y < arrPlate.GetLength(0); y++) { for (int x = 0; x < arrPlate.GetLength(1); x++) { if (arrPlate[x, y] == 0) { listTmp.Add(new Brock() { Row = x, Col = y }); } } } Brock randomBrock = new Brock(); randomBrock = listTmp[random.Next(0, listTmp.Count)]; randomBrock.Value = random.Next() % 2 == 0 ? 2 : 4; arrPlate[randomBrock.Row, randomBrock.Col] = randomBrock.Value; Console.WriteLine("({0}, {1})에 숫자({2}) 생성\n", randomBrock.Row, randomBrock.Col, randomBrock.Value); } //게임 시작 public void StartGame() { while (true) { ConsoleKeyInfo keyInfo = Console.ReadKey(); switch (keyInfo.Key) { case ConsoleKey.LeftArrow: { CalculateBlocks(eDirection.Left); CreateBlock(); BlockMovementCheck(); PrintPlate(); break; } case ConsoleKey.RightArrow: { CalculateBlocks(eDirection.Right); CreateBlock(); BlockMovementCheck(); PrintPlate(); break; } case ConsoleKey.UpArrow: { CalculateBlocks(eDirection.Up); CreateBlock(); BlockMovementCheck(); PrintPlate(); break; } case ConsoleKey.DownArrow: { CalculateBlocks(eDirection.Down); CreateBlock(); BlockMovementCheck(); PrintPlate(); break; } case ConsoleKey.Escape: { EndGame(); break; } default: break; } } } //게임 종료 public void EndGame() { Console.WriteLine("게임이 종료되었습니다."); Environment.Exit(0); } public void GameOver() { Console.WriteLine("GAMEOVER"); Environment.Exit(0); } //판 출력 public void PrintPlate() { Console.WriteLine("방향키 : → ← ↑ ↓ 종료 : ESC\n"); for (int x = 0; x < arrPlate.GetLength(0); x++) { for (int y = 0; y < arrPlate.GetLength(1); y++) { Console.Write("{0, 5}", arrPlate[x, y]); } Console.WriteLine("\n"); } } //합칠 수 있는 블럭이 있거나, 빈 공간이 있는가 public void BlockMovementCheck() { for (int i = 0; i < arrPlate.GetLength(0); i++) { for (int j = 0; j < arrPlate.GetLength(1); j++) { if (arrPlate[i, j] == 0) { return; } } } for (int i = 0; i < arrPlate.GetLength(0); i++) { for (int j = 0; j < arrPlate.GetLength(1)-1; j++) { if (arrPlate[i, j] == arrPlate[i, j+1]) { return; } } } for (int i = 0; i < arrPlate.GetLength(0)-1; i++) { for (int j = 0; j < arrPlate.GetLength(1); j++) { if (arrPlate[i, j] == arrPlate[i + 1, j]) { return; } } } GameOver(); } //블럭 계산 public void CalculateBlocks(eDirection direction) { int[,] arrTmp = new int[arrPlate.GetLength(0), arrPlate.GetLength(1)]; int tmp = 0; try { switch (direction) { case eDirection.Left: { tmp = 0; for (int i = 0; i < arrPlate.GetLength(0); i++) { for (int j = 0; j < arrPlate.GetLength(1); j++) { if (arrPlate[i, j] != 0) { arrTmp[i, tmp] = arrPlate[i, j]; tmp++; } } tmp = 0; } for (int i = 0; i < arrTmp.GetLength(0); i++) { for (int j = 0; j < arrTmp.GetLength(1) - 1; j++) { if (arrTmp[i, j] == arrTmp[i, j + 1]) { arrTmp[i, j] += arrTmp[i, j + 1]; for (int k = j + 1; k < arrTmp.GetLength(1) - 1; k++) { arrTmp[i, k] = arrTmp[i, k + 1]; } arrTmp[i, arrTmp.GetLength(1) - 1] = 0; } } } break; } case eDirection.Right: { tmp = arrPlate.GetLength(1) - 1; for (int i = arrPlate.GetLength(0) - 1; i >= 0; i--) { for (int j = arrPlate.GetLength(1) - 1; j >= 0; j--) { if (arrPlate[i, j] != 0) { arrTmp[i, tmp] = arrPlate[i, j]; tmp--; } } tmp = arrPlate.GetLength(1) - 1; } for (int i = arrTmp.GetLength(0) - 1; i >= 0; i--) { for (int j = arrTmp.GetLength(1) - 1; j > 0; j--) { if (arrTmp[i, j] == arrTmp[i, j - 1]) { arrTmp[i, j] += arrTmp[i, j - 1]; for (int k = j - 1; k > 0; k--) { arrTmp[i, k] = arrTmp[i, k - 1]; } arrTmp[i, 0] = 0; } } } break; } case eDirection.Up: { tmp = 0; for (int i = 0; i < arrPlate.GetLength(0); i++) { for (int j = 0; j < arrPlate.GetLength(1); j++) { if (arrPlate[j, i] != 0) { arrTmp[tmp, i] = arrPlate[j, i]; tmp++; } } tmp = 0; } for (int i = 0; i < arrTmp.GetLength(0); i++) { for (int j = 0; j < arrTmp.GetLength(1) - 1; j++) { if (arrTmp[j, i] == arrTmp[j + 1, i]) { arrTmp[j, i] += arrTmp[j + 1, i]; for (int k = j + 1; k < arrTmp.GetLength(1) - 1; k++) { arrTmp[k, i] = arrTmp[k + 1, i]; } arrTmp[arrTmp.GetLength(1) - 1, i] = 0; } } } break; } case eDirection.Down: { tmp = arrPlate.GetLength(1) - 1; for (int i = arrPlate.GetLength(0) - 1; i >= 0; i--) { for (int j = arrPlate.GetLength(1) - 1; j >= 0; j--) { if (arrPlate[j, i] != 0) { arrTmp[tmp, i] = arrPlate[j, i]; tmp--; } } tmp = arrPlate.GetLength(1) - 1; } for (int i = arrTmp.GetLength(0) - 1; i >= 0; i--) { for (int j = arrTmp.GetLength(1) - 1; j > 0; j--) { if (arrTmp[j, i] == arrTmp[j - 1, i]) { arrTmp[j, i] += arrTmp[j - 1, i]; for (int k = j - 1; k > 0; k--) { arrTmp[k, i] = arrTmp[k - 1, i]; } arrTmp[0, i] = 0; } } } break; } default: break; } } catch (ArgumentOutOfRangeException e) { GameOver(); } arrPlate = arrTmp; } } }
Brock.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Study06 { public class Brock { public int Row { get; set; } public int Col { get; set; } public int Value { get; set; } } }
프로젝트 파일
실행파일
'C# > 수업과제' 카테고리의 다른 글
03/22 델리게이트 연습 (0) 2021.03.22 03/17 추상클래스, 인터페이스, 속성, 스택, 큐를 사용한 예제 (0) 2021.03.18 03/16 컬렉션을 이용 예제 (0) 2021.03.16 03/12 1주차 주말과제 (0) 2021.03.15 03/11 클래스 생성 -> 인스턴스 생성 연습 (0) 2021.03.11