코딩도장

tic-tac-toe game

아마존 본사 입사 문제였습니다.

tic-tac-toe는 두 명의 플레이어가 턴을 돌아가면서 1부터 9까지 포지션을 선택하는 게임 입니다. 선택된 포지션은 X나 0로 표시가 되며, 선택된 포지션은 다시 선택할 수가 없습니다. 게임 그리드는 3*3으로 다음과 같습니다.


 * * 
 1 * 2 * 3 
 * * 
 * * 
 4 * 5 * 6 
 * * 
 * * 
 7 * 8 * 9 
 * *

가로 세로 대각선으로 먼저 세 줄을 연속으로 만드는 플레이어가 우승하게 되며 무승부인 경우도 생깁니다. (매 턴마다 포지션을 입력해야 하지만, 출력은 게임이 끝이 났을 때만 하셔도 됩니다)

입력의 예:


Player 1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9):


출력의 예:


 * * 
 X * X * 0 
 * * 
 * * 
 X * 0 * 6 
 * * 
 * * 
 X * 8 * 9 
 * *

Win playear is: player 1


sort
(追記) (追記ここまで)
댓글 작성은 로그인이 필요합니다.
이거 빙고게임이라고 생각하면 되나요? - 김 한길, 2014年12月05日 22:58 M D
네 ᄒ 3*3 빙고게임이라고 생각하시면 됩니다. - Straß Böhm Jäger, 2015年05月15日 08:06 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

2개의 풀이가 있습니다.

자바로 풀어봤습니다.

import java.util.Scanner;
public class RealTest { 
 // 판단 
 public static int whoIsWinner(int count, String check, int winner) { 
 if(count==3&check.equals("X")) {
 winner = 1;
 }else if(count==3&check.equals("O")) {
 winner = 2;
 }
 return winner;
 }
 // 이긴 사람이 있는가?
 public static int answerResult(String[][] ticTacToe, int player) {
 int winner = 0;
 String[] checkList = {"X", "O"};
 // 행 판단
 for(String check : checkList) {
 for(int i=0; i<3; i++) {
 int count = 0;
 for(int j=0; j<3; j++) {
 if(ticTacToe[i][j].equals(check)){
 count++;
 }
 }
 winner = whoIsWinner(count, check, winner);
 }
 }
 // 열 판단
 for(String check : checkList) {
 for(int j=0; j<3; j++) {
 int count = 0;
 for(int i=0; i<3; i++) {
 if(ticTacToe[i][j].equals(check)){
 count++;
 }
 }
 winner = whoIsWinner(count, check, winner);
 }
 }
 // 대각선 판단
 for(String check : checkList) {
 int countLeft = 0, countRight = 0;
 for(int i=0; i<3; i++) {
 if(ticTacToe[i][i].equals(check)) {
 countLeft++;
 }
 if(ticTacToe[i][2-i].equals(check)) {
 countRight++;
 }
 }
 winner = whoIsWinner(countLeft, check, winner);
 winner = whoIsWinner(countRight, check, winner);
 }
 return winner;
 }
 // 해당 원소가 들어있는가? & 있으면 표시
 public static boolean checkContain(String[][] ticTacToe, String selectedElement, int player) {
 boolean result = false;
 for(int i=0; i<3; i++) {
 for(int j=0; j<3; j++) {
 if(ticTacToe[i][j].equals(selectedElement)) {
 result = true;
 if(player==1) {
 ticTacToe[i][j] = "X";
 }else {
 ticTacToe[i][j] = "O";
 }
 }
 }
 }
 return result;
 }
 // 남은 원소 출력
 public static void printRemaining (String[][] ticTacToe, int player) {
 String remaining = "";
 for(int i=0; i<3; i++) {
 for(int j=0; j<3; j++) {
 if((ticTacToe[i][j].equals("X")==false)&(ticTacToe[i][j].equals("O")==false)) {
 remaining += " "+ticTacToe[i][j]+",";
 }
 }
 }
 remaining = remaining.substring(0, remaining.length()-1);
 System.out.printf("Player %d's turn\n", player);
 System.out.printf("please type a position (available position(s) are %s):", remaining);
 }
 // 결과 출력
 public static void painting(String[][] ticTacToe) {
 for(int i=0; i<3; i++) {
 for(int j=0; j<3; j++) {
 if(j!=2) {
 System.out.print(" *");
 }else {
 System.out.print(" ");
 }
 }
 System.out.println();
 for(int j=0; j<3; j++) {
 if(j!=2) {
 System.out.printf(" %s *",ticTacToe[i][j]);
 }else {
 System.out.printf(" %s ",ticTacToe[i][j]);
 } 
 }
 System.out.println();
 for(int j=0; j<3; j++) {
 if(j!=2) {
 System.out.print(" *");
 }else {
 System.out.print(" ");
 }
 }
 System.out.println();
 }
 System.out.println();
 }
 // 메인 
 public static void main(String[] args) {
 Scanner scan = new Scanner(System.in);
 // 게임 시작 전 세팅
 String[][] ticTacToe = {{"1", "2", "3"}, {"4", "5", "6"}, {"7" ,"8" ,"9"}};
 System.out.println("Game Start!");
 painting(ticTacToe);
 // 시작 
 int player = 1;
 for(int i=1; i<=9; i++) {
 while(true) {
 printRemaining(ticTacToe, player);
 String selectedElement = scan.next();
 boolean isContain = checkContain(ticTacToe, selectedElement, player);
 if(isContain==false) {
 System.out.println("The element does not exist. Please re-enter.\n");
 continue;
 }else {
 break;
 }
 }
 System.out.println();
 painting(ticTacToe);
 int winner = answerResult(ticTacToe, player);
 if(winner!=0) {
 System.out.printf("Game over! Winner is player %d\n", winner);
 break;
 }else if(i==9&&winner==0) {
 System.out.println("Game over! draw! \n");
 }
 // 플레이어 차례 선정
 if(player==1) {
 player=2;
 }else {
 player=1;
 }
 }
 }
}
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java 로 풀어봤습니다.

