ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.