前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Python制作好玩的小游戏

用Python制作好玩的小游戏

作者头像
stormwen
发布2019-08-13 15:46:30
2.8K1
发布2019-08-13 15:46:30
举报
文章被收录于专栏:公众号:googpy公众号:googpy

阅读文本大概需要 4 分钟。

炎炎夏日,独坐家中,闲来无事,便用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,则表示他们没有交集就可以了。

代码语言:javascript
复制
iflen(set(row1)&set(row2))==0:

有人会问了:为什么不是三行比,比如row1&row2&row3呢?

因为前两行定下来,最后一行肯定也定了呀!

完整代码

代码语言:javascript
复制
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)

结果展示

代码语言:javascript
复制
********************

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。

代码如下:

代码语言:javascript
复制
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中的某个数字,进行猜数游戏。

原创不易,如果你觉得不错,点个关注,留下你的小心心哦。欢迎志同道合的技术大神留言交流。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 googpy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档