明天你好,我叫干不倒

一直比较喜欢看《欢乐喜剧人》,其中有一期小沈龙的节目,名字叫明天你好,我叫干不倒...
父亲的身体一直不好,因为常年的酗酒抽烟,患脑梗好些年头了,周末病情有些恶化,住院治疗了。我是家中独子,父母生病只能靠我来照看,但IT这行请假尤其长假简直奢望,但母亲一个人忙不过来,让我有些不知如何是好。希望老爸的病情能有所好转,早日康复吧。

英语单词学习应用

周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多。本来周末打算照着扇贝/极光单词,写一个英语单词自测工具。但苦于单词的分类和数据没找到很细致的文档,所以这个内容往后延一下。
如果大家有英语单词、音标、翻译这种根据不同年级或等级分类的数据可以共享给我,开发完成大家一起学习背单词。

成语接龙

6月高考的前一天,我发布的一篇文章,决战高考,帮你秒变成语之王,当时只是吧网站的成语爬下来保存到数据库中,文末提到有机会了抽时间拿这些数据搞点事情,那么今天就来搞事情吧。用3W+的成语数据库,开发一款成语接龙的小游戏。

接龙规则

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

实现分析
数据库信息

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

数据库信息

数据库表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的引入工作

<!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涉及到挑战者排行和用户名提交与页面跳转

{% extends "layout.html"%}{% block contents %}
<form method="post"><div class="form-group has-success"><div class="input-group"><div class="input-group-addon">选手姓名:</div><input id='name' name="name" class="form-control" required autofocus></div></div><div class="form-group "><button type="submit" class="form-control btn-primary" id="load">火前留名</button></div>
</form>
<div class="form-group "><span class="label label-info">如果战绩足够出色,你的名字也将出现在下方!</span>
</div>
<div class="form-group table_show"><table class="table table-hover  table-bordered"><thead><tr><th>排名</th><th>挑战者</th><th>对答次数</th></tr></thead><tbody>{% if rank_list|length %}{% for rank in rank_list %}<tr><th scope="row">{{ loop.index }}</th><td>{{rank.name}}</td><td>{{rank.round_num}}</td></tr>{% endfor %}{% endif %}</tbody></table>
</div>{% endblock %}

game.html主要负责成语接龙游戏的监控与AJAX数据的后台刷新。

{% extends "layout.html"%}{% block contents %}
<div class="form-group has-success"><h3 id='round_num' class="round_num">ROUND 1</h3>
</div><div class="form-group rank"><table class="table table-hover  table-bordered table_show table-condensed"><tbody><tr><th>成语</th><td id="idiom_name"> {{idiom.name}} ({{idiom.speak}})</td></tr><tr><th>解释</th><td id="idiom_meaning">{{idiom.meaning}}</td></tr><tr><th>示例</th><td id="idiom_example"> {{idiom.example}}</td></tr></tbody></table>
</div><div class="form-group has-success"><div class="input-group"><div class="input-group-addon" required autofocus>成语:</div><input id='user_idiom' class="form-control"></div></div>
<div class="form-group "><button class="form-control btn-primary" id="load">用户:{{user}} 作答</button>
</div>
<script type="text/javascript">$(function () {$('#load').click(function () {let user_idiom = $('#user_idiom').val();if (user_idiom.length != 4) {alert("请填写四字成语...");} else {$.ajax({url: '/more/' + user_idiom,type: 'get',success: function (data) {$('.result').html(data);if (data['code'] == 200) {$('#round_num').html('ROUND ' + data['round']);$('#idiom_name').html(data['info']['name'] + ' (' + data['info']['speak'] + ')');$('#idiom_meaning').html(data['info']['meaning']);$('#example').html('ROUND ' + data['info']['example']);} else {alert(data['error']);$(location).attr('href', data['url']);}}})}})})
</script>
{% endblock %}
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})
游戏演示

说了这么多,让我们来开一局:

游戏展示

我们使用一个Neo的新用户来进行游戏,随便接龙了几次,然后我编了一个 “蝉鸣鸟叫”的成语结束这次演示,不然好好答不来个几百轮的那里能结束啊,哈哈...可以看到游戏结束后退回到首页,并进行了挑战排序。还好没几个号,不然排不到前五都看不到效果了...

手机搭建项目

既然上一篇的天气预报工程可以搭建到手机,那么这篇成语接龙,也一样来试试呗。

代码clone

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

pipenv导入

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

image.png
image.png
image.png
The End

