Система определения выигрыша в крестики-нолики-Python

Я создаю игру в крестики-нолики на питоне и изо всех сил пытаюсь создать модуль, который определяет, выиграл ли кто-то. Я передаю в модуль 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))

Модуль, в котором я использую, чтобы проверить, выиграл ли кто-то. Модуль вызывается после 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

person Faisal148991    schedule 30.11.2015    source источник
comment
Не имеет отношения к вопросу, но ознакомьтесь с предложениями PEP8 по именованию соглашения. Это никак не меняет принцип работы кода, но делает его чтение намного проще для всех остальных. Board - ›board, Check_Results -› check_results и т. Д.   -  person Holloway    schedule 30.11.2015
comment
Вам нужно только проверить каждую строку (или столбец) и одну диагональ. После этого транспонируйте вашу доску и повторите.   -  person Frerich Raabe    schedule 28.01.2016


Ответы (2)


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

Тогда вам не нужно делать 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

Изменить: обратите внимание на соглашение об именах, оставьте CamelCase для классов.

Также однострочное решение:

return any(
    (board[each[0]] == board[each[1]] and board[each[1]]== board[each[2]])
    for each in win_comb)
person Cyrbil    schedule 30.11.2015
comment
Вы можете объединить две проверки в одну. a == b == c допустимо как логическое выражение. - person Holloway; 30.11.2015

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

#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
person Arnab Datta    schedule 30.11.2015