不清除板
doesn't clear the board
我正在制作一款井字游戏,在开始和结束时它会询问您是否“想玩游戏 y/n?”,如果您按“是”,则它运行良好,如果您按否,它会说“再见”并像它假设的那样关闭程序,但是如果你在玩完第一场比赛后立即按“是”,它不会重新打印棋盘,只会给你已经填写过的棋盘。有没有任何人可以帮我解决的方法?
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
仅存在于 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
不会影响它,您将保留以前的数据。一种选择是明确地重新初始化它:
else:
board = [" " for x in range(10)]
print()
main()
我正在制作一款井字游戏,在开始和结束时它会询问您是否“想玩游戏 y/n?”,如果您按“是”,则它运行良好,如果您按否,它会说“再见”并像它假设的那样关闭程序,但是如果你在玩完第一场比赛后立即按“是”,它不会重新打印棋盘,只会给你已经填写过的棋盘。有没有任何人可以帮我解决的方法?
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
仅存在于 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
不会影响它,您将保留以前的数据。一种选择是明确地重新初始化它:
else:
board = [" " for x in range(10)]
print()
main()