-
03/19 1차원 2048게임 구현C#/수업내용 2021. 3. 19. 17:06
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.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 } public int[] arrPlate; public List<int> listTmp; //생성자 public GameLauncher() { } //초기화 public void Init() { Console.WriteLine("초기화 합니다."); this.CreatePlate(); } //새로운 판을 생성 public void CreatePlate() { Console.WriteLine("새로운 판을 생성합니다."); this.arrPlate = new int[8]; } //빈 자리 중 한 칸에 랜점하게 2 또는 4가 나온다. public void CreateBlock() { Console.WriteLine(); Console.WriteLine("블럭을 생성합니다."); listTmp = new List<int>(); for(int i = 0; i <arrPlate.Length; i++) { if(arrPlate[i] == 0) { listTmp.Add(i); } } Random random = new Random(); int tmp = random.Next(0, listTmp.Count); arrPlate[listTmp[tmp]] = random.Next() % 2 == 0 ? 2 : 4; PrintPlate(); listTmp.Clear(); } //게임 시작 public void StartGame() { CreateBlock(); while (true) { if(!BlockMovementCheck()) { Console.WriteLine("Game Over"); break; } ConsoleKeyInfo keyInfo = Console.ReadKey(); if (keyInfo.Key == ConsoleKey.RightArrow) { Console.WriteLine("->"); CalculateBlocks(eDirection.Right); CreateBlock(); } else if (keyInfo.Key == ConsoleKey.LeftArrow) { Console.WriteLine("<-"); CalculateBlocks(eDirection.Left); CreateBlock(); } else if (keyInfo.Key == ConsoleKey.Escape) { this.EndGame(); break; } } } //게임 종료 public void EndGame() { Console.WriteLine("게임이 종료되었습니다."); } //판 출력 public void PrintPlate() { Console.Clear(); Console.WriteLine("조작 오른쪽 : ->, 왼쪽 : <-, 종료 : ESC"); Console.WriteLine("\n -------------------------------"); foreach (int i in arrPlate) { Console.Write("|{0, 2} ", i); } Console.WriteLine("|\n -------------------------------"); } //합칠 수 있는 블럭이 있거나, 빈 공간이 있는가 public bool BlockMovementCheck() { bool plug = false; for(int i = 0; i<arrPlate.Length; i++) { if(arrPlate[i] == 0) { plug = true; } } for(int i = 0; i<arrPlate.Length-1; i++) { if(arrPlate[i] == arrPlate[i+1]) { plug = true; } } return plug; } //블럭 계산 public void CalculateBlocks(eDirection direction) { switch (direction) { case eDirection.Left: { int[] arrTmp = new int[arrPlate.Length]; int tmp = 0; for (int i = 0; i < arrPlate.Length; i++) { if (arrPlate[i] != 0) { arrTmp[tmp] = arrPlate[i]; tmp++; } } for(int i = 0; i< arrPlate.Length-1; i++) { if(arrTmp[i]== arrTmp[i+1]) { arrTmp[i] += arrTmp[i + 1]; for(int j = i + 1; j< arrPlate.Length - 1; j++) { arrTmp[j] = arrTmp[j + 1]; } } } arrTmp[arrTmp.Length-1] = 0; arrPlate = arrTmp; break; } case eDirection.Right: { int[] arrTmp = new int[arrPlate.Length]; int tmp = arrPlate.Length-1; for (int i = arrPlate.Length-1; i >= 0; i--) { if (arrPlate[i] != 0) { arrTmp[tmp] = arrPlate[i]; tmp--; } } for (int i = arrPlate.Length - 1; i > 0; i--) { if (arrTmp[i] == arrTmp[i - 1]) { arrTmp[i] += arrTmp[i - 1]; for (int j = i - 1; j > 0; j--) { arrTmp[j] = arrTmp[j - 1]; } } } arrTmp[0] = 0; arrPlate = arrTmp; break; } default: break; } } } }
'C# > 수업내용' 카테고리의 다른 글
03/22 델리게이트 연습 1 (0) 2021.03.22 03/19 수업내용 메모 (0) 2021.03.19 03/18 수업내용 메모 (0) 2021.03.19 03/18 다차원 배열 연습 2 (0) 2021.03.19 03/18 다차원 배열 연습 1 (0) 2021.03.19