炎炎夏日,獨(dú)坐家中,閑來無事,便用Python寫了2個(gè)簡單的解悶小游戲,分享給你們,也希望大家通過這兩個(gè)小游戲可以學(xué)習(xí)Python的編程知識(shí)。
1.用Python破解九宮格
九宮格最早叫「洛書」,現(xiàn)在也叫「幻方」。九宮格游戲?qū)θ藗兊乃季S鍛煉有著極大的作用,千百年來對人們的思維訓(xùn)練影響巨大,從古時(shí)起人們便意識(shí)到九宮格的教育意義,現(xiàn)在也經(jīng)常出現(xiàn)在文學(xué)、影視中。
好了,放了這么多洋屁,該進(jìn)入正題啦!
九宮格要求:把1至9這九個(gè)數(shù)字放進(jìn)一個(gè)3*3的網(wǎng)格,思考怎么使每行、每列以及兩個(gè)對角線上的三數(shù)之和都等于15。
破解九宮格的算法有很多種,今天我們就用最原始的算法——暴力破解法。
九宮格是三行三列,每一行都是1-9中的3個(gè)數(shù)字,所以我們先取1-9所有的3個(gè)數(shù)字的全排列組合[S1,S2,…,Sn],總共有9*8*7=504種。
這樣3行,其實(shí)就是每一行從這個(gè)504序列里面取一個(gè)放到第一排、第二排、第三排,就形成了一個(gè)矩陣。
最后對這個(gè)3*3的矩陣,只要判斷行、列、對角線和斜對角線都是15就可以了。
代碼思路
Step1:獲取1-9數(shù)字的全排列
Python標(biāo)準(zhǔn)庫中有一個(gè)很牛逼的模塊——itertools,這個(gè)模塊提供了很多操作迭代對象,非常方便。
這次我們用itertools里面的permutations,它可以方便的全排列序列中的數(shù)字,每一個(gè)組合都是3個(gè)數(shù)字:比如S1(1,2,3),S2(1,5,8)…這樣我們得到一個(gè)長的列表[S1,S2,…,Sn]
Step2:列出3*3的矩陣
Step3:計(jì)算行、列、對角線和斜對角線都是15
上面我們已經(jīng)把這個(gè)3*3的矩陣列出來了:
row1_1,row1_2,row1_3
row2_1,row2_2,row2_3
row3_1,row3_2,row3_3
Step4:過濾重復(fù)矩陣
這樣我們就可以得到“行、列、兩對角線都是15”的矩陣,但是這里面會(huì)有重復(fù)的元素,比如下面這樣的:
1 9 5
9 5 1
5 1 9
比如第一行是(1,5,9),第二行是(9,5,1)這樣的怎么過濾呢,簡單我們用集合。
把第一行和第二行都放到集合里面,主要判斷他們的交集長度為0,則表示他們沒有交集就可以了。
iflen(set(row1)&set(row2))==0:
有人會(huì)問了:為什么不是三行比,比如row1&row2&row3呢?
因?yàn)榍皟尚卸ㄏ聛恚詈笠恍锌隙ㄒ捕搜剑?/p>
完整代碼:
importitertools
defjiuGongge():
#step1
#窮舉3個(gè)數(shù)字的組合
nums=[xforxinrange(1,10)]
seq_3nums=[pforpinitertools.permutations(nums,3)]
#過濾出和等于15
seq_3nums=[pforpinitertools.permutations(nums,3)ifsum(p)==15]
# print (seq_3nums)
#step2:搜索行,列,對角,斜對角,中線均為15
matrix=[]
forrow1_1,row1_2,row1_3inseq_3nums:
forrow2_1,row2_2,row2_3inseq_3nums:
forrow3_1,row3_2,row3_3inseq_3nums:
ifrow1_1+row1_2+row1_3==15\
androw1_1+row2_2+row3_3==15\
androw1_1+row2_1+row3_1==15\
androw1_3+row2_2+row3_1==15\
androw1_2+row2_2+row3_2==15:
#step3 去重
row1=[row1_1,row1_2,row1_3]
row2=[row2_1,row2_2,row2_3]
row3=[row3_1, row3_2, row3_3]
iflen(set(row1) & set(row2)) ==0:
ifrow1notinmatrix:
matrix = [row1, row2, row3]
print(matrix)
print('-'*100)
結(jié)果展示:
********************
2 7 6
9 5 1
4 3 8
********************
2 9 4
7 5 3
6 1 8
********************
4 3 8
9 5 1
2 7 6
********************
4 9 2
3 5 7
8 1 6
********************
6 1 8
7 5 3
2 9 4
********************
6 7 2
1 5 9
8 3 4
********************
8 1 6
3 5 7
4 9 2
********************
8 3 4
1 5 9
6 7 2
2.猜數(shù)字游戲
用戶輸入1-20中某一個(gè)數(shù)字,可以猜5次,當(dāng)輸入的數(shù)字與隨機(jī)生成的預(yù)定數(shù)字一致時(shí),就算你贏,當(dāng)然這里有要求,你只有5次機(jī)會(huì),每次輸入都有提示,大了或者小了,如果超過5次,就會(huì)提示game over。
代碼思路:
1.用input提示用戶輸入一個(gè)數(shù)字,然后隨機(jī)產(chǎn)生一個(gè)1-20的整數(shù)。
2.因?yàn)樽疃嘌h(huán)5次,所以需要用一個(gè)while來循環(huán),根據(jù)循環(huán)體輸出的內(nèi)容,來對輸入的數(shù)字進(jìn)行判斷。
3.分別對數(shù)字大了,小了和正好,三種情況進(jìn)行判斷,并且retry的計(jì)數(shù)器進(jìn)行加1。
代碼如下:
importrandom
defguess_num():
max_retry =5
i=0
random_num=random.randint(1,21)
whilei
try:
num=int(input("please input num :1-20\n"))
print(f'Your input is :{num}')
ifnum>random_num:
print('>>Biger')
elifnum
print('>>Small')
else:
print('!!Great,you guess the num!')
break
exceptExceptionase:
print(f'Your input incorrect,Please input num 1-20\n')
finally:
i+=1
print(f'retry time:{max_retry-i}')
else:
print('Your retry time>5,Game over!')
guess_num()
好了,感興趣的同學(xué)趕緊運(yùn)行一下代碼吧,尤其是第二個(gè)猜數(shù)字游戲,個(gè)人覺得還是很有意思的,你也可以增加游戲的難度,比如輸入1-100中的某個(gè)數(shù)字,進(jìn)行猜數(shù)游戲。
原創(chuàng)不易,如果你覺得不錯(cuò),點(diǎn)個(gè)關(guān)注,留下你的小心心哦。歡迎志同道合的技術(shù)大神留言交流。