2015-01-14 3 views
0

Я начинаю с python, и я создаю игру с двумя игроками tic tac toe в терминале. В общем, этот код занимает 139 строк (это ниже относится к той части кода, с которой у меня возникают проблемы), однако эта функция CheckWin занимает около 40 строк кода, что, я думаю, довольно много по сравнению с суммой строк в этом коде и учитывая, что он выполняет несколько базовую функцию. В принципе, в игре эта функция проверяет, есть ли строка, столбец или диагональ, имеет три X или три O, и если да, то назначает X победителю и O победителю. Во всяком случае, вот код.Упрощение Python If Statementments

X = "X" 
O = "O" 
empty = " " 
S = [" ", " ", " ", " ", " ", " ", " ", " ", " "] 

def CheckWin(S): 
    global winner 
    winner = "" 
    if S[0] == S[1] == S[2] != empty: 
     if S[0] == X: 
      winner = X 
     if S[0] == O: 
      winner = O 
    if S[3] == S[4] == S[5] != empty: 
     if S[3] == X: 
      winner = X 
     if S[3] == O: 
      winner = O 
    if S[6] == S[7] == S[8] != empty: 
     if S[6] == X: 
      winner = X 
     if S[6] == O: 
      winner = O 
    if S[0] == S[3] == S[6] != empty: 
     if S[0] == X: 
      winner = X 
     if S[0] == O: 
      winner = O 
    if S[1] == S[4] == S[7] != empty: 
     if S[1] == X: 
      winner = X 
     if S[1] == O: 
      winner = O 
    if S[2] == S[5] == S[8] != empty: 
     if S[2] == X: 
      winner = X 
     if S[2] == O: 
      winner = O 
    if S[0] == S[4] == S[8] != empty: 
     if S[0] == X: 
      winner = X 
     if S[0] == O: 
      winner = O 
    if S[2] == S[4] == S[6] != empty: 
     if S[2] == X: 
      winner = X 
     if S[2] == O: 
      winner = O 

В принципе, мне нужна помощь, чтобы сделать функцию намного проще. Однако я не хочу исключать переменные X, O и победителя, а также не хочу исключить метод индекса списка со списком S. Хотя есть ли способ упростить все эти утверждения If, сохраняя эти вещи? Если да, то как?

+0

Для начала, вы можете избавиться от нагрузок, сокращая все из '', если S [п] == X: победитель = X/S, если [х] == O: победитель = O'' в просто '' winner = S [n] ''. Это сэкономит вам 24 строки кода. :) –

+0

Рассмотрите использование циклов 'for' и' range'. – Alex

+1

Этот вопрос лучше подходит для http://codereview.stackexchange.com/, где основное внимание уделяется улучшению существующего кода. – zehnpaard

ответ

0

Ваш код ищет «трио» позиций; Вы могли бы также иметь объект, который содержит эту информацию:

trios = ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6)) 

Тогда CheckWin бы просто цикл через все трио, сделать это проверить, что вы делаете, и вернуться победителем, если трио матчей. Таким образом, CheckWin будет меньше 10 строк кода.

Я не хочу, чтобы дать все это прочь, потому что я уверен, что вы можете сделать это :)

Кроме того, вам не нужна глобальная переменная «победитель» в CheckWin; просто попробуйте CheckWin вернуть победителя (или «») и сохранить результат в переменной вне самой функции.
I.e.

winner = CheckWin(S) 
+0

wow thanks, это намного проще, однако, как мне заставить переменную trios работать со списком S и его индексами. – supersmarty1234

+0

Подробнее о срезах – stark

+0

Что-то вроде 'для трио в трио'', если S [трио [0]] == S [трио [1]] == S [трио [2]] ...' – Roberto

0

Вы пробовали использовать петлю вместо этого?

X, O = 'X', 'O' 
S = [X,O,X,O,X,O,O,X,O] # Test values 
def CheckWin(S): 
    index  = 0 
    has_winner = False 
    while index < len(S): 
     print index 
     if index <= 6: # after this point you won't find a winner (or you run this after every turn?) 
      if (index % 3 == 0 and S[index] == S[index + 1] and S[index] == S[index + 2]): # horizontals 
       has_winner = True 
      elif index < 3: # verticals and diagonals (you only need the first row to know this) 
       if (S[index] == S[(index + 3)] and S[index] == S[index + 6]) or \ 
        (index == 0 and S[index] == S[4] and S[index] == S[8]) or \ 
        (index == 2 and S[index] == S[4] and S[index] == S[6]): 
        has_winner = True 
     if has_winner: # I'm using this to prevent duplicating code above (one if less) 
      if S[index] in [X,O]: 
       return S[index] 
     index += 1 
    return has_winner # If we have a winner but the X or O criterion isn't met, it returns False 
winner = CheckWin(S)