成语接龙

今天难得下班早,不用做公司的末班车,和同事乘公交回家。中途上来几个学生,相互在玩着成语接龙游戏。说是成语,但词汇却真是不堪入耳。
6月高考的前一天,我发布的一篇文章,决战高考,帮你秒变成语之王,当时只是吧网站的成语爬下来保存到数据库中,文末提到有机会了抽时间拿这些数据搞点事情,那么今天就来搞事情吧。用3W+的成语数据库,开发一款成语接龙的小游戏。

接龙规则

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

游戏演示

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

游戏展示

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

数据库信息

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

数据库信息

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

登陆排行

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

挑战者记录

创建用户排名表:

CREATE TABLE rank (name  VARCHAR (50) NOT NULL,round_num INT      NOT NULL
);

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

游戏界面

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

游戏界面
成语判断

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

拼音识别

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

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

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

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1 ,user-scalable=no"><title>清风python</title><link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}"><link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.min.css') }}"><link rel="stylesheet" href="{{ url_for('static',filename='css/main.css') }}"><script src="{{ url_for('static',filename='js/jquery.min.js') }}"></script>
</head>
<body><div class="container container-small"><div class="content"><div class="header">成语接龙</div><div class="block-info">{% block contents %}{% endblock %}</div></div><div class="footer">©2019-欢迎关注我的公众号:<a href="https://www.jianshu.com/u/d23fd5012bed">清风Python</a></div>
</div></body>
</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整体代码如下

import sqlite3
from flask import Flask, render_template, request, g, session, redirect, url_for, jsonify
import random
from pypinyin import pinyinapp = Flask(__name__)
DATABASE = 'static/db/database.db'
app.secret_key = 'Breeze Python'def connect_db():return sqlite3.connect(DATABASE)@app.before_request
def before_request():g.db = connect_db()@app.teardown_request
def teardown_request(exception):if hasattr(g, 'db'):g.db.close()def query_db(query, args=(), one=True):cur = g.db.execute(query, args)rv = [dict((cur.description[idx][0], value)for idx, value in enumerate(row)) for row in cur.fetchall()]if not query.startswith('select'):g.db.commit()return (rv[0] if rv else None) if one else rv@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'POST':user = request.form.get('name')session['user'] = usersession['round'] = 1return redirect(url_for('game'))rank_list = query_db('select * from rank order by round_num desc limit 5',one=False)print(rank_list)return render_template('login.html', rank_list=rank_list)@app.route('/game')
def game():if not session.get('user'):return redirect(url_for('index'))id = random.randint(1, 30000)idiom = query_db('select * from idiom where id = ?',[id])return render_template('game.html', user=session.get('user'), idiom=idiom)@app.route('/more/<user_idiom>')
def more(user_idiom):speak_list = pinyin(user_idiom)print(speak_list[0][-1])idiom_speak = '  '.join(map(lambda x: x[0], speak_list))if query_db('select * from idiom where speak = ?',[idiom_speak]):new_idiom = query_db("select * from idiom where speak like ('%s%%')" % speak_list[-1][0])session['round'] = session.get('round') + 1print({'code': 200, 'round': session.get('round'), 'info': new_idiom})return jsonify({'code': 200, 'round': session.get('round') + 1, 'info': new_idiom})else:query_db('replace into rank (name,round_num) values (?,?)',[session.get('user'), session.get('round')])return jsonify({'code': 404, 'error': "挑战结束:用户输入的成语是自己编的吧!", 'url': request.host_url})
手机搭建项目

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

代码clone

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

pipenv导入

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

image.png
image.png
image.png
The End

今天的Flask项目开发成语接龙游戏的文章,公众号清风Python回复成语接龙,自动获取代码的百度网盘地址。如果你觉得不错,希望能动动手指转发给你身边的朋友们。

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

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

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 真者,精诚之至也,不精不诚,不能动 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. python成语接龙到为所欲为_为所欲为是第一个成语开头的成语接龙游戏

    为所欲为是第一个成语开头的成语接龙游戏 日期:2018-10-30 12:22 人气: 次 来源:未知 → 为所欲为 → 为富不仁 → 仁者能仁 → 仁同一视 → 视同路人 → 人无远虑 → 虑周藻密 ...

  9. 单机版成语接龙游戏(Appinventor练习)

    用Appinventor开发一个简单的单机版成语接龙游戏 功能介绍: 1.在欢迎界面,点击"进入游戏",进入游戏界面: 2.在欢迎界面,点击"退出",出现提示框 ...

最新文章

  1. CV03-双线性差值pytorch实现
  2. Vue2.x开发饿了么项目(header部分)
  3. Python学习:列表
  4. 10月12日云栖精选夜读:【直击2017杭州·云栖大会】TECH INSIGHT企业迁云实战专场...
  5. 免费Linux系统和生信宝典原创学习教程
  6. require.js使用(一)
  7. linux uvc stm32,linux uvc深入理解(三)
  8. WCF 第五章 导出并发布元数据(服务行为)
  9. 百度突然发公告:将停止这个服务!
  10. linux:如何修改用户的密码
  11. 【疲劳检测】基于matlab行为特征疲劳驾驶检测【含Matlab源码 944期】
  12. 计算机地图制图的优点,计算机地图制图实习报告.doc
  13. 什么是政微助手?政微助手是干什么用的?
  14. 一篇文章带你深入理解漏洞之 XXE 漏洞
  15. 使用Linux还原存储在群晖中的数据
  16. 电容的等效串联电阻 ESR
  17. Oracle 整理知识点
  18. 谈谈我的副业打造星球
  19. C语言练习——单词本管理
  20. Android 10 手势导航源码分析

热门文章

  1. Spring Security 框架详解
  2. 【FAQ】【HarmonyOS】鸿蒙java开发关于蓝牙通信api的传输数据大小设置
  3. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.9 逆光拍摄透明体
  4. CSS中vertical-align不起作用
  5. Vue脚手架html2canvas生成图片
  6. PTA菜鸡刷题日记(6-10)
  7. Vue学习 第一阶段
  8. 清除浏览器操作—JavaWeb网页刷新
  9. 机器人关节角qq评估关节角速度qv---高增益观测器
  10. python基础语法条件判断基础题训练