본문 바로가기

Programing/C#

[C#활용]Tic Tae Toe Game 만들기

728x90
반응형

안녕하세요 ! 이번 포스팅에서는 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 구문을 이용해서 playerFiled2차원 배열의 항목이 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 구문을 통해서 그거를 playerField2차원 배열에 각각 승리 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#을 이용해서 틱택토 콘솔 게임을 만들어보았습니다. 공부한 언어를 이용해서 이렇게 여러 예제들, 게임들을 만들어 보면서 지식을 써먹어 보아야 더욱더 오래 머리속에 남고 응용도 더 많이 할 수 있는 것같습니다.

 

전체 코드는 남기지는 않았지만, 여러분들 께서 위의 내용을 한번 읽어보시고 스스로 만들어보시는 것을 추천해드립니다. 

 

※ 만약 필요하시면 메일을 댓글로 남겨주시면 전체 코드는 전달해드리겠습니다.

 

지금 까지 읽어 주셔서 감사합니다.

 

반응형