2016-11-18 54 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 

這地方我檢查了「可轉移」目標座標根據我的「搶」變量的當前座標是空的。在這種情況下, '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-如何凝聚我的巨大的elif語句列表?
2-正確的格式/過程存儲座標以執行對周圍座標內容的檢查是什麼?
3-如何壓縮我的if語句來檢查目標座標是否爲空(' - ')。

+1

在所有的'elif'語句中,我想你的意思是'返回抓取[x1] [y1]'或'抓住= 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

當你* shadow *一個python內建的。像[地圖](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, coldict{'A1': (0,0), 'A2': (0,1)}的映射。字典是恆定的時間查詢,你可以直接獲得協調,讓事情變得更快。使用矩陣表示爲

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縱座標值(A,B,C,...)並將其轉換爲數字(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,等)。