目录

一、背景介绍:

二、整体流程:

三、游戏的主要设计:

四、效果展示

五、代码部分

1.游戏整体部分

2.设计关卡

3.碰撞检测(核心)


项目描述:为落实抗击疫情的精神设计了一款类似于愤怒的小鸟模型的一款小游戏,基于pygame开发。

一、背景介绍:

  1. 疯狂的小鸟作为被大众熟知的一款游戏,在当年许多单机游戏中也是脱颖而出。又正值如今疫情严峻,为了缓解大家一个多月的疫情封寝带来的焦虑以及感受防疫工作者面对新冠病毒的勇敢果决,我们在这一款游戏之上做了一些改编和拓展,做出了一款关于防疫医生与新冠病毒的游戏。游戏的主要流程是通过控制医生实现对病毒的精确打击,要求便是将病毒全部消灭。如果成功消灭会显示相应分数,作为向医生的鼓励以及增加我们防疫的信心

二、整体流程:

三、游戏的主要设计:

四、效果展示

游戏开始界面

游戏界面

游戏关卡切换界面(体现分数)

游戏失败界面

游戏暂停界面

五、代码部分

1.游戏整体部分

def start(self):# 导入所有游戏精灵game_sprites = self.loadlevelmap()  # 载入地图返回游戏精灵内容(字典类型)doctors, covids, blocks, walls = game_sprites['doctors'], game_sprites['covids'], game_sprites['blocks'], game_sprites['walls']  # 得到游戏内容slingshot = Slingshot(self.screen, 200, self.screen_size[1] - 200, 30, 200)doctors[0].load(slingshot)score_label = Label(self.screen, 50, 10, 100, 50)score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))doctors_remaining_label = Label(self.screen, 120, 50, 100, 50)doctors_remaining_label.addtext(f"Doctor REMAINING: {len(doctors)}", 25, self.cfg.FONTPATH['Comic_Kings'],(236, 240, 241))covids_remaining_label = Label(self.screen, 110, 90, 100, 50)covids_remaining_label.addtext(f"COVIDs REMAINING: {len(covids)}", 25, self.cfg.FONTPATH['Comic_Kings'],(236, 240, 241))charles_label = Label(self.screen, self.screen_size[0] - 450, self.screen_size[1] - 20, 300, 100)charles_label.addtext('Against The Epidemic', 60, self.cfg.FONTPATH['arfmoochikncheez'], (113, 125, 126))# 游戏主循环clock = pygame.time.Clock()blocks_to_remove, covids_to_remove = [], []while True:# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:self.quitgame()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_q:self.quitgame()elif event.key == pygame.K_r:self.start()elif event.key == pygame.K_p or event.key == pygame.K_ESCAPE:self.pauseinterface()elif event.type == pygame.MOUSEBUTTONDOWN:if doctors[0].selected():doctors[0].is_selected = Trueelif event.type == pygame.MOUSEBUTTONUP:if doctors[0].is_selected:doctors[0].is_selected = Falsedoctors[0].start_flying = True# --背景颜色填充,绘制四色条的背景color = self.cfg.BACKGROUND_COLORfor i in range(3):color = (color[0] + 5, color[1] + 5, color[2] + 5)pygame.draw.rect(self.screen, color, (0, i * 300, self.screen_size[0], 300))pygame.draw.rect(self.screen, (77, 86, 86), (0, self.screen_size[1], self.screen_size[0], 50))# --判断游戏是否结束,若没有则导入新的医生if (not doctors[0].is_loaded) and self.still(covids + doctors + blocks):doctors.pop(0)if self.status(covids, doctors) == 2:  # 游戏胜利self.score += len(doctors) * 100  # 剩余医生越多,得分越高self.switchlevelinterface()elif self.status(covids, doctors) == 1:self.failureinterface()doctors[0].load(slingshot)doctors[0].start_flying = False# --重置医生的位置if doctors[0].is_selected:doctors[0].reposition(slingshot)if hasattr(doctors[0], 'start_flying') and doctors[0].start_flying: #start_flying为后添加属性,得用hasatter判断是否存在属性doctors[0].is_loaded = False# --弹弓slingshot.draw(doctors[0])# --判断病毒是否撞上木桩for i in range(len(covids)):for j in range(len(blocks)):covid_magnitude_1, block_magnitude_1 = covids[i].velocity.magnitude, blocks[j].velocity.magnitudecovids[i], blocks[j], is_collision = self.collision(covids[i], blocks[j])covid_magnitude_2, block_magnitude_2 = covids[i].velocity.magnitude, blocks[j].velocity.magnitudeif is_collision:if abs(covid_magnitude_2 - covid_magnitude_1) > 2:blocks_to_remove.append(blocks[j])blocks[j].setdestroy()if abs(block_magnitude_2 - block_magnitude_1) > 2:covids_to_remove.append(covids[i])covids[i].setdead()# --判断医生是否撞上木桩for i in range(len(doctors)):if not (doctors[i].is_loaded or doctors[i].velocity.magnitude == 0):for j in range(len(blocks)):doctor_magnitude_1, block_magnitude_1 = doctors[i].velocity.magnitude, blocks[j].velocity.magnitudedoctors[i], blocks[j], is_collision = self.collision(doctors[i], blocks[j])doctor_magnitude_2, block_magnitude_2 = doctors[i].velocity.magnitude, blocks[j].velocity.magnitudeif is_collision:if abs(doctor_magnitude_1 - doctor_magnitude_2) > 2:if blocks[j] not in blocks_to_remove: #木桩和医生病毒同时相撞避免重复破坏木桩blocks_to_remove.append(blocks[j])blocks[j].setdestroy()# --判断病毒是否撞上病毒或者病毒撞墙for i in range(len(covids)):covids[i].move()for j in range(i + 1, len(covids)):covid1_magnitude_1, covid2_magnitude_1 = covids[i].velocity.magnitude, covids[j].velocity.magnitudecovids[i], covids[j], is_collision = self.collision(covids[i], covids[j])covid1_magnitude_2, covid2_magnitude_2 = covids[i].velocity.magnitude, covids[j].velocity.magnitudeif abs(covid1_magnitude_1 - covid1_magnitude_2) > 2:if covids[j] not in covids_to_remove:covids_to_remove.append(covids[j])covids[j].setdead()if abs(covid2_magnitude_1 - covid2_magnitude_2) > 2:if covids[i] not in covids_to_remove:covids_to_remove.append(covids[i])covids[i].setdead()for wall in walls: covids[i] = self.collision(covids[i], wall)[0]covids[i].draw()# --判断医生是否撞到病毒或者医生是否撞到墙for i in range(len(doctors)):if (not doctors[i].is_loaded) and (doctors[i].velocity.magnitude):doctors[i].move()for j in range(len(covids)):doctor_magnitude_1, covid_magnitude_1 = doctors[i].velocity.magnitude, covids[j].velocity.magnitudedoctors[i], covids[j], is_collision = self.collision(doctors[i], covids[j])doctor_magnitude_2, covid_magnitude_2 = doctors[i].velocity.magnitude, covids[j].velocity.magnitudeif is_collision:if abs(doctor_magnitude_2 - doctor_magnitude_1) > 2:if covids[j] not in covids_to_remove:covids_to_remove.append(covids[j])covids[j].setdead()if doctors[i].is_loaded: doctors[i].projectpath()for wall in walls: doctors[i] = self.collision(doctors[i], wall)[0]doctors[i].draw()# --判断木桩是否撞到了木桩或者木桩撞到墙for i in range(len(blocks)):for j in range(i + 1, len(blocks)):block1_magnitude_1, block2_magnitude_1 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitudeblocks[i], blocks[j], is_collision = self.collision(blocks[i], blocks[j])block1_magnitude_2, block2_magnitude_2 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitudeif is_collision:if abs(block1_magnitude_2 - block1_magnitude_1) > 2:if blocks[j] not in blocks_to_remove:blocks_to_remove.append(blocks[j])blocks[j].setdestroy()if abs(block2_magnitude_2 - block2_magnitude_1) > 2:if blocks[i] not in blocks_to_remove:blocks_to_remove.append(blocks[i])blocks[i].setdestroy()blocks[i].move()for wall in walls: blocks[i] = self.collision(blocks[i], wall)[0]blocks[i].draw()# --墙for wall in walls: wall.draw()# --显示文字score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))score_label.draw()doctors_remaining_label.addtext(f"DOCTORS REMAINING: {len(doctors)}", 25, self.cfg.FONTPATH['Comic_Kings'],(236, 240, 241))doctors_remaining_label.draw()covids_remaining_label.addtext(f"COVID REMAINING: {len(covids)}", 25, self.cfg.FONTPATH['Comic_Kings'],(236, 240, 241))covids_remaining_label.draw()charles_label.draw()# --画面刷新pygame.display.update()clock.tick(self.cfg.FPS)# --删除无效的元素if self.still(doctors + covids + blocks):for covid in covids_to_remove:if covid in covids:covids.remove(covid)self.score += 100for block in blocks_to_remove:if block in blocks:blocks.remove(block)self.score += 50covids_to_remove = []blocks_to_remove = []

