井字,Python,索引已经填充了问题



在过去的几天里,我一直在尝试解决这段代码,如果我错误地将我的符号("x"或"o"(放在已经包含符号的索引中,那么它应该显示消息"索引已填充!",问题是它甚至显示该消息对于未填充的索引。我是初学者,请帮助我编写此代码,并请用您的代码回答我的问题,因为我的英语有点差。

import numpy
board=numpy.array([["-","-","-"],["-","-","-"],["-","-","-"]])
numpy.matrix(board)
def pos(row,col,symbol,altr):
while(board[row][col]==symbol or board[row][col]==altr):
print("index already filled")
place(symbol,altr)
board[row][col]=symbol
return board
def place(symbol,altr):
c=int(input("enter index: "))
if(c==1):
return pos(0,0,symbol,altr)
elif(c==2):
return pos(0,1,symbol,altr)
elif(c==3):
return pos(0,2,symbol,altr)
elif(c==4):
return pos(1,0,symbol,altr)
elif(c==5):
return pos(1,1,symbol,altr)
elif(c==6):
return pos(1,2,symbol,altr)
elif(c==7):
return pos(2,0,symbol,altr)
elif(c==8):
return pos(2,1,symbol,altr)
elif(c==9):
return pos(2,2,symbol,altr)
def won(symbol):
return check_rows(symbol) or check_cols(symbol) or check_diagnols(symbol)
def check_rows(symbol):
for i in range(3):
count=0
for j in range(3):
if(board[i][j]==symbol):
count+=1
if(count==3):
return True
else:
return False
def check_cols(symbol):
for j in range(3):
count=0
for i in range(3):
if(board[i][j]==symbol):
count+=1
if(count==3):
return True
else:
return False
def check_diagnols(symbol):
if(board[0][0]==board[1][1] and board[1][1]==board[2][2] and board[2][2]==symbol):
return True
if(board[0][2]==board[1][1] and board[1][1]==board[2][0] and board[2][0]==symbol):
return True
return False
def play():
p1=input("player1,enter your name: ")
p2=input("player2,enter your name: ")
pl1="x"
pl2="o"
i=0
while(i<9):
if(i%2==0):
print(board)
print(p1,"your turn")
place(pl1,pl2)
if(won(pl1)):
print(board)
print(p1,"you won")
break
else:
if(i%2==1):
print(board)
print(p2,"your turn")
place(pl2,pl1)
if(won(pl2)):
print(board)
print(p2,"you won")
break
i+=1
if not won(pl1) and not won(pl2):
print(board)
print("draw")
while

是不合适的:无论你循环多少次,条件的结果都不会改变。实际上,这是一个无限循环:一旦你进入,你就再也出不来了。

这应该是if.其次,当if条件为真时,您不希望执行具有rowcol值的board[row][col]=symbol。您应该通过递归调用place让该分配发生。该执行将以(希望(更好的rowcol值来此函数,并将负责将值放入电路板中。所以。。。您需要将该分配放在else块中,因此它仅在位置正常时才会发生。

if (board[row][col]==symbol or board[row][col]==altr):
print("index already filled")
place(symbol,altr)
else:
board[row][col]=symbol

备注:即使它像这样工作,我也不会选择递归解决方案。您可能想要查看一个替代方案,其中没有递归,而是在place函数中有一个while循环。

我认为问题是地方调用pos,而pos调用位置,一次又一次。没有必要在这两个功能中返回电路板。

def pos(row,col,symbol,altr):
if board[row][col]==symbol or board[row][col]==altr:
print("index already filled")
return False
else:
board[row][col]=symbol
return True
def place(symbol,altr):
while True
c=int(input("enter index: "))
if 1 <= c <= 9:
c = c-1
if pos(c//3, c%3, symbol, alter):
return

我用伪代码解释了这一点

def pos(row, column, player_symbol, another_player_sumbol):
# Check (row, cell) if not occupied
if selected_cell not with blank syambol:
message('Cell occupied')
return input_is_NG
else:
set cell occupied
return input_is_OK
def place(symbol,altr):
while True (until position_is_OK):
input position of cell
if position is from 1 to 9:
position -= 1
if pos(position//3, position%3, symbol, alter) is OK:
return # exit from place, and next turn for another player
user_input_is_NG, while loop again

最新更新