==今天的課題
課本:https://reurl.cc/ROvEv6
综合案例3:井字棋遊戲
結果讀到現在才發現老師都有貼心的把題目變成超連結可供點選參考定義=_=
main=建立地圖、選擇遊戲模式、顯示目前進度、判斷誰贏
player=選擇角色、輸入想下的位置
com=與玩家對抗
player2=選擇角色、輸入想下的位置
那就開始吧
==建立地圖==
建立一個list,除了9個空白以外其餘填入格線|或——,分三段顯示,共五行
print('%s|%s|%s\n——————\n%s|%s|%s\n——————\n%s|%s|%s'%(1,2,3,4,5,6,7,8,9))
結果
寫出來才發現好像怪怪的,因為這個作法執行起來要寫九個變數,可能還要寫一堆判斷式
所以調整一下方向
#地圖
i=0
list1=[,"|",[],'|',[]]
while i<5:
if i%2!=0:
print("------------------------")
else:
print(list1)
i+=1
用list的好處或許是能先取值再填入?那我又該取什麼值?
這時候我想到第六天學過的練習
那時候我跟老師最大的差異就是他在比對數串的時候,會習慣用算式表達位數
例如要比對'1234'就只需要每次%10,餘數就是目標值
這個做法讓我意識到懂數學還真的有點方便
扯遠了總之
我想到如果讓九宮格的每個位置等值1-9,是不是就能以總數45來扣除,為0時遊戲結束?
f=[num for num in range(1,10)]
sum(f)#45
答案好像是不行,因為45-n=0只是其中一種遊戲結束的條件
那試試把全部空格預設None,填入值為布林?
=======又過了好幾天的分隔線
因為每天在腦內想程式都要從頭規劃一次程式碼,但每次都只能用零碎的上班休息時間來想,導致每次都卡在差不多的進度上,這讓我煩躁到想放棄,但從另一個角度來想這次卡的關或許問題就出在流程上
於是重新把整個OOXX的流程寫了一遍
然後照著自己寫的完成每個功能
最後竟然就完成了
import random
#pvp模式
def pvp():
carater1=input('P1請選擇角色\n我要當O=1\n我要當X=2\n')
#選擇角色
if carater1=='1':
#顯示已選角色
print('P1先攻')
else:
print('P2先攻')
round=0
f=[x for x in range(0,9)]#建立空白地圖
game=True
while game:
round+=1
#顯示回合數
print('==============\n回合數=%s\n'%round)
#顯示剩餘位置
print('%s|%s|%s\n------\n%s|%s|%s\n------\n|%s|%s|%s\n================='%(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]))
#選擇位置
x=int(input('O選擇位置(0-8)'))
y=int(input('X選擇位置(0-8)'))
#標上記號
f[x],f[y]='O','X'
#強制結束
if round==9:
print('沒輸沒贏')
game=False
#判斷輸贏
if f[0]==f[1]==f[2] or f[0]==f[3]==f[6] or f[0]==f[4]==f[8] :
print('%swin'%f[0])
break
elif f[1]==f[4]==f[7]:
print('%swin'%f[1])
break
elif f[2]==f[4]==f[6] or f[2]==f[5]==f[8]:
print('%swin'%f[2])
break
elif f[3]==f[4]==f[5]:
print('%swin'%f[3])
break
elif f[6]==f[7]==f[8]:
print('%swin'%f[6])
break
def computer(f):#目前電腦只能當X
g=f[:]
while 'O'in g:
g.pop(g.index('O'))
return random.choice(g)
def com():
#顯示角色選項
carater=input('請選擇角色\n我要當O=1\n我要當X=2\n')
#選擇角色
if carater=='1':
#顯示已選角色
print('您先攻')
else:#bug:選擇其他數字也會當X
print('您後攻')
round=0
f=[x for x in range(0,9)]#建立空白地圖
game=True
while game:
round+=1
#顯示回合數
print('==============\n回合數=%s\n'%round)
#顯示剩餘位置
print('%s|%s|%s\n------\n%s|%s|%s\n------\n|%s|%s|%s\n================='%(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]))
#選擇位置
x=int(input('選擇位置(0-8)'))
#標上記號
f[x]='O'
#電腦對抗
y=computer(f)
f[y]='X'
#判斷輸贏
if f[0]==f[1]==f[2] or f[0]==f[3]==f[6] or f[0]==f[4]==f[8] :
print('%swin'%f[0])
break
elif f[1]==f[4]==f[7]:
print('%swin'%f[1])
break
elif f[2]==f[4]==f[6] or f[2]==f[5]==f[8]:
print('%swin'%f[2])
break
elif f[3]==f[4]==f[5]:
print('%swin'%f[3])
break
elif f[6]==f[7]==f[8]:
print('%swin'%f[6])
break
#強制結束
if round==9:
print('沒輸沒贏')
game=False
def main():
#顯示歡迎詞
print('歡迎來到OX大戰')
#顯示遊戲模式
mode=input('請選擇遊戲模式\nPVP=1\nCOM=2\n')
#選擇遊戲模式
if mode=='1':
#顯示已選遊戲模式
print('您選擇的是PVP模式')
pvp()
else :#bug:選擇其他數字也會變成com
print('您選擇的是COM模式')
com()
main()
雖然很長就是了,不過自己從0到有寫出來真的是爽到靠杯...
來看解答吧
import os
def print_board(board):
print(board['TL'] + '|' + board['TM'] + '|' + board['TR'])
print('-+-+-')
print(board['ML'] + '|' + board['MM'] + '|' + board['MR'])
print('-+-+-')
print(board['BL'] + '|' + board['BM'] + '|' + board['BR'])
def main():
init_board = {
'TL': ' ', 'TM': ' ', 'TR': ' ',
'ML': ' ', 'MM': ' ', 'MR': ' ',
'BL': ' ', 'BM': ' ', 'BR': ' '
}
begin = True
while begin:
curr_board = init_board.copy()
begin = False
turn = 'x'
counter = 0
os.system('clear')
print_board(curr_board)
while counter < 9:
move = input('轮到%s走棋, 请输入位置: ' % turn)
if curr_board[move] == ' ':
counter += 1
curr_board[move] = turn
if turn == 'x':
turn = 'o'
else:
turn = 'x'
os.system('clear')
print_board(curr_board)
choice = input('再玩一局?(yes|no)')
begin = choice == 'yes'
if __name__ == '__main__':
main()
老師的這個版本雖然用了OS,雖說我也想過用OS不過因為我不能測試所以就算了
然後沒有判斷輸贏所以必須要到9局玩完才能重新
我覺得我寫的比較好,哈
==========終於結束這一章的分隔線=========
呼
把OX寫出來的時候真的長呼了一口氣
最大的感想是:
明明標題是python第七天我卻在這章逗留了23天(從11/15到12/8),超好笑
不過這章的練習也是前所未有的多,每個都有他難的地方,不過也都是我這個程度能解決的,希望未來的學習難度也能都保持在這個水平(不過依照一章23天的話我要完成這個100天的教學要花六年四個月:) )
第二個感想是
原來就算是這麼笨的部落格更新也還是有人願意看甚至是留言給我建議,當初從mideum移過來真是正確的決定ㄋ
接下來大概會邊讀下一章邊重構之前的文章,請繼續期待我的逃離服務業ㄛ~