2013-10-05 4 views
0

Итак, у меня есть еще один вопрос о игре с tic tac toe, которую я создаю. : P Я работаю над кодированием A.I. это непревзойденно, так что я сейчас нахожусь в том, что, если компьютер начнет сначала, он выполнит необходимые шаги для победы или розыгрыша, однако я не знаю, как использовать алгоритмы, в основном minimax(), (так как это это моя первая фактическая программа, которую я делаю), и я не слишком уверен, как упростить все мои инструкции if.Начальные алгоритмы/вложенные операторы if Python 3.3

Код, который у меня есть для A.I. до сих пор выглядит следующим образом:

if strategy == False: 
    slot[0] = computer_team 
    if slot[1] == user_team or slot [2] == user_team and (slot[3] != user_team) \ 
     and (slot[3] != computer_team): 
     slot[3] = computer_team 
     if slot[6] == user_team and (slot[4] != user_team) and (slot[4] != computer_team): 
      slot[4] = computer_team 
     else: 
      return 
    if slot[3] == user_team or slot[4] == user_team or slot[6] == user_team \ 
      and (slot[1] != user_team) and (slot[1] != computer_team): 
     slot[1] = computer_team 
     if slot[2] == user_team and (slot[4] != user_team) and (slot[4] != computer_team): 
      slot[4] = computer_team 
     elif slot[2] == user_team and slot[4] == user_team and (slot[6] != user_team) \ 
      and (slot[6] != computer_team): 
      slot[6] = computer_team 
      if slot[4] == user_team and (slot[5] != user_team) and (slot[5] != computer_team): 
       slot[5] = computer_team 
      elif slot[7] == user_team and slot[5] == computer_team and (slot[8] != user_team) and (slot[8] != computer_team): 
        slot[8] = computer_team 
     else: 
      return 
    else: 
     return 

Одна вещь, которую я нашел, чтобы быть проблемой является то, что когда-то, если заявления получить вложенные в до сих пор они прекращают выполнение (в данном случае, слот последним Элиф [7]). Я знаю, что этот код неэффективен, но это единственный способ, которым я знаю, как это сделать. (Я не уверен, как я буду использовать для операторов или диапазонов здесь). Поэтому, если у кого-то из вас есть предложения по алгоритмам или как упростить это, если вложенные беспорядки, тогда я буду рад услышать. с:

Edit: Все слот неразбериха относится к моей плате, которая:

def draw_board(): 
'''Opted to use lists so that the numbers can be replaced with either 
    X or O later on and so that testing whether the game is over is simpler''' 
print (" " + str(slot[0]) + " | " + str(slot[1]) + " | " + str(slot[2])) 
print ("-----------") 
print (" " + str(slot[3]) + " | " + str(slot[4]) + " | " + str(slot[5])) 
print ("-----------") 
print (" " + str(slot[6]) + " | " + str(slot[7]) + " | " + str(slot[8])) 
print ("\n") 

И user_team/computer_team имеет либо «X» или «O», в зависимости от которой один игрок решает использовать ,

+1

можете ли вы предоставить пастебин (http://pastebin.com/) вашего кода? Я хочу запустить его сам и посмотреть, что происходит (проще отлаживать в траншеях, чем от моста корабля в море = P) –

+0

@JustinCarroll http://pastebin.com/9VbzpgWe Чтобы увидеть проблему с if -statement не выполняется, перезагрузитесь, пока компьютер не начнет сначала, а затем для ваших ходов, сделайте 4, 2, 3, 7.: P –

+0

спасибо - глядя на него сейчас. Какую версию python вы используете? 3+? 2,7? –

ответ

0

Я нашел несколько других «ошибок», но чтобы ответить на ваш вопрос ...

Похоже вашей проблемы здесь:

elif slot[2] == user_team and slot[4] == user_team and (slot[6] != user_team) \ 
and (slot[6] != computer_team): 

к тому времени вы следовать схеме вы предусмотрели 4, 2, 3, 7 плата выглядит следующим образом:

O | O | X 
----------- 
X | X | O 
----------- 
O | X | 8 

Какой из вышеуказанных условий не удовлетворяет. Например, что вы написали читает:

if Slot2 = User, Slot4 = User, Slot6 != User, and Slot6 != Computer either... 

И совет гласит:

Slot2 = User, Slot4 = User, Slot6 != User, and Slot6 = Computer 

я только удалил and (slot[6] != computer_team) от того, что линия 192 для меня, и это, кажется, работает просто отлично теперь.

Сообщите мне, если это зафиксировало ваши первые (из-за чего может быть много) проблем (на всем протяжении есть несколько других ошибок, но если вы проложите себе путь, вы найдете их все в свое время) ,

Это прочная - хорошая работа.

+0

Да, это определенно! Все эти утверждения if/elif могут стать довольно значительными. >. <Но хорошо, теперь я знаю, как решить эту ошибку, если она появится в другом сценарии! И хорошо, я не удивлен, что есть другие ошибки, но я, вероятно, столкнусь с ними в какой-то момент. xD Спасибо за помощь и ваше время! Я теперь возвращаюсь к размалыванию всех возможных шагов для ai. : P –

+0

Я рекомендую использовать отладчик бедных людей с помощью 'print()'. Я нашел эту ошибку, посмотрев на ваше гнездование, а затем добавив «печать» в разные места, чтобы посмотреть, какие места действительно стреляют. Затем, когда я увидел, что некоторые места освещались, а другие не спали, я знал, где сосредоточиться. Или ... вы могли бы просто использовать отладчик, как профи, и пройти через него ха-ха. –

+0

Хмм, печать для отладки? На самом деле это хорошая идея. Я буду использовать это в будущем, и, возможно, я буду использовать отладчик. Мне придется выбросить некоторые преднамеренные ошибки и пропущенные петли в тесте, чтобы почувствовать это. –

0

Вы можете посмотреть на

http://www.ntu.edu.sg/home/ehchua/programming/java/JavaGame_TicTacToe_AI.html

Он принимает вас шаг за шагом по построению решений для Tic Tac Toe. Обратите внимание, что он начинается с внедрения табличной реализации, аналогичной тому, что вы сделали здесь, и приступает к использованию древовидных решений.

+0

Пойду взглянуть и посмотреть, смогу ли я найти что-то, что поможет. :) –

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