当前课程知识点:Python 交互式程序设计导论 > 第7周 > 本周项目:决战三字经 > 程序说明
返回《Python 交互式程序设计导论》慕课在线视频课程列表
本项目我们将尝试用Python语言设计开发一个计算机程序来以游戏的形式让玩家熟悉《三字经》。程序的文件名称为ThreeCharacterPrimer.py。程序将使用到以下Python语言的功能特性:
(1)、Python保留词:
import、import...as、True、False、None、def、return、global、if/elif/else、and、or、class、for/in等。
(2)、导入的模块:
import simpleguitk as simplegui
import random
import copy
(3)、使用到的内置函数及模块中的函数:
print()、open()、close()、readlines()、split()、join()、random.randrange()
random.shuffle()、simplegui.create_frame()、simplegui.create_timer()、add_button()
add_label()、set_keydown_handler()、set_draw_handler()、get_canvas_textwidth()、
draw_text()、set_text()、draw_polygon()、copy.deepcopy()等。
(4)、使用到的数据结构:
集合(set)、列表(list)等
(5)、其它知识点和概念:
类和对象、事件驱动、全局变量、数学运算表达式、逻辑条件表达式、字符串运算表达式、自定义函数、代码格式、注释等Python语言的一些特性。
通过该项目你可以获得以下能力:
- 进一步理解计算机的工作原理
- 进一步熟悉事件驱动的程序设计方法
- 进一步理解面向对象的程序设计方法
- 熟练掌握利用simpleguitk模块开发小游戏的程序框架
- 掌握Python集合(set)、列表(list)数据结构的使用方法
- 掌握游戏逻辑到Python代码的转换过程
- 练习解决问题的步骤
基于simpleguitk模块的小游戏程序框架通常由全局变量的定义、辅助函数的定义、辅助类的定义、事件处理函数的定义、程序窗口的创建和初始化、事件处理函数的注册、游戏的启动等7部分组成。
本游戏程序的第一部分代码如下图:
has_rising_box = True # 是否有文字块正在上升
canvas_height = 600 # 画布高度,单位为像素
canvas_width = 480 # <布宽度,单位为像素
box_height = 30 # 文字块高度,单位为像素
box_width = 120 # 文字块宽度,单位为像素,包含3个汉字
rising_speed = -1 # 上升速度,单位为像素
horizontal_move_distance = box_width # 按左右箭头键时,水平移动的距离,单位为像素
game_over = False # 游戏是否结束
rising_box = None # 正在运动的文字块
stopped_box = set([]) # 停止移动的文字块集合
prime_sentence_list = [] # 三字经全文列表,每句为一个列表元素
current_section_list = [] # 当前处理的段落文字列表,每句为一个列表元素,4句为一个段落
last_four_box = [] # 最近的4个文字块对象列表
score = 0 # 游戏得分
图3 挑战《三字经》程序的全局变量定义部分
你可以直接使用这些变量,如果你认为不使用其中的某些变量同样可以实现游戏的功能,你可以删除多余的变量,当然,你也可以添加自己认为必须的其它变量。
由于画布的宽度为480个像素,而文字块的宽度为120个像素,因此一行正好可以容纳4个文字块,也就是《三字经》的一个段落。
我们定义画布的高度为600个像素,而文字块的高度为30个像素,因此画布可以容纳20行文字块,但是为了给玩家留出调整文字次序和方块位置的时间,我们最多允许文字块堆积到10行。
本游戏程序的第二部分为辅助函数的定义,我们将游戏程序中的各种辅助功能抽象为7个函数,每个函数的名称、参数及函数的主要功能描述如下图:
def read_from_file(filename): # 完成将磁盘文件中的三字经读入到列表中
def text_shuffle(text): # 随机打乱文字的次序
def draw_all_stopped_box(stopped_box,canvas): # 绘制所有静止文字块
def check_collision(group, moving_box): # 判断上升的文字块和所有静止文字块是否接触
def stop_box(group, moving_box): # 对发生接触或到达顶部的上升文字块进行处理并更新游戏得分
def generate_current_section_list(): # 生成一个段落四句诗歌列表
def draw_game_over_msg(canvas, msg): # 绘制游戏结束信息
图4 挑战《三字经》程序的辅助函数定义部分
你的任务之一就是完善以上7个函数的定义,你当然可以创建新的辅助函数,也可以合并以上函数,但必须考虑清楚你这样做的理由。
本游戏程序的第三部分为辅助类的定义,在该游戏中,我们只定义了1个类,类的名称为Box,用来表示《三字经》的文字块,Box类拥有一些属性和方法。
# Box类
class Box:
def __init__(self, pos, width, height, sentence, correct_sentence, order):
self.pos = [pos[0],pos[1]] # 文字块的位置,其实为矩形块左上角的坐标
self.width = width # 文字块的宽度,以像素为单位
self.height = height # 文字块的高度度,以像素为单位
self.sentence = sentence # 实际显示的文字,次序随机,按空格键可以改变次序
self.correct_sentence = correct_sentence # 次序正确的文字
self.rising = True # True表示该文字块为运动的文字块,False表示静止的快
self.processed = False # 发生接触或到达顶部是否已经处理并更新游戏得分
self.order = order # 文字块在一行中的正确位置,用0、1、2、3表示
self.proper_order = True # 实际位置是否处在正确位置
图5 挑战《三字经》程序的辅助类定义部分
你的任务之一就是完善Box类的定义,你当然可以创建新的属性和方法,也可以删除你认为多余的属性和方法,但必须考虑清楚你这样做的理由。
本游戏程序的第四部分为事件处理函数的定义,在该游戏中,我们定义了4个事件处理函数,分别用来处理时钟事件、屏幕刷新事件、键盘事件和鼠标事件,每个函数的名称、参数及函数的主要功能描述如下图:
# 时钟事件处理函数,生产一个上升的方块
def box_spawner():
# 屏幕刷新事件处理函数
def draw(canvas):
# 键盘事件处理函数,处理键盘按下事件的函数
def keydown(key):
# 为游戏开始或重新开始初始化全局变量,也是鼠标点击按钮的事件处理函数
def start_game():
图6 挑战《三字经》程序的事件处理函数定义部分
你的任务之一就是完善以上4个函数的定义,你当然可以创建新的事件处理函数,也可以合并以上函数,但必须考虑清楚你这样做的理由。
本游戏程序的第五部分为创建窗口初始化画布的代码,如下图:
# 初始化画布
frame = simplegui.create_frame("挑战《三字经》", canvas_width, canvas_height)
label = frame.add_label("游戏得分 = 0分")
图7 挑战《三字经》程序的窗口创建和初始化部分
请熟记这两行代码的的语法格式,可以尝试对其进行修改以观察每个参数的含义和作用。
本游戏程序的第六部分完成对事件处理函数的注册,代码如下图:
# 注册事件处理函数
# 按键处理,每次按键会调用keydown函数
frame.set_keydown_handler(keydown)
# 显示处理,每秒调用draw函数60次
frame.set_draw_handler(draw)
# 每秒调用box_spawner函数1次
timer = simplegui.create_timer(1000.0, box_spawner)
# 鼠标每次点击“重新开始游戏”按钮,调用start_game函数1次
button = frame.add_button('重新开始游戏', start_game, 100)
图8 挑战《三字经》程序的事件处理函数注册部分
请熟记这四行代码的的语法格式,可以尝试对其进行修改以观察每个参数的含义和作用。
本游戏程序的第七部分,也是最后一部分,完成全局变量初始化、启动定时器、显示窗口从而让游戏开始运行,代码如下an>
# 启动游戏
start_game() # 为游戏开始或重新开始初始化全局变量
timer.start() # 启动定时器
frame.start() # 显示窗口
图9 挑战《三字经》程序的游戏启动部分
请熟记这四行代码的的语法格式,可以尝试对其进行修改以观察每个参数的含义和作用。
-课程简介
--课程简介
-A 课程视频(算数操作符及表达式)
--绪论
-B 课程视频(变量及赋值)
--变量
--项目提交
-C 辅助视频(计算机结构、Python开发环境安装)
-D 辅助视频(如何提交项目)
--项目提交
-第0周--小测验
-本周项目:"我喜欢Python"
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
--项目提交
-A 课程视频(函数)
--函数
--其它操作符
--随机函数
-B 课程视频(逻辑及表达式)
--逻辑值和比较
--条件
--编程技巧
-第1周--小测验
-本周项目:“老虎杠子鸡虫”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(Python交互式应用)
--事件驱动编程
--按钮
-B 课程视频(输入框、全局变量)
--输入框
--编程技巧
-第2周--小测验A
-第2周--小测验B
-本周项目:猫咪藏在哪个房间
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(画布绘图)
--画布和图形绘制
--字符串处理
--图片和音效
-B 课程视频(计时器)
--计时器
--交互式绘图
--“神奇时钟”游戏
--编程技巧
-第3周--小测验A
-第3周--小测验B
-本周项目:“神奇时钟”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(列表)
--列表
--键盘输入
--碰撞和反射
-B 课程视频(键盘控制)
--速度控制
--运动
--编程技巧
--“桌上冰球”游戏
-第4周--小测验A
-第4周--小测验B
-本周项目:“桌上冰球”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(鼠标输入、列表进阶)
--鼠标输入
--Video
--Video
--Video
-B 课程视频(字典和图片)
--Video
--Video
--Video
--Video
-第5周--小测验A
-第5周--小测验B
-本周项目:“世界杯八强连连看”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类)
--华容道中的类
-B 课程视频(平铺图片)
--平铺图片
--理解对象
--编程技巧
--“华容道”游戏
-第6周--小测验A
-第6周--小测验B
-本周项目:“华容道”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类进阶及文件操作)
--集合
--文件操作
--文字块类
--处理停止的文字块
-B 课程视频(游戏状态控制)
--游戏记分规则
--编程技巧
-第7周--小测验A
-第7周--小测验B
-本周项目:决战三字经
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板
-A、课程视屏(精灵集合)
--Video
--精灵类
--战士类
--编程技巧
-B、课程视屏(动画)
--精灵碰撞
--精灵动画
--编程技巧
--保卫家园游戏
-第8周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板