C#

C# 콘솔 틱택토 게임

작성자 정보

  • 마스터 작성
  • 작성일

컨텐츠 정보

본문

 C# 콘솔 틱택토 게임 만들기

 

1.전체 코드

string[] Area = {"-","-","-","-","-","-","-","-","-"};

bool isPlayer = true;


Console.WriteLine("\t틱택토 게임");

Console.WriteLine("");

Console.WriteLine("0,0     |0,1    |0,2");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("--------------------------");

Console.WriteLine("1,0     |1,1    |1,2");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("--------------------------");

Console.WriteLine("2,0     |2,1    |2,2");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("\t|\t|\t");

Console.WriteLine("");

Console.WriteLine("");



Turn(isPlayer);

void Turn(bool isPlayerTurn)

{

    if (isPlayerTurn)

    {

        Console.WriteLine("플레이어 차례입니다.");

        Console.WriteLine("선택할 좌표를 고르세요 X좌표(0,1,2)중에서");

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

        CheckNum(num1, 1);

        Console.WriteLine("선택할 좌표를 고르세요 Y좌표(0,1,2)중에서");

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

        CheckNum(num2, 2);


        selectArea(num1, num2, isPlayer);

    }

    else

    {

        Console.WriteLine("컴퓨터 차례입니다.");

        Console.WriteLine("컴퓨터가 고르고 있습니다.");

        Random random = new Random();

        int num1 = random.Next(0, 3);

        int num2 = random.Next(0, 3);

        selectArea(num1, num2, isPlayer);

    }

    

}



void selectArea(int X, int Y, bool isPlayerTurn)

