第七周作业

第七周作业

分组:李肖华,陆遥

一、理论学习

1、《软件工程》慕课学习

 2、讲义《设计与开发》学习

  设计与开发是将用户需求转换为产品、过程或体系的规定的特性或规范的一组过程。设计与开发简单来说就是要知道软件是怎么满足需求以及是否真的解决了这些需求。具体方法是先理解和抽象需求的本质,然后找到适合的模型,最后根据模型和解法解决问题。其中分析和设计的方法有许多,包括思维导图、实体关系图、用例图、形式化方法和文学化编程等。

3、UML行为建模

UNM建模是指绘制软件蓝图的标准化语言,是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。换句话说,就像建筑设计师需要为建筑公司设计蓝图一样,软件设计师也需要创建UML图帮助软件开发者开发软件。UML建模中总共有以下13种建模用图:用例图:从用户角度描述系统功能;类图:描述系统中类的静态结构;对象图:系统中的多个对象在某一时刻的状态;状态图:是描述状态到状态控制流,常用于动态特性建模;活动图:描述了业务实现用例的工作流程;顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互;协作图:描述对象之间的协助关系;构件图:一种特殊的UML图来描述系统的静态实现视图;部署图:定义系统中软硬件的物理体系结构;包图:对构成系统的模型元素进行分组整理的图;组合结构图:表示类或者构建内部结构的图;交互概览图:用活动图来表示多个交互之间的控制关系的图。

二、实践学习

  本周实践内容基本完成了游戏的整体框架,使得游戏具备了可玩性,并且利用UML工具基本确定了该软件的功能。实践部分采用石墨文档编辑,文档地址为:https://shimo.im/docs/w6YYc3qcXTxXqpqX 。代码仓库地址为:https://gitee.com/lixiaohua_03/joint_development_project/tree/master/ChinesePoetry,具体的实践内容如下:

(一)利用Tower进行项目进度安排以及任务分配,李肖华同学主要负责利用starUML软件制定软件基本功能,修复了计时功能以及游戏计次功能;陆遥同学完成游戏的输入答案功能、判断机制以及玩家对游戏时间和诗词库的选择功能。下周任务安排:李肖华同学主要负责对诗词数据库的整理和重次问题的结局,以及玩家登陆界面和玩家数据库的建立;陆遥同学主要负责程序中类和函数的封装,以及程序架构的进一步完善。项目地址为:https://tower.im/teams/864718/projects/133,相关截图如下所示:

(二)利用starUML软件绘制了出口成诗游戏的顺序图,类图和状态图,具体内容在随堂讨论8中:https://www.cnblogs.com/lxh0303/p/12624502.html

(三)根据上周画的用例图,完成了“出口成诗”游戏的基本框架,使其具备了可玩性,关于游戏的基本功能如下:

游戏初始界面:

游戏开始界面:用户可以选择游戏时间,以及不同难度的诗词数据库,后续将完善中小学不同年级的诗词库

