어느 한 교육을 듣고있다.
그 교육에서 Java를 이용하여 3x3의 틱택토(Tic Tac Toe)라는 게임을 구현해 보는것이 과제였다.
사용자의 입력을 O 컴퓨터 입력을 X로 구현하였고,
메인 메소드에서 배열을 초기화 시킨 후, 메서드 들을 이용하여 while문을 사용하여 구현하였다.
Code
import java.util.Random;
import java.util.Scanner;
public class TicTacToe {
public static void printGame(String[][] arr){
System.out.println();
System.out.println("----------------");
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr.length; j++){
System.out.print(arr[i][j]);
System.out.print(" | ");
}
System.out.println();
System.out.println("----------------");
}
}
public static void userPick(String[][] arr, int x, int y){
arr[x][y] = "O";
}
public static void computerPick(String[][] arr){
Random random = new Random();
while(true){
int x = random.nextInt(3);
int y = random.nextInt(3);
if(arr[x][y] == " "){
arr[x][y] = "X";
break;
}
if(gameIsFull(arr) == true){
break;
}
}
}
public static String gameWinner(String[][] arr){
for(int i = 0; i < arr.length; i++){
if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != " " ){
return arr[i][0];
}
if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != " " ){
return arr[0][i];
}
}
if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != " "){
return arr[0][0];
}
if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != " "){
return arr[0][2];
}
return "";
}
public static boolean gameIsFull(String[][] arr){
for(int i =0; i<arr.length; i++){
for(int j=0; j<arr.length; j++){
if(arr[i][j] == " "){
return false;
}
}
}
return true;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String[][] arr = new String[3][3];
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr.length; j++){
arr[i][j] = " ";
}
}
printGame(arr);
System.out.println();
boolean gameEnd = true;
while(gameEnd){
System.out.println("선택할 좌표(x, y)를 입력해 주세요.");
int x = scanner.nextInt();
int y = scanner.nextInt();
if(arr[x][y] != " "){
System.out.println("중복된 자리입니다.");
continue;
}
userPick(arr, x, y);
computerPick(arr);
printGame(arr);
String winner = gameWinner(arr);
if(winner.equals("O")){
System.out.println("축하합니다. 게임에서 승리하였습니다!");
gameEnd = false;
} else if(winner.equals("X")){
System.out.println("아쉽게 게임에서 패배하였습니다.");
gameEnd = false;
}
if(gameIsFull(arr) == true){
System.out.println("비겼습니다");
gameEnd = false;
}
}
}
}
메서드 설명
먼져 printGeme
라는 메서드는 메서드 이름 그대로 게임판을 계속 출력해주는 메서드이다. 게임판 이쁘게 꾸미고 그런건 못하겠다..
그 밑으로 userPick
메서드와 computerPick
메서드는 배열에 O 와 X를 추가해주는 메서드로 computerPick
메서드는 사용자가 입력하지 않은 곳에 입력해야 함으로 random과 while문을 통해 구현하였다.
그 다음 가장 고민 많이 했던 승리조건이다. 3x3 틱택톡 게임에서의 승리 조건은 가로 3줄 세로 3줄 대각선 2줄 총 8줄이다.
최대한 이 로직을 간단하게 짜보려고 생각을 많이 했다.하지만 내 머리로는 저것보다 간단하게 구현이 되질 않았다...
더 간단하게 승리조건 구현이 가능하다면 댓글로 알려주시기 바란다...
그 밑에 마지막 메서드인 gemeIsFull
이라는 메서드는 게임판이 가득차게 되면 true
를 반환하여 게임을 중지시키는 역할을 한다.
또한 3x3 틱택토 게임에서 총 9개의 말을 놓을 수 있는 판이 있고, 첫번째 유저가 5개의 말을 놓고 두번째 유저는 4개의 말을 놓게 된다.
그렇게 되면 첫번째 유저가 5개의 말을 놓은 뒤 computerPick
에서 놓을 수 있는 자리가 없기에 무한루프에 빠지게 된다.
그것을 gameIsFull
이라는 메서드를 사용하여 break문을 걸어주었고, 또한 게임 판이 가득 찼을 때 승패가 갈리지 않게된다면 비기게 되는 것으로 구현을 마무리 하였다.
찾아보니 백준에 골드5등급에 틱택토 게임이 있었다.
그 게임은 9x9의 게임인거 같은데 나중에 실력이 더 올라간다면 풀어보고싶다는 생각이 들었다.
'1.프로그래밍 > 알고리즘' 카테고리의 다른 글
[알고리즘] 백준 1065 한수 Java (0) | 2022.07.20 |
---|---|
[알고리즘] 백준 4673 셀프 넘버 Java (1) | 2022.07.19 |
[알고리즘] 백준 1110번 Java (0) | 2022.07.14 |
[알고리즘] 백준 10951번 Java (0) | 2022.07.13 |
[알고리즘] 백준 2525번 Java (0) | 2022.07.04 |