炎炎夏日,獨坐家中,閒來無事,便用Python寫了2個簡單的解悶小遊戲,分享給你們,也希望大家通過這兩個小遊戲可以學習Python的編程知識。
1.用Python破解九宮格
九宮格最早叫「洛書」,現在也叫「幻方」。九宮格遊戲對人們的思維鍛鍊有着極大的作用,千百年來對人們的思維訓練影響巨大,從古時起人們便意識到九宮格的教育意義,現在也經常出現在文學、影視中。
好了,放了這麼多洋屁,該進入正題啦!
九宮格要求:把1至9這九個數字放進一個3*3的網格,思考怎麼使每行、每列以及兩個對角線上的三數之和都等於15。
破解九宮格的算法有很多種,今天我們就用最原始的算法——暴力破解法。
九宮格是三行三列,每一行都是1-9中的3個數字,所以我們先取1-9所有的3個數字的全排列組合[S1,S2,…,Sn],總共有9*8*7=504種。
這樣3行,其實就是每一行從這個504序列裏面取一個放到第一排、第二排、第三排,就形成了一個矩陣。
最後對這個3*3的矩陣,只要判斷行、列、對角線和斜對角線都是15就可以了。
代碼思路
Step1:獲取1-9數字的全排列
Python標準庫中有一個很牛逼的模塊——itertools,這個模塊提供了很多操作迭代對象,非常方便。
這次我們用itertools裏面的permutations,它可以方便的全排列序列中的數字,每一個組合都是3個數字:比如S1(1,2,3),S2(1,5,8)…這樣我們得到一個長的列表[S1,S2,…,Sn]
Step2:列出3*3的矩陣
Step3:計算行、列、對角線和斜對角線都是15
上面我們已經把這個3*3的矩陣列出來了:
row1_1,row1_2,row1_3
row2_1,row2_2,row2_3
row3_1,row3_2,row3_3
Step4:過濾重複矩陣
這樣我們就可以得到“行、列、兩對角線都是15”的矩陣,但是這裏面會有重複的元素,比如下面這樣的:
1 9 5
9 5 1
5 1 9
比如第一行是(1,5,9),第二行是(9,5,1)這樣的怎麼過濾呢,簡單我們用集合。
把第一行和第二行都放到集合裏面,主要判斷他們的交集長度爲0,則表示他們沒有交集就可以了。
iflen(set(row1)&set(row2))==0:
有人會問了:爲什麼不是三行比,比如row1&row2&row3呢?
因爲前兩行定下來,最後一行肯定也定了呀!
完整代碼:
importitertools
defjiuGongge():
#step1
#窮舉3個數字的組合
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)
結果展示:
********************
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.猜數字遊戲
用戶輸入1-20中某一個數字,可以猜5次,當輸入的數字與隨機生成的預定數字一致時,就算你贏,當然這裏有要求,你只有5次機會,每次輸入都有提示,大了或者小了,如果超過5次,就會提示game over。
代碼思路:
1.用input提示用戶輸入一個數字,然後隨機產生一個1-20的整數。
2.因爲最多循環5次,所以需要用一個while來循環,根據循環體輸出的內容,來對輸入的數字進行判斷。
3.分別對數字大了,小了和正好,三種情況進行判斷,並且retry的計數器進行加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()
好了,感興趣的同學趕緊運行一下代碼吧,尤其是第二個猜數字遊戲,個人覺得還是很有意思的,你也可以增加遊戲的難度,比如輸入1-100中的某個數字,進行猜數遊戲。
原創不易,如果你覺得不錯,點個關注,留下你的小心心哦。歡迎志同道合的技術大神留言交流。