2016-11-18 2 views
1

Мне интересно, как я могу сконденсировать эти утверждения elif в какой-то метод. Я также не знаю, как нужно хранить выбранную координату, чтобы я мог выполнять проверки окружающих координат. Я знаю, что мой код - nooby, но я тоже, я лучше знаю, начиная с длинного пути :)Как преобразовать несколько инструкций ELIF в один метод (PYTHON)

Ниже приведено, как я собираюсь хранить координату внутри переменной. (Не уверен, что это даже правильный способ сделать это еще ...)

grab = board[x][y] 
if(SjumpX == 'A1'): 
    grab = [0][0] 
elif(SjumpX == 'A2'): 
    grab = [0][1]  
elif(SjumpX == 'A3'): 
    grab = [0][2] 
elif(SjumpX == 'A4'): 
    grab = [0][3] 
elif(SjumpX == 'B1'): 
    grab = [1][0] 
elif(SjumpX == 'B2'): 
    grab = [1][1] 
elif(SjumpX == 'B3'): 
    grab = [1][2] 
elif(SjumpX == 'B4'): 
    grab = [1][3] 
elif(SjumpX == 'C1'): 
    grab = [2][0] 
elif(SjumpX == 'C2'): 
    grab = [2][1] 
elif(SjumpX == 'C3'): 
    grab = [2][2] 
elif(SjumpX == 'C4'): 
    grab = [2][3] 

SjumpX координату куска моего игрок хочет, чтобы захватить и DjumpX координаты места назначения. Моя логика заключается в том, что если игрок входит в координату (т.е. A1 B2 C3 ...), я могу сохранить эту координату в переменной «grab», а затем использовать эту переменную для проверки, если координата адресата пуста, также, если координация между ними - это противоположная фигура игроков.

Вот совет:

1 2 3 4 
A - X O X 
B X O - O 
C O X O X 

Это где я проверяю, что «jumpable» координаты назначения пустуют на основании текущих координат моего «захватить» переменной. В этом случае 'A3' < ==> грейфер = [0] [2]

if((grab[x][y-2] == '-' or grab[x][y+2] == '-' or grab[x-2][y] == '-' or grab[x+2][y] == '-')and 
    (grab[x][y-1] == 'X' or grab[x][y+1] == 'X' or grab[x-1][y] == 'X' or grab[x+1][y] == 'X'): 

Мои основные вопросы:

1- Как уплотнить мой огромный список Элиф заявление?
2- Каков правильный формат/процесс для хранения координаты для выполнения проверки окружающего содержимого координат?
3- Как я могу сгустить оператор if, который проверяет, пуста ли координата места назначения ('-').

+1

Во всех выражениях 'elif', я полагаю, вы намерены означать' return grab [x1] [y1] 'или' grab = board [x1] [y1] 'вместо' grab = [x1] [y1] '. Правильно? Потому что утверждения не кажутся синтаксически правильными. –

+1

Просто для забавы вы можете конденсировать вас elifs в одну строку (при условии, что приведенный выше комментарий верен): 'grab [{'A': 0, 'B': 1, 'C': 2} [SjumpX [0]] ] [int (SjumpX [1]) - 1] ' – khachik

ответ

2

Мы можем сделать карту затем использовать его можно инициализировать захват

т.е.

field_map = {'A1':(0,0),'A2':(0,0)......} 
if SjumpX in field_map.keys(): 
    x,y = field_map[SjumpX] 
    grab = [x][y] 

Я думаю, что это помогает

+1

Когда вы * теневой * встроенный python. например [map] (https://docs.python.org/3/library/functions.html#map), имейте в виду, что вы это сделали и какие-либо возможные последствия. – wwii

+1

@wwii спасибо за хорошую обратную связь, я переименовал эту переменную –

+1

Плохая часть этого подхода заключается в том, что если вы добавите столбец, вам нужно будет изменить field_map и добавить другой набор значений для A, B, C. Вы можете просто сопоставить индексы A, B, C с индексами, а для столбцов - номер, который вы получаете в координатах для пользователей. – khachik

1

У меня есть два предложения:

Первые : Сохраните список смежности для представления или матрицы (этот ответ зависит от вашего дизайна, Я лично, как смежности списки лучше)

# Adding only some of the values here 
map = {'A1': ['A2','B1'], 'A2': ['A1','A3', 'B2'], 'B1': ['A1','B2','C1']} 
val_map = {'A1': '-', 'B1': 'X'} 
grab = SjumpX 
# You can also get the values by iterating over the list from next statement 
nearby_ele[grab] = map[grab] 

Второе: магазин отображение row, col в dict{'A1': (0,0), 'A2': (0,1)}. Dict - постоянный поиск по времени, и вы можете напрямую получить координаты, чтобы сделать вещи быстро. Используйте матричное представление, как

map = {'A1': (0,0), 'A2': (0,1), 'A3': (0,2), 'A4': (0,3), 
     'B1': (1,0), 'B2': (1,1), 'B3': (1,2), 'B4': (1,3), 
     'C1': (2,0), 'C2': (2,1), 'C3': (2,2), 'C4': (2,3), 
     } 
val_map = [['-', 'X', 'O', 'X'], ['X', 'O', '-', 'O'],['O','X','O','X']] 
grab = map[SjumpX] 
nearby_ele[grab] = [(grab[0]-1,grab[1]), (grab[0]+1,grab[1]), 
        (grab[0],grab[1]-1), (grab[0],grab[1]+1)] 
1

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

grab = board[ord(SjumpX[0]) - 65][int(SjumpX[1]) - 1] 

Это означало бы превращение первой буквы SjumpX его ASCII значение ординат (А, В, С, ...), и преобразования его в числа (65, 66, 67, ...). Поскольку смещение равно 65, вычитание из ординаты должно дать вам нужные вам номера (0, 1, 2, ...)

С другой стороны, вы можете пойти по прямому методу, предложенному комментарием @ khachik.

grab = board[{'A':0, 'B':1, 'C':2}[SjumpX[0]]][int(SjumpX[1]) - 1] 

Это непосредственно карты (A, B, C) в (0, 1, 2), хотя это утверждение будет расти больше для больших досок (D, E, и так далее).