Python 不';I don’我不能离开董事会
我正在做一个“井字游戏”,在开始和结束时,它会问你是否“想玩游戏y/n?”,如果你按“是”,它工作得很好,如果你按“否”,它会说“再见”,并像它设想的那样关闭程序,但是如果你在第一次玩游戏后按“是”,它不会重新打印棋盘,只给你一个你已经填好的。有没有一种方法可以帮助我清理董事会Python 不';I don’我不能离开董事会,python,python-3.x,tic-tac-toe,Python,Python 3.x,Tic Tac Toe,我正在做一个“井字游戏”,在开始和结束时,它会问你是否“想玩游戏y/n?”,如果你按“是”,它工作得很好,如果你按“否”,它会说“再见”,并像它设想的那样关闭程序,但是如果你在第一次玩游戏后按“是”,它不会重新打印棋盘,只给你一个你已经填好的。有没有一种方法可以帮助我清理董事会 board = [" " for x in range(10)] #insert letter into the board def insertLetter(letter, pos):
board = [" " for x in range(10)]
#insert letter into the board
def insertLetter(letter, pos):
board[pos] = letter
# Is that space avalible?
def spaceIsFree(pos):
return board[pos] == " "
# Prints the board
def printBoard(board):
#Board set up
print(" | |")
print(" " + board[1] + " | " + board[2] + " | " + board[3])
print(" | |")
print("-----------")
print(" | |")
print(" " + board[4] + " | " + board[5] + " | " + board[6])
print(" | |")
print("-----------")
print(" | |")
print(" " + board[7] + " | " + board[8] + " | " + board[9])
print(" | |")
def isWinner(bo, le):
#Look for winner!
return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top
(bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle
(bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom
(bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side
(bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle
(bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side
(bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal
(bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal
def playerMove():
#Grabs player move, cheak for valid input
run = True
while run:
move = input("Please select a position place an \"X\" (1-9): ")
try:
move = int(move)
if move > 0 and move < 10:
if spaceIsFree(move):
run = False
insertLetter("X", move)
else:
print ("Sorry, this space is already taken!")
else:
print ("Please type a number within the range!")
except:
print("Please type a number!")
def compMove():
# Computers move
possibleMoves = [x for x, letter in enumerate(board) if letter == " " and x != 0]
move = 0
#check for a possible win
for let in ["O", "X"]:
for i in possibleMoves:
boardCopy = board[:]
boardCopy[i] = let
if isWinner (boardCopy, let):
move = i
return move
#check for open corners
cornersOpen = []
for i in possibleMoves:
if i in [1,3,7,9]:
cornersOpen.append(i)
if len(cornersOpen) > 0:
move = selectRandom(cornersOpen)
return move
#check for center move
if 5 in possibleMoves:
move = 5
return move
#check for open edges
edgesOpen = []
for i in possibleMoves:
if i in [2,4,6,8]:
edgesOpen.append(i)
if len(edgesOpen) > 0:
move = selectRandom(edgesOpen)
return move
def selectRandom(li):
# Selects random numbers
import random
ln = len(li)
r = random.randrange(0,ln)
return li[r]
def isBoardFull(board):
#See if the board is full
if board.count(" ") > 1:
return False
else:
return True
def main():
print("Welcom to Tic Tac Toe!")
print ()
printBoard(board)
while not (isBoardFull(board)):
# Do a player move,
# Check if O wins
if not (isWinner(board, "O")):
playerMove()
printBoard(board)
else:
print("Sorry, O's won this time!")
break
# Check If X wins
if not (isWinner(board, "X")):
move = compMove()
if move == 0:
print("Tie Game!")
else:
insertLetter("O", move)
print("Computer placed an O in position", move ,":")
printBoard(board)
else:
print("X's won this time! Good Job")
break
# No one wins - it's a tie
if isBoardFull(board):
print ("Tie Game!")
while True:
# Start/Play again
replay = input ("Would you like to play a game? y/n: ")
if replay == "no":
print ("Goodbye")
break
else:
print()
main()
board=[“”表示范围内的x(10)]
#在黑板上插入字母
def插入字母(字母,位置):
董事会[职位]=信件
#那个空间可用吗?
def spaceIsFree(位置):
返回板[pos]==“”
#打印电路板
def打印板(板):
#董事会成立
打印(“| |”)
打印(“+板[1]+“|”+板[2]+“|”+板[3])
打印(“| |”)
打印(------------)
打印(“| |”)
打印(“+板[4]+“|”+板[5]+“|”+板[6])
打印(“| |”)
打印(------------)
打印(“| |”)
打印(“+板[7]+“|”+板[8]+“|”+板[9])
打印(“| |”)
def isWinner(bo,le):
#寻找赢家!
返回((bo[7]==le和bo[8]==le和bo[9]==le)或#穿过顶部
(bo[4]==le和bo[5]==le和bo[6]==le)或#穿过中间
(bo[1]==le和bo[2]==le和bo[3]==le)或#穿过底部
(bo[7]==le和bo[4]==le和bo[1]==le)或#在左侧下方
(bo[8]==le和bo[5]==le和bo[2]==le)或#在中间
(bo[9]==le和bo[6]==le和bo[3]==le)或#右侧下方
(bo[7]==le和bo[5]==le和bo[3]==le)或#对角线
(bo[9]==le和bo[5]==le和bo[1]==le))#对角线
def playerMove():
#抓取玩家移动,切克有效输入
运行=真
运行时:
移动=输入(“请选择一个位置放置\“X\”(1-9):)
尝试:
move=int(移动)
如果移动>0且移动<10:
如果spaceIsFree(移动):
运行=错误
插入字母(“X”,移动)
其他:
打印(“对不起,此空间已被占用!”)
其他:
打印(“请键入范围内的数字!”)
除:
打印(“请键入一个数字!”)
def compMove():
#计算机移动
possibleMoves=[x代表x,如果字母==“”和x!=0,则枚举(板)中的字母]
移动=0
#检查是否有可能获胜
对于租入[“O”,“X”]:
对于可能移动中的i:
boardCopy=板[:]
董事会副本[我]=出租
如果是赢家(董事会副本,请填写):
移动=i
回击
#检查是否有明角
cornersOpen=[]
对于可能移动中的i:
如果我在[1,3,7,9]中:
cornersOpen.append(一)
如果len(cornersOpen)>0:
移动=选择随机(角落打开)
回击
#检查中心是否移动
如果可能的移动中有5个:
移动=5
回击
#检查有无开口边缘
EdgeOpen=[]
对于可能移动中的i:
如果我在[2,4,6,8]中:
edgesOpen.append(一)
如果len(EdgeOpen)>0:
移动=选择随机(边打开)
回击
def selectRandom(li):
#选择随机数
随机输入
ln=len(li)
r=随机。随机范围(0,ln)
返回li[r]
def ISBOARD满(板):
#看看黑板上是否满了
如果board.count(“”)大于1:
返回错误
其他:
返回真值
def main():
打印(“欢迎来到Tic Tac Toe!”)
打印()
印刷板
而不是(isBoardFull(board)):
#做一个球员的动作,
#检查O是否获胜
如果不是(isWinner(董事会,“O”)):
playerMove()
印刷板
其他:
打印(“对不起,这次O赢了!”)
打破
#检查X是否获胜
如果不是(isWinner(董事会,“X”)):
move=compMove()
如果move==0:
打印(“平局游戏!”)
其他:
插入字母(“O”,移动)
打印(“计算机将O放置到位”,移动“:”)
印刷板
其他:
打印(“这次X赢了!干得好”)
打破
#没有人赢,这是平局
如果isBoardFull(板):
打印(“平局游戏!”)
尽管如此:
#重新开始/播放
replay=输入(“您想玩游戏吗?是/否:”)
如果replay==“否”:
打印(“再见”)
打破
其他:
打印()
main()
您只在顶部创建一次电路板,然后从不重置它
重置状态最简单的方法就是不全局保存。重新配置代码,使board
仅存在于main
中,并手动将其传递给每个需要它的函数。然后,当main
退出时,每次main
运行时都会销毁并重新创建电路板
要修补现有代码以使其正常工作,我只需创建一个函数来创建新的电路板:
def new_board():
return [" " for x in range(10)]
然后,在main
的顶部重置它:
def main():
global board
board = new_board()
print("Welcom to Tic Tac Toe!")
print ()
printBoard(board)
我不能长期推荐这种方法,但它是一种快速修复方法。您只需在顶部创建一次电路板,然后再也不会重置它 重置状态最简单的方法就是不全局保存。重新配置代码,使
board
仅存在于main
中,并手动将其传递给每个需要它的函数。然后,当main
退出时,每次main
运行时都会销毁并重新创建电路板
要修补现有代码以使其正常工作,我只需创建一个函数来创建新的电路板:
def new_board():
return [" " for x in range(10)]
然后,在main
的顶部重置它:
def main():
global board
board = new_board()
print("Welcom to Tic Tac Toe!")
print ()
printBoard(board)
从长远来看,我不建议这样做,但这是一个快速解决方案。
board
是在全局范围内定义的,因此调用ma