2016-08-21 2 views
1

Я работаю над программой tic-tac-toe в python. Теперь, работа человека в порядке. Однако, ИИ, после первого хода, не играет никаких дальнейших поворотов. Я просмотрел код и не могу найти ошибок, которые могут вызвать это.Python TIC TAC TOE skipping turn

Просьба проигнорировать комментарии и ту часть, которая касается связей. Я все еще работаю над этим.

import random 
import copy 
import sys 


the_board = [" "]*10 


def printboard(board): 
    print(board[7] + " " + "|" + board[8] + " " + "|" + board[9]) 
    print("--------") 
    print(board[4] + " " + "|" + board[5] + " " + "|" + board[6]) 
    print("--------") 
    print(board[1] + " " + "|" + board[2] + " " + "|" + board[3]) 


def choose_player(): 
    while True: 
     player = input("What do you want to be; X or O?") 
     if player == "X": 
      print("You chose X") 
      comp = "O" 
      break 
     elif player == "O": 
      print("You chose O") 
      comp = "X" 
      break 
     else: 
      print("Invalid Selection") 
      continue 
    return [player, comp] 


def virtual_toss(): 
    print("Tossing to see who goes first.....") 
    x = random.randint(0,1) 
    if x== 0: 
     print("AI goes first") 
     move = "comp" 
    if x == 1: 
     print("Human goes first") 
     move = "hum" 
    return move 


def win(board,le): 
    if (board[7] == le and board[8] == le and board[9]==le) or (board[4] == le and board[5]==le and board[6] == le)or (board[1] == le and board[2]==le and board[3] == le)or (board[7] == le and board[5]==le and board[3] == le)or (board[9] == le and board[5]==le and board[1] == le)or (board[7] == le and board[4]==le and board[1] == le)or (board[8] == le and board[5]==le and board[2] == le)or (board[9] == le and board[6]==le and board[3] == le): 
     return True 
    else: 
     return False 


def make_move(board,number,symbol): 
    board[number] = symbol 


def board_full(board): 
    count = 0 
    for item in board: 
     if item in ["X","O"]: 
      count+= 1 
    if count ==9 : 
     return True 
    else: 
     return False 


def valid_move(board,num): 
    if board[num] == " ": 
     return True 
    else: 
     return False 


def player_move(board): 
    number = int(input("Enter the number")) 
    return number 


def copy_board(board): 
    copied_board = copy.copy(board) 
    return copied_board 


def check_corner(board): 
    if (board[7] == " ") or (board[9] == " ") or (board[1] == " ") or (board[3] == " "): 
     return True 
    else: 
     return False 


def check_center(board): 
    if (board[5] == " "): 
     return True 
    else: 
     return False 


while True: 
    count = 0 
    loop_break = 0 
    print("welcome to TIC TAC TOE") 
    pla,comp = choose_player() 
    turn = virtual_toss() 
    while True: 
     #printboard(the_board) 
     if board_full(the_board) == True: 
      again = input ("Game is a tie. Want to try again? Y for yes and N for No") 
      if again == "Y": 
       loop_break = 6 
       break 
      else: 
       system.exit() 
