Windows应用程序设计作业(Python版实现)

作业5-综合作业

要求:在作业3的基础上,每个方块随机设置偏旁部首或简单汉字。方块下落停止后,改变俄罗斯方块的消除规则。规则定义为:如果相邻的块能够构成一个汉字就消除这些块,合并为一个汉字;如果这些字能够组成一个成语、一句唐诗或宋词,就完全消除。数据文件不能存在本地,只能联网读取。
作业考察重点:访问网络文件,数据结构设计和存储数据,检索符合规则的数据。
参考网址:
1、汉字俄罗斯方块,你能过几关?https://zhuanlan.zhihu.com/p/120710579
2、简体拆字库,https://github.com/fighting41love/funNLP/blob/master/data/%E6%8B%86%E5%AD%97%E8%AF%8D%E5%BA%93/chaizi-jt.txt
3、成语词库,https://github.com/fighting41love/funNLP/blob/master/data/%E6%88%90%E8%AF%AD%E8%AF%8D%E5%BA%93/ChengYu_Corpus%EF%BC%885W%EF%BC%89.txt
4、诗词短句词库,https://github.com/fighting41love/funNLP/blob/master/data/%E8%AF%97%E8%AF%8D%E7%9F%AD%E5%8F%A5%E8%AF%8D%E5%BA%93/THUOCL_poem.txt

已实现:
版本一:汉字 -> 成语消去版(将可以组成成语的相邻汉字消去)
版本二:偏旁部首 -> 汉字消去不显示或消去后显示在画布中
版本三:先偏旁部首 -> 汉字,再由汉字 -> 成语 (先将可以构成汉字的偏旁部首消去,将组成的汉字显示在画布中,然后汉字相邻位置若有能组成成语的,则进行消去、加分操作




下面的这张是成语消去时的照片,和上面三张不是一次执行过程测试的,目的是为了显示右侧中会显示下一个文字或偏旁部首~

第三版本的部分代码
(一)board_operation.py

from tetris_initialize import Status
from tetris_shape import Tetris_shape
import randomclass Board_op:def __init__(self, tetris, nw_canvas, option = False):  self.tetris = tetrisself.nw_canvas = nw_canvasself.R, self.C, self.cell_size = tetris.R, tetris.C, tetris.cell_sizeself.height, self.width = tetris.R * tetris.cell_size, tetris.C * tetris.cell_sizeself.screenwidth, self.screenheight = tetris.win.winfo_screenwidth(), tetris.win.winfo_screenheight() self.opt = option                def draw_cell_by_cr(self, canvas, c, r, color="lightgray"):x0, y0 = c * self.cell_size, r * self.cell_size  x1, y1 = c * self.cell_size  + self.cell_size, r * self.cell_size + self.cell_size      canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = "white", width = 2)     def draw_cell_by_cr_word(self, canvas, c, r, word, color="lightgray"):x0, y0 = c * self.cell_size, r * self.cell_size  x1, y1 = c * self.cell_size  + self.cell_size, r * self.cell_size + self.cell_size      canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = "white", width = 2)     canvas.create_text((x0 + 15, y0 + 15), text = word, font = ('华文新魏', 20, 'bold'), fill = 'black')def draw_cells(self, canvas, c, r, cell_list, color = "lightgray", show = False):for cell in cell_list:cell_c, cell_r = cellci, ri = cell_c + c, cell_r + rif 0 <= c < self.C and 0 <= r < self.R :              self.draw_cell_by_cr(canvas, ci, ri, color)if show is True:self.draw_cell_by_cr(canvas, ci, ri, color) def draw_board(self, canvas, inner = False):for ri in range(self.R):for ci in range(self.C):word_type = Status.block_list[ri][ci]    if not self.opt:      if word_type:self.draw_cell_by_cr(canvas, ci, ri,Tetris_shape.SHAPESCOLOR[word_type])else:self.draw_cell_by_cr(canvas, ci, ri)else:if word_type:self.draw_cell_by_cr_word(canvas, ci, ri, word_type, Status.radical_color[ri][ci])else:self.draw_cell_by_cr_word(canvas, ci, ri, '')  if inner:for ri in range(4, 8):for ci in range(13, 17):self.draw_cell_by_cr_word(canvas, ci, ri, '',color = "white")   self.draw_cell_by_cr(canvas, ci, ri, color = "white")       else:for ri in range(3, 9):for ci in range(12, 18):self.draw_cell_by_cr_word(canvas, ci, ri, '',color = "white")     self.draw_cell_by_cr(canvas, ci, ri, color = "white")

