Python 如何在tic-tac-toe上安装静电板?

Python 如何在tic-tac-toe上安装静电板?,python,Python,我试图建立一个tic-tac-toe程序,但是,我想了解当用户输入“O”或“X”时,或者当我只想看到一个静态板时,如何拥有一个静态板 编辑:问题中的输出看起来很奇怪,第一个是不稳定的电路板,因为它有输入,而第二个例子是干净的 e、 g 输出: O |O |O -+-+- X |X | -+-+- | |X | | -+-+- | | -+-+- | | 第二 theBoard = {'top-L': '', 'top-M': '', 'top-R': '',

我试图建立一个tic-tac-toe程序,但是,我想了解当用户输入“O”或“X”时,或者当我只想看到一个静态板时,如何拥有一个静态板

编辑:问题中的输出看起来很奇怪,第一个是不稳定的电路板,因为它有输入,而第二个例子是干净的

e、 g

输出:

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'])
输出:

O |O |O
-+-+-
X |X | 
-+-+-
  |  |X
 | |
-+-+-
 | | 
-+-+-
 | |
那么,有没有一种方法可以让它一直保持美感呢?或者我必须使用另一个模型

其他问题:
您可以看到,在第二个示例的def内部的最后一行中,“|”中没有我需要调整的空间,但是在前两个“|”中,我需要放置一个空间“|”,我不知道为什么

如果要在每条垂直线旁边输出一个额外的空间,则水平线需要考虑到这一点。实际上,我会在标记的两侧添加一个空格

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']))
然后


您还需要记住,电路板的每个元素必须是单个字符,可以是
X
O
,也可以是一个空格。

如果您要在每条垂直线旁边输出一个额外的空格,您的水平线需要考虑到这一点。实际上,我会在标记的两侧添加一个空格

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']))
然后


您还需要记住,电路板的每个元素必须是单个字符,可以是
X
O
,也可以是一个空格。

用额外的空格包装每个元素似乎有助于演示

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)

用额外的空间包装每个元素似乎有助于演示

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)

我认为你有一个基本的设计问题。数据结构:

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'}
即使使用Python3.6 dict排序,并且不管(或因为)它的语义命名键,操作起来也非常笨拙。您面临的打印问题似乎是这种笨拙表示法的副作用,这种表示法要求“知道”每个正方形的所有魔术字符串键,因此几乎不可能按行和列对其进行迭代,也不可能使用
0..2
行和列的数字对其进行自然索引

虽然修复打印是问题的主题,但我怀疑您的应用程序中的其他代码可能相当笨拙

考虑使用类似2d列表的数据结构来表示电路板。这是一个非常简单的草图(没有添加错误处理或win Check,但这种设计比当前的方法更有利于编写这些内容):

输出:

| 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))

这在Python3.6+中是可行的,但是必须进行这种转换,或者一次又一次地按每个方块的名称在字典中建立索引,这比从一开始就选择一个可用的数据结构更不吸引人。

我认为您在这里遇到了一个基本的设计问题。数据结构:

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'}
即使使用Python3.6 dict排序,并且不管(或因为)它的语义命名键,操作起来也非常笨拙。您面临的打印问题似乎是这种笨拙表示法的副作用,这种表示法要求“知道”每个正方形的所有魔术字符串键,因此几乎不可能按行和列对其进行迭代,也不可能使用
0..2
行和列的数字对其进行自然索引

虽然修复打印是问题的主题,但我怀疑您的应用程序中的其他代码可能相当笨拙

考虑使用类似2d列表的数据结构来表示电路板。这是一个非常简单的草图(没有添加错误处理或win Check,但这种设计比当前的方法更有利于编写这些内容):

输出:

| 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+中适用,但是必须进行这种转换,或者一次又一次地按每个方块的名称在字典中建立索引,这不如从一开始就选择一个可用的数据结构更吸引人。

在您的问题下方、注释上方有一个编辑按钮您所说的静态板是什么意思?它不会到处移动,因为当我输入“X”或“O”时,电路板会移动。使用
制表
模块我认为用英语单词来表示TTT电路板是一种相当笨拙的方式。考虑使用一对数字(一个X和一个用于O)和位操作,一个2D列表或NUMPY阵列/矩阵。通过很好地表示数据,您自动地以简单、优雅的方式进行打印等操作就不会有太多问题。在您的问题下方,在注释上方,有一个编辑按钮。您所说的静态板是什么意思?它不会到处移动,因为当我放置“X”或“O”时电路板移动。使用
制表
模块我认为用英语单词来表示TTT电路板是一种相当笨拙的方式。考虑使用一对数字(一个X和一个用于O)和位操作,一个2D列表或NUMPY阵列/矩阵。通过很好地表示数据,您可以自动减少在直板打印等操作中遇到的麻烦