2016-11-30 7 views
-3

Я пытаюсь написать функцию в моей программе tic-tac-toe, которая проверяет, были ли все три пробела в строке на сетке отмечены как «x» или «o». lst_1 список всех возможных комбинаций линий:проверка строки во вложенном списке

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    triplet = [s for s in lst_1] 
    if all('o' == item for item in triplet): 
     print('Player 2 wins!') 
     reply() 
    elif all('x' == item for item in triplet): 
     print('Player 1 wins!') 
     reply() 
    else: 
     pass 

Я думал, что это будет остановить игру, когда кому-то удалось получить 3 подряд, но он продолжает идти. Есть идеи?

+0

Я думаю, что у вас есть дополнительные данные в 'lst_1', это все испортило. – TigerhawkT3

+0

И в ваших 'all()' вызовах отсутствуют некоторые ключевые части. – TigerhawkT3

+0

Ваш отступ выключен, что имеет решающее значение для Python. Ваша переменная 'triplet' кажется такой же, как' lst_1'. Вы не говорите нам, что означает 'reply()'. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

ответ

1

Чтобы ответить на ваш вопрос просто, вы не итерации через lst_1. Я думаю, вы думаете, что по заявлению вы используете для triplet, но на самом деле просто копирует lst_1 в triplet.

Я предполагаю, что вы на самом деле пытаетесь сделать генератор из lst_1 и назначить его triplet, но вы случайно используете понимание списка и не совсем понимаете, как работают генераторы. Подробнее о генераторах here.

В то время как генераторы, несомненно, являются полезными для некоторых ситуаций, я не думаю, что они на самом деле упростить код здесь. В любом случае вам понадобится цикл, и вам нужно проверить исключение StopIteration, чтобы узнать, когда закончится генератор.

Итак, мое предложение состоит в том, чтобы использовать цикл for.

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    for triplet in lst_1: 
     if all('o' == item for item in triplet): 
      print('Player 2 wins!') 
      reply() 
      break 
     elif all('x' == item for item in triplet): 
      print('Player 1 wins!') 
      reply() 
      break 

Некоторые другие нит: Добавление else: pass до конца вашего if-elif-else цикла совершенно постороннее. Этого не должно быть.

Также старайтесь избегать глобальных переменных. Прочтите немного о сфере видимости в Python. Это может работать для простых программ, но если вы полагаетесь на них, когда получаете что-либо удаленно, это повредит вам.

+0

Спасибо @ Dodosaur. Почему глобальные функции нежелательны? – Boris

+0

[This] (http://stackoverflow.com/questions/19158339/why-are-global-variables-evil) ответ объясняет это более красноречиво, чем я могу. – Dodosaur

+0

Извините, я попал в него и отправил его. Основной смысл состоит в том, что он затрудняет понимание кода, потому что если функция использует глобальную переменную, то есть что-то вне сферы действия ее функции. – Dodosaur

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