当前位置: 首页 > 后端技术 > Python

用Python做好玩的游戏

时间:2023-03-26 11:49:01 Python

炎炎夏日,一个人坐在家里无所事事,用Python写了2个简单无聊的游戏分享给大家。也希望大家可以通过这两个游戏学习Python编程知识。一、用Python破解九宫格九宫格最早叫“洛书”,现在又叫“魔方”。九宫格游戏对人的思维训练有很大的作用。千百年来对人们的思维训练影响很大。自古以来,人们就认识到九宫格的教育意义,现在也经常出现在文学作品、影视作品中。好了,说了这么多洋屁话,该进入正题了!九宫格要求:把1到9的九个数字放到一个3*3的格子里,想一想如何让每一行、每一列和两条对角线的三个数字之和等于15。破解九宫格的算法有很多。今天我们用最原始的算法——暴力破解法。九宫格三行三列,每行是1-9的3个数,所以我们先取1-9的3个数[S1,S2,...,Sn]的全排列组合,一共987=504种。这样3行,其实就是每行从504序列中取一个,放到第一行,第二行,第三行,组成一个矩阵。最后,对于这个3*3的矩阵,只要判断行列对角线都是15即可。代码思路Step1:获取1到9的数字全排列。Python标准库中有一个非常强大的模块—itertools。该模块提供了很多操作迭代对象,非常方便。这次我们使用itertools中的排列,可以很方便的对序列中的数字进行排列,每个组合都是3个数字:比如S1(1,2,3),S2(1,5,8)...所以我们得到一个长列表[S1,S2,...,Sn]Step2:列出3*3的矩阵Step3:计算行、列、对角线和对角线都是15上面我们已经把这个3*3的矩阵列出:row1_1,row1_2,row1_3row2_1,row2_2,row2_3row3_1,row3_2,row3_3Step4:对重复矩阵进行过滤,这样我们就可以得到一个“行、列、两条对角线都为15”的矩阵,但是其中会有重复的元素it,例如:195951519比如第一行是(1,5,9),第二行是(9,5,1)。如何过滤呢,简单的我们用一套。将第一行和第二行放入集合中,主要判断它们的交集长度为0,也就是没有交集。iflen(set(row1)&set(row2))==0:可能有人会问:为什么不是三行的比例,比如row1&row2&row3?因为设置了前两行,最后一行也必须设置!完整代码:importitertoolsdefjiuGongge():step1穷举3个数的组合nums=[xforxinrange(1,10)]seq_3nums=[pforpinitertools.permutations(nums,3)]过滤掉sum等于15seq_3nums=[pforpinitertools.permutations(nums,3)ifsum(p)==15]print(seq_3nums)step2:搜索行、列、对角线、对角线、中线都是15matrix=[]forrow1_1,row1_2,row1_3inseq_3nums:forrow2_1,row2_2,row2_3inseq_3nums:forrow3_1,row3_2,row3_3inseq_3nums:如果row1_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:如果row1不在矩阵中:matrix=[row1,row2,row3]print(matrix)print('-'*100)结果显示:2769514382947536184389512764923578166187532946721598348163574928341596722.猜数字游戏用户输入1-20中的某个数字,可以猜5次。赢,这里当然有要求,你只有5次机会,而且每次输入都会有提示,太大或者太小,超过5次就会提示gameover代码思路:1.使用input提示用户输入一个数字,然后随机生成一个1-20的整数。2、因为循环最多5次,所以需要用while循环,根据循环体输出的内容判断输入的个数。3、对数大、小、刚好三种情况进行判断,重试计数器加1。代码如下:importrandomdefguess_num():max_retry=5i=0random_num=random.randint(1,21)whileirandom_num:print('>>Biger')elifnum>Small')else:print('!!太好了,你猜数字!')breakexceptExceptionase:print(f'你的输入不正确,请输入数字1-20\n')finally:i+=1print(f'retrytime:{max_retry-i}')else:print('Yourretrytime>5,Gameover!')guess_num()嗯,有兴趣的赶紧跑代码吧,尤其是第二个猜数游戏,个人觉得很有意思,大家也可以添加更多游戏难度,比如输入1-100的数字来玩猜谜游戏。原创不易,觉得不错就点个关注吧。欢迎志同道合的技术高手留言交流。