今天的Flask项目开发成语接龙游戏的文章,大家是否喜欢,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。
项目代码我都贴出来了,但是有些css和引用的js就没往出贴。如果大家想搭建app玩玩,可以从git上下载代码,或公众号回复成语接龙,自动获取代码的百度网盘地址。
不知道父亲之后几天的住院治疗情况如何,如果比较麻烦可能会断更了,希望大家体谅....
==期待你关注我的公众号清风Python,如果你觉得不错,希望能动动手指转发给你身边的朋友们。==

Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!相关推荐

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

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

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

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

  3. 微信公众平台开发—成语接龙

    因为申请的是个人未认证的订阅号,开启开发者模式以后没有菜单,只能使用接收消息-回复消息的方式来开发 一.实现思路 1.成语接龙题库 成语接龙的题库比24点的复杂一些,数量也很大,我建的表字段是:&qu ...

  4. 做web前端开发就是爽!不仅工资高而且没事还能写个游戏玩!真棒

    web前端程序员薪资高 web薪资 17000左右 就是好,可以随便玩游戏!!! 程序员是这样玩游戏的 GitHub经常有一些很有趣的项目,特别是一些小游戏,有的烧脑,有的沙雕,玩惯了商业化游戏,这些 ...

  5. linux小红帽自带游戏在哪里,安卓手机自带的隐藏游戏在哪 自带游戏位置介绍

    你知道安卓手机里都会自带一个小游戏吗?相信很多人都不知道吧,下面小编就告诉你自带小游戏入口位置介绍,一起来看看吧! 首先,我们需要进入手机的设置里面. 然后进入到系统选项卡,到"关于手机&q ...

  6. Android9自带的游戏怎么玩,[Android]手机也能玩电脑游戏,PC游戏模拟器ED302-9最新版及详细使用帮助 | 樱花庄...

    ED模拟器是一款在国内外非常的知名的一款专业的手机模拟pc的模拟器,有了这款app你的手机就能变成你的随身小电脑,但是目前来看只能用来游玩pc游戏但只能是2D,比如dnf这种就没有什么问题,可以和任何 ...

  7. inventor2五子棋游戏apk_联机五子棋手机版下载|联机五子棋游戏下载v1.3.2 安卓版_ 单机手游网...

    单机100手游网下载吧! 联机五子棋手游简介 是可以和好友实时对战的棋类游戏,界面简单清新,操作方便快捷,系统为你匹配棋力相当的对手. 联机五子棋手机版特色 1.五子棋大师增加滑动落子方式,小屏手机操 ...

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

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

  9. Html5 Egret游戏开发 成语大挑战(一)开篇

    最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...

最新文章

  1. python画三维立体图-python_matplotlib画三维图
  2. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
  3. kotlin sealed 中_7.8 Kotlin Sealed类
  4. Socket UDP无连接通信
  5. nginx重新编译添加ssl模块
  6. 使用go开启一个能够提供给html的a标签的下载的后端
  7. matlab故障识别,基于Matlab的电力系统故障分析与仿真(V2.1)最新版
  8. springboot controller访问不到_Spring Boot 开篇:快速入门
  9. 当Github上下载的代码需要安装作者写的库时
  10. python字符串split()函数
  11. Eclipse手动添加dtd文件使xml能自动提示
  12. 一文带你看透手机号码归属地
  13. rs485接口与计算机,电脑有USB接口就能连接RS485产品了
  14. 世嘉MD游戏开发【十四】:SRAM存档和读档
  15. 戴尔服务器密码忘记,进入PE清除密码
  16. gitlab: [remote rejected] pre-receive hook declined
  17. 【WIN】超简单的Excel密码破解
  18. Day20 网络编程
  19. 睁眼、耸肩、觉醒:人形机器人的吊诡与最终幻想
  20. H.266/VVC相关技术学习笔记16:VTM6.0中的CIIP技术(帧内帧间联合预测)

热门文章

  1. Android:RecyclerView滑动到边缘时的光晕效果
  2. 区块链的安全软肋都有什么
  3. zuul 详解,带视频
  4. 时间序列网络RNN,LSTM入门
  5. “穷苦乡村”小伙就得安于现状,2021必看
  6. DSP_TMS320F2802x_CMPSS逐波限流功能实现
  7. 2007-05-13
  8. 场内场外基金和开户避坑
  9. WPF_图画(二)Drawing抽象类
  10. XILINX K7 DDR3引脚验证总结