이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

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 14:50

Straß Böhm Jäger

이거 빙고게임이라고 생각하면 되나요? - 김 한길, 2014/12/05 22:58
네 ㅎ 3*3 빙고게임이라고 생각하시면 됩니다. - Straß Böhm Jäger, 2015/05/15 08:06

37개의 풀이가 있습니다.

class Tictactoe:
    casetowin = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))

    def __init__(self):
        self.board = list(range(1, 10))
        self.available = list(range(1, 10))
        self.winner = 0
        self.phase = 1

    def __str__(self):
        string = ''
        for i in range(3):
            row = self.board[i * 3:i * 3 + 3]
            string += '\t\t*\t\t*\t\n\t{0[0]}\t*\t{0[1]}\t*\t{0[2]}\n\t\t*\t\t*\t\n'.format(row)
        return string

    def move(self, x):
        self.board[x - 1] = 'O' if self.phase == 1 else 'X'
        self.available.remove(x)
        self.winner = self.checkcase()
        self.phase = 2 if self.phase == 1 else 1

    def checkcase(self):
        caselist = []
        for case in self.casetowin:
            caselist = [self.board[x] for x in case]
            if caselist.count('O') == 3:
                return 1
            elif caselist.count('X') == 3:
                return 2
            else:
                continue
        return 0


if __name__ == '__main__':
    t = Tictactoe()

    while t.winner == 0 and len(t.available) != 0:
        move = 0
        print('\n' + str(t))
        string = 'Player {0} - Please type a position (available position(s) are {1}): ' \
            .format(t.phase, ','.join([str(x) for x in t.available]))
        while move not in t.available:
            try:
                move = int(input(string))
                if move not in t.available: raise TypeError
            except:
                print('Please try again. ', end='')
        t.move(move)

    else:
        print(t)
        if t.winner > 0:
            print('The winner is: Player ' + str(t.winner))
        else:
            print('The game ended up in a tie')

2014/12/09 01:46

투플러스

C++입니다.

position 입력 메시지 출력시 빈칸 숫자들을 ","로 구분하여 나열하는 부분을 간과하면 안될 듯.

프로그램 설명:

"turn"이 9가 될 때까지 진행. 짝수 "turn"은 "O", 홀수 "turn"은 "X". "board[]"값은 Empty, O, X 중 하나.

Winning 조건 점검은, Clever한 방법을 고민하다가 포기하고 평범하게 갔습니다.
board[] index에 따른 보드판이 다음과 같다면:

0|1|2
3|4|5
6|7|8
  • 현재 위치 기준 가로방향 (row) 점검 : 0,1,2 또는 3,4,5 또는 6,7,8
  • 현재 위치 기준 세로방향 (column) 점검 : 0,3,6 또는 1,4,7 또는 2,5,8
  • 현재 위치가 1,3,5,7이 아니면 사선방향(diagonal) 점검 : 0,4,8 2,4,6

Note : 현재 위치가 4가 아닌 경우, 현재 위치가 속한 한쪽 사선만 점검하면 되지만 조건식 추가로 코드가 복잡해지는거 같아서 그냥 두 사선 뱡향을 모두 점검합니다.

#include <iostream>

using namespace std;

typedef enum { Player_Empty, Player_O, Player_X } PlayerType;
static PlayerType board[9];

int getValidPosition(int turn)
{
    int position;
    int numEmpty = 10-turn;
    do {
        cout << "Player " << (turn%2 ? 1 : 2) << " - please type a position ";
        cout << "(available position(s) are ";
        for (int i=0, count=0; i<9; ++i)
        {
            if (board[i] == Player_Empty)
            {
                cout << i+1;
                cout << (numEmpty != ++count ? "," : "):");
            }
        }

        cin >> position;
        if (position < 1 || 9 < position || board[position-1] != Player_Empty)
            cout << "Invalid position. Try again.\n";
        else
            return position-1; // convert to array index
    } while (true);
}

bool hasWon(PlayerType player, int ndx)
{
    // check row
    int base = (ndx/3)*3;
    if (board[base + (ndx-base+0)%3] == player &&
        board[base + (ndx-base+1)%3] == player &&
        board[base + (ndx-base+2)%3] == player) return true;

    // check column
    if (board[(ndx+0*3)%9] == player &&
        board[(ndx+1*3)%9] == player &&
        board[(ndx+2*3)%9] == player) return true;

    // check diagonals
    if (ndx % 2 != 0)
        return false; // indices 1,3,5,7 cannot make a diagonal win condition
    if (board[0] == player &&
        board[4] == player &&
        board[8] == player) return true;
    if (board[2] == player && 
        board[4] == player && 
        board[6] == player) return true;

    return false;
}

bool printBoard()
{
    for (int row=0; row<3; ++row)
    {
        cout << "|";
        for (int col=0; col<3; ++col)
        {
            int ndx = row*3+col;
            switch (board[ndx])
            {
            case Player_O: cout << "O"; break;
            case Player_X: cout << "X"; break;
            default: cout << ndx+1; break;
            }
            cout << "|";
        }
        cout << endl;
    }
}

int main(void)
{
    int turn = 0; // even = "O", odd = "X"

    printBoard();
    while (++turn < 10)
    {
        int position = getValidPosition(turn);
        board[position] = (turn%2) ? Player_X : Player_O;
        printBoard();
        if (hasWon(board[position], position))
        {
            cout << ((board[position] == Player_X) ? "X" : "O") << " has won.\n";
            return 0;
        }
    }
    cout << "This game is a draw\n";
    return 0;
}

2014/12/29 10:27

Bang Keugyeol

자바로 풀어봤습니다.

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;
            }
        }
    }
}

2022/06/15 19:51

유로

#include <iostream>
using namespace std;

int main()
{
    int pb[9] = {0};
    int input = 0;
    int turn = 0;
    int end = 1;
    int e;
    while (end!=0)
    {
        e = 1;
        int c=1;
        if (turn == 1) turn = 2;
        else turn=1;

        while (e)
        {
            cout << "player" << turn << "- ";
            cin >> input;
            cin.get();
            if (pb[input - 1]) continue;
            e = 0;
            if (turn == 1) pb[input - 1] = 1;
            else pb[input - 1] = -1;
        }

        for (int i = 0; i < 3; i++) if ((pb[i] + pb[i + 1] + pb[i + 2]) == 3 || (pb[i] + pb[i + 1] + pb[i + 2]) == -3) end=0;
        for (int i = 0; i < 3; i++) if ((pb[i] + pb[i + (1* 3)] + pb[i+(2 *3)]) == 3 || (pb[i] + pb[i+(1* 3)] + pb[i+(2 *3)] ==3 )) end = 0;
        if ((pb[0] + pb[4] + pb[8]) == -3 || (pb[0] + pb[4] + pb[8])==3) end = 0;
        if ((pb[2] + pb[4] + pb[6]) == -3 || (pb[2] + pb[4] + pb[6])==3) end = 0;
        c++;
        if (c == 9) break;
    }

    for (int i = 0; i < 9; i++)
    {
        if (i % 3 == 0) cout << endl;
        if (pb[i] == 1) cout <<"O ";
        else if (pb[i] == -1) cout << "X ";
        else cout << i+1<<" ";
    }
    cout << endl <<"win players is " << turn<<endl;
    cin.get();
    cin.get();
    return 0;
}

검토부탁드립니다. ps.중간에 입력에서 잘못된 값을 받는 경우는 생각하지 않았습니다.

2014/12/05 23:45

김 한길

Scala로 구혔습니다. 입력은 Random으로 처리했습니다.


def game(user: String, board: Array[String])(input: (String) => Int): (String, Array[String]) = {

    val in = input(user) - 1

    if(in < 0 || in > 8) {
        game(user, board)(input)
    } else if(List("X", "O").contains(board(in))) {
        game(user, board)(input)
    } else {
        board(in) = user
        checkRule(user, board) match {
            case null =>
                if(user == "X")
                    game("O", board)(input)
                else
                    game("X", board)(input)
            case result => 
                (result, board)
        }
    }
}

def checkRule(user: String, board: Array[String]): String = {
    val position = board.zipWithIndex.filter(_._1 == user).map(_._2)

    def rule1 = 
        board.grouped(3).exists { grouped =>
            grouped.forall(_ == user)
        }
    def rule2 = {
        val temp = position.map(_ % 3)

        (0 until 3).exists { n =>
            temp.count(_ == n) == 3
        }
    }
    def rule3 = {
        def fn(start: Int, step: Int): Boolean = {
            if(start > 3 * 3) {
                true
            } else if(position.contains(start)) {
                fn(start + step, step)
            } else {
                false
            }
        }

        fn(0, 4) || fn(2, 2)
    }

    if(rule1 || rule2 || rule3) {
        user
    } else if(board.forall(List("X", "O").contains)){
        "draw"
    } else 
        null
}


val (result, board) = 
    game("X", (1 to 9).map(_.toString).toArray) { user =>
        scala.util.Random.nextInt(9) + 1
    }

println(
    board.grouped(3).map{ grouped =>
        grouped.mkString(
            "\t*\t\t*\t\n",
            "\t*\t",
            "\n\t*\t\t*\t"
        )
    }.mkString("\n")
)

if(result == "draw") 
    println("The game is a draw.")
else
    println(s"Win player is: player $result")

2014/12/12 17:41

killbirds

python 3.4

