ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 틱택토 게임 만들기 (스파르타캠프)
    게임 개발기록 2024. 4. 22. 21:22

    스파르타 C# 문법 강의 2주차 숙제인 틱택토 게임을 만들어 보겠습니다.

    ==========

     

    */우선 배열을 활용 해서 게임판을 만들면 좋을 것 같다.

     

    먼저 원모양을 설정 해보자. 난 9 개의 블록을 만들어서 o모양과 x모양을 설정 하겠다.

    그림판으로 대충 생각 해냄.

     

    그러면 9개의 블록 한칸과 경계선 1칸 10칸이 3개 필요 하다. 

     

    그러면 30개의 인덱스를 가진 배열을 세로로도 30칸이 필요 하니 [30, 30] 2차원 배열을 설정 하고 시작 하면 될 것 같다. 

    이제 노가다 작업으로 30개 30개 배열에 적당히 들어갈 계산을 구해야 한다. 

    o모양 할 때 칸에 무엇이 들어갈지 x는 어떻게

     

    이걸 정하고 나서 123456789 숫자를 정하게 하고 정하면 정한 곳이 o모양이 되고 컴퓨터는 랜덤으로 정해서 x를 하게 하고 그러면 숫자를 정했을 때 음 .. */ 싹 다 무시하고 새로

    ============

     

    가볍게 만들기로 한다.

    - 열칸 짜리로 만든다

     

     1 | 2 | 3
    ----------
     4 | x | 6
    ----------
     0 | x | 0

     

    이렇게 만들기로 한다. 

     

    우선 가로 10칸이 되고 세로로 5칸이 필요 하다. 

     

    10개의 인덱스?를 갖고 있는 배열을 5개 만들자. 

     

    int[,] tictacto = new int[5, 10];

     

    그리고 배열을 직접 만들어 주는데 모양을 보면서 만들기 편하게 이런 식으로 코드 써주자.

     

    int[,] tictacto = new int[5, 10]
    {
        { 0, 1, 0, 11, 0, 2, 0, 11, 0, 3 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },
        { 0, 4, 0, 11, 0, 5, 0, 11, 0, 6 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },
        { 0, 7, 0, 11, 0, 8, 0, 11, 0, 9 }
    };

     

    0은 공백, 11은 |모양, 12는 - 모양으로 할 것이다. 1~9 는 숫자 그대로를 적는다.

     

    이제 여기서 5행 10열이니 2차원 반복으로 1번 째 반복에 5가 들어가고 안에 2 번째 반복에 10번 실행 하게 하면 될 것이다. 

     

    그리고 배열과 섞어주면 된다.  for반복문을 사용 하도록 하자.

    for(int i = 0; i <5 ; i++)

    {

        for(int j = 0 ; j < 10 ; j++)

        {

            swich (tictacto[i,  j] )

             {

                 case 0 :

                      Console.Write(" ");

                       break;

                 case 11 :

                       Console.Write("|");

                       breakl;

    .....

    ..

    .

    알맞는 코드를 적어주자. 

     

    스위치 조건문을 사용 해서 배열의 값에 맞는 문자를 출력 하도록 했다. 

    스위치 조건문을 사용 한 이유 : 배열 값의 경우가 많았고 그 경우들마다 다른 문자를 출력 하기엔 스위치문이 더 효율적이다라고 생각 했다. 

     

    그리고 2차 반복문이 끝난, 다음줄의

    Console.WriteLine();

    을 적어줘서 10열의 문자가 입력 되면 다음 줄로 바뀌게 해주자. 그래야 내가 원하는 모양이 나온다.

     

    그리고 이제 플레이어가 숫자를 선택 한 곳을 다른 문자열로 바뀌게 해주면 될 것이다. 

     

    ================

    int[,] tictacto = new int[5, 10]
    {
        { 0, 1, 0, 11, 0, 2, 0, 11, 0, 3 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },
        { 0, 4, 0, 11, 0, 5, 0, 11, 0, 6 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },
        { 0, 7, 0, 11, 0, 8, 0, 11, 0, 9 }
    };

    int select=20;

    for (int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            if(select == tictacto[i, j])
            {
                switch (select)
                {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                    case 9:
                        tictacto[i, j] = 10;
                        break;
                }
            }
            switch(tictacto[i, j])
            {
                case 0:
                    Console.Write(" ");
                    break;
                case 1:
                    Console.Write("1");
                    break;
                case 2:
                    Console.Write("2");
                    break;
                case 3:
                    Console.Write("3");
                    break;
                case 4:
                    Console.Write("4");
                    break;
                case 5:
                    Console.Write("5");
                    break;
                case 6:
                    Console.Write("6");
                    break;
                case 7:
                    Console.Write("7");
                    break;
                case 8:
                    Console.Write("8");
                    break;
                case 9:
                    Console.Write("9");
                    break;
                case 11:
                    Console.Write("|");
                    break;
                case 12:
                    Console.Write("-");
                    break;
                case 10:
                    Console.Write("0");
                    break;
                case 15:
                    Console.Write("X");
                    break;
            }

        }
        Console.WriteLine();
    }

    select = int.Parse(Console.ReadLine());

     

    2024년 4월 22일

    오늘은 일단 여기서 마무리 한다.

    다음 작업을 하려면 1줄 맞추면 게임을 끝내게 해야 하는데 어떻게 구현 할지 생각이 안든다.

     

    그리고 튜터님이 이렇게 하면 고생 할 거라고 하는데 음... 이 방법도 해보고 튜터님이 알려준 방법도 해봐야 겠다.

     

    =========

     

                int sum_1 = tictacto[0, 1] + tictacto[0, 5] + tictacto[0, 9];
                int sum_2 = tictacto[2, 1] + tictacto[2,5] + tictacto[0,9];
                int sum_3 = tictacto[4, 1] + tictacto[4,5] + tictacto[4,9];

                int sum_4 = tictacto[0, 1] + tictacto[2, 1] + tictacto[4, 1];
                int sum_5 = tictacto[0, 5] + tictacto[2, 5] + tictacto[4, 5];
                int sum_6 = tictacto[0, 9] + tictacto[2, 9] + tictacto[4, 9];

                int sum_7 = tictacto[0,1] + tictacto[2,5] + tictacto[4,9];
                int sum_8 = tictacto[0,9] + tictacto[2,5] + tictacto[4,1];

                if(sum_1  == 30 || sum_2 == 30 ||sum_3 == 30 || sum_4 == 30 || sum_5 == 30 || sum_6 == 30 || sum_7 == 30 || sum_8 == 30)
                {
                    Console.WriteLine("축하 합니다. 당신의 승리");
                }

     

    3줄 맞출 시에 끝나게 하기.

    흠 근데 이거 잘 못 됐다. 처음 부터 다시 해야 겠다. 입력한 숫자가 배열에 있는 숫자와 같다면 배열 값을 바꾸려 했는데 

     

    선택이 되지 않은 숫자 선택 하게 하기 컴퓨터가.

     

     

    중요한 것은 배열을 이렇게 사용 했다고 해서 이렇게만 사용 할 수 있는 게 아니다. 어떻게 사용 할 수 있을지 계속 고민 하자. 그래야 방법이 떠오르는 것이다. 배열은 그림 그리려고 만든 게 아님. 

    일단 복잡한 데이터 구조를 정리하기 쉽게 한다라고 알지만 한 번 써봐야 느낌을 알텐데

    ================== 새로 한다.

     

     

    =========2024년 4월 23일

    랜덤한 값을 결정 하고 고른 건 파괴 하게 하자!

    도저히 생각 안 나서 튜터님께 여쭤봤다!

     

    List<int> set = new List<int>();
    set.Add(1);
    set.Add(2);
    set.Add(3);
    set.Add(4);
    set.Add(5);
    set.Add(6);
    set.Add(7);
    set.Add(8);
    set.Add(9);

     

    리스트를 만들어 주고 랜덤하게 리스트에 목록을 선택 하는 코드를 작성 하자. 

    Random random = new Random;

    int a = random.Next(set.Count);

     

    이렇게 하면 a라는 변수에 0부터 리스트의 인덱스 갯수만큼에 랜덤한 숫자를 가져오게 된다. 

     

    컴퓨터보고 랜덤 한 인덱스를 고르게 하고 그 인덱스에 저장 돼있는 값을 활용 해서 무작위로 선택 하게 하는 기능을 구현 할 수 있다. 

     

    그리고 이 가져온 값을 스위치 값에서 X 표시가 나오게끔 바꾸게 해주고 인덱스도 파괴 시켜 주면 된다. 

      if (computer == tictacto[i, j])
      {
          switch (computer)
          {
              case 1:
              case 2:
              case 3:
              case 4:
              case 5:
              case 6:
              case 7:
              case 8:
              case 9:
                  tictacto[i, j] = 50;
                  break;
          }
      }

    이 코드를 적어서 컴퓨터가 고른 숫자가 X표시로 바뀌게 하고 

     

    RemovAt(a) 도 적어줘서 인덱스도 파괴 시켜주게 하면 된다. 

     

    일단 어디에 적어야 할지가 관건인데 반복문과 여러 개 섞여있어서 음. 

    일단 Do 와일로 작업을 했다. 

     

    한 번 모양이 나오게 한 후에 나중에 컴퓨터와 플레이어의 입력값을 받고 다시 Do 와일이 실행 될 때 입력한 값에 맞게끔 그림 모양을 바꾸게 설정 했고 다시 그 그림을 나타나게 설정을 했다. 

     

    알맞는 곳에 코드 추가 하면 된다. 

     

    using System.ComponentModel;
    Console.WriteLine("원강 틱택토 게임입니다.");
    Console.WriteLine("아래의 그림을 보고 숫자를 선택 해주세요!");        <= 소개말 나오는 곳
    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine();

    int[,] tictacto = new int[5, 10]
    {
        { 0, 1, 0, 11, 0, 2, 0, 11, 0, 3 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },         <= 빙고 모양 나오게 설정 한 곳 각 숫자에 알맞게 문자를 설정해서 Console 출력 하게 했다.
        { 0, 4, 0, 11, 0, 5, 0, 11, 0, 6 },
        { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 },
        { 0, 7, 0, 11, 0, 8, 0, 11, 0, 9 }
    };

    bool clear = true;
    int select=20;          <= 게임 반복에 들어갈 bool변수와, 컴퓨터와 플레이어가 고른 숫자 반영 하게 하는 변수들
    int computer = 20;

    int sum_1;
    int sum_2;              < =승리와 패배에 사용 되는 변수들
    int sum_3;
    int sum_4;
    int sum_5;
    int sum_6;
    int sum_7;
    int sum_8;

    List<int> set = new List<int>();           컴퓨터가 선택 되지 않은 랜덤한 숫자를 고르기 위해 만든 리스트.
    set.Add(1);
    set.Add(2);
    set.Add(3);
    set.Add(4);
    set.Add(5);
    set.Add(6);
    set.Add(7);
    set.Add(8);
    set.Add(9);


    Random random = new Random(); 그냥 랜덤 만들어둔 거

    do
    {                플레이어와 컴퓨터가 입력 한 숫자에 맞춰 배열의 값을 변경 해서 그림을 바꾸게 했다.
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (select == tictacto[i, j])
                {
                    switch (select)
                    {
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                            tictacto[i, j] = 25;
                            break;
                    }
                }

                if (computer == tictacto[i, j])
                {
                    switch (computer)
                    {
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                            tictacto[i, j] = 50;
                            break;
                    }
                }
            }
        }

                배열의 값에 알맞게 그림판을 나오게 했다.
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                switch (tictacto[i, j])
                {
                    case 0:
                        Console.Write(" ");
                        break;
                    case 1:
                        Console.Write("1");
                        break;
                    case 2:
                        Console.Write("2");
                        break;
                    case 3:
                        Console.Write("3");
                        break;
                    case 4:
                        Console.Write("4");
                        break;
                    case 5:
                        Console.Write("5");
                        break;
                    case 6:
                        Console.Write("6");
                        break;
                    case 7:
                        Console.Write("7");
                        break;
                    case 8:
                        Console.Write("8");
                        break;
                    case 9:
                        Console.Write("9");
                        break;
                    case 11:
                        Console.Write("|");
                        break;
                    case 12:
                        Console.Write("-");
                        break;
                    case 25:
                        Console.Write("0");
                        break;
                    case 50:
                        Console.Write("X");
                        break;
                }

            }
            Console.WriteLine();
        }

        sum_1 = tictacto[0, 1] + tictacto[0, 5] + tictacto[0, 9];
        sum_2 = tictacto[2, 1] + tictacto[2, 5] + tictacto[2, 9];
        sum_3 = tictacto[4, 1] + tictacto[4, 5] + tictacto[4, 9];

        sum_4 = tictacto[0, 1] + tictacto[2, 1] + tictacto[4, 1];
        sum_5 = tictacto[0, 5] + tictacto[2, 5] + tictacto[4, 5];

     

    세 줄을 맞췄을 때 기능을 구현 하기 위해 다 더하는 방식을 사용 했다.

     

        sum_6 = tictacto[0, 9] + tictacto[2, 9] + tictacto[4, 9];

        sum_7 = tictacto[0, 1] + tictacto[2, 5] + tictacto[4, 9];
        sum_8 = tictacto[0, 9] + tictacto[2, 5] + tictacto[4, 1];

     

     

    세 개의 합이 승리와 패배에 알맞을 경우 각각의 코드가 실행 되게 작성 했다. 그리고 bool형 변수를 false로 변경 해 반복을 멈추게 했다.
        if (sum_1 == 75 || sum_2 == 75 || sum_3 == 75 || sum_4 == 75 || sum_5 == 75 || sum_6 == 75 || sum_7 == 75 || sum_8 == 75)
        {
            Console.WriteLine("축하 합니다. 당신의 승리");
            clear = false;
        }
        else if (sum_1 == 150 || sum_2 == 150 || sum_3 == 150 || sum_4 == 150 || sum_5 == 150 || sum_6 == 150 || sum_7 == 150 || sum_8 == 150)
        {
            Console.WriteLine("안쓰럽네요. 당신의 패배");
                clear = false;
        }
        else
        {
            Console.WriteLine();                  승리와 패배 둘 다 실행 되지 않으면 다시 그림판을 만들게 했다.
            Console.WriteLine();
            Console.WriteLine("숫자를 선택 하세요.");
            Console.Write("당신의 선택 : ");
            select = int.Parse(Console.ReadLine());             플레이어와 컴퓨터가 숫자를 선택 하는 구간이다.
            Console.Clear();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            set.Remove(select);
            if (set.Count > 0)
            {
                int randomIndax = random.Next(set.Count);
                computer = set[randomIndax];
                set.RemoveAt(randomIndax);
            }
            Console.WriteLine("당신의 선택 : " + (select) + "       컴퓨터의 선택 : " + (computer));
            Console.WriteLine();
            Console.WriteLine();       그림 위에 무엇을 선택 했는지 알려주는 글도 추가 했다.
        }
    }
    while (clear);

     

    완성 한 코드.

    시작 했을 때
    게임 플레이 중
    게임 끝났을 때

     

     

    미구현 : 무승부일 때 종료 하게 해야한다.. 후 애초에 시작을 잘 못 한 것 같아서 무승부 어떻게 해야 할지 고민을 좀 해야 한다.

     

    오류경험 : 컴퓨터가 선택 할 리스트가 없으면 생기는 오류가 있었다.

    if 조건문을 사용 해서 리스트가 없으면 실행 하지 않게 해서 오류를 해결 했다.

     

            if (set.Count > 0)
            {
                int randomIndax = random.Next(set.Count);
                computer = set[randomIndax];
                set.RemoveAt(randomIndax);
            }

     

    느낀점: 배열 리스트 등 여러가지 기능들이 있다는 걸 알고 질문을 통해 많은 지식을 얻게 되었다. 

    잊지 말고 간직 하자. 그리고 어떠한 방법을 할려고 할 때 어떻게 해야 할지 생각이 엄청 안 떠오른 다는 걸 알았다.

    이제 3주차 강의로 간다... 무승부는 어떻게 하징

     

    ============= 2024년 4월 23일

    숫자판에 값을 다 더했을 때의 값을 이용 해서 무승부를 구현 했다. 

    내가 먼저 시작 하고 컴퓨터가 후순위라면 내가 5번 컴퓨터가 4번이다. 

    내가 선택 했을 때의 숫자가 25가 되고, 컴퓨터가 선택 하면 150이 되게했다. (50으로 하니, 자잘한 오류 생겨서 그냥 크게 했다.)

     

    그래서 25* 5 = 125, 150*4 = 600 총 725로 다 더한 값이 725가 되면 무승부가 되게 했다.

     

        else if (tictacto[0, 1] + tictacto[0, 5] + tictacto[0, 9]+ tictacto[2, 1] + tictacto[2, 5] + tictacto[2, 9]+ tictacto[4, 1] + tictacto[4, 5] + tictacto[4, 9] == 725)
        {
            Console.WriteLine();
            Console.WriteLine("무승부!");
            clear = false;
        }

     

    구현 된 모습

     

    이렇게 야매로 하면 안 될텐데.., 지금은 쉬간이 부족 하다. 한 줄 맞췄을 때를 어떻게 구현 하는지에 대해서도 오래 걸렸다..

    다음엔 야매로 하지 말고 제대로 된 로직을 구성 해보도록 하자.

Designed by Tistory.