2015-11-30 3 views
1

Я создаю игру на Tic-Tac-Toe в питоне и изо всех сил пытаюсь создать модуль, который обнаруживает, что кто-то выиграл. Я передаю 2 вещи в модуль, плату и набор выигрышных комбинаций:
win_comb=((0,1,2),(3,4,5),(6,7,8),(6,3,0),(7,4,1),(8,5,2),(6,4,2),(8,4,0))Система обнаружения выигрыша Tic-tac-toe-Python

Модуль, в котором я использую, чтобы проверить, выиграл ли кто-либо. Модуль вызывается после выполнения 4 ходов. Если кто-то выиграл, он должен вернуть 1, но если у кого-то нет, то он должен вернуть -1.

def Check_Results(Board,win_comb): 
    for each in win_comb: 
     try: 
      if (Board[each[0]] == Board[each[1]] and Board[each[1]]== Board[each[2]] and Board[each[0]]==Board[each[2]]): 
       return 1 
      else: 
       each=each+1 
     except: 
      pass 
     return -1 
+0

не связан с вопросом, но взгляните на [предложения PEP8 для именования] (https://www.python.org/dev/peps/pep-0008/#naming-conventions). Он не меняет того, как работает код вообще, но он делает его намного проще для всех, кто его читает. 'Board' ->' board', 'Check_Results' ->' check_results' и т. Д. – Holloway

+0

Вам нужно только проверить каждую строку (или столбец) и одну диагональ. Впоследствии, [транспонировать] (http://stackoverflow.com/questions/21444338/transpose-nested-list-in-python) ваш совет и повторите. –

ответ

1

В вашей проверке, если вам нужны только две проверки.
Поскольку третье равенство будет подразумеваться (если == Ь и Ь == с тогда == с Подразумевается)

Тогда вам не нужно делать each=each+1 с for уже петля для каждого выигрыша комбинации. Наконец, ваш try/except не мешает вам видеть, что вы не можете сделать each+1, поскольку каждый из них является tuple и не может быть увеличен.

def check_Results(board, win_comb): 
    for each in win_comb: 
     if (board[each[0]] == board[each[1]] and board[each[1]]== board[each[2]]): 
      return 1 
    return -1 

Edit: обратите внимание на именование, резервные верблюжьего для Оценена.

Также раствор одна строка:

return any(
    (board[each[0]] == board[each[1]] and board[each[1]]== board[each[2]]) 
    for each in win_comb) 
+1

Вы можете комбинировать две проверки в одну. 'a == b == c' действителен как булево выражение. – Holloway

0

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

#Assume pre-defined BOARD_LEN (for instance 3) 
Board = [[None for y in range(BOARD_LEN)] for x in range(BOARD_LEN)] 

TOKEN_1 = "0" 
TOKEN_2 = "X" 

""" 
Get a sequence of tokens and see which one would win. Examples: 
[None,0,x] gives None as winner 
[0,0,0] gives 0 as winner 
[0,X,0] gives None as winner 
""" 
def get_winner_of_sequence(seq, TOKEN1, TOKEN2): 
    token_set = set(seq) 
    if len(token_set) > 1 or None in token_set: 
    return None 
    return TOKEN1 if TOKEN1 in seq else TOKEN2 

""" 
Assume a N x N board. 
Winning sequences are: 
- all rows 
- all columns 
- the diagonal (0,0 -> N-1,N-1) 
""" 
def get_possible_winning_sequences(board): 
    winning_sequences = [] 
    #Add each row 
    #Add each column 
    #Add the diagonal 
    return winning_sequences 
Смежные вопросы