subprocess.call("cls") 清屏,僅限 Windows 執行。def draw_board(board):
subprocess.call("cls", shell=True)
print(' -------\n' + ' |' + board[9] + '|' + board[8] + '|' + board[7] + '|\n' + ' -------\n' +
' |' + board[6] + '|' + board[5] + '|' + board[4] + '|\n' + ' -------\n' +
' |' + board[3] + '|' + board[2] + '|' + board[1] + '|\n' + ' -------')
def input_player_letter():
letter = ''
while letter not in ('X', 'O'):
letter = input('請選擇 X 或 O 作棋子:').upper()
return ['X', 'O'] if letter == 'X' else ['O', 'X']
def is_winner(board, letter):
return ((board[1]==letter and board[2]==letter and board[3]==letter) or
(board[4]==letter and board[5]==letter and board[6]==letter) or
(board[7]==letter and board[8]==letter and board[9]==letter) or
(board[1]==letter and board[5]==letter and board[9]==letter) or
(board[2]==letter and board[5]==letter and board[8]==letter) or
(board[3]==letter and board[5]==letter and board[7]==letter) or
(board[1]==letter and board[4]==letter and board[7]==letter) or
(board[2]==letter and board[5]==letter and board[8]==letter) or
(board[3]==letter and board[6]==letter and board[9]==letter))
def get_computer_move(board, computer_letter):
player_letter = 'O' if computer_letter == 'X' else 'X'
# 1. 檢查自己能否一步獲勝
for i in range(1,10):
if is_space_free(board, i):
copy = get_board_copy(board)
make_move(copy, computer_letter, i)
if is_winner(copy, computer_letter): return i
# 2. 檢查阻擋玩家獲勝
for i in range(1,10):
if is_space_free(board, i):
copy = get_board_copy(board)
make_move(copy, player_letter, i)
if is_winner(copy, player_letter): return i
# 3. 佔角 -> 佔中心 -> 佔邊
move = choose_random_from_list(board, [1,3,7,9])
if move: return move
if is_space_free(board, 5): return 5
return choose_random_from_list(board, [2,4,6,8])
while True:
board = [' '] * 10
player_letter, computer_letter = input_player_letter()
turn = who_first()
print(turn + '先走')
game_is_playing = True
while game_is_playing:
if turn == 'player':
draw_board(board)
move = get_player_move(board)
make_move(board, player_letter, move)
if is_winner(board, player_letter):
draw_board(board); print('恭喜!你贏了。'); break
if is_board_full(board): draw_board(board); print('平手!'); break
turn = 'computer'
else:
move = get_computer_move(board, computer_letter)
make_move(board, computer_letter, move)
if is_winner(board, computer_letter):
draw_board(board); print('電腦獲勝!'); break
if is_board_full(board): draw_board(board); print('平手!'); break
turn = 'player'
if not is_again(): break
程式啟動時顯示 ASCII 藝術字歡迎畫面,遊戲過程在控制台即時刷新棋盤。