#화면 출력
def show(map):
    mapPosion = [7,9,11,
                 25,27,29,
                 43,45,47]
    for i in range(1,55):
        count = 0
        ch1 = '\n' if i%6==0 else '   *  '
        ch2 = '  '+map[mapPosion.index(i)] if i in mapPosion else '   '
        ch3 = ch1 if i%2==0 else ch2
        print(ch3,end='')

#값 입력
def inValue(player,map):
    piece = 'O' if player == 1 else 'X'
    strNo = input('\nplayer%s(%s)\n원하는 위치를 입력해 주세요.: ' % (player,piece))
    result = 0
    if strNo in map:
        if map[int(strNo)-1] in ('O','x'):
            print('\n!!!!! 그 자리에는 넣을 수 없습니다. !!!!!\n')
        else:
            index = int(strNo)-1
            map[index] = piece
            result = int(strNo)
    else:
        print('\n!!!!!유요한 값이 아닙니다.!!!!!\n')
    return int(result)

#조건체크
def check(player,map):
    w,h = 3,3
    name = 'player1' if player == 1 else 'player2'
    check = 0
    #가로
    for i in range(w-1,(w*h),w):
        check += (map[i] == map[i-1] and map[i] == map[i-2])
    #세로
    for i in range(w):
        check += (map[i] == map[i+w] and map[i] == map[i+(w*2)])
    #대각선 \
    check += map[0] == map[w+1] and map[0] == map[(w+1)*2]
    #대각선 /
    check += map[w-1] == map[(w-1)*2] and map[w-1] == map[(w-1)*3]
    #무승부
    if check:
        print('\n%s 승리!!!\n' % name)
    else:
        count = 0 
        for i in map:
            count += (not i.isdigit())
        if count == len(map):
            print('\n무승부!!!\n')
            check = 1

    return check

def main():
    #필드
    map = ['1','2','3',
           '4','5','6',
           '7','8','9']
    player = 1
    while 1:
        show(map)
        if inValue(player,map):
            if check(player,map):
                break;
            player = player * (-1)

main()

2015/01/16 14:56

eunpyo

coding by python beginner

board = [['1','2','3'],['4','5','6'],['7','8','9']]
symbol = ['X', 'O']
player = 1

def chkWin():       
    if board[0][0] == board[1][1] and board[1][1] == board[2][2]:
        return board[0][0]  
    elif board[0][2] == board[1][1] and board[1][1] == board[2][0]:
        return board[0][2]
    else:
        for i in range(len(board)):         
            if len(list(set([board[0][i],board[1][i], board[2][i]]))) == 1:
                return board[0][i]
            elif len(list(set([board[i][0], board[i][1], board[i][2]]))) == 1:
                return board[i][0]

    return False

def printBoard():
    print('-' * 7)  
    for t in board:
        print('|' + '|'.join(t) + '|')      
    print('-' * 7)


def tic(player, idx):   
    board[int((idx-1) / 3)][(idx-1) % 3] = symbol[player-1]
    printBoard()
    if chkWin() != False:
        print('Win playear is: player %s' % player)
        return False

    return True


def play(player):
    remainPos = ''
    for arr in board:
        for pos in arr:
            if pos not in symbol:
                remainPos += pos 

    if remainPos == '':
        print('Game is draw.')
        return False
    else:       
        print('Player %d - please type a position \
(available position(s) are %s):' % (player, ','.join(list(remainPos))))

        pos = int(input())
        if remainPos.find(str(pos)) == -1:
            print('Not available position.')
            return play(player)
        else:
            return tic(player, pos)


printBoard()
while True:
    player ^= 1
    if play(player + 1) == False: break

2015/01/30 16:39

vegan

    Sub Main()
        Dim map()() As Byte = {
            New Byte() {1, 2, 3},
            New Byte() {4, 5, 6},
            New Byte() {7, 8, 9}
        }
        Dim seledA As New List(Of Byte)
        Dim seledB As New List(Of Byte)

        Dim print As Action =
            Sub()
                Console.Clear()
                For y As Integer = 0 To 2
                    For x As Integer = 0 To 2
                        If seledA.Contains(map(x)(y)) Then
                            Console.ForegroundColor = ConsoleColor.Red
                            Console.Write("X ")
                        ElseIf seledB.Contains(map(x)(y)) Then
                            Console.ForegroundColor = ConsoleColor.Cyan
                            Console.Write("X ")
                        Else
                            Console.ForegroundColor = ConsoleColor.Gray
                            Console.Write(map(x)(y) & " ")
                        End If
                    Next
                    Console.WriteLine()
                Next
            End Sub
        print()

        Dim check As Func(Of List(Of Byte), Boolean) =
            Function(lst As List(Of Byte)) As Boolean
                Dim b As Boolean = False

                b = b Or lst.Where(Function(n As Byte) n = 1 Or n = 2 Or n = 3).Count = 3
                b = b Or lst.Where(Function(n As Byte) n = 4 Or n = 5 Or n = 6).Count = 3
                b = b Or lst.Where(Function(n As Byte) n = 7 Or n = 8 Or n = 9).Count = 3

                b = b Or lst.Where(Function(n As Byte) n = 1 Or n = 5 Or n = 9).Count = 3
                b = b Or lst.Where(Function(n As Byte) n = 3 Or n = 5 Or n = 7).Count = 3

                b = b Or lst.Where(Function(n As Byte) n = 1 Or n = 4 Or n = 7).Count = 3
                b = b Or lst.Where(Function(n As Byte) n = 2 Or n = 5 Or n = 8).Count = 3
                b = b Or lst.Where(Function(n As Byte) n = 3 Or n = 6 Or n = 9).Count = 3

                Return b
            End Function

        For i As Integer = 1 To 9
            Dim n As Byte = CByte(Console.ReadLine)

            Dim seled As List(Of Byte) = IIf(i Mod 2 = 0, seledA, seledB)

            If Not seledA.Union(seledB).Contains(n) Then
                seled.Add(n)

                If check(seled) Then
                    print()

                    If i Mod 2 = 0 Then
                        Console.WriteLine("Win: A")
                    Else
                        Console.WriteLine("Win: B")
                    End If

                    Exit For
                End If
            Else
                i -= 1
            End If

            print()
        Next

        Console.ReadLine()
    End Sub

실시간으로 띄워봣습니다

2015/06/23 18:25

Steal

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

이 준균

c입니다

#include <stdio.h>
#include <Windows.h>
#define COL    GetStdHandle(STD_OUTPUT_HANDLE)
#define ORIGINAL  SetConsoleTextAttribute(COL,0x0007);
#define YELLOW SetConsoleTextAttribute(COL,0x000e);

int board[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //판 

void print(void) //출력
{
    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            switch (board[((3 * i) + 1 + j)])
            {
            case 'O':
                printf("%c",'O');
                break;
            case 'X':
                printf("%c",'X');
                break;
            default:
                printf("%d", board[((3 * i) + 1 + j)]);
                break;
            }
            if (j == 2)
                printf("\n");
            else
                printf("      *      ");
        }
    }
    printf("\n");
}
int getposition(int turn) //입력받기
{
    int position = 1;
    do{
        printf("Player %d - please type a position(available position(s) are ", turn % 2 ? 1 : 2);
        for (int i = 0 ; i < 9 ; ++i)
            if(board[i+1] == i+1)
                printf("%d, ", board[i+1]);
        printf("):");
        scanf_s("%d", &position);
        if (position < 1 || position>9 || board[position] != position) //1미만 9초과 이미 입력한 경우
            printf("error:invalid position.");
        else
            return position;
    } while (1);
}
int winnig_con(int player) //이기는 조건
{
    int i = 0;
    while (i < 3)
    {
        if (board[i + 1] == player && board[i + 2] == player && board[i + 3] == player) //row
        {
            YELLOW printf("Win playear is : player %d\n", player == 'O' ? 1 : 2);
            return 1;
        }
        i += 3;
    }
    i = 0;
    while (i < 3)
    {
        if (board[i + 1] == player && board[i + 4] == player && board[i + 7] == player) //column
        {
            YELLOW printf("Win playear is : player %d\n", player == 'O' ? 1:2);
            return 1;
        }
        i++;

    }
    if (board[1] == player && board[5] == player && board[9] == player)
    {
        YELLOW printf("Win playear is : player %d\n", player == 'O' ? 1 : 2);
        return 1;
    }
    else if (board[3] == player && board[5] == player && board[7] == player)
    {
        YELLOW printf("Win playear is : player %d\n", player == 'O' ? 1 : 2);
        return 1;
    }
    return 0;
}

int main(void)
{
    int turn = 1;
    int position = 0;
    while (turn<10)
    {
        position = getposition(turn);
        board[position] = (turn % 2 ? 'O' : 'X');
        print();
        while (winnig_con(turn % 2 ? 'O' : 'X'))
        {
            print();
            ORIGINAL printf("");
            return 0;
        }
        turn++;
    }
    YELLOW printf("DRAW\n");
    print();
    ORIGINAL printf("");
    return 0;
}

2015/07/18 22:45

남새

pinkey = 0
board = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]

def keyreplacer(strnum, pl):
    for x in board:
        for xx in range(0, len(x)):
            if x[xx] == strnum and pl == 1:
                x[xx] = 'X'
            elif x[xx] == strnum and pl == 2:
                x[xx] = 'O'

