首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零和交叉Python3

零和交叉Python3
EN

Code Review用户
提问于 2022-06-06 19:51:58
回答 1查看 353关注 0票数 3

我试图获得更多的编码经验,并决定从一个基本的零和交叉游戏开始小。

欢迎任何反馈意见,以下是我认为应该补充的项目

  • 实际网格中的打印,而不是数组
  • 更多错误捕获ie用户输入T而不是X或O
  • 潜在职位建议
  • 代码中的更多注释
代码语言:javascript
复制
import random

def grid(n):
    
    board = []
    
    for i in range(n):
        board.append("-")
    return board


board1 = grid(9)
    


print(board1)
   
p1 = input("Enter your value X or O: ")

if p1 =='X':
    p2 = 'O'
else:
    p2 = 'X'


def check_column(board, p, pos):
    if board[pos + 3*0] == p:
        if board[pos+3*1] == p:        
            if board[pos+3*2] == p:        
                return True
            
def check_row(board, p, pos):
    if board[pos + 0] == p:
        if board[pos + 1] == p:        
            if board[pos + 2] == p:        
                return True

def check_dig1(board, p, pos):
    if board[pos + 0] == p:
        if board[pos + 2] == p:        
            if board[pos + 4] == p:        
                return True


def check_dig2(board, p, pos):
    if board[pos + 0] == p:
        if board[pos + 4] == p:        
            if board[pos + 8] == p:        
                return True

 
def check_win(board, player):
    
    length = len(board)
    #column check
    for i in range(3):
        if check_column(board, player,i):
            print('col')
            return True
        
    for i in range(0,7,3):
        if check_row(board, player,i):
            print('col')
            return True
        
    if check_dig1(board, player, 2):
        print('diag1')
        return True
    
    if check_dig2(board, player, 0):
        print('diag2')
        return True

    return False




while True:
    #val, pos = input("Enter two values: ").split(',')
    position = input("P1 enter your position: ")
    
    board1[int(position)-1] = p1
    
    print(board1)
    
    if check_win(board1,p1):
        print('P1 has won')
        print(board1)
        break
    
    
    if board1.count('X') + board1.count('O')  == 9:
        print("Tie!")
        break
    
    position = input("P2 enter your position: ")
    
    board1[int(position)-1] = p2
    
    print(board1)
    
    if check_win(board1,p2):
        print('P2 has won')
        print(board1)
        break

    if board1.count('X') + board1.count('O')  == 9:
        print("Tie!")
        break

# check_win(board1, 'O')
# print(board1)
EN

回答 1

Code Review用户

发布于 2022-06-07 13:47:18

您的脚本确实完成了这项工作(偶尔),但它并不是非常有效,这是可以理解的,因为您是一个初学者。

  • 不要使用for循环重复添加相同的元素

创建网格的方法效率很低:

代码语言:javascript
复制
def grid(n):
    
    board = []
    
    for i in range(n):
        board.append("-")
    return board

不要使用它,而是使用列表理解,这是:

board = ['-' for i in range(n)]

执行与附加列表完全相同的操作,但效率要高得多,执行时可以将其转换为优化的C代码。

但是,由于board是重复n次的相同元素,所以只需使用列表乘法,这就更快了:

board = ['-'] * n

因此,grid函数可以编写为:

代码语言:javascript
复制
def grid(n):
    return ['-'] * n
  • 不要使用嵌套的if语句

不要使用嵌套的if语句。

你有很多这样的功能:

代码语言:javascript
复制
def check_column(board, p, pos):
    if board[pos + 3*0] == p:
        if board[pos+3*1] == p:        
            if board[pos+3*2] == p:        
                return True

你看到右边的操作数全是p,而左边的操作数有一个模式吗?

由于每个阶段的索引都增加了3,所以只需使用for循环来检查这些条件。但是这里只检查是否满足所有条件,只需使用all,即短路(在遇到虚假值后不会执行以下检查)。

而且,由于网格中的最大索引为8,如果pos大于6,则第二次检查将导致索引错误,而第三次检查也会导致索引错误大于2。

相反,请使用以下内容:

代码语言:javascript
复制
def check_column(board, p, pos):
    return all(board[(pos + i) % 9] == p for i in (0, 3, 6))
  • 输入验证

您不进行输入验证,没有什么可以阻止用户输入一个既不是“O”也不是“X”的值,并且自动假定输入是有效的,因此可能会出现逻辑错误。

例如,如果输入'x‘(Python区分大小写),则如下所示:

代码语言:javascript
复制
if p1 =='X':
    p2 = 'O'
else:
    p2 = 'X'

p1和p2都会被.

相反,使用while循环重复获取用户输入,直到输入有效值为止:

代码语言:javascript
复制
while True:
    p1 = input("Enter your value X or O: ").upper()
    if p1 in ('O', 'X'):
        break

if p1 =='X':
    p2 = 'O'
else:
    p2 = 'X'
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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