点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

真者,精诚之至也,不精不诚,不能动人。

成语接龙

今天难得下班早,不用做公司的末班车,和同事乘公交回家。中途上来几个学生,相互在玩着成语接龙游戏。说是成语,但词汇却真是不堪入耳。
6月高考的前一天,我发布的一篇文章,决战高考,帮你秒变成语之王。

当时只是把网站的成语爬下来保存到数据库中,文末提到有机会了抽时间拿这些数据搞点事情,那么今天就来搞事情吧。用3W+的成语数据库,开发一款成语接龙的小游戏。

接龙规则

成语接龙是中华民族传统的文字游戏。它不仅有着悠久的历史和广泛的社会基础,同时还是体现我国文字、文化、文明的一个缩影,是老少皆宜的民间文化娱乐活动。
成语接龙规则多样,大家一般熟知的是采用成语字头与字尾相连不断延伸的方法进行接龙;用四个字成语的最后一个字与下一句成语的第一个相同的字【音同就可以】,首尾相接不断延伸,形成长龙。

游戏演示

说了这么多,让我们来先睹为快,让我来挑战一局接龙比赛吧:

游戏展示

既然是游戏,就得来个排名才有意思啊!之前测试了几轮数据,这次我们使用一个Neo的新用户来进行游戏,随便接龙了几次,然后我编了一个“蝉鸣鸟叫”的成语结束这次演示,不然像我这种学富五车的有为青年,好好答不来个几十轮的哪里能结束啊,哈哈…可以看到游戏结束后退回到首页,并进行了挑战排序。还好没几个号,不然排不到前五都看不到效果了…

数据库信息

先来看看我们的数据库信息:


数据库表idiom分为id,name,speak,meaning,example,hot 几个字段,hot是当时搜索的网站热词排行,跟咱们没有太大关系…主要是name和speak字段。

登陆排行

为了能增强可玩性,我们在每次开场前,允许用户随机输入一个名字。在挑战过程中,针对用户坚持的接龙次数进行排名。


创建用户排名表:

1CREATE TABLE rank (
2    name  VARCHAR (50) NOT NULL,
3    round_num INT      NOT NULL
4);

这里为什么不设置主键呢?主要是排名取前5,用户使用一个名字多次参战,如果犀利的话包揽前5看这也很帅气啊,清一色的都是我,想想都觉得自我满足感爆棚。

游戏界面

首先映入眼帘的是ROUND 1的接龙次数显示,有没有儿时拳皇对打的感觉…
为了帮助大家在玩游戏的同时能学习成语知识,也避免有些生僻字不认识,所以在界面中显示了成语、注音、解释和示例,当然示例不是每个成语都有,网站有啥我就展示啥呗…


成语判断

首先必须是四字的成语,用户输入非四字的成语会弹出警示栏,其次用户填写完成语后,会将成语在数据库中进行检索,如果是成语则进行接龙后返回电脑的匹配结果,进行第二轮的基隆,如果数据库中无此成语会弹出游戏结束的提示“挑战结束:用户输入的成语是自己编的吧!”,返回登陆页,并将用户的挑战结果入库rank表进行排行。
这里需要注意,成语接龙的收尾字可以不一样但音必须相同,包括声调哦!

拼音识别

数据库中的成语我们存在拼音了,但用户输入的是汉字,我们如何进行拼音转化呢?这里需要使用到python的一个模块pypinyin。针对这个模块的使用,之前写过一篇文章Python为文档批量注音(生僻字歌词为例),喜欢的朋友可以去看看。用法很简单,但我们需要做到和数据库中相对应才行。

1from pypinyin import pinyin
2pinyin('唇枪舌剑')
3# output:
4[['chún'], ['qiāng'], ['shé'], ['jiàn']]
5# 此处为一个嵌套列表,我们需要转化为数据库中的格式
6'  '.join(map(lambda x: x[0], pinyin('唇枪舌剑')))
7# output:
8'chún  qiāng  shé  jiàn'

Jinjia2模板

大家看到不管是用户登录还是游戏界面,外框内容基本一致,基于这种场景使用Jinjia2的模板继承是个很不错的选择:
layout.html主要负责整体框架及相关css和js的引入工作,使用Bootstrap+Jquery分分钟搞定。

 1<!DOCTYPE html>2<html lang="en">3<head>4    <meta charset="UTF-8">5    <meta http-equiv="X-UA-Compatible" content="IE=edge">6    <meta name="viewport" content="width=device-width, initial-scale=1 ,user-scalable=no">7    <title>清风python</title>8    <link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}">9    <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.min.css') }}">
