栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pygame实战:前方高燃!外星人基地又双叒叕“空降”了!

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Pygame实战:前方高燃!外星人基地又双叒叕“空降”了!

“宇宙比任何人所能想像的大得多 如果只有我们 那不是太浪费空间了吗 ”

忘了到底是从哪搞来的 可能是隔壁班借的 也可能是亲戚朋友给买的。

总之 打着手电筒躲在被窝里看到12点 还越怕越想看~

百慕大三角、UFO、消失多年的飞机、解剖外星人、水晶头盖骨、大脚怪、麦田怪圈、埃及金字塔……

今天的文章就是大家感兴趣的外星人话题 小编脑容量有限倒是想象不出来外星人长什么样子。

但是我可以卡通化一下这款外星人小游戏给大家 绝对不恐怖 甚至还有点儿可爱~

写游戏嘛 还是大家熟悉的pygame模块 主要是分为三块py源码文件。

游戏规则 我方控制炮台击落外星人入侵地球 每次可以重生三次 击毁一次外星人相应加分 进入下一关 完成全部关卡即可通关。

首先定义我方炮台类 有相应注释可看。

 我方类 
class aircraftSprite(pygame.sprite.Sprite):
 def __init__(self, color, bullet_color, **kwargs):
 pygame.sprite.Sprite.__init__(self)
 # 生命值
 self.num_life 3
 self.max_num_life 5
 # 最小单元
 self.cell [3, 3]
 self.num_cols 15
 self.num_rows 8
 # 用于碰撞检测
 self.rect pygame.Rect(0, 550, self.cell[0] * self.num_cols, self.cell[0] * self.num_rows)
 # 填充颜色区域
 self.filled_cells [7,21,22,23,36,37,38,46,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]
 # 飞船颜色
 self.color color
 # 飞船子弹颜色
 self.bullet_color bullet_color
 # 子弹是否在冷却中
 self.is_cooling False
 self.init_count 35
 self.cooling_count self.init_count
 # 得分
 self.score 0
 # 避免重复增加生命值
 self.old_score -1
 self.resetBoom()
 def shot(self):
 if self.is_cooling:
 return None
 self.is_cooling True
 self.cooling_count self.init_count
 return myBulletSprite(self.rect.x self.rect.width // 2, self.rect.y, self.bullet_color)
 在屏幕上画出来 
 def draw(self, screen):
 for i in range(0, len(self.filled_cells)):
 y self.filled_cells[i] // self.num_cols
 x self.filled_cells[i] % self.num_cols
 rect [x * self.cell[0] self.rect[0], y * self.cell[1] self.rect[1], self.cell[0], self.cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 更新飞船位置等信息 
 def update(self, WIDTH):
 # 位置信息
 x pygame.mouse.get_pos()[0] - (self.rect.width // 2)
 if x 0:
 x pygame.mouse.get_pos()[0]
 elif x WIDTH - self.rect.width:
 x WIDTH - self.rect.width
 self.rect.x x
 # 子弹信息
 if self.is_cooling:
 self.cooling_count - 1
 if self.cooling_count 0:
 self.is_cooling False
 被击中后爆炸 
 def boom(self, screen):
 self.boomed_rect.x self.rect.x
 self.boomed_rect.y self.rect.y
 self.boomed_count 1
 if self.boomed_count % 1 0:
 self.boomed_frame 1
 for i in range(0, len(self.boomed_filled_cells)):
 y self.boomed_filled_cells[i] // self.boomed_num_cols
 x self.boomed_filled_cells[i] % self.boomed_num_cols
 rect [x * self.boomed_cell[0] self.boomed_rect[0], y * self.boomed_cell[1] self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 if self.boomed_frame 4:
 return True
 else:
 return False
 重置爆炸所用到的数据 
 def resetBoom(self):
 # 被击中爆炸时用
 self.one_dead False
 self.boomed_filled_cells [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
 self.boomed_cell [3, 3]
 self.boomed_num_cols 11
 self.boomed_num_rows 9
 self.boomed_rect pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
 # 控制每帧的时间
 self.boomed_count 0
 # 爆炸特效当前帧
 self.boomed_frame 0

然后定义地方ufo类:

class enemySprite(pygame.sprite.Sprite):
 def __init__(self, category, number, color, bullet_color, **kwargs):
 pygame.sprite.Sprite.__init__(self)
 self.cell [3, 3]
 # 编号
 self.number number
 # 种类
 self.category category
 if category small :
 self.reward 20
 self.num_cols 8
 self.num_rows 8
 self.rect pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
 self.filled_cells [[3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,42,45,49,51,52,54,56,58,61,63], 
 [3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,41,43,44,46,48,55,57,62]]
 elif category medium :
 self.reward 15
 self.num_cols 11
 self.num_rows 8
 self.rect pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
 self.filled_cells [[2,8,11,14,18,21,22,24,25,26,27,28,29,30,32,33,34,35,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,68,74,78,86], 
 [2,8,14,18,24,25,26,27,28,29,30,34,35,37,38,39,41,42,44,45,46,47,48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,65,66,68,74,76,80,81,83,84]]
 elif category large :
 self.reward 10
 self.num_cols 12
 self.num_rows 8
 self.rect pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
 self.filled_cells [[4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,62,63,64,67,68,69,73,74,77,78,81,82,86,87,92,93], 
 [4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,63,64,67,68,74,75,77,78,80,81,84,85,94,95]]
 self.color color
 self.bullet_color bullet_color
 self.speed [8, 20]
 self.change_count 0
 self.change_flag False
 # 被击中爆炸时用
 self.boomed_filled_cells [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
 self.boomed_cell [3, 3]
 self.boomed_num_cols 11
 self.boomed_num_rows 9
 self.boomed_rect pygame.Rect(0, 0, self.boomed_num_cols * self.boomed_cell[0], self.boomed_num_rows * self.boomed_cell[1])
 self.boomed_count 0
 self.boomed_frame 0
 def shot(self):
 return enemyBulletSprite(self.rect.x self.rect.width // 2, self.rect.y, self.bullet_color)
 在屏幕上画出来 
 def draw(self, screen):
 if self.change_count 50:
 self.change_count 0
 self.change_flag not self.change_flag
 if self.change_flag:
 for i in range(0, len(self.filled_cells[0])):
 y self.filled_cells[0][i] // self.num_cols
 x self.filled_cells[0][i] % self.num_cols
 rect [x * self.cell[0] self.rect[0], y * self.cell[1] self.rect[1], self.cell[0], self.cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 else:
 for i in range(0, len(self.filled_cells[1])):
 y self.filled_cells[1][i] // self.num_cols
 x self.filled_cells[1][i] % self.num_cols
 rect [x * self.cell[0] self.rect[0], y * self.cell[1] self.rect[1], self.cell[0], self.cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 更新敌方位置等信息 
 def update(self, direction, HEIGHT):
 # 用于改变形状
 self.change_count 1
 # 更新位置信息
 if direction right :
 self.rect.x self.speed[0]
 elif direction left :
 self.rect.x - self.speed[0]
 elif direction down :
 self.rect.y self.speed[1]
 if self.rect.y HEIGHT - self.rect.height:
 return True
 else:
 return False
 被击中后爆炸 
 def boom(self, screen):
 self.boomed_rect.x self.rect.x
 self.boomed_rect.y self.rect.y
 self.boomed_count 1
 if self.boomed_count % 1 0:
 self.boomed_frame 1
 for i in range(0, len(self.boomed_filled_cells)):
 y self.boomed_filled_cells[i] // self.boomed_num_cols
 x self.boomed_filled_cells[i] % self.boomed_num_cols
 rect [x * self.boomed_cell[0] self.boomed_rect[0], y * self.boomed_cell[1] self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 if self.boomed_frame 4:
 return True
 else:
 return False

​敌人跟我方交涉 射击子弹

class myBulletSprite(pygame.sprite.Sprite):
 def __init__(self, x, y, color, **kwargs):
 pygame.sprite.Sprite.__init__(self)
 self.cell [2, 2]
 self.num_cols 1
 self.num_rows 4
 self.rect pygame.Rect(x, y, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
 self.filled_cells [0,1,2,3]
 self.speed 8
 self.color color
 在屏幕上画出来 
 def draw(self, screen):
 for i in range(0, len(self.filled_cells)):
 y self.filled_cells[i] // self.num_cols
 x self.filled_cells[i] % self.num_cols
 rect [x * self.cell[0] self.rect[0], y * self.cell[1] self.rect[1], self.cell[0], self.cell[1]]
 pygame.draw.rect(screen, self.color, rect)
 更新子弹位置等信息 
 def update(self):
 self.rect.y - self.speed
 if self.rect.y self.rect.height 0:
 return True
 else:
 return False
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267669.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号