这是一个基本的Tic脚趾游戏,有一个最小的界面.使用方便的唯一让步是输入验证(7行)和1-索引行和列(几个字节)。我一直试图收紧它,同时仍然保持可读性和PEP-8风格。
我对它的大部分都很满意,除了打印板:我想在开始、每次移动和结束时都这样做,但我不知道如何不重复格式化的print()调用或将其转换为一个函数并调用它两次。正如你所看到的,我目前的妥协忽略了空的启动板,而选择了更有趣的结束板。
这期印刷是我目前关注的焦点,但我也对任何其他改进的建议感兴趣。
board = [['*' for i in range(3)] for j in range(3)]
def askmove(piece):
while True:
try:
x,y = map(int, input('\n> '))
if board[x-1][y-1] == '*':
board[x-1][y-1] = piece
else:
continue
except (ValueError, IndexError):
pass
else:
break
print('', *(' '.join(row) for row in board), sep='\n')
if ([piece] * 3 in board or
(piece,) * 3 in zip(*board) or
all(board[i][i] == piece for i in range(3)) or
all(board[i][2-i] == piece for i in range(3))):
print(piece, 'wins.')
return True
elif all(p!='*' for row in board for p in row):
print('Tie.')
return True
while True:
if askmove('X') or askmove('O'):
break发布于 2015-11-21 08:58:20
输入验证实际上与Tac Toe无关,而是在所有控制台程序之间共享。
获得正确坐标的代码应该移动到它自己的文件中的函数中,以便在将来重用它,并使tac toe脚本更短。
askmove做了一个彻底的转变,所以我称之为:make_turn
对获胜位置的检查与程序的其他部分非常隔离。我认为,如果您编写了一个is_won函数,程序将获得很大的可重用性。
发布于 2015-11-22 05:28:17
我再盯着它看,发现一条单线干燥的改进:
if ([piece] * 3 in board or
(piece,) * 3 in zip(*board) or
all(board[i][i] == piece for i in range(3)) or
all(board[i][2-i] == piece for i in range(3))):
print(piece, 'wins.') # return removed
elif all(p!='*' for row in board for p in row):
print('Tie.') # return removed
else:
return True # invert condition; game now continues on True这导致了单行LoC的改进:
while askmove('X') and askmove('O'):
pass我一直在努力做这样的事:
win condition:
return piece + ' wins'
tie condition:
return 'Tie.'
while print_wrapper(askmove('X') or askmove('O') or '') and sys.exit():
pass但是,如果不在包装器函数上花费几行代码来为print()提供退出代码,那么import sys也需要两行代码,所以上面的代码是我所能处理的最好的代码。
https://codereview.stackexchange.com/questions/111386
复制相似问题