( 謝謝留言幫我優化程式以及教學 太感謝了>< )
根據下面的回答 再檢查一下自己的程式 我知道我錯哪了 ....-.-a
錯在turn一直等於0 然後沒跳出while a() 迴圈.....
我真的找好久....
謝謝前面的回答 ><
感激 >_<
(下次會用正確的方式貼程式碼 :D )
( getcopy(nb)、isWin(copy,computerLetter、isTie(copy)、 drawBoard(nb) 是前面自己定義的function ,因為怕太長所以只放了覺得有問題的區塊 )
nn='mm'
for i in [0,1,2,3,4,5,6,7,8,9]:
if nn!='gg':
copy=getCopy(nb)
if copy[i]==' ':
copy[i]=computerLetter
if isWin(copy,computerLetter):
int(i)
nb[i]=computerLetter
drawBoard(nb)
print('The AI is win~')
print('============')
print(i)
print('=============')
nn='gg'
break #<<<這個break只是結束掉for這個迴圈
else :
if isTie(copy):
print('It is tie!!!')
drawBoard(nb)
nn='gg'
break #<<<這個break只是結束掉for這個迴圈
以上是 isWin 是True後印出的....QQ (可能跟其他區塊有關嗎....我真的找很久了(用print的方式)..)
(這是小時候玩 'x' 'o' 的遊戲,先連成一條線就贏了。我是先看了別人寫的tic tac toe 然後再自己寫一遍的,但是就在那裏卡住了@@(書本裡的邏輯跟我不一樣,所以寫的也不一樣,無法從中找出錯在哪...QQ))
下面是完整的程式碼:
下面的 return(b[1]==L....b[7]==L)是一整行,因為拍照拍不進去所以把它弄成一行一行@@
下面的 last check() 後面沒有用到,應該沒影響,但是為了完整還是放上來@@
從下面開始是主程式 ( 會有重複的部分 因為python 是用縮行來決定內外迴圈@@ 怕會不知道哪個迴圈在外或內 所以重複拍@@)
寫的有點雜....QQ
然後謝謝前面的回復 >_<
依照樓主要寫的遊戲,我用自己想的邏輯加上一些樓主寫好的函式,做出來的功能應該是差不多的東西,有些寫法可以再優化不過已經比樓主貼上來的程式碼少了三分之一左右,貼上來給樓主參考,寫程式能簡化的儘量簡化,能用一個陣列解決的,就不要用到第二個陣列...
import os,random
def drawBoard(board):
print("┌──┬──┬──┐")
print("│ "+board[0]+" │ "+board[1]+" │ "+board[2]+" │")
print("├──┼──┼──┤")
print("│ "+board[3]+" │ "+board[4]+" │ "+board[5]+" │")
print("├──┼──┼──┤")
print("│ "+board[6]+" │ "+board[7]+" │ "+board[8]+" │")
print("└──┴──┴──┘")
def whoGo1st():
a=random.randint(0,1)
if a==0:
print('You go 1st.')
return 0
else:
print('Com go 1st.')
return 1
def isWin(b,L):
return (b[1]==L and b[2]==L and b[0]==L) or (b[4]==L and b[5]==L and b[3]==L) or (b[7]==L and b[8]==L and b[6]==L) or (b[0]==L and b[3]==L and b[6]==L) or (b[1]==L and b[4]==L and b[7]==L) or (b[2]==L and b[5]==L and b[8]==L) or (b[0]==L and b[4]==L and b[8]==L) or (b[2]==L and b[4]==L and b[6]==L)
def change_player():
global c_flag
c_flag = 1 if c_flag==0 else 0
def check_moves(arg):
global my_arr,my_choice,c_flag,com_choice,steps
if arg>9 or arg<1:
return False
elif my_arr[arg-1]=='O' or my_arr[arg-1]=='X':
return False
else:
if c_flag==0:
my_arr[arg-1]=my_choice
else:
my_arr[arg-1]=com_choice
steps=steps+1
return True
def do_move(player):
while 1:
print('You['+my_choice+'] Com:['+com_choice+']')
if player==0:
tmp_input=input('Input a number to choose the place:(1-9)')
if tmp_input.upper()=='Q': exit()
else:
tmp_input=random.randint(0, 9)
if check_moves(int(tmp_input)):
break
def do_my_choice():
global my_choice,com_choice
while 1:
my_choice=input("Do you want 'O' or 'X'?").upper()
if my_choice=='O' or my_choice=='X':
com_choice= 'X' if my_choice=='O' else 'O'
break
if my_choice=='Q': exit()
def cls(): os.system("cls")
def game_init():
global my_arr,my_choice,com_choice,c_flag,steps
my_arr=['1','2','3','4','5','6','7','8','9']
my_choice=''
com_choice=''
steps=0
c_flag=-1
def game_start():
global c_flag,my_arr,my_choice,com_choice,steps
game_init()
cls()
print('Welcome to Tic Tac Toe!!!')
c_flag=whoGo1st()
do_my_choice()
while 1:
cls()
drawBoard(my_arr)
if isWin(my_arr,my_choice):
print("U WIN")
break
elif isWin(my_arr,com_choice):
print("Com WIN")
break
elif steps==9:
print("DRAWN GAME!")
break
do_move(c_flag)
change_player()
def ask_play_again():
return True if input("PLAY AGAIN?( Y or N )...").upper()=='Y' else False
if __name__ == '__main__':
while 1:
game_start()
if ask_play_again()==False:
print("Bye!!!")
break
你的程式碼不完整,
所以有可能問題不是如你寫的那樣,
另外break只能跳出一個迴圈,
如果你有兩層迴圈,
break只會跳出裡面那層,
而外面那層還是會繼續進行.