공부/C# Console Game

[C#] 이차원 배열을 이용해 콘솔창에서 빙고를 실행시켜보자!

굴러다니다니 2023. 3. 20. 17:39
728x90

다음은 만들고자 하는 빙고판의 조건이다.

빙고 만들기

  1. 셔플 메소드 만들기
  2. 빙고 생성 메소드 만들기
  3. 컴퓨터 AI 만들기
  4. 각자 다른 빙고판 컴퓨터가 숫자 하나 플레이어가 숫자 하나 빙고
  5. 종료 조건 둘 중 4빙고가 되는 사람 있으면 해당 플레이어 승 게임 종료

메서드마다 풀이를 해두겠다.

static int[,] Create_bingo()
        {
            int length = 5;
            int[,] arr = new int[length, length];
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    arr[i, j] = 5 * i + j + 1; //1~25 순서대로 [5][5]에 넣기
                }
            }
            return arr;
        }

create_bingo메소드이다. 매개변수는 받지 않으며 length를 5로 입력해 두어, arr에 5 * 5를 선언한다.

for문을 돌며 1 ~ 25를 [0][0] 부터 [4][4]까지 순서대로 할당해준다.

 

static int[,] shuffle(int[,] arr, int seed)  //seed없이 랜덤을 메소드에서 진행한다면 어째서인지 동일한 값이 나와 seed값을 주어 다르게 처리
        {
            Random random = new Random(seed);
            int firsti;
            int firstj;
            int secondi;
            int secondj;
            int temp;
            for (int i = 0; i < 1000; i++)
            {
                firsti = random.Next(5);  //이차원 배열에서 섞는거라 가로줄, 세로줄을 랜덤으로 골라 처리
                firstj = random.Next(5); 
                secondi = random.Next(5);
                secondj = random.Next(5);
                temp = arr[firsti, firstj];
                arr[firsti, firstj] = arr[secondi, secondj];
                arr[secondi, secondj] = temp;
            }
            return arr;
        }

shuffle 메서드이다, 이는 2차원 배열과 씨드값을 받는다. (shuffle을 연속되는 코드에서 사용하면 연산하는 과정에서 같은 값이 나와버려 이를 방지하기 위해 seed값을 따로 받았다.)

seed값으로 random을 돌렸으며, 이차원 배열이기 때문에 처음수의 가로줄, 세로줄을 랜덤으로 0~4까지 받았으며, 바꿀 수의 위치도 받아 이를 temp를 이용해 두 자리수의 숫자를 바꿔주었다. (지금 생각해보니 seed필요 없이 그냥 연속해서 코드를 작성하지 않으면 된다,,, 는건 비밀)

 

static void show_bingo(int[,] arr) //5*5의 빙고판을 보여준다
        {
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine("\n    ========================================================");
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                Console.WriteLine();
                Console.Write("    ");
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.Write("∥   ");
                    if (arr[i, j] == 0)  //숫자라 0이라면 이미 선택된 숫자라 노란색으로 보여준다
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkCyan;
                    }
                    Console.Write(" {0, 2}   ", arr[i, j]);
                }
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine("∥");
                Console.WriteLine("\n    ========================================================");
            }
            Console.ResetColor();
        }

단순히 5*5의 빙고판을 조금 더 깔끔하게 보여주기 위한 식이다.

선택된 부분, 즉 0인 부분은 노란색으로 강조하고 나머지 부분들은 darkcyan 색으로 나오게 처리해두었다.

 

static int check_bingo(int[,] arr) //빙고 줄이 몇 줄인지 센다
        {
            int check = 0;
            for (int i = 0; i < 5; i++)
            {
                if (arr[i, 0] == 0 && arr[i, 1] == 0 && arr[i, 2] == 0 && arr[i, 3] == 0 && arr[i, 4] == 0) //가로줄
                {
                    check++;
                }
                if (arr[0, i] == 0 && arr[1, i] == 0 && arr[2, i] == 0 && arr[3, i] == 0 && arr[4, i] == 0) //세로줄
                {
                    check++;
                }
            }
            if (arr[0, 0] == 0 && arr[1, 1] == 0 && arr[2, 2] == 0 && arr[3, 3] == 0 && arr[4, 4] == 0) //대각선
            {
                check++;
            }
            if (arr[4, 0] == 0 && arr[3, 1] == 0 && arr[2, 2] == 0 && arr[1, 3] == 0 && arr[0, 4] == 0) //대각선
            {
                check++;
            }
            return check;
        }

