课程设计教学目的:
本课程设计是本专业的一门重要实践性教学环节。在学习了专业基础课和《Python程序设计》课程的基础上,本课程设计旨在加深对Python程序设计的认识,对Python语言及其语言生态有一个进一步的掌握和应用,学会运用Python标准库及外接相关库来解决实际问题的基本能力,培养和提高学生分析问题、解决问题的能力,尤其是提高学生使用Python为开发语言来进行问题描述、交流与思考的能力,为毕业设计和以后的工程实践打下良好的基础。
本课程设计具体目的:
为全面了解Python技术历史、现状与发展趋势的基础上,系统掌握Python基本概念、编程思想以及程序设计技术,具备熟练的Python编程技能和面向对象软件设计技术思想。
通过总体框架到页面设计再到代码实现,了解Python设计的一般步骤,并熟练掌握Python的设计思想。
本课题主要训练逻辑思维和Python语法,对代码编写由大到小,由总体到模块,掌握其基本逻辑,对以后的设计可以做到举一反三,进而形成逻辑思维。
课程设计教学任务和要求:
本课程设计主要任务是以Python为开发语言完成一个100~300行左右规模的程序项目开发。设计参考题目见附件1。
课程设计的基本要求是:在课程设计的各个阶段严格、规范地完成相关的文档,例如总体方案报告,详细设计报告、功能说明、数据结构说明、算法说明、程序设计框图、图例和源程序等。要求所写文档结构合理、内容完整、叙述清晰。程序源码要有详细注释,可读性好。更高要求是:有创意、系统界面美观。
本课程设计具体任务和要求:


我负责游戏逻辑的实现。
Vel_y是游戏中鱼下落的速度,游戏中每当接到了炸弹,猫的表情会变成哭脸,同时生命值减一,遗漏鱼时,生命值也会减一,当生命值为0时,游戏结束。
游戏的启动页面:

游戏的运行界面:

当Round>2时,会插入炸弹:

图3 炸弹界面
良好
总体上来说,游戏的运行基本满足了当初设计时的构想,满足了设计要求。
游戏具体逻辑的实现:
pygame事件可以处理游戏中的各种事情,pygame中的事件处理是放在一个实时的循环中来完成的。将代码都放在一个while True的循环中,但是这样会造成死循环,所以在里面加一句sys.exit()来退出。
for event in pygame.event.get()
上面的代码将会创建当前等待处理的事件的一个列表,然后使用for循环来遍历里面的事件。这样,我们将会根据事件产生的顺序依次地进行不同的操作。常见的事件是按键按下,按键释放以及鼠标移动。通常需要最先处理QUIT事件(在用户关闭窗口的时候会产生该事件。)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame支持一些鼠标事件,他们包括:
MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN.
在MOUSEMOTION中包含了一些属性:event.pos,event.rel,event.buttons
Elif event.type == MOUSEMOTION:
mouse_x,mouse_y = event.pos
move_x,move_y = event.rel
MOUSEBUTTONUP里面的属性:
elif event.type == MOUSEBUTTONUP:
if game_over:
game_over = False
lives = 10
score = 0
Round =1
vel_y=0.4
mine=0
flag=0
pic=cat
bomb_y = -50
在pygame中,使用pygame.key.get_pressed()来轮询键盘接口。这个方法会返回布尔值的一个列表,其中每个键一个标志。使用键常量值来匹配按键,这样的好处就是不必遍历事件系统就可以检测多个键的按下。
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()
if game_over:
screen.blit(init,(60, 60))
print_text(font3, 200, 400,"Clicked To Play!")
print_text(font2, 310, 480,"Copyright@2015 developed by xiaoxiami")
图4 游戏结束页面

| 等级 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 分数 | <300 | 300600 | 600900 | 9001200 | 12001500 | >1500 |
| 下落速度 | 0.4 | 0.6 | 0.8 | 1.0 | 1.2 | 1.2 |
else:
#Round setting
if score >300 and score <600:
Round=2
elif score >600 and score <900:
Round =3
elif score >900 and score <1200:
Round=4
elif score >1200 and score <1500:
Round =5
elif score >=1500:
Round =6
#draw the Round
print_text(font1, 280, 0, "Round: " + str(Round))
#speed setting
if Round ==1:
vel_y=0.4
elif Round ==2:
vel_y=0.6
elif Round ==3:
vel_y=0.8
elif Round ==4:
vel_y=1.0
elif Round ==5:
vel_y=1.2
如果错过鱼的话,就重置鱼的位置,给它一个随机的x值,然后生命值减一:
if bomb_y > 500:
bomb_x = random.randint(0, 500)
bomb_y = -50
lives -= 1
if lives == 0:
game_over = True
简单碰撞检测函数,查看是否接住鱼:
elif bomb_y > pos_y:
if bomb_x > pos_x-10 and bomb_x < pos_x + 70:
score += 10
bomb_x = random.randint(0, 500)
bomb_y = -50
同理炸弹的检测和这个是类似的:
if mine_y > 500:
mine_x = random.randint(0, 500)
mine_y = -50
为了控制猫的坐标不超出屏幕范围,加入了以下代码:
pos_x = mouse_x
if pos_x < 0:
pos_x = 0
elif pos_x > 510:
pos_x = 500
猫在接到炸弹。或者生命值小于5的时候,会变成哭脸,因此我们还需要加载一张哭脸的位图,然后在程序中添加一些相应的逻辑代码:
加载猫的哭脸位图:
cat2=pygame.image.load("aodamiao_3.png")
当接到炸弹的时候,猫变成哭脸:
elif mine_y > pos_y:
if mine_x > pos_x and mine_x < pos_x + 40:
mine_x = random.randint(0, 500)
mine_y = -50
lives-=1
pic=cat2
if lives == 0:
game_over = True
当猫的生命值小于5时,猫变成哭脸:
if lives<5:
pic=cat2
try...except...finally...
用于判断猫的位置是否超出了游戏窗口:
try:
print("开始执行try...")
mouse_x>0
mouse_x<510
except ZeroDivisionError as e:
print(“猫超出范围”)
finally:
print("执行finally...")
print("END...")
通过print 输出可能出错的变量,可以通过错误信息和print 输出的内容来进行修改bug,print在测试完成后还需要删除
pdb
启动Python的单步调试器pdb,程序一行行执行。可以采用pdb.set_trace()在代码中设置断点