基于python純函數(shù)實現(xiàn)井字棋游戲
1、定義全局變
'''全局變量: X 和 O 表示兩方的棋子; EMPTY 表示棋位為空; TIE 表示平局; NUM_SQUARES 表示有 9 個棋位 ''' X = "X" O = "O" EMPTY = " " TIE = "TIE" NUM_SQUARES = 9
2、定義調(diào)用到的函數(shù)
def ask_yes_no(question):
'''問一個是或否的問題,用 y 或 n 回答。'''
response = None
while response not in ('y', 'n'):
response = input(question).lower()
return response
def ask_number(question, low, high):
'''訊問一個規(guī)定范圍的數(shù)字。'''
response = None
while response not in range(low, high):
response = int(input(question))
return response
def pieces():
'''決定在人和機器之間誰先行棋。'''
go_first = ask_yes_no('你先走? (y/n): ')
if go_first == 'y':
print('\n好,你先請。')
human = X
computer = O
else:
print('\n你放棄先手,我先走。')
computer = X
human = O
return computer, human
def new_board():
'''創(chuàng)建一個棋盤。'''
board = []
for square in range(NUM_SQUARES):
board.append(EMPTY)
return board
def display_board(board):
'''顯示棋盤。'''
print('\n\t', board[0], '|', board[1], '|', board[2])
print('\t', '---------')
print('\t', board[3], '|', board[4], '|', board[5])
print('\t', '---------')
print('\t', board[6], '|', board[7], '|', board[8], '\n')
def legal_moves(board):
'''創(chuàng)建合法的行棋位置清單。'''
moves = []
for square in range(NUM_SQUARES):
if board[square] == EMPTY: # 該棋位為空
moves.append(square)
return moves
def winner(board):
'''判定游戲獲勝者。'''
WAYS_TO_WIN = ((0, 1, 2), # 橫
(3, 4, 5),
(6, 7, 8),
(0, 3, 6), # 豎
(1, 4, 7),
(2, 5, 8),
(0, 4, 8), # 主對角線
(2, 4, 6)) # 副對角線
# 誰先有三個棋子在一條直線上誰就獲勝。
for row in WAYS_TO_WIN:
if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
winner = board[row[0]]
return winner
# 沒有獲勝方,但棋盤已經(jīng)下滿,判為平局
if EMPTY not in board:
return TIE
return None # 沒有獲勝方,且非平局
def human_move(board, human):
'''獲取玩家的行棋位置。'''
legal = legal_moves(board) # 合法的行棋位置清單
move = None
while move not in legal:
move = ask_number('你走哪? (0 - 8):', 0, NUM_SQUARES)
if move not in legal:
print('\n你選的棋位已落子,重新選擇。\n')
print('落子無悔...')
return move
def computer_move(board, computer, human):
'''獲取電腦的行棋位置。'''
board = board[:] # 通過切片復(fù)制棋盤, 創(chuàng)建局部變量
BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7) # 優(yōu)先的行棋位置
print('我走到:', end=' ')
# 在局部空間確定可以獲勝的走法
for move in legal_moves(board): # 合法的行棋位置列表
board[move] = computer # 更新棋盤副本
if winner(board) == computer:
# 計算機能獲勝
print(move)
return move
# 如果計算機在該棋位行棋不能獲勝,
board[move] = EMPTY # 悔棋,更換下一個合法棋位
# 阻止玩家獲勝
for move in legal_moves(board): # 合法的行棋位置列表
board[move] = human # 更新棋盤
if winner(board) == human:
# 在該棋位玩家行棋后將獲勝
print(move)
return move
# 玩家不能獲勝,不行棋至此
board[move] = EMPTY
# 沒有能使行棋雙方立決勝負(fù)的棋位,從優(yōu)先棋位選擇合法行棋位置
for move in BEST_MOVES:
if move in legal_moves(board):
print(move)
return move
def next_turn(turn):
'''切換行棋方'''
if turn == X:
return O
else:
return X
def congrat_winner(the_winner, computer, human):
'''向獲勝方表示祝賀或聲明平局'''
if the_winner != TIE:
print(the_winner, '祝賀你!\n')
else:
print('平局。。。\n')
if the_winner == computer:
print('如我所料,我又勝了。\n這是否能說明計算機在給方面都優(yōu)于人類呢?')
elif the_winner == human:
print('真是匪夷所思,你沒搗鬼吧?人類怎么會勝? \n不會有下次了。' )
elif the_winner == TIE:
print('你很厲害嘛,能跟計算機打成平手。')
3、定義主函數(shù)
def main():
display_instruct() # 顯示游戲操作指南
computer, human = pieces() # 決定誰先行棋
turn = X # 先行棋方執(zhí)子 X
board = new_board() # 創(chuàng)建空棋盤
display_board(board) # 顯示棋盤
while not winner(board):
# 判定結(jié)果,在沒有獲勝方且不是平局時進(jìn)入循環(huán)
if turn == human:
# 輪到玩家行棋,玩家行棋
move = human_move(board, human) # 玩家的行棋位置
board[move] = human # 更新棋盤
else:
# 輪到電腦行棋
move = computer_move(board, computer, human) # 電腦的行棋位置
board[move] = computer # 更新棋盤
display_board(board) # 顯示更新后的棋盤
turn = next_turn(turn) # 切換行棋方
the_winner = winner(board) # 判定獲勝者,返回獲勝方的執(zhí)子,平局返回 None
congrat_winner(the_winner, computer, human) # 向獲勝方表示祝賀或聲明是平局
4、調(diào)用主函數(shù),啟動程序
main()
input('\n\n按回車鍵退出程序。') # 等待用戶
在 jupyter 中演練如下:





以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
numpy array找出符合條件的數(shù)并賦值的示例代碼
本文主要介紹了numpy array找出符合條件的數(shù)并賦值的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
pytorch實現(xiàn)保證每次運行使用的隨機數(shù)都相同
今天小編就為大家分享一篇pytorch實現(xiàn)保證每次運行使用的隨機數(shù)都相同,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python代碼實現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除
這篇文章主要介紹了python代碼實現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
這篇文章主要介紹了Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06
Python OpenCV Hough直線檢測算法的原理實現(xiàn)
這篇文章主要介紹了Python OpenCV Hough直線檢測算法的原理實現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07
Python遞歸函數(shù)反轉(zhuǎn)序列的實現(xiàn)
本文主要介紹了Python遞歸函數(shù)反轉(zhuǎn)序列的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

