Flask開(kāi)發(fā)成語(yǔ)接龍游戲,閑來(lái)無(wú)事手機(jī)玩玩自己寫的游戲吧!

      網(wǎng)友投稿 816 2022-05-29

      明天你好,我叫干不倒

      一直比較喜歡看《歡樂(lè)喜劇人》,其中有一期小沈龍的節(jié)目,名字叫明天你好,我叫干不倒…

      父親的身體一直不好,因?yàn)槌D甑男锞瞥闊煟寄X梗好些年頭了,周末病情有些惡化,住院治療了。我是家中獨(dú)子,父母生病只能靠我來(lái)照看,但I(xiàn)T這行請(qǐng)假尤其長(zhǎng)假簡(jiǎn)直奢望,但母親一個(gè)人忙不過(guò)來(lái),讓我有些不知如何是好。希望老爸的病情能有所好轉(zhuǎn),早日康復(fù)吧。

      英語(yǔ)單詞學(xué)習(xí)應(yīng)用

      周五發(fā)布的文章Flask開(kāi)發(fā)天氣查詢軟件,帶你掌握pipenv的使用與手機(jī)Termux下的部署發(fā)布后,看到喜歡的人比較多。本來(lái)周末打算照著扇貝/極光單詞,寫一個(gè)英語(yǔ)單詞自測(cè)工具。但苦于單詞的分類和數(shù)據(jù)沒(méi)找到很細(xì)致的文檔,所以這個(gè)內(nèi)容往后延一下。

      如果大家有英語(yǔ)單詞、音標(biāo)、翻譯這種根據(jù)不同年級(jí)或等級(jí)分類的數(shù)據(jù)可以共享給我,開(kāi)發(fā)完成大家一起學(xué)習(xí)背單詞。

      成語(yǔ)接龍

      6月高考的前一天,我發(fā)布的一篇文章,決戰(zhàn)高考,幫你秒變成語(yǔ)之王,當(dāng)時(shí)只是吧網(wǎng)站的成語(yǔ)爬下來(lái)保存到數(shù)據(jù)庫(kù)中,文末提到有機(jī)會(huì)了抽時(shí)間拿這些數(shù)據(jù)搞點(diǎn)事情,那么今天就來(lái)搞事情吧。用3W+的成語(yǔ)數(shù)據(jù)庫(kù),開(kāi)發(fā)一款成語(yǔ)接龍的小游戲。

      接龍規(guī)則

      成語(yǔ)接龍是中華民族傳統(tǒng)的文字游戲。它不僅有著悠久的歷史和廣泛的社會(huì)基礎(chǔ),同時(shí)還是體現(xiàn)我國(guó)文字、文化、文明的一個(gè)縮影,是老少皆宜的民間文化娛樂(lè)活動(dòng)。

      成語(yǔ)接龍規(guī)則多樣,大家一般熟知的是采用成語(yǔ)字頭與字尾相連不斷延伸的方法進(jìn)行接龍;用四個(gè)字成語(yǔ)的最后一個(gè)字與下一句成語(yǔ)的第一個(gè)相同的字【音同就可以】,首尾相接不斷延伸,形成長(zhǎng)龍。

      實(shí)現(xiàn)分析

      數(shù)據(jù)庫(kù)信息

      先來(lái)看看我們的數(shù)據(jù)庫(kù)信息:

      數(shù)據(jù)庫(kù)表idiom分為id,name,speak,meaning,example,hot 幾個(gè)字段,hot是當(dāng)時(shí)搜索的網(wǎng)站熱詞排行,跟咱們沒(méi)有太大關(guān)系…主要是name和speak字段。

      登陸排行

      為了能增強(qiáng)可玩性,我們?cè)诿看伍_(kāi)場(chǎng)前,允許用戶隨機(jī)輸入一個(gè)名字。在挑戰(zhàn)過(guò)程中,針對(duì)用戶堅(jiān)持的接龍次數(shù)進(jìn)行排名。

      創(chuàng)建用戶排名表:

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

      這里為什么不設(shè)置主鍵呢?

      游戲界面

      首先映入眼簾的是ROUND 1的接龍次數(shù)顯示,有沒(méi)有兒時(shí)拳皇對(duì)打的感覺(jué)…

      為了幫助大家在玩游戲的同時(shí)能學(xué)習(xí)成語(yǔ)知識(shí),也避免有些生僻字不認(rèn)識(shí),所以在界面中顯示了成語(yǔ)、注音、解釋和示例,當(dāng)然示例不是每個(gè)成語(yǔ)都有,網(wǎng)站有啥我就展示啥唄…

      成語(yǔ)判斷

      首先必須是四字的成語(yǔ),用戶輸入非四字的成語(yǔ)會(huì)彈出警示欄,其次用戶填寫完成語(yǔ)后,會(huì)將成語(yǔ)在數(shù)據(jù)庫(kù)中進(jìn)行檢索,如果是成語(yǔ)則進(jìn)行接龍后返回電腦的匹配結(jié)果,進(jìn)行第二輪的基隆,如果數(shù)據(jù)庫(kù)中無(wú)此成語(yǔ)會(huì)彈出游戲結(jié)束的提示“挑戰(zhàn)結(jié)束:用戶輸入的成語(yǔ)是自己編的吧!”,返回登陸頁(yè),并將用戶的挑戰(zhàn)結(jié)果入庫(kù)rank表進(jìn)行排行。

      這里需要注意,成語(yǔ)接龍的收尾字可以不一樣但音必須相同,包括聲調(diào)哦!

      拼音識(shí)別

      Flask開(kāi)發(fā)成語(yǔ)接龍游戲,閑來(lái)無(wú)事手機(jī)玩玩自己寫的游戲吧!

      數(shù)據(jù)庫(kù)中的成語(yǔ)我們存在拼音了,但用戶輸入的是漢字,我們?nèi)绾芜M(jìn)行拼音轉(zhuǎn)化呢?這里需要使用到python的一個(gè)模塊pypinyin。針對(duì)這個(gè)模塊的使用,之前寫過(guò)一篇文章Python為文檔批量注音(生僻字歌詞為例),喜歡的朋友可以去看看。用法很簡(jiǎn)單,但我們需要做到和數(shù)據(jù)庫(kù)中相對(duì)應(yīng)才行。

      from?pypinyin?import?pinyin pinyin('唇槍舌劍') #?output: [['chún'],?['qiāng'],?['shé'],?['jiàn']] #?此處為一個(gè)嵌套列表,我們需要轉(zhuǎn)化為數(shù)據(jù)庫(kù)中的格式 '??'.join(map(lambda?x:?x[0],?pinyin('唇槍舌劍'))) #?output: 'chún??qiāng??shé??jiàn'

      代碼編寫

      Jinjia2模板

      大家看到不管是用戶登錄還是游戲界面,外框內(nèi)容基本一致,基于這種場(chǎng)景使用Jinjia2的模板繼承是個(gè)很不錯(cuò)的選擇:

      layout.html主要負(fù)責(zé)大體框架及相關(guān)css和js的引入工作

      login.html涉及到挑戰(zhàn)者排行和用戶名提交與頁(yè)面跳轉(zhuǎn)

      {%?extends?"layout.html"%} {%?block?contents?%} ???? ????????

      ????????????
      ????????????????選手姓名: ????????????
      ???????????? ????????
      ????
      ???? ????????火前留名 ????
      ????如果戰(zhàn)績(jī)足夠出色,你的名字也將出現(xiàn)在下方!
      ???? ???????? ???????? ????????????排名 ????????????挑戰(zhàn)者 ????????????對(duì)答次數(shù) ???????? ???????? ???????? ????????{%?if?rank_list|length?%} ????????????{%?for?rank?in?rank_list?%} ???????????? ????????????????{{?loop.index?}} ????????????????{{rank.name}} ????????????????{{rank.round_num}} ???????????? ????????????{%?endfor?%} ????????{%?endif?%} ???????? ????
      {%?endblock?%}

      game.html主要負(fù)責(zé)成語(yǔ)接龍游戲的監(jiān)控與AJAX數(shù)據(jù)的后臺(tái)刷新。

      {%?extends?"layout.html"%} {%?block?contents?%} ????ROUND?1

      ???? ???????? ???????? ????????????成語(yǔ) ?????????????{{idiom.name}}?({{idiom.speak}}) ???????? ???????? ????????????解釋 ????????????{{idiom.meaning}} ???????? ???????? ????????????示例 ?????????????{{idiom.example}} ???????? ???????? ????
      ????
      ???????? ????????????成語(yǔ): ????????
      ???????? ???? ????用戶:{{user}}?作答 ????$(function?()?{ ????????$('#load').click(function?()?{ ????????????let?user_idiom?=?$('#user_idiom').val(); ????????????if?(user_idiom.length?!=?4)?{ ????????????????alert("請(qǐng)?zhí)顚懰淖殖烧Z(yǔ)..."); ????????????}?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']); ????????????????????????} ????????????????????} ????????????????}) ????????????} ????????}) ????}) {%?endblock?%}

      Flask裝飾器

      首先,我們的游戲涉及到SQLite數(shù)據(jù)庫(kù)的交互,所以在每次請(qǐng)求前,需要建立數(shù)據(jù)庫(kù),請(qǐng)求結(jié)束后需要釋放連接。此時(shí)我們需要使用到兩個(gè)裝飾器,@app.before_request和@app.teardown_request,before_request見(jiàn)名知意就是在請(qǐng)求訪問(wèn)前調(diào)動(dòng)該裝飾器,那么為什么不用對(duì)應(yīng)的@app.after_request呢?因?yàn)榧幢阌脩舸a在執(zhí)行過(guò)程中,出現(xiàn)任何錯(cuò)誤,也可以通過(guò)@app.teardown_request裝飾器最終釋放數(shù)據(jù)庫(kù)連接,但@app.after_request可不行…

      Flask整體代碼如下:

      import?sqlite3 from?flask?import?Flask,?render_template,?request,?g,?session,?redirect,?url_for,?jsonify import?random from?pypinyin?import?pinyin app?=?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']?=?user ????????session['round']?=?1 ????????return?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/') 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')?+?1 ????????print({'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':?"挑戰(zhàn)結(jié)束:用戶輸入的成語(yǔ)是自己編的吧!",?'url':?request.host_url})

      游戲演示

      說(shuō)了這么多,讓我們來(lái)開(kāi)一局:

      我們使用一個(gè)Neo的新用戶來(lái)進(jìn)行游戲,隨便接龍了幾次,然后我編了一個(gè)“蟬鳴鳥(niǎo)叫”的成語(yǔ)結(jié)束這次演示,不然好好答不來(lái)個(gè)幾百輪的那里能結(jié)束啊,哈哈…可以看到游戲結(jié)束后退回到首頁(yè),并進(jìn)行了挑戰(zhàn)排序。還好沒(méi)幾個(gè)號(hào),不然排不到前五都看不到效果了…

      手機(jī)搭建項(xiàng)目

      既然上一篇的天氣預(yù)報(bào)工程可以搭建到手機(jī),那么這篇成語(yǔ)接龍,也一樣來(lái)試試唄。

      代碼clone

      代碼我已經(jīng)上傳到了我的git倉(cāng)庫(kù),手機(jī)登陸Termux直接clone下載即可:

      git clone https://github.com/KingUranus/IdiomsGame.git

      pipenv導(dǎo)入

      進(jìn)入clone好的代碼路徑,之后輸入pipenv install創(chuàng)建虛擬環(huán)境并下載依賴的模塊

      鍵入pipenv shell 進(jìn)入虛擬環(huán)境

      通過(guò)flask run運(yùn)行我們的Flask app程序…

      The End

      今天的Flask項(xiàng)目開(kāi)發(fā)成語(yǔ)接龍游戲的文章,大家是否喜歡,如果覺(jué)得內(nèi)容對(duì)你有所幫助,歡迎點(diǎn)擊文章右下角的“在看”。

      項(xiàng)目代碼我都貼出來(lái)了,但是有些css和引用的js就沒(méi)往出貼。如果大家想搭建app玩玩,可以從git上下載代碼,或公眾號(hào)回復(fù)成語(yǔ)接龍,自動(dòng)獲取代碼的百度網(wǎng)盤地址。

      不知道父親之后幾天的住院治療情況如何,如果比較麻煩可能會(huì)斷更了,希望大家體諒….

      期待你關(guān)注我的公眾號(hào)清風(fēng)Python,如果你覺(jué)得不錯(cuò),希望能動(dòng)動(dòng)手指轉(zhuǎn)發(fā)給你身邊的朋友們。

      -------------

      游戲 Flask

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:UNIX 環(huán)境高級(jí)編程|文件和目錄
      下一篇:使用NPS自建內(nèi)網(wǎng)穿透服務(wù)器教程,帶WEB管理
      相關(guān)文章
      国产产在线精品亚洲AAVV| 亚洲AV无码成人精品区狼人影院| 国产精品亚洲AV三区| 伊人久久亚洲综合影院首页| 亚洲性无码av在线| 亚洲精品视频久久| 亚洲毛片无码专区亚洲乱| 亚洲黄色在线观看| 亚洲高清在线mv| 亚洲最新黄色网址| 亚洲国产精品专区| 亚洲乱码一二三四五六区| 亚洲av日韩av无码av| 亚洲人成图片网站| 亚洲综合欧美色五月俺也去| 亚洲欧美日韩综合俺去了| 亚洲熟妇无码av另类vr影视| 亚洲乱码日产精品一二三| 亚洲AV第一成肉网| 成人亚洲综合天堂| 亚洲午夜精品一级在线播放放| 亚洲熟伦熟女新五十路熟妇| 中文字幕第13亚洲另类| 亚洲桃色AV无码| 亚洲精品无码不卡在线播HE| 亚洲av永久无码精品秋霞电影影院| 亚洲AV无码专区亚洲AV伊甸园 | 亚洲AV无码片一区二区三区| 亚洲老熟女五十路老熟女bbw| 亚洲人成色99999在线观看| 亚洲成AV人片在WWW| 亚洲Av无码乱码在线观看性色| 中文字幕在亚洲第一在线| 亚洲欧洲精品无码AV| 久久久久久亚洲av成人无码国产| 久久久久亚洲AV片无码下载蜜桃| 亚洲成人网在线观看| 亚洲字幕AV一区二区三区四区| 久久久久亚洲AV无码去区首| 2022中文字字幕久亚洲| 亚洲av无码片在线播放|