2

Pythonでトリプルトライアドと呼ばれるゲームをプログラムしようとしましたが、ボードの出力に問題があります。すべての正方形のようにする必要があります。各数字は基点を表し、9つの正方形があります。ライン。

| 1 | 1 | 9 |

|2@3|1*6|7*2|

| 4 | 1 | 2 |

すべての行のリストを作成し、すべての基点の番号でボードを開始することを考えました。たとえば、北にある場合は「0」などなので、カードの番号に置き換える必要がある場合は、正確にわかります。すべての基本的なポイントをどこに置くか、何か提案はありますか?

前もって感謝します

4

4 に答える 4

4

このボードは、次の 3 つのリストで表すことができます。

["1", "1", "9"]
["2@3", "1*6", "7*2"]
["4", "1", "2"]

またはリストに一緒に:

board = [["1", "1", "9"], ["2@3", "1*6", "7*2"], ["4", "1", "2"]]

次の 2 つの関数を記述する必要があります。

  • このリストを取得|し、間に行を入れてボードを印刷する関数。
  • 上記のリストを計算し、ボード内の各セルの正しい値を決定する関数。

数字などを扱う必要はありません。この 2 つのことを行うだけです。

于 2012-06-05T18:59:25.180 に答える
2

探しているフォーマットを取得する簡単な方法を次に示します。

def format_row(row):
    return '|' + '|'.join('{0:^3s}'.format(x) for x in row) + '|'

def format_board(board):
    # for a single list with 9 elements uncomment the following line:
    # return '\n\n'.join(format_row(row) for row in zip(*[iter(board)]*3))
    # for a 3x3 list:
    return '\n\n'.join(format_row(row) for row in board)

例:

>>> print format_board([['1', '1', '9'], ['2@3', '1*6', '7*2'], ['4', '1', '2']])
| 1 | 1 | 9 |

|2@3|1*6|7*2|

| 4 | 1 | 2 |
于 2012-06-05T19:12:42.657 に答える
1

トリプル トライアドのカードを見ました (そのゲームは今でも覚えていますが、楽しいものです)、ボード上の @ や * が何を意味するのかわかりません。それを表現しようとしている場合は、数値を表示するコードを次に示します。

def cardString(card):
    if (card):
        return '{west},{north},{south},{east}'.format(**card)
    else:
        return '-,-,-,-'

def printBoard(board):
    for row in board:
        print('{}|{}|{}'.format(cardString(row[0]), cardString(row[1]), cardString(row[2])))

cardMoogle = {'north':9, 'east':3, 'west':2, 'south':9}
cardNull = {'north':'-', 'east':'-', 'west':'-', 'south':'-'}
# I'm sure there's a better way to do this list, but I'm new to Python.
board = [cardNull]*3
board = [list(board), list(board), list(board)]
board[0][0] = cardMoogle

printBoard(board)

それはまったく役に立ちますか?

于 2012-06-05T19:26:36.903 に答える
0

これはやり過ぎかもしれませんが、次の Matrix クラスはそれ自体の表現を自動的に作成できます。

class Matrix:

    def __init__(self, rows, columns):
        self.__data = tuple([None] * columns for row in range(rows))
        self.__rows, self.__columns = rows, columns

    def __repr__(self):
        table = Matrix(self.rows, self.columns)
        rows, columns = [0] * self.rows, [0] * self.columns
        for (row, column), value in self:
            lines = tuple(repr(value).replace('\r\n', '\n')
                          .replace('\r', '\n').split('\n'))
            table[row, column] = self.__yield(lines)
            rows[row] = max(rows[row], len(lines))
            columns[column] = max(columns[column], max(map(len, lines)))
        return ('\n' + '+'.join('-' * column for column in columns) + '\n') \
               .join('\n'.join('|'.join(next(table[row, column])
               .ljust(columns[column]) for column in range(table.columns))
               for line in range(rows[row])) for row in range(table.rows))

    def __len__(self):
        return self.rows * self.columns

    def __getitem__(self, key):
        row, column = key
        return self.__data[row][column]

    def __setitem__(self, key, value):
        row, column = key
        self.__data[row][column] = value

    def __delitem__(self, key):
        self[key] = None

    def __iter__(self):
        for row in range(self.rows):
            for column in range(self.columns):
                key = row, column
                yield key, self[key]

    def __reversed__(self):
        for row in range(self.rows - 1, -1, -1):
            for column in range(self.columns - 1, -1, -1):
                key = row, column
                yield key, self[key]

    def __contains__(self, item):
        for row in self.__data:
            if item in row:
                return True
        return False

    def freeze(self):
        self.__data = tuple(map(tuple, self.__data))

    def thaw(self):
        self.__data = tuple(map(list, self.__data))

    @property
    def rows(self):
        return self.__rows

    @property
    def columns(self):
        return self.__columns

    @staticmethod
    def __yield(lines):
        for line in lines:
            yield line
        while True:
            yield ''

行列を設定、加算、または乗算する方法が必要な場合は、これらの関数が操作の補足として機能します。

def set_matrix(matrix, array):
    for y, row in enumerate(array):
        for x, item in enumerate(row):
            matrix[y, x] = item

def add_matrix(a, b):
    assert a.rows == b.rows and a.columns == b.columns
    c = Matrix(a.rows, a.columns)
    for key, _ in c:
        c[key] = a[key] + b[key]
    return c

def mul_matrix(a, b):
    assert a.columns == b.rows
    c = Matrix(a.rows, b.columns)
    for key, _ in c:
        row, column = key
        c[key] = sum(j * k for j, k in
                     zip((a[row, i] for i in range(a.columns)),
                         (b[i, column] for i in range(b.rows))))
    return c
于 2012-06-06T13:19:58.633 に答える