炎炎夏日,独坐家中,闲来无事,便用 Python 写了 2 个简单的解闷小游戏,分享给你们,也希望大家通过这两个小游戏可以学习 Python 的编程知识。
1. 用 Python 破解九宫格
九宫格最早叫「洛书」,现在也叫「幻方」。九宫格游戏对人们的思维锻炼有着极大的作用,千百年来对人们的思维训练影响巨大,从古时起人们便意识到九宫格的教育意义,现在也经常出现在文学、影视中。
好了,放了这么多洋屁,该进入正题啦!
九宫格要求:把 1 至 9 这九个数字放进一个 3 * 3 的网格,思考怎么使每行、每列以及两个对角线上的三数之和都等于 15。
破解九宫格的算法有很多种,今天我们就用最原始的算法——暴力破解法。
九宫格是三行三列,每一行都是 1 - 9 中的 3 个数字,所以我们先取 1 - 9 所有的 3 个数字的全排列组合 [S1,S2,…,Sn],总共有 9 87=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 呢?
因为前两行定下来,最后一行肯定也定了呀!
完整代码:
import itertools
def jiuGongge():
step1
穷举 3 个数字的组合
nums=[x for x in range(1,10)]
seq_3nums=[p for p in itertools.permutations(nums,3)]
过滤出和等于 15
seq_3nums=[p for p in itertools.permutations(nums,3) if sum(p)==15]
print (seq_3nums)
step2: 搜索行,列,对角,斜对角,中线均为 15
matrix=[]
for row1_1,row1_2,row1_3 in seq_3nums:
for row2_1,row2_2,row2_3 in seq_3nums:
for row3_1,row3_2,row3_3 in seq_3nums:
if row1_1+row1_2+row1_3==15 \
and row1_1+row2_2+row3_3==15 \
and row1_1+row2_1+row3_1==15 \
and row1_3+row2_2+row3_1==15 \
and row1_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]
if len(set(row1) & set(row2)) == 0:
if row1 not in matrix:
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。
代码如下:
import random
def guess_num():
max_retry = 5
i=0
random_num=random.randint(1,21)
while i<max_retry:
try:
num=int(input("please input num :1-20\n"))
print(f'Your input is :{num}')
if num>random_num:
print('>>Biger')
elif num<random_num:
print('>>Small')
else:
print('!!Great,you guess the num!')
break
except Exception as e:
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 中的某个数字,进行猜数游戏。
原创不易,如果你觉得不错,点个关注,留下你的小心心哦。欢迎志同道合的技术大神留言交流。