(二)tetris_operation.py

from tetris_initialize import Status
from tetris_shape import Tetris_shape
from board_operation import Board_op
import tkinter.messagebox
import tkinter as tk
import pyautogui
import randomclass Tetris_op:def __init__(self, tetris, nw_canvas, board_op):self.tetris = tetrisself.nw_canvas = nw_canvasself.board_op = board_opself.R, self.C, self.cell_size = tetris.R, tetris.C, tetris.cell_sizeself.height, self.width = tetris.R * tetris.cell_size, tetris.C * tetris.cell_sizeself.screenwidth, self.screenheight = tetris.win.winfo_screenwidth(), tetris.win.winfo_screenheight() def draw_block_move(self, canvas, block, direction = [0, 0]):shape_type = block['kind']          cell_list = block['cell_list']      c, r = block['cr']                    self.board_op.draw_cells(canvas, c, r, cell_list)    dc, dr = direction                new_c, new_r = c + dc, r + dr       block['cr'] = [new_c, new_r]       self.board_op.draw_cells(canvas, new_c, new_r, cell_list, Tetris_shape.SHAPESCOLOR[shape_type])    def generate_new_block(self):       cr = [self.C//2, 0]   new_block = {'kind': Status.next_block['kind'],                        'cell_list': Status.next_block['cell_list'],        'cr': cr                               }if Status.flag_clear is True:pre_shape_type = Status.next_block['kind']pre_cell_list = Status.next_block['cell_list']pre_c, pre_r = Status.next_block['cr']for cell in pre_cell_list:cell_c, cell_r = cellci = cell_c + pre_cri = cell_r + pre_rx0 = ci * self.cell_size                   y0 = ri * self.cell_size  x1 = ci * self.cell_size  + self.cell_size y1 = ri * self.cell_size + self.cell_sizeself.nw_canvas.create_rectangle(x0, y0, x1, y1, fill = "white", outline = "white", width = 2) Status.flag_clear = FalseStatus.next_block = self.generate_next_block()self.draw_next_block(self.nw_canvas, Status.next_block, Status.next_block_pre)return new_blockdef generate_next_block(self):kind = random.choice(list(Tetris_shape.SHAPES.keys()))next_cr = [15, 6]next_tetris_block = {'kind': kind,'cell_list': Tetris_shape.SHAPES[kind],'cr': next_cr}return next_tetris_blockdef draw_next_block(self, canvas, block, block_pre):shape_type = block['kind']                cell_list = block['cell_list']            c, r = block['cr']    for cell in cell_list:cell_c, cell_r = cellci = cell_c + cri = cell_r + rx0 = ci * self.cell_size                  y0 = ri * self.cell_size  x1 = ci * self.cell_size  + self.cell_size y1 = ri * self.cell_size + self.cell_sizecanvas.create_rectangle(x0, y0, x1, y1, fill = Tetris_shape.SHAPESCOLOR[shape_type], outline = "white", width = 2) def check_move(self, block, direction=[0, 0]):cc, cr = block['cr']cell_list = block['cell_list']for cell in cell_list:cell_c, cell_r = cellc = cell_c + cc + direction[0]r = cell_r + cr + direction[1]if c < 0 or c >= self.C or r >= self.R:return Falseif r >= 0 and Status.block_list[r][c]:return Falsereturn Truedef save_block_to_list(self, block):shape_type = block['kind']cell_list = block['cell_list']cc, cr = block['cr']for cell in cell_list:cell_c, cell_r = cellc = cell_c + ccr = cell_r + crStatus.block_list[r][c] = shape_typedef check_and_clear(self):has_complete_row = Falsefor ri in range(len(Status.block_list)):jd_complete_row = Truefor ci in Status.block_list[ri]:if ci == '':jd_complete_row = Falseif jd_complete_row:has_complete_row = Trueif ri > 0:for cur_ri in range(ri, 0, -1):Status.block_list[cur_ri] = Status.block_list[cur_ri - 1][:]Status.block_list[0] = ['' for j in range(self.C)]else: Status.block_list[ri] = ['' for j in range(self.C)]Status.score += 10 if has_complete_row:self.board_op.draw_board(self.nw_canvas, True)self.nw_canvas.delete('SCORE')score_str = str(Status.score)self.nw_canvas.create_text((15 * self.cell_size, 3 * (self.height / 4) ), text = score_str, font = ('Helvetica', 80, 'bold'), fill = 'DarkCyan', tag = 'SCORE')  def game_loop(self):if Status.mouse_click == 1:x, y = (self.screenwidth - self.width)/2 + 100 , (self.screenheight - self.height)/2 + 100pyautogui.moveTo(x, y)        pyautogui.click()             Status.mouse_click += 1Status.next_block_pre = self.generate_next_block()   Status.next_block = Status.next_block_preif Status.current_block is None:Status.new_block = self.generate_new_block()self.draw_block_move(self.nw_canvas, Status.new_block)    Status.current_block = Status.new_blockif not self.check_move(Status.current_block, [0, 0]):tk.messagebox.showinfo("Game Over!","Your Score is %s " % Status.score)self.tetris.win.destroy()                     return                       else:if self.check_move(Status.current_block, [0, 1]):              self.draw_block_move(self.nw_canvas, Status.current_block, [0, 1]) else:     self.save_block_to_list(Status.current_block)          Status.flag_clear = True                                Status.current_block = None                               self.check_and_clear()                                         self.tetris.win.after(Status.FPS, self.game_loop)

(三)main.py

from tetris_initialize import Tetris_init
from tetris_initialize import Status
from tetris_bg_show import Background_show
from idiom_data import Idiom_data
from word_data import Word_data
from PIL import ImageTk,Image
import tkinter as tkf1 = open('0_test_data_idiom6.txt','r', encoding = 'utf-8-sig')
f2 = open('0_test_data_word21.txt','r', encoding = 'utf-8-sig')
iid_data = Idiom_data(f1, Status.word_list_shuffle, Status.idiom_dictionary)
wid_data = Word_data(f2, Status.radical_list_shuffle, Status.word_dictionary)
iid_data.get_idiom_data()
wid_data.get_shape_change_rule()
win = tk.Tk()
tetris = Tetris_init(win, 20, 12, 30, 400)   # R,C,cell_size,FPS
img = ImageTk.PhotoImage(Image.open(r'F:\2020_C#_assignments\background.gif'))
bk_canvas = Background_show(win, tetris, img)
bk_canvas.BK_canvas()
win.mainloop()

(四)word_data.py

from tetris_initialize import Status
from tetris_shape import Tetris_shape
from idiom_data import Idiom_data
import string
import randomclass Word_data:def __init__(self, f, list_shuffle, dictionary):self.f = fself.list_shuffle = list_shuffleself.dictionary = dictionaryself.new_five_blocks = {}def get_word_data(self):lines = self.f.readlines()            for i in range(0, lines.__len__(), 1):     word = []                         word_list = []     for wi in lines[i].split():wi = wi.strip(string.whitespace)word.append(wi)word_cut = word[1:]for wci in word_cut:self.list_shuffle.append(wci)word_cut.sort()self.dictionary[str(word_cut)] = word[0]random.shuffle(self.list_shuffle)def get_rorate_list(self, cell_list, key):for i in range(4):new_rorate_list = []for cell in cell_list:cell_c, cell_r = cellrorate_cell = (cell_r, -cell_c)new_rorate_list.append(rorate_cell)new_rorate_list.sort()k_cnt = i + 1self.new_five_blocks[key + str(k_cnt)] = new_rorate_listrorate_list = new_rorate_list

那写看似毫无波澜的日复一日,会在某一天 让你突然发现努力的意义。
无悔昨天 & 感谢今天 & 喜欢明天~

一以贯之的努力,不得懈怠的人生。每天的微小积累,会决定最终的结果,这 就是答案!

2020-11-08 Windows应用程序设计作业(Python版实现)(五)综合作业 - 汉字版俄罗斯方块+2048相关推荐

  1. 计算机综合基础作业,《计算机网络基础》综合作业(参考答案).doc

    <计算机网络基础>综合作业(参考答案) 1.不属于星型结构网络的优点是(). A.中心设备的性能是网络的关键 B.易添加新站点 C.易检测排查网络故障 D.单点故障,引发全局网络瘫痪 参考 ...

  2. 计算机程序设计python的作业_2020高校邦《百度凤巢沙盒系统营销实践》单元测试答案2020中国大学《计算机程序设计(Python)》作业题库...

    [单选] 机场情报室的航行通告栏应展示:(). [单选] 各地在向总局上报机场资料时,必须上报机场15千米和50千米范围内的主要障碍物,15千米或50千米是以()为中心. [单选] 在提供原始资料的分 ...

  3. python 课后作业_python 学习笔记 五 课后作业

    # # 1.有如下变量(tu是个元组),请实现要求的功能 # tu = ('alex',[11,22,{'k1':'v1','k2':['age','name'],'k3':(11,22,33)},4 ...

  4. python学习第五天作业

    作业1:有一堆硬币,每次只能拿一个或者两个,求最少多少次可以拿完硬币[10, 8, 5, 3, 27, 99] 代码: 或: 或: 结果: 作业2:如果两个素数之差为2,这样的两个素数就叫作" ...

  5. 数据结构与算法Python版-第五周作业

    1. 进制转换(10分) 题目内容: 给定一个M进制的数,请将其转换为N进制并输出 输入格式: 两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N:其中M, N均满足2 ≤ M.N ≤ 36 ...

  6. 生物医药实验室安全知识202203第五次作业答案(2022.11.11)

    生物医药实验室安全知识202203第五次作业答案(2022.11.11) 2022年11月 生物医药实验室安全知识202203第五次作业答案(2022.11.11)

  7. 2020-11-08 Windows应用程序设计作业(Python版实现)(一)简单语法

    Windows应用程序设计作业(Python版实现) 作业1-语法 1.任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编 ...

  8. 2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答

    2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答 简介 赛题构成 代码提交说明 成绩评定 2020真题 1-1 数字与相邻的前.后数字之和可以被4整除 题目 个人对 ...

  9. python代写学生作业_CS1026A留学生作业代做、代写Python实验作业、代做Python程序设计作业、代写Computer Organization作业...

    CS1026A留学生作业代做.代写Python实验作业.代做Python程序设计作业.代写Computer Organization作业 日期:2019-05-31 11:23 University ...

最新文章

  1. 操作系统原理第五章:CPU调度
  2. canal mysql多实例_canal搭建实例
  3. Python学习笔记:面向对象编程(3)
  4. 在天气预报中应用机器学习
  5. 程序员最痛苦的事,就是程序出错;程序员最最痛苦的事,就是程序出错了还没有错误信息!--IIS Service Unavailable 问题如何解决...
  6. [蓝桥杯][历届试题]网络寻路-dfs,图的遍历
  7. 【中文分词】隐马尔可夫模型HMM
  8. android auto note 8,三星Galaxy Note 8.0支持flash吗
  9. WPF 基础到企业应用系列2——WPF前世今生
  10. 用74ls90组成二十四进制计数器_尘埃粒子计数器的工作原理和应用分析
  11. 计算机专业—毕业设计题目大全
  12. 英语单词记忆 词源法-思维导图(18)词源st/sist/stat/stin/stem-277
  13. (亚马逊澳大利亚)手机充电器 AS/NZS 4417.1 安全标准检测 电池产品UL2054
  14. 2023年深圳技能大赛——大鹏新区潮式风味菜烹饪职业技能竞赛
  15. 神经系统图 基本结构图,神经系统的组织结构图
  16. AST实战技巧|使用v神插件动态替换AST还原后的代码
  17. 自动添加芝麻代理白名单的方法
  18. 基于微信小程序的驾校报名管理系统
  19. python_d03
  20. 计算机网络技术专业职业生涯发展路径

热门文章

  1. iOS仿微信相册界面翻转过渡动画
  2. [笔记]松散四叉树,BVH,BSP,KD树的特性以及适用情况
  3. Tomcat实现java与http_java – 使用嵌入式tomcat服务器的JUnit测试,如何为http和https连接器指定自动端口?...
  4. 手机端上线,破解高架区域偏航检测难题,高德提出工业级轻量模型ERNet
  5. 家长对奥数产生的3个误解,你中招了吗?
  6. 使用moment格式化日期(时间戳转格式)
  7. 京东iphone8的异步加载爬取评论
  8. 中式红木整装定制——非凡韵味
  9. Vue项目的记录(一)
  10. 这几款好用的电脑软件推荐给你