def winident():
    for v in board:
        if v == ['X', 'X', 'X']:
            print("Player 1 won!")
            return 1
            break
        elif v == ['O', 'O', 'O']:
            print("Player 2 won!")
            return 1
            break
        elif board[1][1] == 'X':
            if (board[0][0] == 'X' and board[2][2] == 'X') or (board[0][2] == 'X' and board[2][0] == 'X'):
                print("Player 1 won!")
                return 1
                break
        elif board[1][1] == 'O':
            if (board[0][0] == 'O' and board[2][2] == 'O') or (board[0][2] == 'O' and board[2][0] == 'O'):
                print("Player 2 won!")
                return 1
                break
        else:
            return 0
            break

def showboard():
    print("        *              *         ")
    print("   ", board[0][0], "    *", "       ", board[0][1], "      * ", "    ", board[0][2], "    ", sep = "")
    print("        *              *         ")
    print("        *              *         ")
    print("   ", board[1][0], "    *", "       ", board[1][1], "      * ", "    ", board[1][2], "    ", sep = "")
    print("        *              *         ")
    print("        *              *         ")
    print("   ", board[2][0], "    *", "       ", board[2][1], "      * ", "    ", board[2][2], "    ", sep = "")
    print("        *              *         ")   


print("Let\'s play a tix-tac-toe game!\neach turn, each player can choose a number between 1 and 9.\n")
for i in range(0, 9):
    if i%3 != 1:
        print("        *              *         ")
    else:
        print("   ", i, "    *", "       ", i+1, "      * ", "    ", i+2, "    ", sep = "")
i = 0

while(pinkey == 0):
    display = []
    for lv1 in board:
        if type(lv1) is not list and lv1 != 'X' and lv1 != 'O':
            display.append(lv1)
        elif type(lv1) is list:
            for lv2 in lv1:
                if lv2 != 'X' and lv2 != 'O':
                    display.append(lv2)
    print("Current available position(s) is(are): ", ", ".join(display))
    pl1insert = input("Player 1 - please type a position: ")
    keyreplacer(pl1insert, 1)

    if winident() == 1:
        showboard()
        pinkey = 1
        break

    display = []
    for lv1 in board:
        if type(lv1) is not list and lv1 != 'X' and lv1 != 'O':
            display.append(lv1)
        elif type(lv1) is list:
            for lv2 in lv1:
                if lv2 != 'X' and lv2 != 'O':
                    display.append(lv2)

    print("Current available position(s) is(are): ", ", ".join(display))
    pl2insert = input("Player 2 - please type a position: ")
    keyreplacer(pl2insert, 2)

    if winident() == 1:
        showboard()
        pinkey = 1
        break

3x3 틱택토로 구성되어 있고, 플레이어 1이 찍은 자리는 'X', 플레이어 2가 찍은 자리는 'O'로 표기하도록 하였습니다.

2015/10/13 20:05

박재우

import sys
def display(ttt):
    s=' '
    empty_line = s*5+'*'+s*9+'*'
    for i in range(3):
        print empty_line
        print ttt[i*3+1]+s*4+'*'+s*4+ttt[i*3+2]+s*4+'*'+s*4+ttt[i*3+3]
        print empty_line

ttt=map(str,range(10)) #tic tac toe plate
display(ttt)
while True:
    for player,mark in [('Player 1','O'),('Player 2','X')]:
        available = [int(e) for e in ttt if e.isdigit() and e!='0']
        if not available :
            print 'Tie game'
            sys.exit()
        print player, '- please type a position(available position(s)are ',available,'):',
        i = input()
        while not i in available :
            print "wrong selection. type again : ",
            i = input()
        ttt[i] = mark
        display(ttt)
        marks = set([])
        for i in range(1,10):
            if ttt[i]==mark: marks.add(i)
        for s in [{1,2,3},{4,5,6},{7,8,9},{1,4,7},{2,5,8},{3,6,9},{1,5,9},{7,5,3}]:
            if s<=marks :
                print 'winning player is',player
                sys.exit()

2016/01/29 17:08

상파

Ruby

made = ->u { %w(123 456 789 147 258 369 159 357).any? {|e| (e.chars&u)[2] } }
prt = ->w,m { puts "[Winner: #{w}]", m.each_slice(3).map {|row| row*" " } }
play = ->p1=[],p2=[],map=[*1..9],n=gets.chop do
  map[n.to_i-1] = (p1|p2).size.odd? ? (p2<<n; "X") : (p1<<n; "O")
  winner = made[p1]? "P1" : made[p2]? "P2" : ("None" if (p1+p2)[8])
  winner ? prt[winner,map] : play[p1,p2,map]
end

Test

expect_p1_win = "[Winner: P1]\n" +
                "O 2 3\n" +
                "X O 6\n" +
                "7 X O\n"
expect_p2_win = "[Winner: P2]\n" +
                "O O X\n" +
                "4 X X\n" +
                "X O O\n"
expect_draw   = "[Winner: None]\n" +
                "X O O\n" +
                "O O X\n" +
                "X X O\n"
test_data = ->p1,p2 { StringIO.new(p1.zip(p2).flatten*"\n") } # for stdin

# case : P1 Win
$stdin = test_data[[9,5,1], [4,8]]
expect{ play[] }.to output( expect_p1_win ).to_stdout

# case : P2 Win
$stdin = test_data[[1,2,9,8,4], [3,6,7,5]]
expect{ play[] }.to output( expect_p2_win ).to_stdout

# case : draw
$stdin = test_data[[4,5,9,2,3], [8,7,6,1]]
expect{ play[] }.to output( expect_draw ).to_stdout

2016/04/02 03:32

rk

승패판정을 정규식검사로 처리해봤습니다.

import re

win1 = """OOO......  ...OOO...  ......OOO O..O..O..  .O..O..O.  ..O..O..O O...O...O ..O.O.O..""".split()
win2 = """XXX......  ...XXX...  ......XXX X..X..X..  .X..X..X.  ..X..X..X X...X...X ..X.X.X..""".split()

def print_grid(data):
    print(('\n' + '-' * 9 + '\n').join(
        ' | '.join(data[x*3 + y] for y in range(3)) for x in range(3)))

def game():
    data = "123456789"
    winner = 0
    user, i = 'OX', 0
    for _ in range(9):
        availables = ', '.join([x for x in data if x not in 'OX'])
        x = 0
        while True:
            print_grid(data)
            x = int(input(
                "Player {} - please type a position (avaiable pos are {})"\
                    .format(i + 1, availables)))
            if not (0 < x < 10) or data[x-1] in 'OX':
                print('invalid position')
            else:
                break
        data = data[:x-1] + user[i] + data[x:]
        i = (i + 1) % 2
        if any([True if re.match(x, data) else False for x in win1]):
            winner = 1
        elif any([True if re.match(x, data) else False for x in win2]):
            winner = 2
        if winner != 0:
            break
    else:
        print('No Winner')
        return
    print_grid(data)
    print('Win player is: player %d' % winner)

game()

2016/04/22 14:25

룰루랄라

C#으로 작성했습니다.

        public static void GenerateTicTacToe(string[,] board)
        {
            var complete = false;
            var turn = true;
            while (!complete)
            {
                var n = int.Parse(Console.ReadLine().ToString()) - 1;
                var row = n / 3;
                var column = n % 3;
                if (board[row, column] == null) board[row, column] = turn ? "O" : "X";
                else Console.WriteLine("Error Occured");
                complete = CheckBoard(board, row, column, turn ? "O" : "X");
                if (!complete) turn = !turn;
            }
        }

        public static bool CheckBoard(string[,] board, int x, int y, string mark)
        {
            var rowCount = 0;
            var columnCount = 0;
            for (int i = 0; i < 3; i++)
            {
                if (board[x, i] == mark) rowCount++;
                if (board[i, y] == mark) columnCount++;
            }
            if (rowCount == 3 || columnCount == 3) return true;
            if (board[1, 1] == mark)
            {
                if (board[0, 0] == mark && board[2, 2] == mark) return true;
                if (board[2, 0] == mark && board[0, 2] == mark) return true;
            }
            return false;
        }

2016/06/02 22:39

Straß Böhm Jäger

from itertools import cycle
nums = ''.join(str(x) for x in range(1,10))
pw = lambda : print('Wrong input')
av_pos = lambda res : 'available pos: '+ ', '.join(x for x in res if x not in ('A', 'B')) +'\n'
inpt = lambda fr, res: int(input(av_pos(res) + fr + ' : '))-1
check = lambda b: any(True if x == b&x else False for x in (448, 56, 7, 292, 146, 73, 273, 84))
output = lambda res: print(''.join(x+'\n' if i%3 == 2 else x for i, x in enumerate(res)))
main_code = list(compile('''while 1:\n    {0} = inpt('{0}', res); n = 1 << {0}\n    if (1 << {0}) & game == 1: pw(); continue\n    else: break\ngame += n; {1} += n; res = res[:{0}] + '{0}' + res[{0}+1:]'''.format(T, T.lower()), '<string>', 'exec') for T in 'AB')
check_code = list(compile('check({})'.format(T.lower()), '<string>', 'eval') for T in 'AB')
while __name__ == '__main__':
    game = 2**9; draw = game-1
    res = nums
    a, b = 0, 0
    for i in cycle((0, 1)):
        exec(main_code[i])
        if eval(check_code[i]): break
        if a + b == draw: print('draw'); break
        output(res)
    output(res)

이진수로 풀어보았습니다. 반복되는 코드를 없애다 보니 문자열이 난무하네요. 파이썬 3.5.1

+

itertools.cycle:해당 반복가능한 객체를 반복.

2016/06/27 22:10

Flair Sizz

