3

だから私は割り当てのためにゲームを作っています、そして私はゲームボードを表すネストされたリストを取り込んで各行に1から5までの番号を付ける関数を作る必要があります(座標などのF4、G3など)。

たとえば、ボードを表すリストは次のようになります。

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

各リストの最初の位置に番号を追加して、次のようなものを取得する必要があります。

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

次のように表示します。

1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S

これを行う私の現在の方法は次のようなものです:

def display_board(board):
     bottomLetters  = [" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
     print board
     counter = int(0)
     for row in board:
         counter += int(1)
         row.insert(0, counter)
         for positon in row:
             print positon,
             print

これはほぼ機能しますが、奇妙な出力が得られます:

1 S S X S S
2 . . . . .
3 . . T . .
4 2 . . . . .
5 S S Y S S

またはゲームボードリスト自体:

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [4, 2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, 2, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

なぜこれが起こっているのか誰かが知っていますか?

4

4 に答える 4

3

本当の答えではありませんが、ちょっとしたアドバイスです。

int(0)を使用する必要はありません0。また、Python には、 と呼ばれるシーケンス内の項目に「番号を付ける」ための組み込みメソッドが既に用意されていますenumeratestr.joinテキストのフォーマットを印刷しやすくする方法も参照してください。

上記を使用すると、コードを次のように減らすことができます。

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

def display_board(board):
    for rowno, items in enumerate(board, start=1):
        print rowno, ' '.join(items)

display_board(board)

これはよりPythonicであるだけでなく、意図に関してより明確です。

于 2012-09-28T09:41:47.117 に答える
1

結果を再現できないようですが、ここで目立つ問題は、実行するたびにボードを変更している(カウンターを追加している)ことですdisplay_board()。ボードが元の形式であることを期待するコードは、表示すると壊れます。

これが私がそれにアプローチする方法です:

def display_board(board):
  for counter, row in enumerate(board, start=1):
    print counter, " ".join(row)
  print " ".join(" ABCDEFGHIJK"[:len(board[0])+1])

サンプル出力:

>>> display_board(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E
于 2012-09-28T09:46:17.613 に答える
1

このバグが発生する理由は、表示しているボードが実際には定義どおりではないためです...私は正しいですか?

2行目と4行目が同じように見えることに注意してください。データ構造では、これらはまったく同じオブジェクトになります。そのため、行番号2を変更すると、行番号4にも影響します。

どういうわけか、行を個別に初期化してから、それらをボードに割り当てて、2番目の行を繰り返しますか?その場合、それらをコピーするのではなく、実際には同じオブジェクトへの参照を格納することに注意してください。

于 2012-09-28T09:47:50.157 に答える
0

データ構造を表示する労力を節約し、同時にロジックを壊すためだけにデータ構造を変更することはしません。数字はボードの一部ではなく、ゲームの数字と混ぜてはいけません。私は次のようなことをします:

In [1]: %paste
board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]
## -- End pasted text --

In [2]: from string import ascii_uppercase

In [3]: def display(b):
    for i, row in enumerate(b, 1):
        print i, ' '.join(row)
    print ' ', ' '.join(x for _, x in zip(row, ascii_uppercase))

In [4]: display(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E
于 2012-09-28T09:45:18.543 に答える