游戏界面:界面汇总存在十二个关键词,计时器,进度条,以及换组和退出按钮。用户可点击任意按钮,输入答案,答案正确则相应关键词就会消失,在规定时间内关键词全部消失,则游戏取得胜利。


 

 游戏结束界面:游戏结束分为游戏胜利和游戏失败,游戏结束后会出现重新开始按钮,点击可重新开始游戏。

 完成诗词处理代码如下所示:

  1 # -*- coding: UTF-8 -*-
  2 # Author: Lu Yao and Li Xiaohua
  3 
  4 import json
  5 import random
  6 import time
  7 import tkinter as tk
  8 import tkinter.ttk as ttk
  9 import tkinter.messagebox
 10 from PIL import Image, ImageTk
 11 
 12 
 13 def open_db(json_file):
 14     text = open(json_file, "r", encoding="utf-8")
 15     poetry_dict = json.load(text)
 16     text.close()
 17     return poetry_dict
 18 
 19 
 20 def process_img(jpg_file):
 21     source_img = Image.open(jpg_file)
 22     real_img = ImageTk.PhotoImage(source_img)
 23     return real_img
 24 
 25 
 26 def countdown(seconds):
 27     t = seconds * 100 + 100
 28     time_lab = tk.Label(root, bg="white", fg="black", font=("微软雅黑", 14, "bold"), width=3, height=1,
 29                         relief="ridge", borderwidth=10)
 30     time_lab.place(x=440, y=150)
 31     for s in range(t, -1, -1):
 32         try:
 33             time_lab["text"] = s // 100
 34             root.update()
 35             time.sleep(0.01)
 36         except tk.TclError:
 37             break
 38         if s == 0:
 39             tk.messagebox.showinfo(message="时间到!游戏结束!")
 40 
 41 
 42 def show_btns():
 43     btn_1.place(x=0, y=0, width=105, height=60)
 44     btn_2.place(x=105, y=0, width=105, height=60)
 45     btn_3.place(x=210, y=0, width=105, height=60)
 46     btn_4.place(x=315, y=0, width=105, height=60)
 47     btn_5.place(x=0, y=60, width=105, height=60)
 48     btn_6.place(x=105, y=60, width=105, height=60)
 49     btn_7.place(x=210, y=60, width=105, height=60)
 50     btn_8.place(x=315, y=60, width=105, height=60)
 51     btn_9.place(x=0, y=120, width=105, height=60)
 52     btn_10.place(x=105, y=120, width=105, height=60)
 53     btn_11.place(x=210, y=120, width=105, height=60)
 54     btn_12.place(x=315, y=120, width=105, height=60)
 55 
 56 
 57 def set_game():
 58     global set_bg
 59     enter_btn.place_forget()
 60     start_bg.pack_forget()
 61     set_bg.pack()
 62     set_time.place(x=175, y=50)
 63     choose_db.place(x=175, y=110)
 64     start_btn.place(x=190, y=220)
 65 
 66 
 67 def identify_db():
 68     global db_file
 69     if db.get() == "诗词库":
 70         db_file = "poetry_database.json"
 71     return db_file
 72 
 73 
 74 def random_sel():
 75     global ans_1, ans_2, ans_3, ans_4, ans_5, ans_6, ans_7, ans_8, ans_9, ans_10, ans_11, ans_12
 76     record = []
 77     seconds = eval(set_time.get())
 78     json_file = identify_db()
 79     poetry_dict = open_db(json_file)
 80     set_time.place_forget()
 81     choose_db.place_forget()
 82     start_btn.place_forget()
 83     set_bg.pack_forget()
 84     change_btn.place(x=200, y=200)
 85     quit_btn.place(x=440, y=220)
 86     time_left.place(x=50, y=200)
 87     play_bg.pack()
 88     show_btns()
 89     for i in range(100):
 90         loc = random.randint(1, 100)
 91         if loc not in record:
 92             record.append(loc)
 93             line_count = poetry_dict[loc - 1]["line"]
 94             line_num = random.randint(1, line_count)
 95             if len(record) == 1:
 96                 kwd_1.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
 97                 ans_1 = poetry_dict[loc - 1]["text"][line_num - 1]
 98             elif len(record) == 2:
 99                 kwd_2.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