public void TicTacToe()
        {
            char[,] Board = { { '1', '2', '3' }, { '4', '5', '6' }, { '7', '8', '9' } };
            Console.WriteLine("[Player1]이 선택한 위치는 O로, [Player2]가 선택한 위치는 X로 표시됩니다.\n");
            int Player1WinCnt = 0;
            int Player2WinCnt = 0;
            for (int i = 0; i < 9; i++)
            {
                if (i % 2 == 0)
                {
                input1:
                    Console.Write("[Player1]위치를 선택하십시요(이미 선택된 위치를 선택하여선 안됩니다) : ");
                    int position = Convert.ToInt32(Console.ReadLine());
                    if (position > 9 || position < 1)
                    {
                        Console.WriteLine("{0}에 해당하는 위치가 없습니다.", position);
                        goto input1;
                    }
                    for (int k = 0; k < 3; k++)
                    {
                        for (int j = 0; j < 3; j++)
                        {
                            if ((int)(Board[k, j] - '0') == position)
                            {
                                Board[k, j] = 'O';
                            }

                        }
                    }
                    for (int k = 0; k < 3; k++)
                    {
                        for (int j = 0; j < 3; j++)
                        {

                            Console.Write("{0} ", Board[k, j]);


                        }
                        Console.WriteLine("\n");
                    }
                }


                if ((Board[0, 0] == 'O' && Board[0, 1] == 'O' && Board[0, 2] == 'O') ||
                    (Board[1, 0] == 'O' && Board[1, 1] == 'O' && Board[1, 2] == 'O') ||
                    (Board[2, 0] == 'O' && Board[2, 1] == 'O' && Board[2, 2] == 'O') ||
                    (Board[0, 0] == 'O' && Board[1, 0] == 'O' && Board[2, 0] == 'O') ||
                    (Board[0, 1] == 'O' && Board[1, 1] == 'O' && Board[2, 1] == 'O') ||
                    (Board[0, 2] == 'O' && Board[1, 2] == 'O' && Board[2, 2] == 'O') ||
                    (Board[0, 0] == 'O' && Board[1, 1] == 'O' && Board[2, 2] == 'O') ||
                    (Board[0, 2] == 'O' && Board[1, 1] == 'O' && Board[2, 0] == 'O'))
                {
                    Console.WriteLine("[Player1]이 승리하였습니다!");
                    Player1WinCnt++;
                    break;
                }
                if (i % 2 == 1)
                {
                input2:
                    Console.Write("[Player2]위치를 선택하십시요(이미 선택된 위치를 선택하여선 안됩니다) : ");
                    int position = Convert.ToInt32(Console.ReadLine());
                    if (position > 9 || position < 1)
                    {
                        Console.WriteLine("{0}에 해당하는 위치가 없습니다.", position);
                        goto input2;
                    }
                    for (int k = 0; k < 3; k++)
                    {
                        for (int j = 0; j < 3; j++)
                        {
                            if ((int)(Board[k, j] - '0') == position)
                            {
                                Board[k, j] = 'X';
                            }
                        }
                    }
                    for (int k = 0; k < 3; k++)
                    {
                        for (int j = 0; j < 3; j++)
                        {

                            Console.Write("{0} ", Board[k, j]);


                        }
                        Console.WriteLine("\n");
                    }
                }
                if ((Board[0, 0] == 'X' && Board[0, 1] == 'X' && Board[0, 2] == 'X') ||
                    (Board[1, 0] == 'X' && Board[1, 1] == 'X' && Board[1, 2] == 'X') ||
                    (Board[2, 0] == 'X' && Board[2, 1] == 'X' && Board[2, 2] == 'X') ||
                    (Board[0, 0] == 'X' && Board[1, 0] == 'X' && Board[2, 0] == 'X') ||
                    (Board[0, 1] == 'X' && Board[1, 1] == 'X' && Board[2, 1] == 'X') ||
                    (Board[0, 2] == 'X' && Board[1, 2] == 'X' && Board[2, 2] == 'X') ||
                    (Board[0, 0] == 'X' && Board[1, 1] == 'X' && Board[2, 2] == 'X') ||
                    (Board[0, 2] == 'X' && Board[1, 1] == 'X' && Board[2, 0] == 'X'))
                {
                    Console.WriteLine("[Player2]이 승리하였습니다!");
                    Player2WinCnt++;
                    break;
                }

            }
            if (Player1WinCnt < 1 && Player2WinCnt < 1)
            {
                Console.WriteLine("무승부!");
            }



        }

예외처리는 입력이 1~9를 벗어날 경우 잡아주었고, 그외의 예외(중복 선택이라던가..등등..)는 무시했습니다.

2016/09/23 23:49

이규민

#include <iostream> 

using namespace std;

char sBoard[3][3];
char fBoard[9] = { 1,2,3,4,5,6,7,8,9 };
char* player[2] = { "Player1","Player2" };
bool curPlayer = false;
bool isWin = false;

void Render();
void CheckBoard(int idx);
bool InspectBoard(int _x, int _y);

int main()
{
    Render();
    while (true)
    {
        cout << player[(int)curPlayer] << " 숫자 입력(1~9) : ";
        int input = 0;
        scanf_s("%d", &input);
        CheckBoard(input - 1);

        if(isWin) return 0;
    }
    return 0;
}
void Render()
{
    system("cls");
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            sBoard[i][j] = fBoard[i * 3 + j];
            if (sBoard[i][j] == 'O' || sBoard[i][j] == 'X')
                printf_s("|%c", sBoard[i][j]);
            else
                printf_s("|%d", sBoard[i][j]);
        }
        cout << "|" << endl;
    }
}
void CheckBoard(int idx)
{
    if (idx > 8 || idx < 0 || fBoard[idx] == 'O' || fBoard[idx] == 'X')
    {
        cout << "다시입력하세요 : ";
        int input = 0;
        scanf_s("%d", &input);
        return CheckBoard(input - 1);
    }
    int x, y;
    x = idx / 3;
    y = idx % 3;

    fBoard[idx] = curPlayer ? 'O' : 'X';
    Render();
    if ((isWin = InspectBoard(x, y)))
    {
        cout << player[(int)curPlayer] << " 승리." << endl;
    }
    curPlayer = !curPlayer;
}
bool InspectBoard(int _x, int _y)
{
    int x = _x, y = _y;
    bool rev = false;
    char temp = sBoard[x][y];

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (i == 0 ? (y + j >= 2) : (x + j >= 2))rev = true;
            if (temp != sBoard[i == 0 ? x : x + (rev ? -j : +j)][i == 0 ? y + (rev ? -j : +j) : y])break;
            if (j == 2) return true;
        }
        rev = false;
        for (int j = 0; j < 3; j++)
        {
            if (i==0?(y + j >= 2 && x + j >= 2):(x+j>=2&&y-j<0)) rev = true;
            if (temp != sBoard[x + (rev ? -j : +j)][i==0?(y + (rev ? -j : +j)): (y + (rev ? j : +j))])break;
            if (j == 2)return true;
        }
        rev = false;
    }
    return false;
}

2016/11/01 10:30

이 재화

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define size 3

bool turn; // true  white O
           // false black X
void put(char board[size][size]);
int verdict(char board[size][size]);