#if loop_break == 6: 
    #continue 

     if turn == "hum": 


      while True: 
        number = player_move(the_board) 
        if (valid_move(the_board,number) == True) and not(board_full == False): 
         make_move(the_board,number,pla) 
         #printboard(the_board) 
         break 
        else: 
         print("Invalid Move, try again!") 
         continue 
      if (win(the_board,pla) == True): 
       print ("Yay, you won!!!") 
       printboard(the_board) 
       count = 1 
       loop_break = 7 
       break 
      else: 
       turn = "comp" 
       printboard(the_board) 
       continue 

     else: 
      copied_board = copy_board(the_board) 
      for i in range(1,10): 
       make_move(copied_board,i,pla) 
       if(win(copied_board,pla) == True): 
        make_move(the_board,i,comp) 
        printboard(the_board) 
        turn = "hum" 
        loop_break = 1 
        break 
       else: 
        continue 
      if loop_break == 1: 
       continue 
      if (check_corner(the_board) == True) or (check_center(the_board)==True): 
       for i in [7,9,1,3,5]: 
        if(valid_move(copied_board,i)==True): 
         make_move(copied_board,i,comp) 
         if(win(copied_board,comp)==True): 
          make_move(the_board,i,comp) 
          printboard(the_board) 
          print("The AI beat you") 
          loop_break = 2 
          count = 1 
          break 
         else: 
          make_move(the_board,i,comp) 
          printboard(the_board) 
          turn = "hum" 
          loop_break = 3 
          break 
       if loop_break == 2: 
        break 
       elif loop_break == 3: 
        continue 
       else: 
        for i in [8,4,6,2]: 
         if(valid_move(copied_board,i)==True): 
          make_move(copied_board,i,comp) 
          if(win(copied_board,comp)): 
           make_move(the_board,i,comp) 
           printboard(the_board) 
           print("The AI beat you") 
           count = 1 
           loop_break = 4 
           break 
          else: 
           make_move(the_board,i,comp) 
           printboard(the_board) 
           turn = "hum" 
           loop_break = 5 
           break 
       if loop_break == 4: 
        break 
       elif loop_break == 5: 
        continue 

    if count == 1: 
     again = input("Would you like to play again? y/n") 
     if again == "y": 
      continue 
     else: 
      system.exit() 
+1

Вы пробовали переходить через код в отладчике? – FujiApple

+0

@FujiApple: Я новичок в программировании. Как мне это сделать? –

+0

Какой IDE (т. Е. Редактор) вы используете для написания кода? Большинство достойных IDE предоставляют визуальный отладчик, то есть PyCharm имеет [это] (https://www.jetbrains.com/help/pycharm/2016.1/stepping-through-the-program.html) – FujiApple

ответ

2

Одним словом, проблема вашего ИИ является то, что он выбрал ту же самую позицию все времена, которые, кажется, как «не играет какой-либо дальнейших поворотов».

Чтобы доказать это, просто добавьте print в для цикла вашего AI:

for i in range(1,10): 
    make_move(copied_board,i,pla) 
    if(win(copied_board,pla) == True): 
     make_move(the_board,i,comp) 
     print("The AI chose #%d"%i) # <-- here it is 
     printboard(the_board) 
     # ...... 

И вот результат.

welcome to TIC TAC TOE 
What do you want to be; X or O?X 
You chose X 
Tossing to see who goes first..... 
Human goes first 
Enter the number1 
    | | 
-------- 
    | | 
-------- 
X | | 
The AI chose #3 
    | | 
-------- 
    | | 
-------- 
X | |O 
Enter the number2 
    | | 
-------- 
    | | 
-------- 
X |X |O 
The AI chose #3 
    | | 
-------- 
    | | 
-------- 
X |X |O 
Enter the number 

Я не могу дать конкретный совет, чтобы решить эту ошибку, так как я совершенно не понял смысл этого AI # = _ = (может быть, вы должны использовать MiniMax). Но в любом случае ваш ИИ не должен размещать фигуры в одном и том же положении.

пс. вам может потребоваться изменить system.exit() на sys.exit().

pps. for-else grammar в Python отлично подходит для вас.

ppps. «удалить лишние скобки», - говорит PyCharm.

+0

Ну, я вроде новичок. Пытался спроектировать AI сам, и я думаю, что я потерпел неудачу :( В любом случае, большое спасибо за вашу помощь. Я просмотрю предоставленные ссылки и попытаюсь точно настроить мой ИИ. –

+0

@SwastikMohapatra это [пример MiniMax] (http://paste.ubuntu.com/23075036/) для tic tac toe в Python, написанном мною год назад. Это может помочь. – xmcp

 Смежные вопросы

  • Нет связанных вопросов^_^