首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于文本的Tic Tac Toe (干法和PEP-8 )

基于文本的Tic Tac Toe (干法和PEP-8 )
EN

Code Review用户
提问于 2015-11-21 03:21:47
回答 2查看 157关注 0票数 3

这是一个基本的Tic脚趾游戏,有一个最小的界面.使用方便的唯一让步是输入验证(7行)和1-索引行和列(几个字节)。我一直试图收紧它,同时仍然保持可读性和PEP-8风格。

我对它的大部分都很满意,除了打印板:我想在开始、每次移动和结束时都这样做,但我不知道如何不重复格式化的print()调用或将其转换为一个函数并调用它两次。正如你所看到的,我目前的妥协忽略了空的启动板,而选择了更有趣的结束板。

这期印刷是我目前关注的焦点,但我也对任何其他改进的建议感兴趣。

代码语言:javascript
复制
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
EN

回答 2

Code Review用户

发布于 2015-11-21 08:58:20

输入验证

输入验证实际上与Tac Toe无关,而是在所有控制台程序之间共享。

获得正确坐标的代码应该移动到它自己的文件中的函数中,以便在将来重用它,并使tac toe脚本更短。

名称

askmove做了一个彻底的转变,所以我称之为:make_turn

重构

对获胜位置的检查与程序的其他部分非常隔离。我认为,如果您编写了一个is_won函数,程序将获得很大的可重用性。

票数 1
EN

Code Review用户

发布于 2015-11-22 05:28:17

我再盯着它看,发现一条单线干燥的改进:

代码语言:javascript
复制
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的改进:

代码语言:javascript
复制
while askmove('X') and askmove('O'):
    pass

我一直在努力做这样的事:

代码语言:javascript
复制
    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也需要两行代码,所以上面的代码是我所能处理的最好的代码。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/111386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档