“宇宙比任何人所能想像的大得多 如果只有我们 那不是太浪费空间了吗 ”
忘了到底是从哪搞来的 可能是隔壁班借的 也可能是亲戚朋友给买的。
总之 打着手电筒躲在被窝里看到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