check_bingo이다. 이는 이차원의 배열을 받아 이 빙고판에서 빙고가 몇 줄인지 세어준다.

가로줄 5가지, 세로줄 5가지, 대각선줄 따로따로 2가지로 7가지 경우에 check가 1 증가되어 이를 return 해준다.

 

static bool find_num(int[,] arr, int num)         //빙고 2차원 배열에서 해당 숫자를 찾는다
        {
            bool find = false;                            
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (num == arr[i, j])                 //2차원 배열의 원소와 일치한다면
                    {
                        find = true;                      //찾음 
                        arr[i, j] = 0;                    //해당 값을 0으로 바꿔준다 (선택됨)
                    }
                }
            }
            return find; //못찾았다면 false를 반환한다
        }

find_num이다, 이차원 배열과 숫자를 입력받아 해당 이차원 배열에 입력한 숫자가 존재하는지 알아본다.

for문을 이용해 돌며 있을 시 해당 숫자를 0으로 바꿔 선택됨을 확인하고 find 를 true로 바꿔 return해준다.

 

static int computer_choose(int[,] computer) //현재 빙고판에 존재하는 수 중에 숫자를 골라서 return한다
        {
            Random random = new Random();
            int choose = 0;
            int i;
            int j;
            while (true)
            {
                choose = random.Next(25); //0 ~ 24중 하나 선택
                i = choose / 5;           //5로 나눈 몫을 세로
                j = choose % 5;           //5로 나눈 몫을 가로
                if (computer[i, j] != 0)  //이미 선택된 친구라면 재실행
                {
                    break;
                }
            }
            return computer[i, j];        //선택되지 않은 숫자를 return한다
        }

computer_choose는 컴퓨터가 남은 수중에서 랜덤으로 숫자를 고른다.

0~24중 랜덤으로 하나를 고른 뒤, 몫과 나머지로 위치를 잡아 그 값이 0이 아니면 그 자리에 있는 숫자를 return한다.

 

여러 메소드로 나눠 실행했지만, 뜯어보면 생각보다 간단하게 처리할 수 있었다.

실행시킨 콘솔 빙고게임