10    <link rel="stylesheet" href="{{ url_for('static',filename='css/main.css') }}">
11    <script src="{{ url_for('static',filename='js/jquery.min.js') }}"></script>
12</head>
13<body>
14
15<div class="container container-small">
16    <div class="content">
17        <div class="header">
18            成语接龙
19        </div>
20        <div class="block-info">
21            {% block contents %}
22            {% endblock %}
23        </div>
24    </div>
25    <div class="footer">
26        ©2019-欢迎关注我的公众号:<a href="https://www.jianshu.com/u/d23fd5012bed">清风Python</a>
27    </div>
28</div>
29
30</body>
31</html>

login.html涉及到挑战者排行和用户名提交与页面跳转
game.html主要负责成语接龙游戏的监控与AJAX数据的后台刷新。
由于篇幅有限就不再这里赘述了,代码文末会给出。

Flask装饰器

首先,我们的游戏涉及到SQLite数据库的交互,所以在每次请求前,需要建立数据库,请求结束后需要释放连接。此时我们需要使用到两个装饰器,@app.before_request@app.teardown_request,before_request见名知意就是在请求访问前调动该装饰器,那么为什么不用对应的@app.after_request呢?因为即便用户代码在执行过程中,出现任何错误,也可以通过@app.teardown_request装饰器最终释放数据库连接,但@app.after_request可不行…
Flask整体代码如下

 1import sqlite32from flask import Flask, render_template, request, g, session, redirect, url_for, jsonify3import random4from pypinyin import pinyin56app = Flask(__name__)7DATABASE = 'static/db/database.db'8app.secret_key = 'Breeze Python'9
10
11def connect_db():
12    return sqlite3.connect(DATABASE)
13
14
15@app.before_request
16def before_request():
17    g.db = connect_db()
18
19
20@app.teardown_request
21def teardown_request(exception):
22    if hasattr(g, 'db'):
23        g.db.close()
24
25
26def query_db(query, args=(), one=True):
27    cur = g.db.execute(query, args)
28    rv = [dict((cur.description[idx][0], value)
29               for idx, value in enumerate(row)) for row in cur.fetchall()]
30    if not query.startswith('select'):
31        g.db.commit()
32    return (rv[0] if rv else None) if one else rv
33
34
35@app.route('/', methods=['GET', 'POST'])
36def index():
37    if request.method == 'POST':
38        user = request.form.get('name')
39        session['user'] = user
40        session['round'] = 1
41        return redirect(url_for('game'))
42    rank_list = query_db('select * from rank order by round_num desc limit 5',one=False)
43    print(rank_list)
44    return render_template('login.html', rank_list=rank_list)
45
46
47@app.route('/game')
48def game():
49    if not session.get('user'):
50        return redirect(url_for('index'))
51    id = random.randint(1, 30000)
52    idiom = query_db('select * from idiom where id = ?',
53                     [id])
54    return render_template('game.html', user=session.get('user'), idiom=idiom)
55
56
57@app.route('/more/<user_idiom>')
58def more(user_idiom):
59    speak_list = pinyin(user_idiom)
60    print(speak_list[0][-1])
61    idiom_speak = '  '.join(map(lambda x: x[0], speak_list))
62    if query_db('select * from idiom where speak = ?',
63                [idiom_speak]):
64        new_idiom = query_db("select * from idiom where speak like ('%s%%')" % speak_list[-1][0])
65        session['round'] = session.get('round') + 1
66        print({'code': 200, 'round': session.get('round'), 'info': new_idiom})
67        return jsonify({'code': 200, 'round': session.get('round') + 1, 'info': new_idiom})
68    else:
69        query_db('replace into rank (name,round_num) values (?,?)',
70                 [session.get('user'), session.get('round')])
71        return jsonify({'code': 404, 'error': "挑战结束:用户输入的成语是自己编的吧!", 'url': request.host_url})
手机搭建项目

搭建好的游戏网站,我们可以在局域网内共享, 但日常想进行练手,如果能使用手机运行我们的网站岂不是更爽?
之前写过一篇将安卓手机打造成你的python全栈开发利器,通过这种方式我们就能把python程序在手机端完美运行了,来试试看吧!

代码我已经上传到了我的git仓库,手机登陆Termux直接clone下载即可:
git clone https://github.com/BreezePython/IdiomsGame.git

进入clone好的代码路径,之后输入pipenv install创建虚拟环境并下载依赖的模块
键入pipenv shell 进入虚拟环境
通过flask run运行我们的Flask app程序…

公众号回复成语接龙,即可获取完整代码。

------------------- End -------------------

往期精彩文章推荐:

  • Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

  • 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程

  • 利用Python网络爬虫抓取微信好友的签名及其可视化展示

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

说一两个你喜欢的成语~~

