[공부]261011~12 틱택토 1차
- 3×3 보드에 X와 O를 번갈아 놓는 콘솔 틱택토 게임을 구현함.
- 개인 과제이며, 본인이 작성한 코드의 주요 흐름과 승부 판정 방법을 설명할 수 있어야 함.
공통 게임 규칙
- 보드는 3×3이며, 빈칸은
.으로 표시함. - X가 먼저 시작하고, X와 O가 한 번씩 번갈아 둠.
- 빈칸에만 표시할 수 있으며, 이미 놓인 X나 O는 바뀌지 않음.
- 같은 표시 3개가 가로·세로·대각선 중 한 줄을 이루면 해당 플레이어가 승리함.
- 승자가 없는 상태에서 9칸이 모두 차면 무승부임. 마지막 빈칸에 놓아 승리한 경우에는 무승부가 아님.
- 승리 또는 무승부가 결정되면 최종 보드와 결과를 보여 주고, 그 판의 추가 입력과 컴퓨터 행동을 멈춤.
using System;
Console.WriteLine("=== 틱택토 게임 · 1단계 ===");
Console.WriteLine("두 사람이 X와 O를 번갈아 놓습니다. X가 먼저 시작합니다.");
Console.WriteLine();
Console.WriteLine("위치 번호:");
int show=0;
int round = 1;
bool isFull = true;
string[] position = { ".", ".", ".", ".", ".", ".", ".", ".", ".", };
- 시작 부분 기본적인 텍스트를 입력합니다
- for문에 사용할 show
- 라운드 수를 표시할 round
- 공간 전부 찼는지를 표시하는 isFull
- 틱택토 공간을 만드는 postion 선언하고 . 으로 초기화
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
Console.Write($"{show+1}");
show++;
if (col >= 2)
{
break;
}
Console.Write(" | ");
//position[show] += ".";
}
Console.WriteLine();
if (row >= 2)
{
break;
}
Console.WriteLine("---------");
}
Console.WriteLine();
Console.WriteLine("현재 보드:");
show = 0;//왜
무엇인가요?

- 위치 번호를 그려주는 부분입니다
- 이중 for문으로 3*3 칸을 구현합니다
- Console.Write(" | "); 끝날때마다 |를 붙여 칸 구분하고
- Console.WriteLine("---------"); 행이 바뀔때마다 - 구분합니다
//최초 그림
#region
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
//Console.Write($"{position[show]}"); //실패
Console.Write($"{position[show]}");
show++;
//Console.Write($"{position[show] += (show+1)}"); //실패
//이걸 배열선언해서 채워넣은다음 바꿔야할거같은데
//0번배열에 1, 1번에 2
//그럼 점 부분에 숫자부터 해볼까
if (col >= 2)
{
break;
}
Console.Write(" | ");
}
Console.WriteLine();
if (row >= 2)
{
break;
}
Console.WriteLine("---------");
}
#endregion
무엇인가요?