아래는 코드 전문이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20230320_homeWork_bingo
{
    class Program
    {
        static int computer_choose(int[,] computer) //현재 빙고판에 존재하는 수 중에 숫자를 골라서 return한다
        {
            Random random = new Random();
            int choose = 0;
            int i;
            int j;
            while (true)
            {
                choose = random.Next(25); //0 ~ 24중 하나 선택
                i = choose / 5;           //5로 나눈 몫을 세로
                j = choose % 5;           //5로 나눈 몫을 가로
                if (computer[i, j] != 0)  //이미 선택된 친구라면 재실행
                {
                    break;
                }
            }
            return computer[i, j];        //선택되지 않은 숫자를 return한다
        }
        static bool find_num(int[,] arr, int num)         //빙고 2차원 배열에서 해당 숫자를 찾는다
        {
            bool find = false;                            
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (num == arr[i, j])                 //2차원 배열의 원소와 일치한다면
                    {
                        find = true;                      //찾음 
                        arr[i, j] = 0;                    //해당 값을 0으로 바꿔준다 (선택됨)
                    }
                }
            }
            return find; //못찾았다면 false를 반환한다
        }
        static int check_bingo(int[,] arr) //빙고 줄이 몇 줄인지 센다
        {
            int check = 0;
            for (int i = 0; i < 5; i++)
            {
                if (arr[i, 0] == 0 && arr[i, 1] == 0 && arr[i, 2] == 0 && arr[i, 3] == 0 && arr[i, 4] == 0) //가로줄
                {
                    check++;
                }
                if (arr[0, i] == 0 && arr[1, i] == 0 && arr[2, i] == 0 && arr[3, i] == 0 && arr[4, i] == 0) //세로줄
                {
                    check++;
                }
            }
            if (arr[0, 0] == 0 && arr[1, 1] == 0 && arr[2, 2] == 0 && arr[3, 3] == 0 && arr[4, 4] == 0) //대각선
            {
                check++;
            }
            if (arr[4, 0] == 0 && arr[3, 1] == 0 && arr[2, 2] == 0 && arr[1, 3] == 0 && arr[0, 4] == 0) //대각선
            {
                check++;
            }
            return check;
        }
        static void show_bingo(int[,] arr) //5*5의 빙고판을 보여준다
        {
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine("\n    ========================================================");
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                Console.WriteLine();
                Console.Write("    ");
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.Write("∥   ");
                    if (arr[i, j] == 0)  //숫자라 0이라면 이미 선택된 숫자라 노란색으로 보여준다
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkCyan;
                    }
                    Console.Write(" {0, 2}   ", arr[i, j]);
                }
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine("∥");
                Console.WriteLine("\n    ========================================================");
            }
            Console.ResetColor();
        }
        static int[,] Create_bingo()
        {
            int length = 5;
            int[,] arr = new int[length, length];
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    arr[i, j] = 5 * i + j + 1; //1~25 순서대로 [5][5]에 넣기
                }
            }
            return arr;
        }
        static int[,] shuffle(int[,] arr, int seed)  //seed없이 랜덤을 메소드에서 진행한다면 어째서인지 동일한 값이 나와 seed값을 주어 다르게 처리
        {
            Random random = new Random(seed);
            int firsti;
            int firstj;
            int secondi;
            int secondj;
            int temp;
            for (int i = 0; i < 1000; i++)
            {
                firsti = random.Next(5);  //이차원 배열에서 섞는거라 가로줄, 세로줄을 랜덤으로 골라 처리
                firstj = random.Next(5); 
                secondi = random.Next(5);
                secondj = random.Next(5);
                temp = arr[firsti, firstj];
                arr[firsti, firstj] = arr[secondi, secondj];
                arr[secondi, secondj] = temp;
            }
            return arr;
        }
        static void Main(string[] args)
        {
            Random random = new Random();
            int seed1 = random.Next(100);
            int seed2 = random.Next(100,200);

            Console.SetWindowSize(65, 50);
            int[,] player = Create_bingo();
            Console.WriteLine();
            shuffle(player, seed1); //[5][5]에 1~25 랜덤한 값 저장됨
            int[,] computer = Create_bingo();
            shuffle(computer, seed2); //seed값과 같이 shuffle

            while (check_bingo(player) < 4 && check_bingo(computer) < 4) //둘 중 빙고수가 4 이상인 플레이어가 없을동안 반복
            {
                Console.WriteLine("두 플레이어의 빙고 현황입니다.");
                show_bingo(player);
                int a = check_bingo(player);
                Console.WriteLine("플레이어의 빙고 수: {0}", a);
                show_bingo(computer);
                int b = check_bingo(computer);
                Console.WriteLine("컴퓨터의 빙고 수: {0}", b);

                bool find = false;
                int input = 2;
                while (!find)
                {
                    Console.Write("1~25중 본인의 빙고판에서 없애고 싶으신 숫자를 입력해주세요: ");
                    input = int.Parse(Console.ReadLine());
                    if (input == 0)
                    {
                        continue;
                    }
                    find = find_num(player, input);
                }
                find_num(computer, input);
                if (check_bingo(player) >= 4 || check_bingo(computer)>=4)
                {
                    break;
                }
                int choose = computer_choose(computer);
                Console.WriteLine("컴퓨터의 선택 : {0}", choose);
                find_num(player, choose);
                find_num(computer, choose);
                Console.ReadLine();
                Console.Clear();
            }

            if (check_bingo(player) >= 4)
            {
                Console.Clear();
                Console.WriteLine("플레이어의 승리입니다.");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");

            }
            else
            {
                Console.Clear();
                Console.WriteLine("컴퓨터의 승리입니다.");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ===                                                  ===");
                Console.WriteLine("    ===                                                  ===");
                Console.WriteLine("    ===          1101001                 0010001         ===");
                Console.WriteLine("    ===        01       00             11       00       ===");
                Console.WriteLine("    ===                                                  ===");
                Console.WriteLine("    ===                                                  ===");
                Console.WriteLine("    ===            1                         0           ===");
                Console.WriteLine("    ===             0010010101100100001001110            ===");
                Console.WriteLine("    ===              0                     1             ===");
                Console.WriteLine("    ===               1                   0              ===");
                Console.WriteLine("    ===                0110010110101000100               ===");
                Console.WriteLine("    ===                                                  ===");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("                             ======                         ");
                Console.WriteLine("                             ======                         ");
                Console.WriteLine("                             ======                         ");
                Console.WriteLine("                             ======                         ");
                Console.WriteLine("    ========================================================");
                Console.WriteLine("    ========================================================");
                Console.ResetColor();
            }
        }
    }
}
728x90