学富五车的你,敢来迎战Python开发的成语接龙游戏吗?相关推荐

  1. 学富五车的你,敢迎战Python开发的成语接龙游戏吗?

    成语接龙 今天难得下班早,不用做公司的末班车,和同事乘公交回家.中途上来几个学生,相互在玩着成语接龙游戏.说是成语,但词汇却真是不堪入耳. 6月高考的前一天,我发布的一篇文章,决战高考,帮你秒变成语之 ...

  2. 敢来迎战Python开发的成语接龙游戏吗?

    游戏演示 说了这么多,让我们来先睹为快,让我来挑战一局接龙比赛吧: <游戏展示> 既然是游戏,就得来个排名才有意思啊! 之前测试了几轮数据,这次我们使用一个Neo的新用户来进行游戏,随便接 ...

  3. Python 开发接豆人小游戏 TurnipBit

    Python 开发接豆人小游戏 TurnipBit 最近入手了一款MicroPython的开发板-TurnipBit,这个板子比较适合单片机入门,以及青少年编程,因为它有配备的在线图形编程. 官网地址 ...

  4. Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!

    英语单词学习应用 周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多.本来周末打算照着扇贝/极光单词,写一个英语单词自测工具.但苦 ...

  5. Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!

    明天你好,我叫干不倒 一直比较喜欢看<欢乐喜剧人>,其中有一期小沈龙的节目,名字叫明天你好,我叫干不倒... 父亲的身体一直不好,因为常年的酗酒抽烟,患脑梗好些年头了,周末病情有些恶化,住 ...

  6. Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!#华为云·寻找黑马程序员#

    文章目录 明天你好,我叫干不倒 英语单词学习应用 成语接龙 接龙规则 实现分析 数据库信息 登陆排行 游戏界面 成语判断 拼音识别 代码编写 Jinjia2模板 Flask装饰器 游戏演示 手机搭建项 ...

  7. 基于Python经典版成语接龙逻辑实现

    基于Python经典版成语接龙逻辑实现 今天,想检验一下前期Python学习成功,加上好友提起斗一波成语接龙,为完全碾压,轻松取胜,便顺手写一个适合日常群聊PK的成语接龙小程序.具体实现流程如下: 成 ...

  8. python开发的炸金花小游戏来啦,从此不再无聊~

    哈喽~大家好,我是恰恰!大家今天应该都已经开工了,很多同学过年的时候都是在牌桌上度过的吧哈哈,所以今天给大家带来一个用Python开发的扎金花的小游戏,又可以学习又可以玩,趣味性学习没错了!快来看看吧 ...

  9. 魔兽世界也是Python开发的?盘点Python开发的知名网站和游戏!

    我们都知道,Python不仅在数据分析.人工智能方面有着广泛的应用,在网站开发.游戏开发方面更是一枝独秀. 今天小编就带大家盘点一下,哪些知名的大型公司和网站在用Python开发,以及用Python开 ...

最新文章

  1. [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
  2. CIO对虚拟化缺乏可预见成最大安全挑战
  3. Android性能优化面试题集锦,终局之战
  4. Windows Azure 将正式更名为 Microsoft Azure
  5. 致歉!抖音Semi Design承认参考阿里Ant Design
  6. 数据库读现象和隔离级别
  7. 批处理添加桌面快捷方式
  8. c语言编程菜单流程图,C语言课程设计————写下流程图! 谢谢
  9. 多元函数的微分学思维导图_多元函数微分学思维导图_多元函数微分学j_多元函数微分学思维导图...
  10. qtcpsocket断开_关于QSocket的释放的一个需要注意的情况(必须先断开连接)
  11. vb html ie弹出窗口,vb操作ie浏览器
  12. python excel写入一列_python读取excel指定列数据并写入到新的excel方法
  13. 方舟Mod:任何颜色集
  14. app免填邀请码安装如何实现?
  15. css 取偶数节点_css3 nth 选择器
  16. 看 Sugar 如何说 I2C 通信
  17. 时装过滤效果Lr预设
  18. 中国数据治理现状调研报告(2021)
  19. 量化交易9-backtrader回测十字星K线形态图
  20. label-position--提问

热门文章

  1. 云计算技术分享:linux云计算课程学习大纲
  2. (附源码)springboot基于JAVA的电影推荐系统的开发与实现 毕业设计112306
  3. Android的USB通信(AOA连接)
  4. 炒鸡简单的javaScript的call和apply方法
  5. 离散正弦变换(DST)实现(cpu和cuda)
  6. 写电子邮件是一件严肃的事情
  7. 关于计算机的英语谚语,英语谚语大全 关于C的谚语
  8. 记一次JVM故障排除
  9. RANSAC和SAC-IA
  10. mysql 加密狗_IA300加密狗使用 | 学步园