我试图获得更多的编码经验,并决定从一个基本的零和交叉游戏开始小。
欢迎任何反馈意见,以下是我认为应该补充的项目
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)发布于 2022-06-07 13:47:18
您的脚本确实完成了这项工作(偶尔),但它并不是非常有效,这是可以理解的,因为您是一个初学者。
for循环重复添加相同的元素创建网格的方法效率很低:
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函数可以编写为:
def grid(n):
return ['-'] * n不要使用嵌套的if语句。
你有很多这样的功能:
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。
相反,请使用以下内容:
def check_column(board, p, pos):
return all(board[(pos + i) % 9] == p for i in (0, 3, 6))您不进行输入验证,没有什么可以阻止用户输入一个既不是“O”也不是“X”的值,并且自动假定输入是有效的,因此可能会出现逻辑错误。
例如,如果输入'x‘(Python区分大小写),则如下所示:
if p1 =='X':
p2 = 'O'
else:
p2 = 'X'p1和p2都会被.
相反,使用while循环重复获取用户输入,直到输入有效值为止:
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'https://codereview.stackexchange.com/questions/277143
复制相似问题