2016-11-18 12 views
1

これらのelifステートメントをある種のメソッドに凝縮する方法については、私は不思議です。私はまた、選択した座標を保存する方法を知らないので、周囲の座標のチェックを実行できます。私は自分のコードがnoobyだと知っていますが、それでは、私は長い道のりから始めることを学びます:)複数のELIFステートメントを1つのメソッド(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'に格納し、その変数を使用して目的地座標が空であるかどうかをテストします。 2人の間の座標は反対側の選手の部分です。

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 - どのように私は、巨大なelifのステートメントリストを凝縮しますか?
2周囲の座標の内容をチェックするために座標を格納する正しい形式/プロセスは何ですか?
3宛先の座標が空( ' - ')であるかどうかを調べるif文を凝縮するにはどうすればよいですか。

+1

すべての 'elif'文で' grab = [x1] [y1]の代わりに 'grab [x1] [y1]'や 'grab = board [x1] [y1] '。右?なぜなら、文は構文的に正しいとは思われないからです。 –

+1

あなたはelifを1行に集約することができます(上記のコメントが正しいと仮定して):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] 

グラブを初期化することができ、私はそれが私は2つの提案を持っている

+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] 

第二:ストアdict{'A1': (0,0), 'A2': (0,1)}row, colのマッピング。 Dictは一定の時間のルックアップであり、直接座標を取得して高速化することができます。あなたは、次のタスクのための単純なコードになり、SjumpX値に対応するボードの位置をつかむしたいと仮定すると、

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

として行列表現を使用してください。

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

これは(...、65、66、67)は、そのASCII縦座標値にSjumpXの最初の文字を変換する(A、B、C、...)と数字に変換意味します。オフセットは65なので、縦軸から差し引くと、必要な数字(0,1,2、...)が返されます。

一方、@ khachikのコメントで提案されている直接的な方法に行くことができます。

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

この文は、より大きな基板用長く成長(D、Eなど)であろうが、これは直接、(0、1、2)〜(A、B、C)にマッピングします。

関連する問題