{

    if(X ==0 && Y == 0)

    {

        if (Area[0] == "-")

        {

            Area[0] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if(X ==0 && Y == 1)

    {

        if (Area[1] == "-")

        {

            Area[1] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 0 && Y == 2)

    {

        if (Area[2] == "-")

        {

            Area[2] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 0)

    {

        if (Area[3] == "-")

        {

            Area[3] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 1)

    {

        if (Area[4] == "-")

        {

            Area[4] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 2)

    {

        if (Area[5] == "-")

        {

            Area[5] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 0)

    {

        if (Area[6] == "-")

        {

            Area[6] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 1)

    {

        if (Area[7] == "-")

        {

            Area[7] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 2)

    {

        if (Area[8] == "-")

        {

            Area[8] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }


    MapRender();


    if ((Area[0] == "O" && Area[1] == "O" && Area[2] == "O") || 

        (Area[3] == "O" && Area[4] == "O" && Area[5] == "O") ||

        (Area[6] == "O" && Area[7] == "O" && Area[8] == "O") ||

        (Area[0] == "O" && Area[3] == "O" && Area[6] == "O") ||

        (Area[1] == "O" && Area[4] == "O" && Area[7] == "O") ||

        (Area[2] == "O" && Area[5] == "O" && Area[8] == "O") ||

        (Area[0] == "O" && Area[4] == "O" && Area[8] == "O") ||

        (Area[2] == "O" && Area[4] == "O" && Area[7] == "O")

        )

    {

        Console.WriteLine("플레이어의 승리 입니다.");

        

    }

    else if ((Area[0] == "X" && Area[1] == "X" && Area[2] == "x") ||

        (Area[3] == "X" && Area[4] == "X" && Area[5] == "X") ||

        (Area[6] == "X" && Area[7] == "X" && Area[8] == "X") ||

        (Area[0] == "X" && Area[3] == "X" && Area[6] == "X") ||

        (Area[1] == "X" && Area[4] == "X" && Area[7] == "X") ||

        (Area[2] == "X" && Area[5] == "X" && Area[8] == "X") ||

        (Area[0] == "X" && Area[4] == "X" && Area[8] == "X") ||

        (Area[2] == "X" && Area[4] == "X" && Area[7] == "X")

        )

    {

        Console.WriteLine("컴퓨터의 승리 입니다.");

    }

    else

    {

        isPlayer = isPlayerTurn ? false : true;

        

        Turn(isPlayer);

    }

}


void MapRender()

{

    Console.Clear();

    Console.WriteLine("");

    Console.WriteLine("0,0     |0,1    |0,2");

    Console.WriteLine("   "+Area[0]+"    |   "+Area[1]+ "   |   "+Area[2]+"  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("--------------------------");

    Console.WriteLine("1,0     |1,1    |1,2");

    Console.WriteLine("   " + Area[3] + "    |   " + Area[4] + "   |   " + Area[5] + "  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("--------------------------");

    Console.WriteLine("2,0     |2,1    |2,2");

    Console.WriteLine("   " + Area[6] + "    |   " + Area[7] + "   |   " + Area[8] + "  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("");

    Console.WriteLine("");

}



    void CheckNum(int number, int type)

{

    if (number == 0 || number == 1 || number == 2) { }

    else

    {

        Console.WriteLine("잘못 고르셨습니다.");

        Console.WriteLine("다시 골라주세요");

        

        if(type == 1)

        {

            Console.WriteLine("선택할 좌표를 고르세요 X좌표(0,1,2)중에서");

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

            CheckNum(num1, type);

        }

        else

        {

            Console.WriteLine("선택할 좌표를 고르세요 Y좌표(0,1,2)중에서");

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

            CheckNum(num2, type);

        }

        

    }

}

 

 

2. 플로우 차트

2-1 플레이어 선택 

2-2 숫자를 선택 했는지 확인 (잘못 선택하였을 경우 다시 선택)

2-3 좌표값을 확인  (이미 존재하는 위치라면 다시 선택)

2-4 콘솔창 clear를 사용하여 선택한 위치에 표기 하기 

2-5 빙고가 되었는지 확인하기

2-6 턴넘기기 (반복)

2-7 랜덤으로 숫자 선택하기 (잘못 선택하였을 경우 다시 선택) 

2-8 좌표값을 확인  (이미 존재하는 위치라면 다시 선택) 

2-9 콘솔창 clear를 사용하여 선택한 위치에 표기 하기 

2-10 2-5 빙고가 되었는지 확인하기

2-11 턴넘기기 (반복)

2-12 빙고가 되었다면 승리자 표기 후 끝내기

 

 

3.코드 분석

3-1 변수 선언 

string[] Area = {"-","-","-","-","-","-","-","-","-"};   // 배열 위치 값

bool isPlayer = true;                                   // 플레이어 턴 유무

3-2 숫자를 선택했는지 확인하는 메서드

void CheckNum(int number, int type)

{

    if (number == 0 || number == 1 || number == 2) { }

    else

    {

        Console.WriteLine("잘못 고르셨습니다.");

        Console.WriteLine("다시 골라주세요");

        

        if(type == 1)

        {

            Console.WriteLine("선택할 좌표를 고르세요 X좌표(0,1,2)중에서");

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

            CheckNum(num1, type);

        }

        else

        {

            Console.WriteLine("선택할 좌표를 고르세요 Y좌표(0,1,2)중에서");

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

            CheckNum(num2, type);

        }

        

    }

}

숫자가 0,1,2 이외의 숫자 혹은 다른 문자라면 다시 선택하게 한다.

 

3-3 선택한 좌표를 확인하고 상태값을 바꾸는 메서드

void selectArea(int X, int Y, bool isPlayerTurn)

{

    if(X ==0 && Y == 0)

    {

        if (Area[0] == "-")

        {

            Area[0] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if(X ==0 && Y == 1)

    {

        if (Area[1] == "-")

        {

            Area[1] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 0 && Y == 2)

    {

        if (Area[2] == "-")

        {

            Area[2] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 0)

    {

        if (Area[3] == "-")

        {

            Area[3] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 1)

    {

        if (Area[4] == "-")

        {

            Area[4] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 1 && Y == 2)

    {

        if (Area[5] == "-")

        {

            Area[5] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 0)

    {

        if (Area[6] == "-")

        {

            Area[6] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 1)

    {

        if (Area[7] == "-")

        {

            Area[7] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }

    else if (X == 2 && Y == 2)

    {

        if (Area[8] == "-")

        {

            Area[8] = isPlayerTurn ? "O" : "X";

        }

        else

        {

            Console.WriteLine("이미 선택된 좌표 입니다. 다른 곳을 고르세요");

            Turn(isPlayerTurn);

        }

    }


    MapRender();


    if ((Area[0] == "O" && Area[1] == "O" && Area[2] == "O") || 

        (Area[3] == "O" && Area[4] == "O" && Area[5] == "O") ||

        (Area[6] == "O" && Area[7] == "O" && Area[8] == "O") ||

        (Area[0] == "O" && Area[3] == "O" && Area[6] == "O") ||

        (Area[1] == "O" && Area[4] == "O" && Area[7] == "O") ||

        (Area[2] == "O" && Area[5] == "O" && Area[8] == "O") ||

        (Area[0] == "O" && Area[4] == "O" && Area[8] == "O") ||

        (Area[2] == "O" && Area[4] == "O" && Area[7] == "O")

        )

    {

        Console.WriteLine("플레이어의 승리 입니다.");

        

    }

    else if ((Area[0] == "X" && Area[1] == "X" && Area[2] == "x") ||

        (Area[3] == "X" && Area[4] == "X" && Area[5] == "X") ||

        (Area[6] == "X" && Area[7] == "X" && Area[8] == "X") ||

        (Area[0] == "X" && Area[3] == "X" && Area[6] == "X") ||

        (Area[1] == "X" && Area[4] == "X" && Area[7] == "X") ||

        (Area[2] == "X" && Area[5] == "X" && Area[8] == "X") ||

        (Area[0] == "X" && Area[4] == "X" && Area[8] == "X") ||

        (Area[2] == "X" && Area[4] == "X" && Area[7] == "X")

        )

    {

        Console.WriteLine("컴퓨터의 승리 입니다.");

    }

    else

    {

        isPlayer = isPlayerTurn ? false : true;

        

        Turn(isPlayer);

    }

}

 

selectArea() 매서드는 크게 3개의영역으로 구분합니다.

1.선택한 좌표가 비어 있는지 확인하는 영역 

ㄴ for문으로 쉽게 하고 싶었는데 x,y값을 case로 바꾸는 방법이 생각안남

2. 콘솔창을 다시 그려주는 함수 호출

3. 빙고가 되었는지 확인하는 영역

ㄴ 플레이어 승리조건, 컴퓨터 승리조건, 긔외의 경우 턴을 넘기는 기능을 추가

 

3-4 맵을 그리는 메서드

void MapRender()

{

    Console.Clear();

    Console.WriteLine("");

    Console.WriteLine("0,0     |0,1    |0,2");

    Console.WriteLine("   "+Area[0]+"    |   "+Area[1]+ "   |   "+Area[2]+"  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("--------------------------");

    Console.WriteLine("1,0     |1,1    |1,2");

    Console.WriteLine("   " + Area[3] + "    |   " + Area[4] + "   |   " + Area[5] + "  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("--------------------------");

    Console.WriteLine("2,0     |2,1    |2,2");

    Console.WriteLine("   " + Area[6] + "    |   " + Area[7] + "   |   " + Area[8] + "  ");

    Console.WriteLine("\t|\t|\t");

    Console.WriteLine("");

    Console.WriteLine("");

}

string[] Area의 데이터를 가져와서 뿌려주는 방식을 사용했다.

 

3-5 턴을 시작하는 메서드

void Turn(bool isPlayerTurn)

{

    if (isPlayerTurn)

    {

        Console.WriteLine("플레이어 차례입니다.");

        Console.WriteLine("선택할 좌표를 고르세요 X좌표(0,1,2)중에서");

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

        CheckNum(num1, 1);

        Console.WriteLine("선택할 좌표를 고르세요 Y좌표(0,1,2)중에서");

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

        CheckNum(num2, 2);


        selectArea(num1, num2, isPlayer);

    }

    else

    {

        Console.WriteLine("컴퓨터 차례입니다.");

        Console.WriteLine("컴퓨터가 고르고 있습니다.");

        Random random = new Random();

        int num1 = random.Next(0, 3);

        int num2 = random.Next(0, 3);

        selectArea(num1, num2, isPlayer);

    }

}

지금은 바로 바로 선택되어서 컴퓨터 턴이 안보임

 

 

4.결과

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


알림 0