n * n 가능하도록 만들어봤습니다. 랜덤입력 방식으로 처리됩니다.

n : board 크기 range : board 인덱스 범위 pickedSize : 랜덤입력 값 추출 변수

public class TicTacToeGame_Refactoring {
 public static void main(String[] args) {
 final int n = 3;
 final int range = 3;
 final int pickedSize = 2;
 char board[][] = new char[n][n];
 List<Integer> picked = new ArrayList<Integer>();
 List<TwoDimensions> randomInput = new ArrayList<TwoDimensions>();
 // 1. init (random input)
 createInput(picked, pickedSize, range, randomInput);
 Collections.shuffle(randomInput);
 // 2. input data (board)
 char mark = 'O';
 for (TwoDimensions in : randomInput)
 {
 board[in.x][in.y] = mark;
 if (isDecideWinner(board, in.x, in.y, mark)) 
 {
 print(board);
 System.out.println("Winner is : " + mark);
 return;
 }
 if (mark == 'O') mark = 'X';
 else mark = 'O';
 }
 // 3. Draw
 print(board);
 System.out.println("draw");
 }
 public static void print(char board[][]) {
 int boardSize = board.length;
 for (int i = 0 ; i < boardSize; i++) {
 for (int j = 0 ; j < boardSize; j++)
 System.out.print(board[i][j] + "\t");
 System.out.println();
 }
 }
 public static boolean isDecideWinner(char board[][], int x, int y, char mark) {
 int boardSize = board.length;
 // width
 for (int i = 0 ; i < boardSize; i++) 
 {
 if (board[x][i] != mark) 
 break;
 else if (i == boardSize -1)
 return true;
 }
 // height
 for (int i = 0 ; i < boardSize; i++) 
 {
 if (board[i][y] != mark) 
 break;
 else if (i == boardSize -1)
 return true;
 }
 // diagonal
 if ( x == y || Math.abs(x-y) == boardSize) 
 {
 for (int i = 0 ; i < boardSize ; i++)
 {
 if (board[i][i] != mark)
 break;
 else if ( i == boardSize -1)
 return true;
 }
 for (int i = 0 ; i < boardSize ; i++)
 {
 if (board[i][boardSize-1] != mark)
 break;
 else if ( i == boardSize - 1)
 return true;
 }
 }
 return false; 
 }
 public static void createInput(List<Integer> picked, int pickedSize, int range, List<TwoDimensions> storage)
 {
 if(picked.size() == pickedSize)
 {
 TwoDimensions dimensions = new TwoDimensions();
 dimensions.x = picked.get(0); dimensions.y = picked.get(1);
 storage.add(dimensions);
 return ;
 }
 for(int next = 0 ; next < range ; next++)
 {
 picked.add(next);
 createInput(picked, pickedSize, range, storage);
 picked.remove(picked.size() -1);
 }
 }
}
class TwoDimensions
{
 int x; int y;
}

2015年07月07日 13:55

이 준균

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

(注記) 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
풀이 작성은 로그인이 필요합니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

sort x 2
연관 문제
Dasol Lee, 2025年02月25日 14:39

언어별 풀이 현황
전 체 x 37
python x 22
cpp x 3
java x 2
scala x 2
기 타 x 3
ruby x 1
cs x 3
haskell x 1
코딩도장 © 2014 · 문의 [email protected]
피드백 · 개인정보취급방침 · RSS

AltStyle によって変換されたページ (->オリジナル) /