Python代写-CSSE1001/CSSE7030
时间:2022-05-26
CSSE1001/CSSE7030
作业  3
截止日期:2022  年  6  月  3  日  18:00  GMT+10
2022  年第  1  学期
1  简介
2  提示和提示
1https://web.archive.org/web/20171112065310/http://effbot.org/tkinterbook  
2https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/index.html
迷宫赛跑者再次
‧  库存视图,显示在关卡视图的右侧,允许用户通过左键单击库存中的物品来应用收集的物品(硬币除外);和
除非另有规定,GUI  外观(例如颜色、字体等)的细微差别是可以接受的。除非另有说明,否则您只需要进行足够的错误处
理,以便
该作业分为本科生的两个任务,研究生任务的第三个任务。与每项任务相关的分数并不表示难度。任务  1  可能比任务  2  花
费更少的精力,但得分明显更高。任务  1  的功能齐全的尝试可能会比任务  1  和任务  2  的尝试获得更多的分数,而任务  1  和
任务  2  在整个过程中都有很多错误。同样,对任务  1  的单个部分进行全功能尝试可能会比在整个任务  1  中出现许多错误
的尝试获得更多的分数。您应该在整个编码过程中定期进行测试。手动测试您的  GUI  并定期上传到  Gradescope,以确保
您实现的组件通过  Gradescope  测试。至少在您通过任务  1  测试之前,您不应继续执行任务  2。
‧  使用彩色形状或图像在其上绘制图块和实体的级别视图;
1
与作业  2  中用户通过在提示符处输入文本来控制游戏相反,在作业  3  中,用户通过按键和鼠标点击来控制游戏。最终游戏
的示例如图  1  所示。
游戏视图最初包含  3  个组件:
您可以在  effbot1  上找到tkinter文档和新墨西哥  Tech2 .
‧  统计视图,显示玩家的统计数据,以及他们收集的硬币数量。
在作业  2  中,您使用基于文本的界面实现了  MazeRunner  游戏。此游戏中使用的  Apple  MVC  设计模式允许相当独立地
修改建模逻辑和视图类。在本作业中,您将使用更复杂的基于  tkinter  的图形用户界面  (GUI)  交换  MazeRunner  基于文
本的界面。
Machine Translated by Google
图  1:任务  2  结束时的示例全功能游戏。
您只能使用附录  A  中列出的库。不得导入不在此列表中的任何内容;这样做将导致扣减高达  100%  的分数。
2
常规游戏不会导致您的程序崩溃或错误。如果对某个功能的尝试导致您的程序崩溃或在没有您的标记修改您
的代码的情况下测试其他功能变得困难,请在提交作业之前将其注释掉。如果您的解决方案包含阻止其运行
的代码,您将收到  0  标记。
您可以在作业中使用任何课程提供的代码。这包括支持文件中的任何代码或仅用于本学期以前作业的示例解
决方案,以及课程工作人员提供给您的任何讲座或教程代码。但是,您有责任确保此代码具有适当的样式,并且
是解决您正在解决的问题的适当且正确的方法。
Machine Translated by Google
3  任务  1:基本游戏  ‑  10  分
玩家尝试向右移动一格。
玩家尝试向下移动一格。
事件
表  1:事件及其相应的行为。
某些事件应引起表  1  中的行为。
玩家尝试向左移动一格。
3
图  2:任务  1  结束时的游戏。
玩家尝试向上移动一格。
左键单击一个
如下图所示。
发明中的项目
它应该向上移动以填充空间。
无时无刻不在窗口。在此之下,三个组件应如第  1  节所述出现
按键:d
保守党
按键:s
这个任务你的游戏应该如图  2  所示。标题标签应该出现在
显示该项目应从视图中删除,以及下面的所有其他项目标签
任务  1  要求您实现  MazeRunner  的基于  GUI  的功能版本。在......的最后
按键:a
库存。如果清单中没有该项目的实例,则标签
单击的一种项目应应用于播放器并从
按键:w
行为
Machine Translated by Google
‧  获得中点(自我,位置:元组[int,int])‑>  元组[int,int]:
返回  (row,  col)  位置的边界框,格式为  (x  min,  y  min,  x  max,  y  max)。
3.1.1  模型类
a2  solution.py  和  a3  support.py  中提供了以下代码,供您在实施解决方案时使用。
‧  获取  bbox(self,  position:  tuple[int,  int])  ‑>  tuple[int,  int,  int,  int]:
将网格的尺寸设置为尺寸。
‧  设置维度(self,  dimensions:  tuple[int,  int])  ‑>  无:
以下小节概述了代码所需的结构。您将从并行编写这些类中受益,但您仍应在编写各个方法时对其进行测试。
size:  tuple[int,  int],  **kwargs)  ‑>  None:  在主框架中设置一个新
的  AbstractGrid。维度是初始行数和列数,大小是像素的宽度和像素的高度。  **kwargs  用于允许  AbstractGrid  支持  
tk.Canvas  支持的任何命名参数。
要完成此任务,您将需要实现各种视图类,以及扩展现有  MazeRunner  控制器类的图形控制器类。虽然完成任务  1  不是必需的,但如果
它们改进了您的解决方案,您可以添加其他建模类。
‧  init  (self,  master:  Union[tk.Tk,  tk.Frame],  维度:  tuple[int,  int],
消息框必须在  constants.py  中显示  WIN  MESSAGE  或  LOSS  MESSAGE  的文本。对于任务  1,消息框关闭后没有必要的行为;该程序
可以终止或保持打开状态。但是,您选择的任何行为都必须是合理的(即关闭消息框不应导致程序崩溃或显示错误)。
当玩家赢得或输掉游戏时,他们应该通过消息框被告知结果。
AbstractGrid  是一个抽象视图类,它继承自  tk.Canvas,并为多个视图类提供基本功能。  AbstractGrid  可以被认为是具有一定数
量的行和列的网格,它支持在特定(行、列)位置创建文本和形状。请注意,行数可能与列数不同,并且可能会在构建  AbstractGrid  后发
生变化。如果尺寸发生变化,单元格的大小将被更新以允许  AbstractGrid  保留其原始大小。  AbstractGrid  由以下接口组成:
4
获取给定  (row,  col)  位置的单元格中心的图形坐标。
在任务  1  中,图块由彩色矩形表示,实体由彩色圆圈表示。您还必须用它们的  id  注释实体的圆圈(如图  2  所示)。代表每个图块和实体
的颜色可以在  constants.py  中找到。您必须使用在  constants.py  中指定的颜色。
3.1.2  抽象网格
模型类应按照作业  2  定义。如果它们改进了代码,您可以添加更多建模类。您不得修改提供的模型类。
3.1  提供的代码
Machine Translated by Google
5‧  draw(self,  tiles:  list[list[Tile]],  items:  dict[tuple[int,  int],  Item],
您的程序应该适用于合理的地图大小。您不能假设行数总是等于列数。您必须使用  tk.Canvas  的创建椭圆、创建矩形和创建文本方法来
完成此任务。  LevelView  类应该被实例化为  LevelView(master,  dimensions,  size,  **kwargs),其中  **kwargs  应该像  
AbstractGrid  一样传递给超类。关卡(以及关卡视图)中显示的迷宫的宽度和高度在  constants.py  中给出。虽然建议在此类中创建自己
的辅助方法,但您需要创建的唯一方法是:
同样,在此类中创建自己的辅助方法可能会有所帮助。
LevelView  是一个视图类,它继承自  AbstractGrid  并显示迷宫(图块)以及实体。在地图上使用彩色矩形在其(行、列)位置绘制图块,并
在图块上使用带注释的彩色椭圆在其(行、列)位置绘制实体(如图  2  所示)。代表每个图块和实体的颜色可以在  constants.py  中找到。
你必须使用这些颜色。
‧  draw  coin(self,  num  coin:  int)  ‑>  None:绘制硬币的数量。
绘制玩家的统计数据(hp、饥饿、口渴)。
3.2.1  水平视图
您必须实现关卡地图、库存和玩家统计数据的视图类。因为关卡地图和玩家统计数据都可以用网格表示,所以您需要使用  AbstractGrid  
类来分解共享功能。本节概述了您需要编写的类和方法。虽然您不需要,但您可以添加其他方法或类,前提是它们可以改进您的解决方案。
‧  draw  stats(self,  player  stats:  tuple[int,  int,  int])  ‑>  无:
‧  init  (self,  master:  Union[tk.Tk,  tk.Frame],  width:  int,  **kwargs)  ‑>  None:在给定宽度的主框架中建立一个新的StatsView。  
StatsView  的高度可以在  constants.py  中找到。背景颜色应通过  **kwargs  从  constants.py  设置为  THEME  COLOR。
‧  clear(self)  ‑>  None:清除画布。
StatsView  是一个从  AbstractGrid  继承的视图类,并显示玩家的统计数据(HP、健康、口渴)以及收集的硬币数量(如图  2  所示)。  
StatsView  总是有四列和两行。第一行包含统计类型的标题,第二行包含该列中统计的值。您需要在此类中实现以下方法:
‧  annotate  position(self,  position:  tuple[int,  int],  text:  str)  ‑>  None:用提供的文本注释给定(row,  col)位置的单元
格。
3.2.2  统计视图
player  pos:  tuple[int,  int])  ‑>  None:  清除并重绘整个关卡
(迷宫和实体)。
3.2  查看类
Machine Translated by Google
‧  set  maze  dimensions(self,  dimensions:  tuple[int,  int])  ‑>  None:将关卡中迷宫的维度更新为
维度。
‧  clear  all(self)  ‑>  None:清除三个主要组件中的每一个(不要删除组件实例,只清除它们)。
‧  绘制项目(self,  name:  str,  num:  int,  colour:  str)  ‑>  None:
‧  clear(self)  ‑>  None:清除此InventoryView  中的所有子小部件。
在此界面的主框架中创建组件(级别视图、库存视图和统计视图)。维度表示当前关卡中迷宫的(行、列)维度。
设置单击项目时要调用的函数。提供的回调函数应该有一个参数;项目的字符串名称。
‧  创建接口(self,  dimensions:  tuple[int,  int])  ‑>  无:
注意:此方法不负责实例化三个主要组件,因为在实例化  GraphicalInterface  时您可能不知道迷宫的尺寸。
‧  设置点击回调(self,  callback:  Callable[[str],  None])  ‑>  None:
在  master  中创建一个新的  InventoryView。
‧  init  (self,  master:  tk.Tk)  ‑>  None:用主框架主创建一个新的GraphicalInterface。将窗口的标题设置为“MazeRunner”
并创建一个标题标签。
GraphicalInterface  继承自  UserInterface,必须实现  UserInterface  所描述的方法。  GraphicalInterface  管理整体视图(即
标题横幅和三个主要小部件),并启用事件处理。您必须实现以下方法:
‧  init  (self,  master:  Union[tk.Tk,  tk.Frame],  **kwargs)  ‑>  无:
6
3.2.4  图形界面
InventoryView  是一个从  tk.Frame  继承的视图类,并通过  tk.Labels  在标题标签下显示玩家在其库存中的物品。此类还提供了
一种机制,用户可以通过该机制应用项目。您必须在此类中实现以下方法:
将给定的命令绑定到一般按键事件。该命令应该是一个接收按键事件的函数,并根据按下的字符执行不同的操作。应忽略
除“w”、“a”、“s”或“d”以外的任何字符(包括所有大写字母)。
‧  bind  keypress(self,  command:  Callable[[tk.Event],  None])  ‑>  None:
3.2.3  库存视图
‧  draw  inventory(self,  inventory:  Inventory)  ‑>  None:如果已设置点击回调,则
绘制任何非硬币库存项目及其数量并为每个项目绑定回调。提示:遍历库存中的每个项目并为每个项目调用  draw  item  以
创建和绑定项目标签。
在  InventoryView  框架中创建并绑定(如果存在回调)单个  tk.Label。  name  是商品的名称,num  是当前用户库存中的
数量,color  是该商品标签的背景颜色(由商品类型决定)。
Machine Translated by Google
给玩家的名字。
‧  apply  item(self,  item  name:  str)  ‑>  None:尝试使用
‧  draw  level(self,  maze:  Maze,  items:  dict[tuple[int,  int],  Item],  player  position:  tuple[int,  
int])  ‑>  None:必须按照文档中的文档字符串实现draw  level方法用户界面类。
‧  draw  inventory(self,  inventory:  Inventory)  ‑>  None:必须按照
UserInterface  类中的文档字符串实现draw  inventory  方法。注意:此方法需要在库存视图上绘制非硬币项目(请
参阅公共绘制库存方法),并在统计视图上绘制硬币。
‧  处理按键(self,  e:  tk.Event)  ‑>  无:处理按键。如果按下的键是“w”、“a”、“s”或“d”之一,则尝试移动。如果
玩家通过这一举动赢得或输掉比赛,他们会通过消息框被告知他们的结果。
‑>  无:必须按照  UserInterface  类中的文档字符串实现  draw  方法。这应该只涉及清除三个主要组件并使用新状
态重新绘制它们(作为此方法的参数提供)。
MazeRunner  游戏,具有给定根小部件内的视图。
‧  init  (self,  game  file:  str,  root:  tk.Tk)  ‑>  None:  创建一个新的图形
‧  draw(self,  maze:  Maze,  items:  dict[tuple[int,  int],  Item],  player  position:  tuple[int,  int],  inventory:  
Inventory,  player  stats:  tuple[int,  int,  int])
‧  draw  inventory(self,  inventory:  Inventory)  ‑>  None:如果已设置点击回
调,则绘制任何非硬币库存项目及其数量并为每个项目绑定回调。
GraphicalMazeRunner  应该从  MazeRunner  继承并在需要时覆盖/添加方法,以使游戏能够使用  GraphicalInterface  
而不是  TextInterface,并基于用户生成的事件(按键和鼠标点击),而不是基于用户输入到外壳。特别是,您将需要实现
以下方法:
3.3.1  GraphicalMazeRunner
回调函数需要在控制器类中构建(参见第  3.3  节),并且必须接受一个参数(物品的字符串名称),并将物品栏中
该物品的第一个实例应用于播放器。然后,此函数应从玩家的库存中删除该项目。
将在库存视图中单击项目时要调用的函数设置为回调。
7
‧  play(self)  ‑>  None:调用以导致游戏发生。此方法应首先在  GraphicalInterface  上创建小部件,绑定按键处理
程序,设置库存回调,然后重绘以允许游戏开始。
‧  设置库存回调(self,  callback:  Callable[[str],  None])  ‑>  None:
必须根据  UserInterface  类中的文档字符串实现  draw  player  stats  方法。
‧  绘制球员统计数据(自我,球员统计数据:元组[int,  int,  int])‑>  无:
3.3  控制器类
Machine Translated by Google
3.4  玩游戏(root:  tk.Tk)  功能
4.1  图片
3.5  主要功能
正如任务  1  中的矩形和椭圆需要根据关卡迷宫的尺寸改变大小一样,在任务  2  中,图像必须适当调整大小。为此,
您需要安装  Pillow3
3  https://pillow.readthedocs.io/en/stable/installation.html
然后从  PIL  导入  ImageTk  和  Image。
主要功能应该:
3.  确保根窗口保持打开监听事件(使用主循环)。
创建一个新的视图类  ImageLevelView,它扩展了现有的  LevelView  类。这个类的行为应该类似于现有的  LevelView  类,除了应该使
用图像来显示图块和实体,而不是矩形和椭圆(请参阅提供的图像文件夹)。当您的作业在  constants.py  中的  TASK  常量设置为  2  的
情况下运行时,应该显示  ImageLevelView。当它在  constants.py  中的  TASK  常量设置为  1  的情况下运行时,应该显示来自任务  1  的
基本  LevelView。
2.  导致游戏开始。
范围。
作为一项高级任务,代码的结构很大程度上取决于您。但是,如果您完成此任务,您将被标记为您的代码设计得有多好。设计的某些方面
是强制性的(例如实现下面小节中描述的子类)。但是,没有规定这些类的方法和内部设计。在设计解决方案时,您应该考虑有效利用继
承结构以避免重复代码的方法。
任务  2  要求您添加额外的功能来增强游戏的外观和功能。图  1  给出了任务  2  结束时的游戏示例。另一个示例如下图  3  所示。  注意:您
的任务  1  功能必须仍然是可测试的。当你的程序在  constants.py  中的  TASK  常量设置为  1  的情况下运行时,游戏应该只显示任务  1  
的功能。当您的程序在  TASK  常量设置为  2  的情况下运行时,游戏应该显示所有尝试的任务  2  功能。在任务  1  模式下运行游戏时,不应
有任务  2  功能可见。
1.  使用  GAME  FILE  常量中的文件和根  tk.Tk  构造控制器实例
玩游戏功能应该是相当短的。你应该:
8
,
2.调用play  game函数传入新创建的root  tk.Tk实例。
1.  构造根  tk.Tk  实例。
4  任务  2:图像、按钮和文件菜单
Machine Translated by Google
‧  重新开始按钮:当点击此按钮时,当前游戏应该重新开始,即用户应该回到第一关的开始,他们的移动计数和统计应
该被重置,并且游戏计时器应该回到0。
添加一个继承自  tk.Frame  的新类  ControlsFrame,并显示两个按钮(重新启动和新游戏),以及当前游戏进行了多长
时间的计时器。  ControlsFrame  实例应显示在界面底部,就在  StatsView  下方。这个小部件上三个组件的详细信息如
下:
当前的比赛开始了。
‧  游戏计时器应显示自此以来经过的分钟数和秒数
图  3:任务  2  结束时的另一个全功能游戏示例。
9
‧  新游戏按钮:单击此按钮时,应出现一个  tk.TopLevel  窗口,提示用户输入新游戏文件的相对路径。如果用户输入了
一个有效的游戏文件,游戏应该使用这个游戏文件重新开始。如果他们输入了无效的游戏文件,则应通过消息框通
知他们该游戏文件无效。一旦用户确认了消息框,顶层窗口应该关闭并且用户不应该被自动重新提示。
添加带有表  2  中描述的选项的文件菜单。请注意,在  Windows  上,这将出现在窗口中,而在  Mac  上,它将出现在屏幕顶部。
在  Mac  上,文件菜单应该类似于图  4。确切的布局并不太重要(例如,您的菜单
4.3  文件菜单
4.2  控件框架
Machine Translated by Google
对于此任务,您将创建一个商店,用户可以在其中花费他们收集的硬币来购买物品,并通过  ControlsFrame  上的新按钮将
此商店集成到您的任务中。请注意,此按钮不应出现在您的任务  2  功能中。此外,您将扩展模型以添加一个项目,该项目将在
商店中独家提供,糖果。
提示用户输入文件的位置以从中加载游戏并加载该文件中描述的游戏。
提示用户保存文件的位置(使用您选择的适当方法)并保存所有必要的信息以复制
游戏的当前状态。
注意:仅当  TASK  常量设置为  3  时,才应存在此任务的功能。任务  1  或  2  模式中不应存在任何研究生功能。
行为
表  2:文件菜单选项。
保存游戏
药水  $2
蜂蜜  $2
选项
辞职
10
重启游戏
为了保存和加载文件,您必须设计适当的文件格式来存储有关游戏的信息。您可以使用您喜欢的任何格式,只要您不导入附
录  A  中未明确允许的任何内容,并且您的保存和加载功能可以协同工作。用户的合理操作(例如,尝试加载非游戏文件)应得
到适当处理(例如,通过弹出窗口通知用户出现问题)。
水  $1
图  4:Mac  上的示例文件菜单。
加载游戏
苹果  1  美元
使用四种商品及其价格创建一个基本的商店界面:
可能在顶部有一条虚线,或在显示上有其他细微差别),只要选项具有正确的文本和正确的功能。
通过消息框提示玩家询问他们是否确定要退出。如果没有,什么也不做。如果是,退出
游戏(窗口应该关闭并且程序应该终止)。
重新启动当前游戏,包括游戏计时器。
5  研究生任务:商店和商店专属物品
5.1  基础店铺
Machine Translated by Google
(a)  购买任何东西之前的基本店面。  (b)  购买两件商品后的基本店面。
11
图  5:基本商店。
店面还应该有一个“完成”按钮,点击它会关闭商店。界面应如图  5a  所示。注意:您不能创建多个  tk.Tk  实例。
左键单击物品的图像时,如果玩家买得起该物品(有足够的硬币),则应从玩家的硬币中减去价格,并将该物品的实例添
加到玩家的库存中。这方面的一个例子如图  5b  所示,它显示了图  5a  中的界面,在左键单击水和蜂蜜一次后立即显示。
对于此任务,您将扩展现有模型以添加玩家可以从商店购买的新项目。在此任务结束时,您的店面应该如图  6  所示。
您必须实现一个名为  Candy  的新  Food  子类。糖果应该在应用时将玩家的饥饿值恢复到  0,但也会减少  2  点生命值。将
糖果物品添加到商店前面,价格为  3  美元。
相反,您应该将店面设置为  tk.Toplevel。
5.2  糖果
Machine Translated by Google
1.  应用变量、选择、迭代和子程序等程序结构,
6.  应用测试和调试技术,以及
2.  应用基本的面向对象概念,例如类、实例和方法,
100
图  6:添加商店独家商品后的店面。
7.  设计和实现简单的图形用户界面。
3.阅读和分析别人写的代码,
您的总分将由功能标记和样式标记组成。本科生的功能分数为  75  分,研究生为  100  分。风格标记值其他  25  标记。您的
风格分数将使用以下公式作为您的功能分数的一部分获得:
12
4.  分析问题并设计问题的算法解决方案,
该作业评估课程学习目标:
本科生将有  100  个可用分数,研究生将有  125  个可用分数。这样;等级  =  20  ×
5.  阅读和分析设计并能够将设计转化为工作程序,并且
6  评估和评分标准
6.1  标记分解
Machine Translated by Google
确保可以识别您的应用程序的组件。如果自动评分器无法识别
13
10
游戏网格
功能标志
被标记,但如果您的代码中有错误导致解释器无法执行您的
10
10
25
3
您还需要对您的程序进行自己的测试,以确保它符合作业中给出的所有规范。仅依靠提供的测试可能会导致您的
任务  3
0
PyCharm)但不在  Python  3.10  解释器中,您将获得零功能标记。
2
10
窗口标题
75,否则
将玩游戏并尝试识别游戏的组件,然后测试这些组件在游戏过程中的功能。在提交之前,运行功能测试以
表  3:功能标记细分。
10
20
您的程序必须在  Python  解释器(IDLE  环境)中运行。部分解决方案将
与您通过的加权测试数量成正比。您将获得
控件
10
研究生
自动分级机。
任务  2
使用  Python  3.10  解释器运行。如果它在另一个环境中运行(例如  Python  3.9,或
3
0
解释器失败,注释掉代码,以便其余部分可以运行。你的程序必须
糖果
游戏结束事件
(100,如果研究生
您的作业将在游戏功能的功能上进行测试。自动化测试
全部的
30
任务1
10
本科  45
2,您的作业将通过一系列测试,您的功能标记将
15
在提交之前提供将帮助您确保所有组件都可以被
统计视图
文件菜单
10
组件,即使您的作业是有效的,您也不会获得分数。测试
基本店
最终样式标记  =  样式标记  ×
程序,您将获得零的功能标记。如果您的代码的一部分导致
100
45
2
在作业的截止日期之前进行功能测试。
在某些情况下程序失败并且您丢失了一些功能标记。
30
10  
0
20  
10  
10
75
表  3  概述了该作业的功能标记细分。如作业  1
存货
图片
特征
6.2  功能标识
Machine Translated by Google
6.3  样式标记
–  模型视图控制器:GUI  的视图和控制逻辑与模型明显分离。模型信息存储在控制器中,并在需要时
传递给视图。
‧  面向对象的程序结构
–  标识符名称:变量、常量、函数、类和方法名称清楚地描述了它们在程序逻辑中所代表的内容。不要
使用匈牙利表示法作为标识符。
包括使用空格来突出显示逻辑块。
结构(例如循环和条件语句)。
–  程序结构:代码布局使其更易于阅读和遵循其逻辑。这
–  控制结构:通过良好地使用控制,逻辑结构简单而清晰
任何需要多次使用的代码都应该实现为方法或函数。
‧  可读性
14
–  继承:子类扩展其超类的行为而不重新实现行为,或破坏超类的行为或设计。抽象类已被用于有效地
对子类之间的共享行为进行分组。
代码风格有几个方面有助于理解代码的容易程度。在本次作业中,您的代码风格将根据以下标准进行评估。
–  单一逻辑实例:代码块不应在您的程序中重复。
‧  代码设计
标记代码风格的关键考虑因素是代码是否易于理解。
方法只能直接访问调用它们的对象的状态。方法永远不会更新另一个对象的状态。
–  信息丰富的文档字符串:每个类、方法和函数都应该有一个总结其用途的文档字符串。这包括描述
参数和返回值,以便其他人可以理解如何正确使用方法或函数。
你的作业风格将由导师评估。样式标记将满分  25。
–  封装:类被设计为具有状态和行为的独立模块。
–  抽象:类的公共接口简单且可重用。启用抽象  GUI  细节的模块化和可重用组件。
–  内联注释:所有重要的代码块都应该有注释来解释逻辑是如何工作的。对于一个小的方法或函数,
通常应该从代码和文档字符串中清楚地看出逻辑。对于长的或复杂的方法或函数,每个逻辑块都
应该有一个描述其逻辑的内嵌注释。
‧  文档
Machine Translated by Google
7  作业提交
8  附录
所有延期申请必须在提交截止日期前至少  48  小时通过  UQ  渐进式评估延期申请表提交:https://my.uq.edu.au/
node/218/2。
不允许使用任何其他库(包括内置库),并将被扣分最多  100%  的作业  3  成绩。
1.  tkinter  及其任何子模块:您需要导入  tkinter  本身,以及它的一些子模块。例如,要使用消息框,您需要从  tkinter  
显式导入消息框子模块。如果您没有明确导入您正在使用的子模块,您的解决方案可能会在  IDLE  中运行,但在其
他任何地方都无法运行。
2.打字
逾期提交的作业将不被接受。在特殊情况下,您可以提交延期申请。
您将需要以下库来形成有效的解决方案:
您的作业必须通过成绩范围上的作业三提交链接作为  a3.py  提交。您不应提交任何其他文件(例如地图、图像等)。
您无需重新提交  a2  solution.py  或任何其他提供的文件。
1.  数学
如果您愿意,您可以导入以下库(但不需要它们来创建工作解决方案):
15
2.  PIL
8.1  附录  A:允许的库。
Machine Translated by Google
essay、essay代写