2016-11-17 4 views
1

Я пытаюсь запрограммировать вариант подключения четырех для моего класса программирования. Плата размером 6x8. В варианте Im пытается программировать выигрышное условие, по существу, построить Л.Python: Попытка запрограммировать вариант соединения четыре: условие победы не останавливается

Это означает, что любое построение формы
X
X
X X
выигрышная состояние.
Я пытаюсь сделать функцию, которая проверяет каждую колонку для последовательного же символа, чтобы построить пару. И функция сделать то же самое для каждой строки. С помощью этих двух функций я бы затем проверил, являются ли 2 пары последовательными, потому что независимо от того, как вы объедините вертикальную и горизонтальную пару, он всегда будет строить «L».

Чтобы сделать четкий совет, я использую

def ClearBoardSingle(): 
global Board 
Board = [['0' for i in range(8)] for i in range(6)] 
BoardPrint() 
PlayerMoveSingle() 

И для моего интерфейса я использую

def BoardPrint(): 
global Board 
global GameMoves 
global PlayerTurn 
global Player1Symbol 
global Player2Symbol 
print('\n\nMoves done: ' + str(GameMoves)) 
print('To Restart: R | To Quit: Q') 
print('Valid choices: 1, 2, 3, 4, 5, 6, 7, 8') 
if PlayerTurn == 0: 
    print('It\'s ' +str(Player1Symbol) + '\'s Turn') 
if PlayerTurn == 1: 
    print('It\'s ' +str(Player2Symbol) + '\'s Turn') 
print(Board[0]) 
print(Board[1]) 
print(Board[2]) 
print(Board[3]) 
print(Board[4]) 
print(Board[5]) 

Я уже понял, как изменить переменные внутри совета, и я все в значительной степени сделано, единственное, что я не знаю, как внедрить, - это условие победы. Я пробовал эту функцию для рядов

def VerticalList(Column): 
global Board 
global Choice 
global Row0 
Column = int(Column) 
Choice = int(Choice) 
print(Column,' C') 
while Column > 0: 
    for Board[Column][Choice] in range(Column): 
     Row0.append(Board[Column][Choice]) 
     if Column ==6 or Column == -1: 
      break 
     else: 
      VerticalList(Column-1) 
    if Column ==0: 
     break 
    else: 
     continue 
if Column == 0: 
    Column += 1 
    while Column < 5: 
     Column +=1 
     if Row0[Column] == Row0[Column-1]: 
      print('Pair') 
     else: 
      print('No Pair') 
      pass 
else: 
    pass 

Но это заканчивается бесконечной петлей.
У меня больше нет идей о том, как реализовать условие победы. Я был бы признателен за любую помощь или идеи, если вы хотите, чтобы я опубликовал весь код или другие фрагменты запроса.

Благодарим вас в ожидании!

+0

Вау, звучит так же, как проблема CS101 я был тоже назад, когда память была измерена в мегабайтах – Ray

+1

отформатирован ваш код правильно? возможно, просто вырезать-n-paste ошибку, попав в SO? отступ вашего кода влияет на область переменной. –

+0

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

ответ

0

Прохладная проблема, ниже выглядит много кода, но на самом деле это не так. Я не проверял это широко, поэтому я не уверен, что он не находит ложных срабатываний, но, похоже, он находит, что он должен найти. Главное, что я сделал, это использовать itertools.combinations, чтобы взять все 4-мерные группы позиций X, а затем проверить, были ли они похожими на модели, которые я ожидал для L's. В check_four_group Я рассматриваю различия внутри строки и столбцов.

from itertools import combinations 
def disp_board(board): 
    for row in board: 
     print(row) 

def check_winning(board): 
    winning = False 

    #Find all row,col positions of the X's 
    x_poses = [(i,j) for i in range(6) for j in range(8) if board[i][j] == 'X'] 

    #Loop through every combination of four X's since it takes four to make the 'L' 
    for group in combinations(x_poses,4): 
     if(check_four_group(group)): 
      winning = True 
      break 
    return winning 

def check_four_group(group): 
    rows,cols = zip(*[(r,c) for r,c in group]) 
    row_diffs = [rows[i+1]-rows[i] for i in range(len(rows)-1)] 
    col_diffs = [cols[i+1]-cols[i] for i in range(len(cols)-1)] 

    #Uncomment this to print the row and col diffs 
    #print(row_diffs) 
    #print(col_diffs) 

    # Finds: 
    # X 
    # X 
    # X X 
    if row_diffs == [1,1,0] and col_diffs == [0,0,1]: 
     return True 

    # Finds: 
    # X 
    # X 
    # X X 
    elif row_diffs == [1,1,0] and col_diffs == [0,-1,1]: 
     return True 

    # Finds: 
    # X X 
    # X 
    # X 
    elif row_diffs == [0,1,1] and col_diffs == [1,0,0]: 
     return True 

    # Finds: 
    # X X 
    # X 
    # X 
    elif row_diffs == [0,1,1] and col_diffs == [1,-1,0]: 
     return True 

    # Otherwise it's not there at all (not thinking about horizontal L's but could add that) 
    else: 
     return False 

#Test case 1 
def test_case_1(): 
    board = [['0' for i in range(8)] for i in range(6)] 
    board[2][1] = 'X' 
    board[2][2] = 'X' 
    board[3][1] = 'X' 
    board[4][1] = 'X' 
    return board 

#Test case 2 
def test_case_2(): 
    board = [['0' for i in range(8)] for i in range(6)] 
    board[2][1] = 'X' 
    board[2][0] = 'X' 
    board[3][1] = 'X' 
    board[4][1] = 'X' 
    return board 

#Test case 3 
def test_case_3(): 
    board = [['0' for i in range(8)] for i in range(6)] 
    board[1][0] = 'X' 
    board[2][0] = 'X' 
    board[3][0] = 'X' 
    board[3][1] = 'X' 
    return board 

#Test case 4 
def test_case_4(): 
    board = [['0' for i in range(8)] for i in range(6)] 
    board[1][2] = 'X' 
    board[2][2] = 'X' 
    board[3][2] = 'X' 
    board[3][1] = 'X' 
    return board 

################## 
#Start of program# 
################## 
board = test_case_1() 
#board = test_case_2() 
#board = test_case_3() 
#board = test_case_4() 

disp_board(board) 
if check_winning(board): 
    print('Victory') 
else: 
    print('Keep playing') 
+0

Ok Спасибо большое, я стараюсь в первую очередь понять: P, а затем реализовать это в своей игре. Я буду держать вас в курсе, если что-то не так –

+0

Прошу прощения за то, что вы так долго дали вам обновление, но я подумал, что должен понять код перед его использованием (: После того, как я понял, я добавил варианты выигрыша для горизонтального L'a, а затем добавил все в свой игровой процесс. Таким образом, вы, сэр, просто держали меня от часовых отчаянья и серьезной головной боли. –

+0

замечательная работа, добавляющая горизонтальный L's! – mitoRibo