2012-06-05 66 views
2

我試圖在Python上編寫稱爲三元組三元組的遊戲,但是我有一個板子輸出的問題,它必須像這樣每個方塊,其中每個數字代表一個基點,有9個方塊,三個爲每一行。如何在Python中打印板子?

| 1 | 1 | 9 | 

|[email protected]|1*6|7*2| 

| 4 | 1 | 2 | 

我覺得做一個列表,每一行,並開始與數字電路板的每一個基點,例如,「0」,如果它是北方或類似的東西,所以當我有數字來代替的卡片,我確切知道每個基點的位置,有什麼建議?

在此先感謝

回答

1

這裏有一個簡單的方法來得到你正在尋找的格式:

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'], ['[email protected]', '1*6', '7*2'], ['4', '1', '2']]) 
| 1 | 1 | 9 | 

|[email protected]|1*6|7*2| 

| 4 | 1 | 2 | 
+0

這個工作非常完美,但是¿您知道每隔三行打印一個分隔線是否很熱?由於我在矩陣中有9個列表,並且每個「框」都與您打印的列表相同,並且之後需要一行。 –

+0

欣賞任何幫助;) –

+0

@Maria - 在'format_board()'的返回末尾添加一個'\ n',或者你可以像'print'\ n'那樣做。加入(format_board(box)for box in matrix)'。 –

4

可以代表三列出了該板:

["1", "1", "9"] 
["[email protected]", "1*6", "7*2"] 
["4", "1", "2"] 

或一起在一個列表:

board = [["1", "1", "9"], ["[email protected]", "1*6", "7*2"], ["4", "1", "2"]] 

現在你需要寫兩個函數:

  • 函數t帽子拿着這份清單,並用|之間的線打印你的紙板。
  • 計算上述列表並確定板中每個單元的正確值的函數。

你不需要處理數字或其他任何東西,這都是做這兩件事的問題。

+2

甚至只有一個包含9個元素的列表。 – heltonbiker

+0

@heltonbiker:是的,雖然這可以使顯示電路板的代碼更長一點,因爲您需要確定行結束的位置(通過分成三組或一些計數邏輯)。 –

+1

一個很好的技巧就是模塊(%)運算符。 – heltonbiker

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) 

是,在所有有用嗎?

+0

是的,感謝您的快速回答,*和@代表玩家的身份。 –

0

這可能是矯枉過正,但下面的矩陣類可自動創建自己的表示:如果你需要一種方法來設定,添加或乘矩陣

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