一起來玩遊戲啊

炎炎夏日,獨坐家中,閒來無事,便用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中的某個數字,進行猜數遊戲。

原創不易,如果你覺得不錯,點個關注,留下你的小心心哦。歡迎志同道合的技術大神留言交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章