我试图构建一个井字游戏程序,但是,我想了解当用户输入“ O”或“ X”或仅想看板时如何制作静态板。
编辑:输出在该问题中显得很奇怪,第一个是可疑的板,因为它具有输入,而第二个示例是干净的。
例如
useRef
输出:
theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O',
'mid-L': 'X', 'mid-M': 'X', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
def printBoard(board):
print(board['top-L'] + ' |' + board['top-M'] + ' |' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + ' |' + board['mid-M'] + ' |' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + ' |' + board['low-M'] + ' |' + board['low-R'])
第二个
O |O |O
-+-+-
X |X |
-+-+-
| |X
输出:
theBoard = {'top-L': '', 'top-M': '', 'top-R': '',
'mid-L': '', 'mid-M': '', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': ''}
def printBoard(board):
print(board['top-L'] + ' |' + board['top-M'] + ' |' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + ' |' + board['mid-M'] + ' |' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
那么有什么办法可以使它始终保持美观吗?还是我必须使用其他模型?
其他问题: 您可以看到在第二个示例的def的最后一行中,“ |”中没有空格我需要调整,但是在前2个'|'上我需要在空格中加“ |”我不知道为什么。
答案 0 :(得分:3)
如果要在每条垂直线旁边输出一个额外的空间,则水平线需要考虑到这一点。实际上,我会在标记的两侧两侧添加一个空格。
theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O',
'mid-L': 'X', 'mid-M': 'X', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
def printBoard(board):
print(' {} | {} | {} '.format(board['top-L'], board['top-M'], board['top-R']))
print('---+---+---')
print(' {} | {} | {} '.format(board['mid-L'], board['mid-M'], board['mid-R']))
print('---+---+---')
print(' {} | {} | {} '.format(board['low-L'], board['low-M'], board['low-R']))
然后
>>> printBoard(theBoard)
O | O | O
---+---+---
X | X |
---+---+---
| | X
您还需要记住,木板上的每个元素必须是单个字符,X
,O
或空格。
答案 1 :(得分:1)
用多余的空间包裹每个元素似乎对演示文稿有所帮助。
theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O',
'mid-L': 'X', 'mid-M': 'X', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
separator = '+'.join(('---',)*3)
def printBoard(board):
print(' ' + ' | '.join([board['top-L'], board['top-M'], board['top-R']]))
print(separator)
print(' ' + ' | '.join([board['mid-L'], board['mid-M'], board['mid-R']]))
print(separator)
print(' ' + ' | '.join([board['low-L'], board['low-M'], board['low-R']]))
printBoard(theBoard)
答案 2 :(得分:0)
我认为您在这里有一个基本的设计问题。数据结构:
theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O',
'mid-L': 'X', 'mid-M': 'X', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
即使使用(或由于其)语义命名的键,即使使用Python 3.6 dict排序,仍非常难以操作。您面临的打印问题似乎是这种笨拙表示形式的副作用,该表示形式需要“知道”每个正方形的所有魔术字符串键,因此几乎不可能通过行和列对其进行迭代或自然地对其进行索引行和列的数字为0..2
。
在解决打印问题的同时,我怀疑您还有其他代码,这些代码可能在您的应用程序中的其他地方非常麻烦。
考虑使用2d列表之类的数据结构来表示木板。这可能是一个非常简单的草图(未添加错误处理或获胜检查,但是与当前方法相比,这种设计更有助于编写这些内容)是这样的:
class TTTBoard:
def __init__(self):
self.board = [[None] * 3 for _ in range(3)]
self.sides = "XO"
self.ply = 0
def move(self, row, col):
if not self.board[row][col]:
self.board[row][col] = self.sides[self.ply%2]
self.ply += 1
return True
def __str__(self):
return "\n---+---+---\n".join(" " + " | ".join(x if x else " " for x in row)
for row in self.board)
if __name__ == "__main__":
board = TTTBoard()
moves = [[0, 1], [0, 2], [2, 1], [1, 0], [1, 1]]
for position in moves:
board.move(*position)
print(board, "\n")
输出:
| X |
---+---+---
| |
---+---+---
| |
| X | O
---+---+---
| |
---+---+---
| |
| X | O
---+---+---
| |
---+---+---
| X |
| X | O
---+---+---
O | |
---+---+---
| X |
| X | O
---+---+---
O | X |
---+---+---
| X |
为了回答您的问题并进行比较,您可以将原始表示形式的木板“聚集”到二维列表中,然后使用与上面相同的嵌套join
:
theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O',
'mid-L': 'X', 'mid-M': 'X', 'mid-R': ' ',
'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
vals = list(theBoard.values())
board = [[vals[i+j*3] for i in range(3)] for j in range(3)]
print("\n---+---+---\n".join(" " + " | ".join(row) for row in board))
这在Python 3.6+中有效,但是必须进行这种转换,或者为每个正方形按名称一次又一次地索引到字典中,这比从一开始就选择可用的数据结构更具吸引力。