ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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; }
        }
    }
    

     

    프로젝트 파일

    Study06.zip
    0.04MB

    실행파일

     

     

    Study06.exe
    0.01MB

Designed by Tistory.