void main() {
    turn = true;
    srand (time(NULL));
    char board[size][size] = {{'1' ,'2', '3'},{'4', '5', '6'},{'7', '8', '9'}};

    int count=0;
    int result=0;
    while(count<9) {
        result = verdict(board);
        if(result==1) {
            printf("white win!!\n");
            break;
        }
        else if(result==2) {
            printf("black win!!\n");
            break;
        }
        put(board);
        count++;
    }
    if(count == 9)
        printf("draw!!\n");
    for(int i=0;i<size; i++) {
        for(int j=0;j<size;j++) {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }


}

void put(char board[size][size]) {
    int input;
    scanf("%d", &input);
    for(int i=0;i<size; i++) 
        for(int j=0;j<size;j++) 
            if(board[i][j]==(input+48)) {
                if(turn) {
                    board[i][j] = 'O';
                    turn = false;
                }
                else {
                    board[i][j] = 'X';
                    turn = true;
                }
            }
}

int verdict(char board[size][size]) {  // 1 whte, 2 black
    int black = 0;
    int white = 0;
    for(int i=0;i<size; i++) {
        black = 0;
        white = 0;
        for(int j=0;j<size;j++) {
            if(board[i][j]=='O')
                white++;
            if(board[i][j]=='X')
                black++;
        }
        if(black==3) return 2;
        if(white==3) return 1;
        black = 0;
        white = 0;
        for(int j=0;j<size;j++) {
            if(board[j][i]=='O')
                white++;
            if(board[j][i]=='X')
                black++;
        }
        if(black==3) return 2;
        if(white==3) return 1;
    }

    if((board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O') || (board[3][1] == 'O' && board[1][1] == 'O' && board[1][3] == 'O'))
        return 1;
    if((board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X') || (board[3][1] == 'X' && board[1][1] == 'O' && board[1][3] == 'X'))
        return 2;
    return 0;
}

2017/02/15 16:19

코딩초보

arr1_1 = [[['1','2','3'],['4','5','6'],['7','8','9']]
          , [['1','4','7'],['2','5','8'],['3','6','9']]
          , [['1','5','9'],['3','5','7'],['.','.','.']]]

def f1():
    result = ', '.join([', '.join([x1 for x1 in x if x1!='O' and x1!='X']) for x in arr1_1[0]])
    return result

def f2(nums, typ1):
    for i1 in range(0, len(arr1_1)):
        for i2 in range(0, len(arr1_1[i1])):
            if arr1_1[i1][i2].count(nums) > 0:
                arr1_1[i1][i2][arr1_1[i1][i2].index(nums)] = typ1
    print('\n'.join([' * '.join([x1 for x1 in x]) for x in arr1_1[0]]))

def f3(typ1, idx1):
    for i1 in range(0, len(arr1_1)):
        if arr1_1[i1].count([typ1 for x in range(0, 3)]) > 0:
            print('Win playear is: player ', idx1)
            return typ1
    return ''

def f():
    while f1()!='':
        for idx1, typ1 in enumerate(['X','O']):
            plys = ''
            str1 = f1()
            while True:
                plys = input('Player '+str(idx1+1)+' - please type a position (available position(s) are ' + str1 + '):')
                if str1.count(plys) > 0:
                    break
            f2(plys, typ1)
            if f3(typ1, str(idx1+1)) != '':
                return False
    if f1() == '':
        print('End..')
    return True

f()

2017/09/01 17:05

piko

haskell

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Lens.TH
import Control.Monad
import Control.Applicative
import Control.Monad.State
import Control.Monad.Loops
import Data.Ix
import Data.List
import Data.List.Split (chunksOf)
import Data.Map (Map, (!))
import qualified Data.Map as Map
import Data.Maybe (isJust, fromJust)
import Text.Read (readMaybe)

data Player = O | X deriving (Show, Eq, Ord)

data Game = Game {_board :: Map Int Player, _turn :: Player}
makeLenses ''Game

instance Show Game where
    show game = unlines [showBoard, showTurn]
        where
            showTurn = concat ["This is Player ", show (game^.turn), "'s turn."]
            showBoard = unlines $ chunksOf 3 $ fmap (display . (flip Map.lookup (game^.board))) $ [1..9]
            display (Just O) = 'O'
            display (Just X) = 'X'
            display Nothing = ' '
done :: Game -> Bool
done = liftA2 (||) (isJust . winner) ((==9) . length . (^.board)) 

winner :: Game -> Maybe Player
winner game = fmap (fromJust . head) $ find (`elem` fmap (replicate 3) [Just X, Just O]) $ fmap (flip Map.lookup (game^.board)) <$> compartments
    where
        compartments = chunksOf 3 [1..9] ++ transpose (chunksOf 3 [1..9]) ++ [[1,5,9],[3,5,7]]

validMoves :: Game -> [Int]
validMoves game = filter (`Map.notMember` (game^.board)) $ [1..9]

initialState = Game {_board = Map.empty, _turn = O}


type M = StateT Game IO

putMove :: Int -> M ()
putMove move = do
    t <- use turn
    board %= Map.insert move t
    turn .= (case t of X -> O; O -> X)

getMove :: [Int] -> M Int
getMove valids = liftIO $ iterateUntil (`elem` valids) $ untilJust $ putStr "Please tell me your move: " >> readMaybe <$> getLine


tictactoe :: M ()
tictactoe = do
    showBoard >> untilM 
        (validMoves <$> get >>= getMove >>= putMove >> showBoard)
        (done <$> get)
    tellOutcome =<< winner <$> get
    where
        showBoard = liftIO . print =<< get
        tellOutcome o = liftIO . putStrLn $ case o of Just x -> concat ["Player ", show x, " won!"]; Nothing -> "Draw" 

main = evalStateT tictactoe initialState

2017/12/10 16:24

sodii

파이썬 3.6

"""
아이디어>
 1) grid의 한변의 크기(n)을 입력받아 (n x n) grid를 생성한 후, 각 플레이어에게 숫자(m)을 입력받아 grid내에서 동일한 숫자 요소가 있는지 확인하여 각 플레이어에게 해당되는 표기를 합니다.
 2) 이미 다른 플레이어의 표식이 표기되어 있는 경우는 별도 표기없이 다른 플레이어에게 턴을 넘김니다.
 3) 매 턴마다 가로(tic) / 세로(tac) / 대각선(toe)를 count하여, 승리조건을 달성하는 경우 결과를 출력하고 게임을 마칩니다. 
"""
def makegrid(n):
    line,grid = [],[]
    for i in range(n*3):
        if i%3 != 1:
            for h in range(n*2-1):
                if h%2 == 0:
                    line.append(' ')
                else:
                    line.append('*')
        else:
            for h in range(n*2-1):
                if h%2 == 0:
                    line.append(str(((i//3)*n)+(h//2+1)))
                else:
                    line.append('*')
        grid.append(line)
        line = []
    return grid

def game():
    count,p,i,grid,tic,tac,toe = 0, '',0,[],0,0,0
    grid = makegrid(n)
    for i in grid:
        print('    '.join(i))
    while count < n*n:
        count += 1
        if tic == 3 or tac == 3 or toe == 3:
            break
        if count%2 != 0:
            chk = 1
        else:
            chk = 2
        m = input("Player%d - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): "%chk)
        try:
            i = ((int(m)-1)//3)*3 + 1
            if chk == 1:
                p = 'X'
            else:
                p = '0'
            grid[i][grid[i].index(m)] = p
        except ValueError:
            pass

        for i in range(0,n*2-1,2): # 세로 체크
            for h in range(1,n*3,3):
                if grid[h][i] == p:
                    tic += 1
            if tic == 3:
                 break
            else:
                 tic = 0
        for i in range(1,n*3,3): # 가로 체크
            for h  in range(0,n*2-1,2):
                if grid[i][h] == p:
                    tac += 1
            if tac == 3:
                break
            else:
                tac = 0               
        for i in [0,n*2-2]: # 대각선 체크
            if i == 0:
                for h in range(1,n*3,3):
                    if grid[h][i] == p:
                        toe += 1
                    i += 2
                if toe == 3:
                    break
                else:
                    toe = 0
            else:
                for h in range(1,n*3,3):
                    if grid[h][i] == p:
                        toe += 1
                    i -= 2
                if toe == 3:
                    break
                else:
                    toe = 0                                
    for i in grid:
        print('    '.join(i))
    if tic == 3 or tac == 3 or toe == 3:
        print("Win player is: player%d"%chk)
    else:
        print("This game is draw")

if __name__ == "__main__":
    n = int(input('n = '))
    game()
  • 결과값
n = 3
     *         *     
1    *    2    *    3
     *         *     
     *         *     
4    *    5    *    6
     *         *     
     *         *     
7    *    8    *    9
     *         *     
Player1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 1
Player2 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 5
Player1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 7
Player2 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 7
Player1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 2
Player2 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 3
Player1 - please type a position (available position(s) are 1,2,3,4,5,6,7,8,9): 4
     *         *     
X    *    X    *    0
     *         *     
     *         *     
X    *    0    *    6
     *         *     
     *         *     
X    *    8    *    9
     *         *     
Win player is: player1

2018/02/06 15:50

justbegin

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = list()
player2 = list()
def show(b):
    print(' '*8+'*'+' '*15+'*')
    print(' '+'{0}'.format(b[0])+' '*6+'*'+' '*7+'{0}'.format(b[1])+' '*7+'*'+' '*7+'{0}'.format(b[2]))
    print(' ' * 8 + '*' + ' ' * 15 + '*')
    print(' ' * 8 + '*' + ' ' * 15 + '*')
    print(' ' + '{0}'.format(b[3]) + ' ' * 6 + '*' + ' ' * 7 + '{0}'.format(b[4]) + ' ' * 7 + '*' + ' ' * 7 + '{0}'.format(b[5]))
    print(' ' * 8 + '*' + ' ' * 15 + '*')
    print(' ' * 8 + '*' + ' ' * 15 + '*')
    print(' ' + '{0}'.format(b[6]) + ' ' * 6 + '*' + ' ' * 7 + '{0}'.format(b[7]) + ' ' * 7 + '*' + ' ' * 7 + '{0}'.format(b[8]))
    print(' ' * 8 + '*' + ' ' * 15 + '*')
while 1:
    show(b)
    print("Player1 - please type a position (available position(s) are {0}".format(a))
    n = int(input())
    player1.append(n)
    a.remove(n)
    b[n-1] = 'X'
    l1 = [(i in player1) for i in range(1, 10)]
    if any([l1[0] and l1[1] and l1[2], l1[3] and l1[4] and l1[5], l1[6] and l1[7] and l1[8], l1[0] and l1[3] and l1[6], l1[1] and l1[4] and l1[7],
            l1[2] and l1[5] and l1[8], l1[0] and l1[4] and l1[8], l1[2] and l1[4] and l1[6]]):
        show(b)
        print("Winner is player1")
        break
    show(b)
    print("Player2 - please type a position (available positions(s) are {0}".format(a))
    n = int(input())
    player2.append(n)
    a.remove(n)
    b[n-1] = 'O'
    l2 = [(i in player2) for i in range(1, 10)]
    if any([l2[0] and l2[1] and l2[2], l2[3] and l2[4] and l2[5], l2[6] and l2[7] and l2[8], l2[0] and l2[3] and l2[6], l2[1] and l2[4] and l2[7],
            l2[2] and l2[5] and l2[8], l2[0] and l2[4] and l2[8], l2[2] and l2[4] and l2[6]]):
        show(b)
        print("Winner is player2")
        break

2018/02/19 23:01

김동하

board = ['1','2','3','4','5','6','7','8','9']

def inputcheck(input):
    if input in ['1','2','3','4','5','6','7','8','9']:
        if board[int(input)-1] in ['o','x']:
            print('already selected')
        else:
            return True
    else:
        print('input error')

def wincheck():
    if board[0] == board[1] == board[2] in ['o','x'] or\
       board[3] == board[4] == board[5] in ['o','x'] or\
       board[6] == board[7] == board[8] in ['o','x'] or\
       board[0] == board[3] == board[6] in ['o','x'] or\
       board[1] == board[4] == board[7] in ['o','x'] or\
       board[2] == board[5] == board[8] in ['o','x'] or\
       board[0] == board[4] == board[8] in ['o','x'] or\
       board[2] == board[4] == board[6] :
        return True

def boardout():
    for i in (0, 1, 2):
        print(''.join(board)[3*i:3*(i+1)])

boardout()
while True:

    while True:
        a = input()
        if inputcheck(a):
            board[int(a)-1] = 'o'
            boardout()
            break
    if wincheck():
        print('o win')
        break

    if board.count('o') == 5:
        print('draw')
        break

    while True:
        a = input()
        if inputcheck(a):
            board[int(a)-1] = 'x'
            boardout()
            break
    if wincheck():
        print('x win')
        break

2018/03/19 22:40

python

arr = [" "for i in range(3*3)]

def player1():
    x = int(input("plyaer1 돌을 놓을 위치를 정하세요 : "))
    while(x>9 or arr[x-1] == 'o' or arr[x-1] == 'x'):
        if(x>9):
            x = int(input("범위를 벗어났습니다. 다시 놓으세요 : "))
        elif(arr[x-1] == 'o') :
            x = int(input("이미 돌이 있습니다. 다시 놓으세요 : "))
        elif(arr[x-1] == 'x') :
            x = int(input("이미 돌이 있습니다. 다시 놓으세요 : "))
    arr[x-1] = 'o'
    now()

def player2():
    y = int(input("plyaer2 돌을 놓을 위치를 정하세요 : "))
    while(y>9 or arr[y-1] == 'o' or arr[y-1] == 'x'):
        if(y>9):
            y = int(input("범위를 벗어났습니다. 다시 놓으세요 : "))
        elif(arr[y-1] == 'o') :
            y = int(input("이미 돌이 있습니다. 다시 놓으세요 : "))
        elif(arr[y-1] == 'x') :
            y = int(input("이미 돌이 있습니다. 다시 놓으세요 : "))
    arr[y-1] = 'x'
    now()

def game():
    start()
    print("해당 숫자의 위치에 돌을 놓습니다.")
    for i in range(5):
        player1()
        if(arr[0] == arr[1] == arr[2] == 'o' or
            arr[3] == arr[4] == arr[5] == 'o' or
            arr[6] == arr[7] == arr[8] == 'o' or
            arr[0] == arr[3] == arr[6] == 'o' or
            arr[1] == arr[4] == arr[7] == 'o' or
            arr[2] == arr[5] == arr[8] == 'o' or
            arr[0] == arr[4] == arr[8] == 'o' or
            arr[2] == arr[4] == arr[6] == 'o') :
            print(win1())
            break
        if(" " not in arr):
            draw()
            break        
        player2()
        if(arr[0] == arr[1] == arr[2] == 'x' or
            arr[3] == arr[4] == arr[5] == 'x' or
            arr[6] == arr[7] == arr[8] == 'x' or
            arr[0] == arr[3] == arr[6] == 'x' or
            arr[1] == arr[4] == arr[7] == 'x' or
            arr[2] == arr[5] == arr[8] == 'x' or
            arr[0] == arr[4] == arr[8] == 'x' or
            arr[2] == arr[4] == arr[6] == 'x') :
            print(win2())
            break

def start():
    print("|-----+-----+-----|")
    print('| ',1,' | ',2,' | ',3,' | ')
    print("|-----+-----+-----|")
    print('| ',4,' | ',5,' | ',6,' | ')
    print("|-----+-----+-----|")
    print('| ',7,' | ',8,' | ',9,' | ')
    print("|-----+-----+-----|")

def now():
    print("|-----+-----+-----|",'          ',"|-----+-----+-----|")
    print('| ',arr[0],' | ',arr[1],' | ',arr[2],' | ','         ','| ',1,' | ',2,' | ',3,' | ')
    print("|-----+-----+-----|",'          ',"|-----+-----+-----|")
    print('| ',arr[3],' | ',arr[4],' | ',arr[5],' | ','         ','| ',4,' | ',5,' | ',6,' | ')
    print("|-----+-----+-----|",'          ',"|-----+-----+-----|")
    print('| ',arr[6],' | ',arr[7],' | ',arr[8],' | ','         ','| ',7,' | ',8,' | ',9,' | ')
    print("|-----+-----+-----|",'          ',"|-----+-----+-----|")


def win1():
    print("빙고!! player1이 승리 하였습니다")
    return "경기 끝!"

def win2():
    print("빙고!! player2이 승리 하였습니다")
    return "경기 끝!"

def draw():
    print("비겼습니다")
    return "경기 끝!"

game()

2018/05/10 14:29

효준이아빠

object Main extends App {

    val arr = Array.ofDim[Char](3, 3)
    var cnt = 1
    for(i <- 0 to 2; j <- 0 to 2){
        arr(i)(j) = cnt.toString.head
        cnt += 1
    }
    val location = Map(
            (1, (0, 0)),
            (2, (0, 1)),
            (3, (0, 2)),
            (4, (1, 0)),
            (5, (1, 1)),
            (6, (1, 2)),
            (7, (2, 0)),
            (8, (2, 1)),
            (9, (2, 2))
        )

    def checkEnd():Boolean = {
        var bool = false
        var player = -1
        //가로 세로
        for(i <- 0 to 2){
            if(arr(i)(0) == 'O' && arr(i)(1) == 'O' && arr(i)(2) == 'O') bool = true
            if(arr(i)(0) == 'X' && arr(i)(1) == 'X' && arr(i)(2) == 'X') bool = true
            if(arr(0)(i) == 'O' && arr(1)(i) == 'O' && arr(2)(i) == 'O') bool = true
            if(arr(0)(i) == 'X' && arr(1)(i) == 'X' && arr(2)(i) == 'X') bool = true
        }
        //대각선
        if(!bool){
            if(arr(0)(0) == 'O' && arr(1)(1) == 'O' && arr(2)(2) == 'O') bool = true
            if(arr(0)(0) == 'X' && arr(1)(1) == 'X' && arr(2)(2) == 'X') bool = true
            if(arr(0)(2) == 'O' && arr(1)(1) == 'O' && arr(2)(0) == 'O') bool = true
            if(arr(0)(2) == 'X' && arr(1)(1) == 'X' && arr(2)(0) == 'X') bool = true
        }
        bool
    }
    def chkNum(n : Int):Boolean = {
        n match {
            case x if n >= 10 || n < 0 => false
            case _ => {
                val loc = location(n)
                if(arr(loc._1)(loc._2) == 'O' || arr(loc._1)(loc._2) == 'X') false
                else true
            }
        }
    }
    var player = -1 // -1 or 1
    while(!checkEnd()){
        var a = Console.readInt()
        while(!chkNum(a)){
            println("잘못 입력하셨습니다. 0 ~ 9 \n")
            a = Console.readInt()
        }
        val x = location(a)
        player match {
            case -1 => arr(x._1)(x._2) = 'X'
            case 1 => arr(x._1)(x._2) = 'O'
        }
        player *= -1
        arr.map(_.toList).toList.foreach(v => println(v.mkString(" | ")))
        println("\n")
    }
    player *= -1
    player match {
        case -1 => println("player1 is WIN!!")
        case 1 => println("player2 is WIN!!")
    }
}

2018/05/12 10:12

한강희

Python 굉장히 지저분한 코드군요..

def checkBingo(mat):
    #row
    cnt = 0
    for x in range(0, 9, 3):
        if mat[x] == mat[x+1] == mat[x+2] == 1:
           cnt += 1
    for x in range(3):
        if mat[x] == mat[x+3] == mat[x+6] == 1:
            cnt += 1
    if mat[0] == mat[4] == mat[8]:
        cnt += 1
    if mat[2] == mat[4] == mat[6]:
        cnt += 1
    return cnt


player1 = [0 for _ in range(9)]
player2 = [0 for _ in range(9)]
output = [i+1 for i in range(9)]
isEnd = False
cnt = 0
ava = [i+1 for i in range(9)]
while isEnd is False:
    number = cnt % 2
    pos = int(input("Player {} - please type a position (available position(s) are {}): ".\
                    format(number, ','.join(map(str, ava)))))
    ava.pop(ava.index(pos))
    cnt += 1
    player1[pos-1] = 1
    player2[pos-1] = 1
    p1_b = checkBingo(player1)
    p2_b = checkBingo(player2)
    output[pos-1] = "O" if number == 0 else "X"
    if p1_b == 3 and p2_b == 3:
        print("Draw!!")
        break
    elif p1_b == 3 and p2_b < 3:
        print("Win player is: player0")
        break
    elif p2_b == 3 and p1_b < 3:
        print("Win player is: player1")
        break
for i in range(9):
    if i in [1, 4, 7]:
        print("*".join(map(str,output[i-1:i+2])))
    else:
        print(" * * ")

2018/07/01 14:33

Taesoo Kim

def win_di(x):
    y = set(x)
    for i in range(3):
        if set(range(i+1,10,3)) <= y: return True
    for i in range(3):
        if set(range(i*3+1,i*3+1+3)) <= y: return True
    if set(range(1,10,4)) <= y or set(range(3,8,2)) <= y: return True
    return False

p, position = 1, [[],[]]
while 1:
    print('Player {} - please type a position (available position(s) are {}): '.format(p,', '.join(str(i) for i in set(range(1,10))-set(position[0]+position[1]))),end='')
    n = int(input())
    if n in position[0]+position[1]: print('이미 선택된 번호입니다. 다시 입력하세요.'); continue
    position[p%2].append(n)

    if win_di(position[p%2]): print('Winner player is Player {}'.format(p)); break
    if len(position[0]+position[1]) == 9: print('Draw')
    p = 2 if (p+1)%2 == 0 else 1

for i in range(3):
    for j in range(3):
        print('{}'.format('O' if i*3+j+1 in position[0] else 'X' if i*3+j+1 in position[1] else i*3+j+1),end='')
    print()
Player 1 - please type a position (available position(s) are 1, 2, 3, 4, 5, 6, 7, 8, 9): 1
Player 2 - please type a position (available position(s) are 2, 3, 4, 5, 6, 7, 8, 9): 2
Player 1 - please type a position (available position(s) are 3, 4, 5, 6, 7, 8, 9): 3
Player 2 - please type a position (available position(s) are 4, 5, 6, 7, 8, 9): 4
Player 1 - please type a position (available position(s) are 5, 6, 7, 8, 9): 5
Player 2 - please type a position (available position(s) are 8, 9, 6, 7): 6
Player 1 - please type a position (available position(s) are 8, 9, 7): 7
Winner player is Player 1
XOX
OXO
X89

2018/07/14 19:22

Creator

def bingo(occupied):
    lines = [{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, \
             {'1', '4', '7'}, {'2', '5', '8'}, {'3', '6', '9'}, \
             {'1', '5', '9'}, {'3', '5', '7'}]
    return [line - occupied == {} for line in lines].count(True) >= 3

def print_status(available, occupied):
    for pos in '123456789':
        if pos in available:        print(' ' + pos + ' ', end = '')
        elif pos in occupied['X']: print(' X ', end = '')
        else:                       print(' O ', end = '')
        if pos in '369':            print()

available, occupied = set('123456789'), {'X':set(), 'O':set()}
player = 'X'
while available:
    pos = input('Player ' + player + ' - please type a position(available position(s) are ' + ' '.join(sorted(available)) + ') ')
    if pos not in available:
        continue

    occupied[player].add(pos)
    available.remove(pos)
    print_status(available, occupied)
    if bingo(occupied[player]):
        print('winner is ' + player)
        exit()
    player = {'O':'X', 'X':'O'}[player]

2018/08/14 00:48

Noname

board = ['1','2','3','4','5','6','7','8','9']
state = {'x':'1Player','o':'2Player'}
def printboard():
    print('*'*13)
    for i in range(3):
        print('* {0} * {1} * {2} *'.format(board[i*3],board[i*3+1],board[i*3+2]))
        print('*'*13)
def detGame(board):
    ##가로 확인
    for j in range(3):
        if board[j*3] == board[j*3+1] == board[j*3+2]:
            return [j*3,j*3+1,j*3+2]
    ##세로 확인
    for k in range(3):
        if board[k] == board[3+k] == board[6+k]:
            return [k,3+k,6+k]
    ##대각선 확인
    if board[0] == board[4] == board[8]:
        return [0,4,8]
    if board[2] == board[4] == board[6]:
        return [2,4,6]
    return 0

def playgame():
    _round=0
    _turn=1
    sign='1'
    printboard()
    while _round != 9:
        n = input()
        if _turn%2 == 0:
            sign = 'o'
        else:
            sign = 'x'
        board[board.index(str(n))] = sign
        _turn+=1
        _round+=1
        ##여기에 승패 판단
        cur_state = detGame(board)
        if cur_state:
            printboard()
            print("{0} win~!".format(state[board[cur_state[0]]]))
            return

        print('='*13+'\n')
        printboard()
playgame()

2018/09/20 23:13

JaehakChoi

살짝 최적화

turn=1
notvalid=0
p=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
board=[1, 2, 3, 4, 5, 6, 7, 8, 9]
def winner():
    if str(p[0][0]) == str(p[1][1]) == str(p[2][2]) or str(p[2][0]) == str(p[1][1]) == str(p[0][2]):
        return str(p[1][1])
    for i in range(3):
        if str(p[0][i]) == str(p[1][i]) == str(p[2][i]):
            return str(p[0][i])
        if str(p[i][0]) == str(p[i][1]) == str(p[i][2]):
            return str(p[i][0])


print("       >>> Tic-tac-toe 대각선/가로/세로 줄을 완성하면 승리합니다. <<<")

while True:
    print ("                                                      "+str(p[0][0])+" | "+str(p[0][1])+" | "+str(p[0][2]))
    print ("                                                      "+str(p[1][0])+" | "+str(p[1][1])+" | "+str(p[1][2]))
    print ("                                                      "+str(p[2][0])+" | "+str(p[2][1])+" | "+str(p[2][2]))
    print ("")
    try:
        n=int(input("Player %d - Please type a position (available position(s) are " % turn+ ", ".join(map(str, board)) +" ): "))
        board.remove(n)
    except ValueError:
        print("Not Valid Number!")
        notvalid=1
    if notvalid==0:
        a=n//3
        b=n-a*3-1
        if b==-1:
            a-=1
            b=2
        if turn==1:
            p[a][b] = "o"
        if turn==2:
            p[a][b] = "x"
        turn += 1
        if turn == 3:
            turn = 1
        if winner() == 'o':
            print(">> Player 1 Won!")
            break;
        if winner() == 'x':
            print(">> Player 2 Won!")
            break;
        if board==[]:
            print(">> Draw!")
            break;
    else:
        notvalid=0
print ("                                                      "+str(p[0][0])+" | "+str(p[0][1])+" | "+str(p[0][2]))
print ("                                                      "+str(p[1][0])+" | "+str(p[1][1])+" | "+str(p[1][2]))
print ("                                                      "+str(p[2][0])+" | "+str(p[2][1])+" | "+str(p[2][2]))
print ("")

2018/10/28 17:42

Luzz

파이썬 3입니다.

A = list(range(1, 10))


def grid(li):
    for i in range(9):
        if (i - 1) % 3 == 0:
            print(3 * ' ', li[i - 1], 3 * ' ', '*', 3 * ' ', li[i], 3 * ' ', '*', 3 * ' ', li[i + 1], 3 * ' ', sep='')
        else:
            print(7 * ' ', '*', 7 * ' ', '*', 7 * ' ', sep='')


def victory_cond(x, li):
    return [li[0], li[1], li[2]] == 3 * [x] or [li[3], li[4], li[5]] == 3 * [x] or \
           [li[6], li[7], li[8]] == 3 * [x] or [li[0], li[3], li[6]] == 3 * [x] or \
           [li[1], li[4], li[7]] == 3 * [x] or [li[2], li[5], li[8]] == 3 * [x] or \
           [li[0], li[4], li[8]] == 3 * [x] or [li[2], li[4], li[6]] == 3 * [x]


def draw_cond(x, y, li):
    temp = list(map(lambda z: x if type(z) == int else z, li))
    d = not victory_cond(x, temp)
    temp = list(map(lambda z: y if type(z) == int else z, li))
    d &= not victory_cond(y, temp)
    return d


def avail(li):
    temp = []
    for n in li:
        if type(n) == int:
            temp.append(n)
    return str(temp).strip('[]')


grid(A)

player = 1

while True:
    if victory_cond('X', A) or victory_cond('O', A):
        print('The winner is: Player {}'.format(1 * victory_cond('X', A) + 2 * victory_cond('O', A)))
        break
    if draw_cond('X', 'O', A):
        print('DRAW!!')
        break
    i = int(input('Player {} - please type a position (available position(s) are {}): '.format(player, avail(A)))) - 1
    if type(A[i]) == str:
        print('\nPLEASE TYPE AN AVAILABLE POSITION\n')
        continue
    A[i] = 'X' * (player == 1) + 'O' * (player == 2)
    player = 3 - player
    print()
    grid(A)

2020/01/31 19:21

우재용

grid=[["1","|","2","|","3"],["4","|","5","|","6"],["7","|","8","|","9"]]
for lst in grid:
    for cpn in lst:
        print("%2s"%cpn, end="")
    print()
nlst=[1,2,3,4,5,6,7,8,9]

def chngnum(num):
    global n
    if n==1:
        p1="O"
    else:
        p1="X"
    if num>0 and num<=3:
        grid[0][grid[0].index(str(num))]=p1
    elif num>3 and num<=6:
        grid[1][grid[1].index(str(num))]=p1
    else:
        grid[2][grid[2].index(str(num))]=p1

def decision():
    for i in range(3):
        if grid[0][i*2]==grid[1][i*2]==grid[2][i*2]:
            return grid[0][i*2]
        if grid[i][0]==grid[i][2]==grid[i][4]:
            return grid[i][0]
    if grid[0][0]==grid[1][2]==grid[2][4] or grid[0][4]==grid[1][2]==grid[2][0]:
        return grid[1][2]

n=1
while True:
    inp=input("Player %s - please type a position(available position(s) are "%n+str(",".join(list(map(str,nlst)))+": "))
    if int(inp) not in nlst:
        print("choose wrong position try another one")
        continue
    nlst.remove(int(inp))
    chngnum(int(inp))
    for lst in grid:
        for cpn in lst:
            print("%2s"%cpn, end="")
        print()
    if nlst==[]:
        print("Draw")
        break
    elif decision()=="O":
        print("Player1 Win!!!")
        break
    elif decision()=="X":
        print("Player2 Win!!!")
        break
    if n==2:
        n=1
    else:
        n+=1

2020/03/01 16:53

박시원

import numpy as np
import random
data  = np.array([[1,2,3],[4,5,6],[7,8,9]])

def trans():
    a = int(input("선택할 숫자 입력 : "))
    if a-3>3 :
        a-=7
        b=2
    elif a-3>=1:
        a-=4
        b=1
    elif a-3<=0:
        a-=1
        b=0
    if data[b][a] == 10 or data[b][a] ==11 :
        print("선택된 공간입니다")
        trans()
    else:
        data[b][a] = 10
    #print(data)

def com():
    while True:
        c = random.randint(0,2)
        d = random.randint(0,2)
        if data[d][c] == 10 or data[d][c] == 11 :
            print("이미 선택된 공간입니다")
        else:
            data[d][c] = 11
            break


def tic():
    while True:
        com()
        if data[0][0]==10 and data[0][1]==10 and data[0][2]==10:
            print("이겼습니다!")
            w=1
            break
        elif data[1][0]==10 and data[1][1]==10 and data[1][2]==10:
            print("이겼습니다!")
            w=1
            break
        elif data[2][0]==10 and data[2][1]==10 and data[2][2]==10:
            print("이겼습니다")
            w=1
            break
        elif data[0][0]==10 and data[1][0]==10 and data[2][0]==10:
            print("이겼습니다")
            w=1
            break
        elif data[0][1]==10 and data[1][1]==10 and data[2][1]==10:
            print("이겼습니다")
            w=1
            break
        elif data[0][2]==10 and data[1][2]==10 and data[2][2]==10:
            print('이겼습니다')
            w=1
            break
        elif data[0][0]==10 and data[1][1]==10 and data[2][2]==10:
            print("이겼습니다")
            w=1
            break
        elif data[0][2]==10 and data[1][1]==10 and data[2][0]==10:
            print("이겼습니다")
            w=1
            break
        if data[0][0]==11 and data[0][1]==11 and data[0][2]==11:
            print("졌습니다!")
            w=1
            break
        elif data[1][0]==11 and data[1][1]==11 and data[1][2]==11:
            print("졌습니다!")
            w=1
            break
        elif data[2][0]==11 and data[2][1]==11 and data[2][2]==11:
            print("졌습니다")
            w=1
            break
        elif data[0][0]==11 and data[1][0]==11 and data[2][0]==11:
            print("졌습니다")
            w=1
            break
        elif data[0][1]==11 and data[1][1]==11 and data[2][1]==11:
            print("졌습니다")
            w=1
            break
        elif data[0][2]==11 and data[1][1]==11 and data[2][0]==11:
            print('졌습니다')
            w=1
            break
        elif data[0][0]==11 and data[1][1]==11 and data[2][2]==11:
            print("졌습니다")
            w=1
            break
        elif data[0][2]==11 and data[1][1]==11 and data[2][0]==11:
            print("졌습니다")
            w=1
            break
        print(data)
        trans()




tic()

지저분..

2021/04/12 18:55

fox.j

board = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]

for i in board:
    print(' | '.join(i))
selected = []

for i in range(1, 10):
    if i%2 == 1:
        symbol = 'O'  # 1번 플레이어는 O 마크 사용
    else:
        symbol = 'X'

    p = int(input(symbol + '의 위치를 선택하세요: ')) - 1
    while p in selected:
        p = int(input(symbol + '의 다른 위치를 선택하세요: ')) - 1
    selected.append(p)
    y, x = p//3, p%3  # 선택 위치는 한 행당 3개씩 있기 때문에 3으로 나눈 몫이 행, 나머지는 열
    board[y][x] = symbol

    for ii in board:
        print(' | '.join(ii))

    tmpy = set()
    tmpx = set()
    for ip in range(3):  # 선택된 행과 열의 값이 같은지 확인
        tmpy.add(board[ip][x])
        tmpx.add(board[y][ip])
    if len(tmpy) == 1 or len(tmpx) == 1:
        print(symbol, 'WIN !!!')
        break
    if len(selected) == 9:
        print('DRAW GAME')
        break

2021/09/27 00:17

­박철희

# 포지션 변경 함수
def change (arr,n,k):
    k_arr={1:'X',2:'O'}
    s =k_arr[k]
    if n ==1: arr[1][0] = s
    elif n==2 : arr[1][4] = s
    elif n==3 : arr[1][8] = s
    elif n==4 : arr[4][0] = s
    elif n==5 : arr[4][4] = s
    elif n==6 : arr[4][8] = s
    elif n==7 : arr[7][0] = s
    elif n==8 : arr[7][4] = s
    else : arr[7][8] = s
    return arr

#빙고 판단 함수
def judge(arr):
    if arr[1][0] == arr[1][4] == arr[1][8] or \
       arr[4][0] == arr[4][4] == arr[4][8] or \
       arr[7][0] == arr[7][4] == arr[7][8] or \
       arr[1][0] == arr[4][0] == arr[7][0] or \
       arr[1][4] == arr[4][4] == arr[7][4] or \
       arr[1][8] == arr[4][8] == arr[7][8] or \
       arr[1][0] == arr[4][4] == arr[7][8] or \
       arr[7][0] == arr[4][4] == arr[1][8] :
            return False
    else:
        return True

# positin 배열 출력 함수
def print_p (arr):
    for k in arr:
        for i in k:
            print(i,end='')
        print('')

#game의 초기 포지션 배열
game = [[' '*2,'*',' '*3,'*',' '*2],[1,' ','*',' ',2,' ','*',' ',3],\
        [' '*2,'*',' '*3,'*',' '*2],[' '*2,'*',' '*3,'*',' '*2],\
        [4,' ','*',' ',5,' ','*',' ',6],[' '*2,'*',' '*3,'*',' '*2],\
        [' '*2,'*',' '*3,'*',' '*2],[7,' ','*',' ',8,' ','*',' ',9],\
        [' '*2,'*',' '*3,'*',' '*2]]


position=[i for i in range(1,10)]
p={1:1,-1:2}  # player를 번갈아 가며 진행하기위해 key vlaue로 순환 반복
k=-1
while True:
    k*=-1
    print('Player',p[k],'- please type a position (available position(s) are',position)
    while True:
        n = int(input())
        if n in position:
            break
    game = change(game,n,p[k])
    position.remove(n)
    print_p(game)
    if judge(game) == False:
        print('Win player is: player',p[k])
        break

재밌네요~ 코드가 길지만 2차원 배열과 키 밸류를 이용해서 플레이어가 번갈아가며 진행할수 있도록 해봤어요~ position 배열은 따로둬서, 각 포지션을 고를떄마다 position 배열에서 remove 해서 중복 선택 못하도록 했습니다

2022/02/23 20:53

양캠부부

using System;

namespace Tictacto_Game
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[,] ticBoard = { { "1", "2", "3" }, { "4", "5", "6" }, { "7", "8", "9" } };
            printBoard(ticBoard);
            int p = 1;
            while (true)
            {
                Console.WriteLine("player{0}: 원하는 자리는?",p);
                int pick = int.Parse(Console.ReadLine());
                if(pick <1 || pick>9 || ticBoard[(pick-1)/3, (pick-1)%3] == "O" ||
                    ticBoard[(pick-1) / 3, (pick - 1) % 3] == "X")
                    Console.WriteLine("다시 하세요!!");
                else
                {
                    ticBoard[(pick - 1) / 3, (pick - 1) % 3] = (p == 1) ? "O" : "X";
                    printBoard(ticBoard);
                    if (checkWin(ticBoard))
                    {
                        Console.WriteLine("\n\n    player{0} 승리!!     \n\n",p);
                        break;
                    }
                    p = (p == 1) ? 2 : 1;

                }                
            }
            Console.ReadKey();
        }

        private static bool checkWin(string[,] ticBoard)
        {
            for (int i = 0; i < 3; i++)
            {
                if (ticBoard[i, 0] == ticBoard[i, 1] && ticBoard[i, 1] == ticBoard[i, 2])
                    return true;
                if (ticBoard[0, i] == ticBoard[1, i] && ticBoard[1, i] == ticBoard[2, i])
                    return true;
            }
            if((ticBoard[0, 0] == ticBoard[1, 1] && ticBoard[1, 1] == ticBoard[2, 2]) ||
                (ticBoard[0, 2] == ticBoard[1, 1] && ticBoard[1, 1] == ticBoard[2, 0]))
                return true;
            return false;
        }

        private static void printBoard(string[,] ticBoard)
        {
            for(int y = 0;y < 7;y++)
            {
                for (int x = 1; x <= 2; x++)
                {
                    Console.SetCursorPosition(4 * x, y + 4);
                    Console.WriteLine("*");
                }
            }

            for (int r = 0; r < 3; r++)
            {
                for (int c=0;c < 3; c++)
                {
                    Console.SetCursorPosition(c * 4 + 2, r *2 + 5);
                    Console.WriteLine(ticBoard[r,c]);
                }
            }
            Console.WriteLine("\n\n");
        }
    }
}

2023/12/06 20:57

insperChoi

목록으로