- 입력 전에 현재 칸을 최초로 표시해주는 부분입니다
- 화면을 클리어 한 후엔 사라집니다
while (round < 10)
{
void TicTacToe(int num)
{
Console.Clear();
show = 0;
//재화면
Console.WriteLine("=== 틱택토 게임 · 1단계 ===");
Console.WriteLine("두 사람이 X와 O를 번갈아 놓습니다. X가 먼저 시작합니다.");
Console.WriteLine();
Console.WriteLine("위치 번호:");
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
Console.Write($"{show + 1}");
show++;
if (col >= 2)
{
break;
}
Console.Write(" | ");
//position[show] += ".";
}
Console.WriteLine();
if (row >= 2)
{
break;
}
Console.WriteLine("---------");
}
Console.WriteLine();
Console.WriteLine("현재 보드:");
show = 0;//왜
//TicTacToe(0);//일단 실행
position[num - 1] = (round % 2 == 0 ? "O" : "X");
show = 0;//왜
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
//Console.Write($"{position[show]}"); //실패
Console.Write($"{position[show]}");
show++;
//Console.Write($"{position[show] += (show+1)}"); //실패
//이걸 배열선언해서 채워넣은다음 바꿔야할거같은데
//0번배열에 1, 1번에 2
//그럼 점 부분에 숫자부터 해볼까
if (col >= 2)
{
break;
}
Console.Write(" | ");
}
Console.WriteLine();
if (row >= 2)
{
break;
}
Console.WriteLine("---------");
}
}
무엇인가요?
- 본격적으로 입력받는 부분입니다
- while (round < 10) 입력받는 글자를 매개변수로 받아 배열을 채워야합니다
- void TicTacToe(int num) 어려번 입력받을때마다 화면을 그려야해서 반복문 안에 함수를 넣습니다
- position[num - 1] = (round % 2 == 0 ? "O" : "X"); 현재 입력 횟수에 따라 O턴인지 X턴인지 구분합니다
- for (int row = 0; row < 3; row++) 왜 for문이 두개인가요?
- 화면을 입력할때마자 지우기 때문에 위에 숫자보드와 아래 입력보드를 동시에 써야하기 때문입니다
#region Win Test
//내가보기엔 여기같은데 입력이 다 끝나고 나서 검사하는거
//가로
if ((position[0] == position[1] && position[1] == position[2]) && (position[0] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[0] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
else if ((position[3] == position[4] && position[4] == position[5]) && (position[3] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[3] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
else if ((position[6] == position[7] && position[7] == position[8]) && (position[6] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[6] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
//세로
else if ((position[0] == position[3] && position[3] == position[6]) && (position[0] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[0] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
else if ((position[1] == position[4] && position[4] == position[7]) && (position[1] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[1] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
else if ((position[2] == position[5] && position[5] == position[8]) && (position[2] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[2] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
//대각선
else if ((position[0] == position[4] && position[4] == position[8]) && (position[0] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[0] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
else if ((position[2] == position[4] && position[4] == position[6]) && (position[2] != "."))
{
//값이 같아야하니 이거도 하나만 검사하면 되겠지?
if (position[2] == "X")
{
Console.WriteLine($"플레이어 X 승리!");
break;
}
else
{
Console.WriteLine($"플레이어 O 승리!");
break;
}
}
isFull = true;
for (int i = 0; i < position.Length; i++)
{
if (position[i] == ".")
{
isFull = false;
break;
}
}
if (isFull)
{
Console.WriteLine("무승부입니다!");
break;
}
#endregion
무엇인가요?
-
승리 조건 및 무승부를 파악하는 부분입니다
-
입력후에 탐지해야해서 입력부분 아래에 있습니다
-
틱택토처럼 승리 가짓수가 적은게임이라 직접 만들어 넣었습니다
-
(position[3] position[4] && position[4] position[5]) 해당 배열이 모두 같은지 검사하고
-
(position[3] != ".") 칸이 채워져있음 두가지 모두를 충족해야하며
-
if (position[3] == "X") 그 칸이 X인지 O인지 구분해서 승리 플레이어를 확인합니다
isFull = true;
for (int i = 0; i < position.Length; i++)
{
if (position[i] == ".")
{
isFull = false;
break;
}
}
if (isFull)
{
Console.WriteLine("무승부입니다!");
break;
}
- 현재 배열을 모두 돌면서 하나라도 . 가 있으면 비워짐 상태입니다
- 비워진상태라면 break 하며 아니라면 무승부를 띄우고 break합니다
Console.WriteLine();
Console.WriteLine($"플레이어 {(round % 2 == 0 ? "O" : "X")} 의 차례입니다.");
Console.WriteLine($"위치를 선택하세요 (1~9):");
string input = Console.ReadLine();
// 숫자 이외의 입력-> 숫자로 위치를 입력하세요.
// 잘못된 숫자 입력 -> 1부터 9까지의 번호를 입력하세요.
// 이미 입력된곳은 -> 이미 선택한 칸입니다. 빈칸을 선택하세요.
if (int.TryParse(input, out int result))
{
//result가 0보다 크고 10보다 작아야함 (1~9)
if (result > 0 && result < 10) //이론상 이러면 1~9 범위 아니면 false 나와야하는데...
{
if (position[result-1] == ".") //숫자인지 아닌지 비교를 어캐하지?
{
TicTacToe(result);
round++;
}
else
{
Console.WriteLine($"이미 선택한 칸입니다. 빈칸을 선택하세요.");
continue;
}
}
else
{
Console.WriteLine($"1부터 9까지의 번호를 입력하세요.");
continue;
}
}
else
{
Console.WriteLine($"숫자로 위치를 입력하세요.");
continue;
}
}
무엇인가요?
- 입력 부분입니다
- Console.WriteLine($"플레이어 {(round % 2 == 0 ? "O" : "X")} 의 차례입니다."); 현재 라운드를 계산해 O의 턴인지 X의 턴인지 확인합니다
- string input = Console.ReadLine();
(중대사항) 숫자 입력만 받도록 해야하기 때문에 처음은 string 값으로 줍니다
- if (int.TryParse(input, out int result)) 입력문자가 숫자인지 문자인지 체크합니다
- if (result > 0 && result < 10) 입력숫자가 1~9 사이인지 체크합니다
- if (position[result-1] == ".") .이 있는칸은 입력받지 않은 칸이기에 해당 입력부분이 비어있으면
TicTacToe(result); 해서 다시 판을 그리고 round++; 라운드 수를 증가시킵니다
- 소요시간 - 4시간
-
AI 질문? - 함
종합평가: FFF
- AI 질문 10회 이상
- 풀이 시간 2시간 이상
- 이해가 어려움



