格式化控制台上的输出 - Python

时间:2017-12-11 12:30:16

标签: python formatting

这里的第一个问题,为凌乱的格式化道歉。

我希望有几个指针。我试图将棋盘游戏作为OOP的练习。 所以我需要一个8x8'板,类似于棋盘,但游戏玩法,即在棋盘上放置棋子只发生在7x7单元格上。 我通过迭代8个列表的列表来实现它。 这是代码:

class Board(object):

    def __init__(self):
        self.Board = [[[] for x in range(LENGTH)] for y in range(LENGTH)]

    def makeBoard(self, initial_blocked):

        for row in range(LENGTH):
            for col in range(LENGTH):
                self.Board[row][col] = 'e'
        self.Board[0][1] = 'A'
        self.Board[0][2] = 'B'
        self.Board[0][3] = 'C'
        self.Board[0][4] = 'D'
        self.Board[0][5] = 'E'
        self.Board[0][6] = 'F'
        self.Board[0][7] = 'G'

        self.Board[0][0] = '~'
        self.Board[1][0] = '1'
        self.Board[2][0] = '2'
        self.Board[3][0] = '3'
        self.Board[4][0] = '4'
        self.Board[5][0] = '5'
        self.Board[6][0] = '6'
        self.Board[7][0] = '7'

        if True:
            while initial_blocked > 0:
                position_x = rand(0, 7)
                position_y = rand(0, 7)
                if self.Board[position_x][position_y] == 'e':
                    self.Board[position_x][position_y] = 'X'
                    initial_blocked -= 1

        for line in range(8):
            print(self.Board[line])

输出如下:

['~', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
['1', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['2', 'e', 'e', 'e', 'X', 'X', 'e', 'e']
['3', 'e', 'X', 'e', 'e', 'X', 'e', 'e']
['4', 'e', 'e', 'e', 'X', 'e', 'e', 'e']
['5', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['6', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['7', 'e', 'e', 'e', 'e', 'e', 'e', 'e']

第一行和第二行将用于用户输入(例如A1,D4)' X'是被阻止的细胞和“细胞”。代表空洞。玩家进入他们想要保留他们作品的地方,例如A1,以及' e'将改为' b'或者' w',黑色或白色。 Haven仍然没弄明白我将如何做到这一点,但首先要做的事情 我希望它类似于 - 至少有点 - 董事会。如果我尝试使用许多print()s打印出一块板,我无法弄清楚如何更改该板上的单元格,它引用与索引相同的单元格。即输入A1改变[1] [1]处的列表和板上的那个单元格。

我希望这是有道理的。谢谢!

1 个答案:

答案 0 :(得分:0)

我对您的代码做了一些优化,您可能会发现这些优化很有帮助。我们可以使用循环来完成,而不是使用所有这些单独的语句来初始化列和行标题。此外,在实际情况下,直接迭代列表而不是使用索引是很好的。我已经改变了你的一些名字,使它们符合PEP-0008风格指南;这使得其他人更容易阅读您的代码,特别是如果他们使用颜色编码的语法高亮显示。

from random import seed, randrange

seed(123)

LENGTH = 8

# A dict for converting reference letters to integers
letters = {ch: i for i, ch in enumerate('ABCDEFG', 1)}

def ref_to_index(ref):
    ''' Convert a ref from A1 form to a tuple of (row, col) integers
        Return None if the ref is invalid 
    '''
    if len(ref) != 2:
        return None
    x, y = ref.upper()
    if x not in letters or y not in '1234567':
        return None
    return int(y), letters[x]

class Board(object):
    def __init__(self):
        # Initialize the board lists
        self.board = [['e'] * LENGTH for y in range(LENGTH)]
        # Add the column headers
        self.board[0][:] = list('~ABCDEFG')
        # Add the row headers
        for i, row in enumerate(self.board[1:], 1):
            row[0] = str(i)

    def add_blocks(self, initial_blocked):
        for _ in range(initial_blocked):
            while True:
                position_x = randrange(1, LENGTH)
                position_y = randrange(1, LENGTH)
                row = self.board[position_y]
                if row[position_x] == 'e':
                    row[position_x] = 'X'
                    break

    def reset(self):
        ''' Make all the board cells empty '''
        size = LENGTH - 1
        for row in self.board[1:]:
            row[1:] = ['e'] * size

    def show(self):
        for row in self.board:
            print(' '.join(row))
        print()

# test

board = Board()
board.show()
board.add_blocks(7)
board.show()
while True:
    ref = input('Select a move: ')
    idx = ref_to_index(ref)
    if idx is None:
        print('Invalid move')
        continue
    y, x = idx
    row = board.board[y]
    if row[x] != 'e':
        print("That cell isn't empty")
        continue
    row[x] = 'b'
    board.show()