2016-08-02 6 views
2
board=[[1,0,8,5,12,16,24],[7,0,6,2,20,4,18],[13,0,9,10,22,23,17],[19,0,11,3,14,15,21]] 

def move(): 
while board[0][6]!= 0 and board[1][6]!=0 and board[2][6]!=0 and board[3][6]!=0: 
    user_choice= int(raw_input('>')) 
    for lists in board: 
     for i in range(len(lists)): 
      if lists[i]== user_choice-1 and lists[i+1]==0: 
       lists[i+1]= user_choice 
       print print_board(board)      
       for a in board: 
        for i in range(len(a)): 
         if a[i]==user_choice: 
          a[i]=0 
          print print_board(board) 

私はユーザーが数字(user_choice)を入力するゲームを作っています。プログラムは、user_choiceよりも小さい番号1を見つけます。ユーザーが8を選んだとすると、ゲームはボード上で7番の数字を見つけ、7の後の数字が0であれば、プログラムは0と8の位置を入れ替えます。私はネストされたifステートメントを持っていて、内部ステートメントはアウトターを無効にします

コードは2番目のif

[[1,0,8,5,12,16,24],[7,8,6,2,20,4,18],[13,0,9,10,22,23,17],[19,0,11,3,14,15,21]] 
None 
[[1,0,8,5,12,16,24],[7,0,6,2,20,4,18],[13,0,9,10,22,23,17],[19,0,11,3,14,15,21]] 
None 
[[1,0,0,5,12,16,24],[7,0,6,2,20,4,18],[13,0,9,10,22,23,17],[19,0,11,3,14,15,21]] 

第一の出力は、第二の出力は、ように見える8
と7の後に0を置き換え:文はここに声明

がuser_choice = 8の典型的な出力の場合、出力は最初の取り消し実行します最初のボードを表示します。
第3の出力は、私は両方とも0

答えて

0

変更して、最初の8を8と7の後に0を置き換え、置き換え一つの出力をしたい0

で最初のボードに8を置き換えますボードを編集する順序。まずi+1 == len(lists)

場合、私は、また、私は別の変数を使用し、jと IndexErrorを避けるために試してみた8

for i in range(len(lists)-1): 
     if lists[i]== user_choice-1 and lists[i+1]==0: 
      for a in board: 
       for j in range(len(a)): 
        if a[j]==user_choice: 
         a[j]=0 
         print print_board(board) 
      lists[i+1]= user_choice 
      print print_board(board) 

から7の後にゼロを変更、その後、ゼロで、他の8「に置き換わります

ここでは操作の順序が重要です。 7の後ろに続く0を8で置き換えてから8をすべて0に置き換えると、全体の効果は7に続く0を0で置き換えることです。

他を変更するとまず8sを0にしてから、7を8にした後にゼロを変更すると、全体的な効果があなたの望むものになります。

私はまだここにバグがあるかもしれないと思います。たとえば、1つ以上の7とそれに続く0がありますか?ボードに7が続いている場合はどうなりますか?これらのバグを解決するということは、あなたの考えをしてくれないので、コンピュータが望むものを正確に考えていることです。

+0

ここで注文が重要な理由を説明できますか? – tdammon

+1

@tdammon最初に7を8に置き換えた後、8をすべて0に置き換えたので、順序が重要です。私はこの解決策を試していないが、有効な(7、0)ペアが決して見つからなかったときに8秒に切り替えることに注意する。 – sberry

0

ない世界で最もエレガントな解決策が、ここでは私のものです:

board = [ 
      [1, 0, 8, 5, 12, 16, 24], 
      [7, 0, 6, 2, 20, 4, 18], 
      [13, 0, 9, 10, 22, 23, 17], 
      [19, 0, 11, 3, 14, 15, 21] 
] 

def print_board(): 
    for row in board: 
     print " ".join("{:2}".format(x) for x in row) 

while any(row[6] for row in board): 
    print_board() 
    user_choice = int(raw_input('-> ')) 
    replace_match = False 
    for i, row in enumerate(board): 
     pairs = zip(row, row[1:]) 
     for j, pair in enumerate(pairs): 
      if pair == (user_choice - 1, 0): 
       board[i][j+1] = user_choice 
       replace_match = (i, j+1) 
       print pair 
       break 
    else: 
     if replace_match: 
      for i, row in enumerate(board): 
       board[i] = [x if (x != user_choice or (i, j) == replace_match) else 0 for j, x in enumerate(row)] 
0

私はあなたの小さな機能に問題を破る場合は、物事は簡単に見つけることになると思います。ここでは簡単な例:

board = [[1,0,8,5,12,16,24],[7,0,6,2,20,4,18],[13,0,9,10,22,23,17],[19,0,11,3,14,15,21]] 

# See if item is in lst. If so, return xy location 
def in_list(item, lst): 
    for i in range(0, len(lst)): 
     for j in range(0, len(lst[i])): 
      if lst[i][j] == item: 
       return i, j 
    return -1,-1 

def print_board(): 
    for i in board: 
     for j in i: 
      print j, ' ', 
     print 

def game_over(): 
    return board[0][6] == 0 and board[1][6] == 0 and board[2][6] == 0 and board[3][6] == 0 

while (False == game_over()): 
    print_board() 
    user_choice = int(input("Enter a number: ")) 
    # ux,uy are co-ords of user choice 
    ux, uy = in_list(user_choice, board) 
    if (-1 != ux): 
     # mx,my are co-ords of user choice+1 
     mx, my = in_list(user_choice - 1, board) 
     if (-1 != mx): 
      if (0 == board[mx][my + 1]): 
       board[ux][ux] = 0 
       board[mx][my + 1] = user_choice 
関連する問題