另外,游戏的开始游戏界面、游戏的失败界面、游戏暂停界面、游戏关卡切换界面与这里游戏界面中的部分也大同小异,主要包括相关按钮,标题的载入以及对事件(主要是按钮触发)的检测

2.设计关卡

for i in range(3):doctors.append(Doctor(screen=self.screen, imagepaths=self.cfg.IMAGEPATHS['doctor'],loc_info=(45 * i, self.screen_size[1] - 40, 20)))if self.level_pointer == 1:covids.append(COVID(screen=self.screen, imagepaths=self.cfg.IMAGEPATHS['covid'],loc_info=(1100, self.screen_size[1] - 60, 25)))covids.append(COVID(screen=self.screen, imagepaths=self.cfg.IMAGEPATHS['covid'],loc_info=(1200, self.screen_size[1] - 60, 25)))walls.append(Slab(screen=self.screen, imagepaths=self.cfg.IMAGEPATHS['wall'], x=700, y=250, width=30,height=self.screen_size[1] - 250))

主要通过添加相关元素(包括医生,病毒,障碍[通过木块体现],墙),设置其位置来体现关卡特点,其余关卡也是大同小异

3.碰撞检测(核心)

通过检测物体之间(主要是医生与病毒,医生与障碍,医生与墙,病毒与病毒,病毒与墙,病毒与障碍)图像是否发生重叠来体现是否发生碰撞,若发生碰撞则修改碰撞物体的速度大小与方向,这里体现了病毒医生之间的碰撞,其余碰撞的产生也能通过类似功能实现

 def collision(self, sprite1, sprite2):is_collision = Falseelasticity, block_elasticity = 0.8, 0.7if sprite1.type in ['covid', 'doctor'] and sprite2.type in ['covid', 'doctor']:   #病毒医生之间的碰撞dx, dy = sprite1.loc_info[0] - sprite2.loc_info[0], sprite1.loc_info[1] - sprite2.loc_info[1]dist = math.hypot(dx, dy)if dist < sprite1.loc_info[2] + sprite2.loc_info[2]:tangent = math.atan2(dy, dx)angle = 0.5 * math.pi + tangentangle1, angle2 = 2 * tangent - sprite1.velocity.angle, 2 * tangent - sprite2.velocity.anglemagnitude1, magnitude2 = sprite2.velocity.magnitude, sprite1.velocity.magnitudesprite1.velocity, sprite2.velocity = VelocityVector(magnitude1, angle1), VelocityVector(magnitude2,angle2)sprite1.velocity.magnitude *= elasticitysprite2.velocity.magnitude *= elasticityoverlap = 0.5 * (sprite1.loc_info[2] + sprite2.loc_info[2] - dist + 1)sprite1.loc_info[0] += math.sin(angle) * overlapsprite1.loc_info[1] -= math.cos(angle) * overlapsprite2.loc_info[0] -= math.sin(angle) * overlapsprite2.loc_info[1] += math.cos(angle) * overlapis_collision = True

