==今天的课题
课本: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=0list1=[,"|",[],'|',[]]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]) breakdef 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=Falsedef 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 osdef 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移过来真是正确的决定ㄋ
接下来大概会边读下一章边重构之前的文章,请继续期待我的逃离服务业ㄛ~