삶의 공유
[C#활용]Tic Tae Toe Game 만들기 본문
안녕하세요 ! 이번 포스팅에서는 C# 과 Visual Studio를 이용해서 틱택토 게임(Tic Tae Toe Game)을 만들어보고자 합니다.
우선 이 Tic Tae Toe Game 이 무엇인지 알아보겠습니다.
위 사진을 보시면 바로 감을 잡으실수 있으실 것 입니다. 오목과 아주 유사한 형태인 추상전략 보드게임입니다. 종이와 펜만 있으면 어디서든 할 수 있는 간단한 놀이이며, 심지어 종이나 펜이 없어도 모래 위에 그리거나, 돌이나 나뭇잎 같은 것들로 모양만 갖추면 언제 어디서나 할 수 있습니다. 판 크기는 3×3의 정사각형인 2인 전용 게임이고. 가로 세로 대각선으로 3개가 이어지면 이기는 게임 입니다.
참 간단한 게임이죠? 이 게임을 C#을 이용해서 한번 만들어보겠습니다.
Visual Studio를 열어서 새프로젝트 만들기에서 C# 콘솔 애플리케이션을 선택해줍니다.
프로젝트 이름을 설정해주시고, 콘솔게임이라 프레임워크는 크게 중요하지 않으니 .NET Core 3.1로 설정 해줍니다.
1. 게임판 만들기
자 이제 먼저 SetFiled()함수를 만들어 틱택토 게임의 판을 만들어보겠습니다.
아래의 숫자들이 현재 1~3이 반복되어 있는데 이것을 1~9로 변경하고 사용자가 선택한 숫자를 O, X로 바꾸면서 게임이 이뤄지게 할 것입니다.
함수 구현 코드 입니다.
public static void SetFeld()
{
/ 1st Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", 1,2,3);
Console.WriteLine("______|_______|______");
// 2nd Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", 1, 2, 3);
Console.WriteLine("______|_______|______");
// 3rd Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", 1, 2, 3);
Console.WriteLine(" | | ");
}
위의 1~3 반복되는 숫자를 1~9로 변경 해보겠습니다. 메뉴얼로 1~9까지 입력하는 것이 아니라 playerFiled라는 2차원 배열을 만들어 각 필드의 값들이 게임판의 숫자로 대응될 수 있는 방법 입니다.
먼저 2차원 배열인 playerField를 만들어 보겠습니다.
static char[,] playerField =
{
{'1', '2', '3' },
{'4', '5', '6' },
{'7', '8', '9' },
};
자 이렇게 만든 2차원 배열을 위의 게임판인 SetFiled 의 1,2,3 을 지우고 2차원 배열을 넣어보겠습니다.
// 1st Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", playerField[0,0], playerField[0, 1], playerField[0, 2]);
Console.WriteLine("______|_______|______");
// 2nd Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", playerField[1, 0], playerField[1, 1], playerField[1, 2]);
Console.WriteLine("______|_______|______");
// 3rd Line
Console.WriteLine(" | | ");
Console.WriteLine(" {0} | {1} | {2}", playerField[2, 0], playerField[2, 1], playerField[2, 2]);
Console.WriteLine(" | | ");
2. 사용자와 그에 따른 선택에 따라 O, X로 변경 하는 구문 만들기
자 Main구문에 먼저 3가지 변수를 만들겠습니다.
int player = 2; -> player 는 사용자를 선택하는 변수
int input = 0; -> Input은 사용자가 1~9까지 숫자중에 하나를 선택하는 변수
bool inputCorrect = true; -> inputCorrect는 사용자가 고른 숫자가 맞는 건지 확인해주는 변수
입니다. 자 이것을 가지고 함수를 하나 더 만들겠습니다. EnterXorO(int player, int input) 함수 입니다. 2개의 매개변수를
받아서 사용자에 따라 O, X로 변경하는 함수를 만들겠습니다.
player=1이면 X, 2이면 O를 할당하고 그거를 switch 구문으로 input 매개변수를 받아서 사용자가 입력한 숫자에 playerFiled가 대응되는 값을 O 또는 X로 변경 해주는 것 입니다.
public static void EnterXorO(int player, int input)
{
char playerSign = ' ';
if (player == 1)
playerSign = 'X';
else if (player == 2)
playerSign = 'O';
switch (input)
{
case 1: playerField[0, 0] = playerSign; break;
case 2: playerField[0, 1] = playerSign; break;
case 3: playerField[0, 2] = playerSign; break;
case 4: playerField[1, 0] = playerSign; break;
case 5: playerField[1, 1] = playerSign; break;
case 6: playerField[1, 2] = playerSign; break;
case 7: playerField[2, 0] = playerSign; break;
case 8: playerField[2, 1] = playerSign; break;
case 9: playerField[2, 2] = playerSign; break;
}
}
자 이렇게 사용자가 입력한 변수를 O, X 로 변경해주는 함수를 구현하였습니다.
3. 사용자가 입력한 숫자가 이전에 입력된 숫자인지 확인하는 구문
If ~ else 구문을 이용해서 playerFiled의2차원 배열의 각 항목이 1~9 숫자로되어있는지 Check 하고 숫자로 되어 있다면
inputCorrect = true 값을 넣어줘서 다음 턴으로 넘어가게 설정합니다.
그리고 제대로 된 숫자값이 입되지않는다면 잘못된 숫자가입력되었다는 구문을 띄우고 inputCorrect 변수에 false값을 넣어주어 턴이 넘어가지않게 합니다. Do ~ While 구문에서 whilerk값에 true 값이 입력되어 do 구문을 다시 수행 하는 알고리즘입니다.
do
{
Console.Write("\nPlayer {0}: Choose your field!", player);
try
{
input = Convert.ToInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("Please enter a number");
}
// Check Selecposition
if ((input == 1) && (playerField[0, 0] == '1'))
inputCorrect = true;
else if ((input == 2) && (playerField[0, 1] == '2'))
inputCorrect = true;
else if ((input == 3) && (playerField[0, 2] == '3'))
inputCorrect = true;
else if ((input == 4) && (playerField[1, 0] == '4'))
inputCorrect = true;
else if ((input == 5) && (playerField[1, 1] == '5'))
inputCorrect = true;
else if ((input == 6) && (playerField[1, 2] == '6'))
inputCorrect = true;
else if ((input == 7) && (playerField[2, 0] == '7'))
inputCorrect = true;
else if ((input == 8) && (playerField[2, 1] == '8'))
inputCorrect = true;
else if ((input == 9) && (playerField[2, 2] == '9'))
inputCorrect = true;
else
{
Console.WriteLine("\n 잘못된 숫자가 입력되었습니다. 다른 위치의 숫자를 입력해주세요");
inputCorrect = false;
}
} while (!inputCorrect);
4. 결과 체크
자 이제 막바지 입니다. 가로, 세로 대각선으로 3개 연속으로 이어지면 승자가 될 수 있는 코드를 만들어 보겠습니다.
이 부분은 간단 합니다. playerChars라는 char 배열을만들고 foreach 구문을 통해서 그거를 playerField의2차원 배열에 각각 승리 Case에 대해서 If 구문으로 Check 하는 구조로 짜면 됩니다.
코드를 보면 다음과 같습니다.
char[] playerChars = { 'X', 'O' };
foreach(char playerChar in playerChars)
{
if(((playerField[0,0] == playerChar) && (playerField[0, 1] == playerChar) && (playerField[0, 2] == playerChar))
|| ((playerField[1, 0] == playerChar) && (playerField[1, 1] == playerChar) && (playerField[1, 2] == playerChar))
|| ((playerField[2, 0] == playerChar) && (playerField[2, 1] == playerChar) && (playerField[2, 2] == playerChar))
|| ((playerField[0, 0] == playerChar) && (playerField[1, 0] == playerChar) && (playerField[2, 0] == playerChar))
|| ((playerField[0, 1] == playerChar) && (playerField[1, 1] == playerChar) && (playerField[2, 1] == playerChar))
|| ((playerField[0, 2] == playerChar) && (playerField[1, 2] == playerChar) && (playerField[2, 2] == playerChar))
|| ((playerField[0, 0] == playerChar) && (playerField[1, 1] == playerChar) && (playerField[2, 2] == playerChar))
|| ((playerField[0, 2] == playerChar) && (playerField[1, 1] == playerChar) && (playerField[2, 0] == playerChar))
)
{
if (player == 'X')
{
Console.WriteLine("player 1가 승리하였습니다!");
}
else
{
Console.WriteLine("player 2가 승리하였습니다!");
}
break;
}
}
비기는 경우는 먼저 1~9까지 숫자를 전부 채우는데 위의 승자 체크하는 구문에 속하지않으면 Draw이벤트를 발생 시킵니다.
즉 최대10번을 선택 할 수 있게 되는 것 입니다.
그래서 아래와 같이 turns 변수를 만들고
static int turns = 0;
SetField()함수 안에 turns++; 구문을 넣어서 카운트가 오르게 구문을 작성합니다. 마지막으로 If 구문으로 turns값이 10이면 Draw 이벤트를 발생 시켜주는 코드를작성해줍니다.
else if (turns == 10)
{
Console.WriteLine("\n Draw!");
Console.WriteLine("Please press Any key to reset the game!");
Console.ReadKey();
ResetField();
break;
}
5. 게임판 초기화
게임이 끝나고 나면 다시 처음과 동일한 게임판이 될 수 있도록 구현 하는 것 입니다. 이것도 간단합니다.
먼저 이전에 playerField만든 2차원 배열과 동일한 값을 playerFieldInitial라는 2차원 배열 변수 이름으로 대입합니다.
static char[,] playerFieldInitial =
{
{'1', '2', '3' },
{'4', '5', '6' },
{'7', '8', '9' },
};
이제 ResetField() 함수를 만들어 playerField 값에 초기 상태인 playerFieldInitial 변수를 대입시켜주어 초기화를 시킵니다.
그리고 SetFeld() 함수를 통해 게임판을 다시 로딩시키는 구조 입니다.
public static void ResetField()
{
playerField = playerFieldInitial;
turns = 0
SetFeld();
}
이제 위에 작성한 코드들이 잘 동작하는지를 테스트 해보겠습니다.
승리 체크 입니다. 아래와 같이 승리 Check도 잘 되는 것을 볼 수 있습니다.
엔터를 누르면 아래와 같이 다시 잘 초기화 된 것도 볼 수 있습니다.
이번에는 비기는 결과 Check가 잘 되는지 확인해보겠습니다. 잘 동작하는 것을 확인 할 수 있습니다.
지금 까지 C#을 이용해서 틱택토 콘솔 게임을 만들어보았습니다. 공부한 언어를 이용해서 이렇게 여러 예제들, 게임들을 만들어 보면서 지식을 써먹어 보아야 더욱더 오래 머리속에 남고 응용도 더 많이 할 수 있는 것같습니다.
전체 코드는 남기지는 않았지만, 여러분들 께서 위의 내용을 한번 읽어보시고 스스로 만들어보시는 것을 추천해드립니다.
※ 만약 필요하시면 메일을 댓글로 남겨주시면 전체 코드는 전달해드리겠습니다.
지금 까지 읽어 주셔서 감사합니다.
'Programing > C#' 카테고리의 다른 글
[Winform] C# Keydown Event 동작 안함 Issue(KeyPreview) (0) | 2024.09.09 |
---|---|
[개발환경] 맥북 Visual Studio Code에 C# 환경 설정하기 (0) | 2022.02.10 |