Angry Doctor(愤怒的医生小游戏)相关推荐

  1. C++实现愤怒小鸟小游戏

    C++低配版愤怒小鸟小游戏(转载) 相信大家都玩过愤怒小鸟 如果还想玩玩的话 就试下这个代码吧 #include <bits/stdc++.h> #include <windows. ...

  2. 幼儿英语课前热身小游戏

    幼儿英语课前热身小游戏        孩子玩得正高兴,站在一旁的老师却喊着"要上英语课了",孩子们带着满脸的不情愿回到了教室,有的还嘟囔着"又要上课",丝毫没有 ...

  3. 用processing编写的一个小游戏

    这是本人第一次写博客,是写给自己看的吧,标志着我下定决心开始走程序媛这条路了. 而且这也是我第一次用Processing写小游戏,算是纪念了. 首先帖一张运行初始界面图: 我们可以看到最下面那个警察是 ...

  4. 边玩边学,30个Python小游戏(含源码)

    大家好,我是小F~ 经常听到有朋友说,学习编程是一件非常枯燥无味的事情.其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享30个P ...

  5. python暴打“冠状病毒”小游戏

    python讨论qq群:996113038 导语: 现在天天宅在家里,实在是无聊.想想病毒挺可恨的.于是干脆就开发一个"暴打病毒"的python小游戏,好好发泄一些,只是短时间内找 ...

  6. 从零点五开始用Unity做半个2D战棋小游戏(九)

    写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利. 预计将分为 ...

  7. 第一个python小游戏

    guess = int(input("猜一猜宝宝心目中的数字是多少:")) secret = 8 while guess !=secret: guess = int(input(& ...

  8. python学习之——综合小游戏

    照着笨方法学python的书写了一个小游戏 #!/usr/bin/env python # -*- coding:utf-8 -*- from sys import exit from random ...

  9. 娱乐小游戏助力神器威信小程序源码下载多种游戏选择玩法多种

    大家好今天给大家带来另外一款小神器 好像记得小编之前也发过好几款这种小程序源码吧 但是每一款的UI或者功能什么的都还是会有所不一样的 大家也可以找找之前所发的那几款对比一下然后决定自己需要哪一款哟 这 ...

最新文章

  1. python 东哥 with open_Python一行代码搞定炫酷可视化,你需要了解一下Cufflinks
  2. Farbic区块链PHP SDK
  3. SQL Server 2008中的代码安全(四):主密钥
  4. 比IETEST更好用的浏览器兼容性测试软件[绿色]
  5. 实例47:python
  6. Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】
  7. 【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
  8. 神级程序员8000行css代码画出一个蒙娜丽莎,堪比达芬奇!
  9. 01_博图默认变量和DB块变量导入昆仑通态触摸屏
  10. Sequence Modeling With CTC : Labelling Unsegmented Sequence Data with RNN
  11. 【element】progress-修改进度条形状、高度、颜色、动态传值
  12. 神的战争god无法显示服务器,神的战争GOD
  13. RoughSets属性约简算法
  14. 记录——python与华为云对象存储服务OBS
  15. Windows下cmd进入MySql的命令界面
  16. wait和notify基本原理以及应用场景
  17. web浏览器中的base64编码解码
  18. 【谷歌地图--MapsSDK集成】
  19. 给右键菜单加入CMD命令行快速通道
  20. OC 与 Swift 区别

热门文章

  1. 维修计算机的店店名,家电维修店名大全
  2. 微信公众号开发之现金红包
  3. 【JavaScript】JS的基础知识
  4. 使用shell脚本更新文本数据至mysql数据库
  5. 小明和小强的故事 漫画版
  6. 劳务协议书html,个人劳务协议书
  7. 男孩取名:诚实坦荡、善良宽厚的男孩名字
  8. UGG公会和 Fantaverse游戏达成战略合作
  9. 计算机相关专业本科毕业论文撰写指南
  10. 易语言大漠游戏一键登录自动判断判断角色位置