문제
틱-택-토(Tic-Tac-Toe)는 두 명이 번갈아가며 O 와 X 를 3x3 보드에 써서 같은 글자를 가로, 세로 혹은 대각선 상에 놓이도록 하는 놀이이다.
아래 예시는 먼저 놓은 X가 이기는 경우이다.

게임 방법은 아주 간단하다.
- 종이 위에 가로줄과 세로줄을 각각 2개씩 긋는다.
- 이렇게 생긴 9칸 위에 1P는 O , 2P는 X 를 번갈아가며 그린다.
- 먼저 O 나 X 를 3개가 직선으로 이어지게 만들면 승리한다.
컴퓨터와 사용자가 번갈아 Turn을 수행하여 승패를 가릴 수 있는 Tic Tac Toe 게임을 작성하라.
규칙
- 3 x 3 배열을 사용하여 판(board)를 그린다.
- 사용자 - 컴퓨터 - 사용자 순으로 각각의 Turn을 수행한다.
- Turn에서는 [X 좌표, Y 좌표] 순으로 숫자를 입력하여 수행한다. 예를 들어, 프롬프트에서 1, 1 과 같이 입력하면 board의 가운데 칸에 Turn 수행자의 마크를 표시한다.
| |
-----------
| O |
-----------
| |
- 수행하는 사용자는 X 또는 O 로 표시된 칸에 마크할 수 없다. 마크할 경우 예외 처리 방식으로 오류를 처리한다.
- 컴퓨터는 컴퓨터의 Turn에 빈 칸 중 하나에 Random 방식으로 마크한다.
- 각 동작은 적절히 분해하여 메소드로 만들어 수행한다.
코드
/*
* 1. 사용자 턴 -> userTurn()
* 2. 컴퓨터 턴 -> computerTurn()
* 3. 빙고 판별 -> isBingo()
* 4. 빙고보드 보여주기 -> printBoard()
*/
import java.util.*;
public class TicTacToe {
static String[][] board = {
{" ", " ", " "},
{" ", " ", " "},
{" ", " ", " "}
};
static boolean[][] visited = new boolean[3][3];
static boolean bingo = false;
static Scanner scanner = new Scanner(System.in);
public static void userTurn() { // 사용자 턴
boolean correctInput = false;
do{
try {
System.out.print("Enter user coordinates. ex) 0,1 >> ");
String input = scanner.nextLine();
String[] splitInput = input.split(",");
int x = Integer.parseInt(splitInput[0]);
int y = Integer.parseInt(splitInput[1]);
if ( x<0 || x>2 || y<0 || y>2 || board[x][y] != " " || visited[x][y] == true ){
throw new Exception("your input is incorrect");
}
else{
board[x][y] = "O";
visited[x][y] = true;
correctInput = true;
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
} while(!correctInput);
}
public static void computerTurn() { // 컴퓨터 턴
Random random = new Random();
boolean emptySpace = false;
while(!emptySpace) {
int x = random.nextInt(3);
int y = random.nextInt(3);
if (!visited[x][y]) {
emptySpace = true;
visited[x][y] = true;
board[x][y] = "X";
}
}
}
public static void isBingo() { // 빙고 판별
if(!bingo) {
for (int i=0; i<3; i++) { // 가로 빙고
int j=0;
if ((board[i][j] == "O" || board[i][j] == "X") && (board[i][j] == board[i][j+1]) && (board[i][j+1] == board[i][j+2]) && (board[i][j] == board[i][j+2])){
bingo = true;
if(board[i][j] == "O") {
System.out.println("User Win!");
}
else{
System.out.println("Computer Win!");
}
return;
}
}
for (int j=0; j<3; j++) { // 세로 빙고
int i=0;
if ((board[i][j] == "O" || board[i][j] == "X") && (board[i][j] == board[i+1][j]) && (board[i+1][j] == board[i+2][j]) && (board[i][j] == board[i+2][j])) {
bingo = true;
if(board[i][j] == "O") {
System.out.println("User Win!");
}
else{
System.out.println("Computer Win!");
}
return;
}
}
// 대각선 빙고1
if ((board[1][1] == "O" || board[1][1] == "X") && (board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[0][2] == board[2][0])) {
bingo = true;
if(board[1][1] == "O") {
System.out.println("User Win!");
}
else{
System.out.println("Computer Win!");
}
return;
}
// 대각선 빙고2
if ((board[1][1] == "O" || board[1][1] == "X") && (board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] == board[2][2])) {
bingo = true;
if(board[1][1] == "O") {
System.out.println("User Win!");
}
else{
System.out.println("Computer Win!");
}
return;
}
}
}
public static void printBoard() { // 빙고보드 프린트
System.out.println(" " + board[0][0] + " | " + board[0][1] + " | " + board[0][2]);
System.out.println("-----------");
System.out.println(" " + board[1][0] + " | " + board[1][1] + " | " + board[1][2]);
System.out.println("-----------");
System.out.println(" " + board[2][0] + " | " + board[2][1] + " | " + board[2][2]);
}
public static void main(String[] args) {
while(!bingo) {
userTurn();
if(bingo) break;
computerTurn();
if(bingo) break;
printBoard();
isBingo();
}
scanner.close();
}
}
class-programming_with_java/Module 06 배열/homework/tictactoe.adoc at master · gikpreet/class-programming_with_java
Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.
github.com
'코딩 문제' 카테고리의 다른 글
[코딩 문제] 문자열 반전 (0) | 2024.08.30 |
---|---|
[코딩 문제] Palindrom (0) | 2024.08.23 |
[코딩 문제] 연도 일자를 월/일로 계산하기 (0) | 2024.08.23 |
[코딩 문제] 미로 탐색 (0) | 2024.08.23 |
[코딩 문제] Anagram (0) | 2024.08.23 |