100                 ans_2 = poetry_dict[loc - 1]["text"][line_num - 1]
101             elif len(record) == 3:
102                 kwd_3.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
103                 ans_3 = poetry_dict[loc - 1]["text"][line_num - 1]
104             elif len(record) == 4:
105                 kwd_4.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
106                 ans_4 = poetry_dict[loc - 1]["text"][line_num - 1]
107             elif len(record) == 5:
108                 kwd_5.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
109                 ans_5 = poetry_dict[loc - 1]["text"][line_num - 1]
110             elif len(record) == 6:
111                 kwd_6.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
112                 ans_6 = poetry_dict[loc - 1]["text"][line_num - 1]
113             elif len(record) == 7:
114                 kwd_7.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
115                 ans_7 = poetry_dict[loc - 1]["text"][line_num - 1]
116             elif len(record) == 8:
117                 kwd_8.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
118                 ans_8 = poetry_dict[loc - 1]["text"][line_num - 1]
119             elif len(record) == 9:
120                 kwd_9.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
121                 ans_9 = poetry_dict[loc - 1]["text"][line_num - 1]
122             elif len(record) == 10:
123                 kwd_10.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
124                 ans_10 = poetry_dict[loc - 1]["text"][line_num - 1]
125             elif len(record) == 11:
126                 kwd_11.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
127                 ans_11 = poetry_dict[loc - 1]["text"][line_num - 1]
128             elif len(record) == 12:
129                 kwd_12.set(poetry_dict[loc - 1]["keyword"][line_num - 1])
130                 ans_12 = poetry_dict[loc - 1]["text"][line_num - 1]
131                 countdown(seconds)
132                 break
133         if loc in record:
134             continue
135 
136 
137 def answer_qu(btn_x, ans_x):
138     global ans_entry
139     global ans_window
140     ans_window = tk.Toplevel()
141     window_width = root.winfo_screenwidth()
142     window_height = root.winfo_screenheight()
143     w = int((window_width - 300) / 2)
144     h = int((window_height - 100) / 2)
145     ans_window.geometry("300x100+%s+%s" % (w, h))
146     ans_window.title("请输入答案")
147     ans_entry = tk.Entry(ans_window, font=("微软雅黑", 14))
148     ans_entry.pack(pady=10)
149     confirm_btn = tk.Button(ans_window, text="确认", command=lambda: judge_ans(btn_x, ans_x), font=("微软雅黑", 12))
150     confirm_btn.pack(anchor=tk.S, side=tk.LEFT, padx=40, pady=10)
151     clear_btn = tk.Button(ans_window, text="清除", command=clear_ans, font=("微软雅黑", 12))
152     clear_btn.pack(anchor=tk.S, side=tk.RIGHT,  padx=40, pady=10)
153 
154 
155 def judge_ans(btn_y, ans_y):
156     global right_count
157     if ans_entry.get() == ans_y:
158         tk.messagebox.showinfo(message="回答正确!")
159         ans_window.destroy()
160         btn_y.place_forget()
161         if right_count == 12:
162             change_btn["text"] = "重新开始"
163             tk.messagebox.showinfo(message="取得胜利!")
164             right_count = 0
165     else:
166         tk.messagebox.showerror(message="回答错误!")
167 
168 
169 def clear_ans():
170     ans_entry.delete(0, tk.END)
171 
172 
173 def close_window():
174     if tk.messagebox.askokcancel(message="您确定要退出吗?"):
175         root.destroy()
176 
177 
178 def quit_game():
179     if tk.messagebox.askokcancel(message="您确定要退出吗?"):
180         root.destroy()
181 
182 
183 root = tk.Tk()
184 root.title("出口成诗游戏")
185 root.geometry("550x300")
186 
187 right_count = 0
188 kwd_1 = tk.StringVar()
189 kwd_2 = tk.StringVar()
190 kwd_3 = tk.StringVar()
191 kwd_4 = tk.StringVar()
192 kwd_5 = tk.StringVar()
193 kwd_6 = tk.StringVar()
194 kwd_7 = tk.StringVar()
195 kwd_8 = tk.StringVar()
196 kwd_9 = tk.StringVar()
197 kwd_10 = tk.StringVar()
198 kwd_11 = tk.StringVar()
199 kwd_12 = tk.StringVar()
200 db = tk.StringVar()
201 
202 start_img = process_img("start.jpg")
203 start_bg = tk.Canvas(root, width=550, height=300)
204 start_bg.create_image(275, 150, image=start_img)
205 start_bg.pack()
206 start_bg.create_text(260, 120, font=("微软雅黑", 50, "bold"), fill="Snow", text="出 口 成 诗")
207 set_img = process_img("start.jpg")
208 set_bg = tk.Canvas(root, width=550, height=300)
209 set_bg.create_image(275, 150, image=set_img)
210 play_img = process_img("play.jpg")
211 play_bg = tk.Canvas(root, width=550, height=300)
212 play_bg.create_image(275, 150, image=play_img)
213 
214 choose_db = ttk.Combobox(root, font=("微软雅黑", 12), textvariable=db)
215 choose_db["value"] = ("请选择诗词库", "诗词库")
216 choose_db.current(0)
217 
218 style_A = ttk.Style()
219 style_A.theme_use("clam")
220 style_A.configure("yellow.Horizontal.TProgressbar", background="yellow")
221 style_B = ttk.Style()
222 style_B.theme_use("clam")
223 style_B.configure("red.Horizontal.TProgressbar", background="red")
224 style_C = ttk.Style()
225 style_C.theme_use("clam")
226 style_C.configure("green.Horizontal.TProgressbar", background="green")
227 time_left = ttk.Progressbar(root, mode="determinate", style="green.Horizontal.TProgressbar")
228 time_left["value"] = 1000
229 
230 set_time = tk.Spinbox(root, font=("微软雅黑", 12), from_=10, to=1000, increment=10)
231 
232 enter_btn = tk.Button(root, text="进入游戏", font=('微软雅黑', 14, "bold"), width=10, height=1, command=set_game,
233                       relief="raised", borderwidth=10)
234 enter_btn.place(x=190, y=220)
235 start_btn = tk.Button(root, text="开始游戏", font=('微软雅黑', 14, "bold"), width=10, height=1,
236                       command=random_sel, relief="raised", borderwidth=10)
237 quit_btn = tk.Button(root, text="退出", font=('微软雅黑', 14, "bold"), width=5, height=1, command=quit_game,
238                      relief="raised", borderwidth=10)
239 change_btn = tk.Button(root, text="换一组", font=('微软雅黑', 14, "bold"), width=8, height=1,
240                        command=random_sel, relief="raised", borderwidth=10)
241 
242 btn_1 = tk.Button(root, textvariable=kwd_1, bg="red", fg="white", font=("微软雅黑", 15, "bold"), relief="raised",
243                   borderwidth=10, command=lambda: answer_qu(btn_1, ans_1))
244 btn_2 = tk.Button(root, textvariable=kwd_2, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
245                   borderwidth=10, command=lambda: answer_qu(btn_2, ans_2))
246 btn_3 = tk.Button(root, textvariable=kwd_3, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
247                   borderwidth=10, command=lambda: answer_qu(btn_3, ans_3))
248 btn_4 = tk.Button(root, textvariable=kwd_4, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
249                   borderwidth=10, command=lambda: answer_qu(btn_4, ans_4))
250 btn_5 = tk.Button(root, textvariable=kwd_5, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
251                   borderwidth=10, command=lambda: answer_qu(btn_5, ans_5))
252 btn_6 = tk.Button(root, textvariable=kwd_6, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
253                   borderwidth=10, command=lambda: answer_qu(btn_6, ans_6))
254 btn_7 = tk.Button(root, textvariable=kwd_7, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
255                   borderwidth=10, command=lambda: answer_qu(btn_7, ans_7))
256 btn_8 = tk.Button(root, textvariable=kwd_8, bg="red", fg="white", font=("微软雅黑", 14, "bold"),
257                   relief="raised", borderwidth=10, command=lambda: answer_qu(btn_8, ans_8))
258 btn_9 = tk.Button(root, textvariable=kwd_9, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
259                   borderwidth=10, command=lambda: answer_qu(btn_9, ans_9))
260 btn_10 = tk.Button(root, textvariable=kwd_10, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
261                    borderwidth=10, command=lambda: answer_qu(btn_10, ans_10))
262 btn_11 = tk.Button(root, textvariable=kwd_11, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
263                    borderwidth=10, command=lambda: answer_qu(btn_11, ans_11))
264 btn_12 = tk.Button(root, textvariable=kwd_12, bg="red", fg="white", font=("微软雅黑", 14, "bold"), relief="raised",
265                    borderwidth=10, command=lambda: answer_qu(btn_12, ans_12))
266 
267 root.protocol('WM_DELETE_WINDOW', close_window)
268 root.mainloop()

总结:本周基本完成了游戏的整体框架,修改了游戏中出现的许多bug,使游戏具备了的可玩性,基本满足了“出口成诗”的游戏规则。通过本周的实践和理论学习,我们对UML建模的重新学习,以及对StarUML建模工具的熟练运用,让我们对软件开发的科学性有了更深的理解,双方协同的默契程度也有所提高。但是,出口成诗软件还有许多不完善的地方,需要在接下来的工作中进一步完成,开发出更多人性化的游戏功能

三、学习记录

学习阶段 学习内容 学习收获
2019.3.31 14:00-17:00 软件工程

对UML建模有了深入了解

2019.4.1 14:00-17:00 UML软件莫学习 了解UML建模工具
2019.4.3 08:00-11:00 课堂讨论 练习使用UML图
2019.4.4 09:00-17:00 讲义学习 了解了软件设计与开发过程
2019.4.5 09:00-2100  实践学习

编写出口成诗程序

 

 

 

 





 

posted @ 2020-04-05 20:58  不会飞的小笨鸟  阅读(257)  评论(0)    收藏  举报