Hola, tengo algunos problemas con la codificación del juego de tic tac toe en el que la computadora juega al azar eligiendo números entre 0 y 1. Intenté un código pero obtengo una situación irreal como esta representada aquí:

O O O

X X X

O O O

Quiero poner algo en mi código que verifique si hay un ganador en cada movimiento. Si alguien gana, quiero que el juego se detenga y diga quién es el ganador o si nadie gana. Y tampoco quiero que la salida sea como en la imagen de abajo. Solo quiero una sola pantalla de tablero (si es posible).

El resultado de este programa es ese.

Aquí está mi código:

import random

board = []
line= 3
col = 3
for i in range (line) :
    for j in range (col):
        board.append(" ") 


def show():
    print(board[0],'|',board[1],'|',board[2])
    print('--------------')
    print(board[3],'|',board[4],'|',board[5])
    print('--------------')
    print(board[6],'|',board[7],'|',board[8])
    print()

# Verify the possibility of position to take.
B=1
C=2
D=3           
def check(A, B, C, D):
    if board[B] == A and board[C] == A and board[D] == A :
        return True            

# Win conditions
def Winner(G):
    if  check(G, 0, 1, 2):
            True 
    if  check(G, 0, 3, 6):
            True 
    if  check(G, 0, 4, 8):
            True
    if  check(G, 1, 4, 7):
            True             
    if  check(G, 2, 5, 8):
            True         
    if  check(G, 2, 4, 6):
            True     
    if  check(G, 3, 4, 5):
            True 
    if  check(G, 6, 7, 8):
            True  


player1 = "O"
player2 = "X"
play=random.randint(0,1)
if play == 1:
    player1 = "X"
    player2 = "O"

while True:
        random.seed()
        place=random.randint(0,8)
        if board[place] != "O" and board[place] != "X" :
           board[place] = player1
           if Winner(player1)==True:
               print("~~~~~~~ the player ",player1," wins~~~~~~~")           
               break;

           while True:
               random.seed()
               place=random.randint(0,8)

               if board[place] != "O" and board[place] != "X" :
                   board[place] = player2
                   if Winner(player2)==True:
                       print("~~~~~~~ the player ",player2," wins~~~~~~~")           
                       break;

                   break; 

        else: 
            print("This position is already taken")         

        show()
0
gulraiz safdar 14 dic. 2016 a las 06:59

2 respuestas

La mejor respuesta

Código:

import random
board = []
for x in range(9):
    board.append(" ")
def show():
    print(board[0],'|',board[1],'|',board[2])
    print('--------------')
    print(board[3],'|',board[4],'|',board[5])
    print('--------------')
    print(board[6],'|',board[7],'|',board[8])
def check(A, B, C, D):
    if board[B] == A and board[C] == A and board[D] == A :
        return True 
def Winner(G):
    ret = False
    if  check(G, 0, 1, 2):
            ret = True 
    if  check(G, 0, 3, 6):
            ret = True 
    if  check(G, 0, 4, 8):
            ret = True
    if  check(G, 1, 4, 7):
            ret = True             
    if  check(G, 2, 5, 8):
            ret = True         
    if  check(G, 2, 4, 6):
            ret = True     
    if  check(G, 3, 4, 5):
            ret = True 
    if  check(G, 6, 7, 8):
            ret = True
    return ret
def filled():
    ll = 0
    for x in board:
        if x == " ":
            ll = 11 + 1
    if ll > 0:
        return False
    else:
        return True
done = False
turn = "O"
tie = False
while done == False:
    place = random.randint(0, 8)
    if board[place] == " ":
        board[place] = turn
        if Winner(turn) == True:
            done = True
        else:
            if filled() == True:
                done = True
                tie = True
            else:#change turn
                if turn == "X":
                    turn = "O"
                else:
                    turn = "X"
if tie == True:
    print ("The game was a tie. No winner.")
    show()
else:
    print("~~~~~~~ the player '",turn,"' wins~~~~~~~")
    show()

Esto debería completar todos sus requisitos.

Simplemente verifique el ganador () y complete () después de cada turno válido. haga que el ciclo cambie de quién es el turno después de cada ciclo exitoso, para evitar la duplicación.

NOTA: 'O' va primero, para cambiar esa variable de cambio, gire a 'X' antes de que comience el ciclo.

0
ANVGJSENGRDG 14 dic. 2016 a las 15:15

Su función Winner() no devuelve nada, por lo que de forma predeterminada devuelve False sin importar cuáles sean las entradas. Debe incluir un return True en lugar de solo True (que no hace nada en absoluto), algo como:

def Winner(G):
    if check(G, 0, 1, 2) or check(G, 0, 3, 6) or check(G, 0, 4, 8) or check(G, 1, 4, 7) or check(G, 2, 5, 8) or check(G, 2, 4, 6) or check(G, 3, 4, 5) or check(G, 6, 7, 8):
        return True
    else
        return False

El punto principal es que debería return True. El resto es principalmente preferencia de estilo; prefiero un solo if, con muchas or condiciones. Otros pueden preferir muchas declaraciones if todas con return True.

(Técnicamente, no necesita la parte else, ya que de todos modos devolverá False de forma predeterminada. Pero lo hace más legible. También puede eliminar solo la línea else, y aplicar sangría inversa a la return False, lo que la convierte en una trampa para toda la función en lugar de para la if.)

0
Son of a Beach 14 dic. 2016 a las 04:44