python 经典游戏(飞机大战)
技术:pygame
概述
python经典入门游戏开发
详细
一、安装pygame
1、去python官网:https://www.python.org/
2、点击pypi,然后输入pygame
3、点击第一个pygame1.9.6,再点击download files
4、找到和自己python版本匹配的版本,点击下载,
5、因为这是whl的文件,下载完完后,打开控制台,进入下载目录下,使用pip命令运行
python -m pip install --user +文件名
6、pip list查看是否安装成功
7、然后cmd进入代码路径
8、输入python plane_main.py 回车
9、代码启动后效果
二、摘取关键代码实现说明
1、首先创建游戏相关事件及组件类,代码如下:
pygame plane_sprites CREATE_ENEMY_EVENT pygame.USEREVENT HERO_FIRE_EVENT pygame.USEREVENT pygame.init.screen pygame.display.set_modeSCREEN_RECT.size.clock pygame.time.Clock.__create_spritesPlaneGame.__create_user_events.back_group pygame.sprite.GroupBackgroundBackground.hero Hero.hero_group pygame.sprite.Group.hero.enemy_group pygame.sprite.Group.destroy_group pygame.sprite.Grouppygame.time.set_timerCREATE_ENEMY_EVENTpygame.time.set_timerHERO_FIRE_EVENT.clock.tick.__event_handler.__update_sprites.__check_collidepygame.display.updateenemies pygame.sprite.groupcollide.enemy_group.hero.bullets.keysenemy enemiesenemy.life enemy.life enemy.add.destroy_groupenemy.remove.enemy_groupenemy.destroiedpygame.sprite.spritecollide.hero.enemy_group.hero.destroiedevent pygame.event.getevent.type pygame.QUITPlaneGame.__finished_gameevent.type HERO_FIRE_EVENT.hero.fireevent.type CREATE_ENEMY_EVENT.enemy_group.addEnemyevent.type pygame.KEYDOWN event.key pygame.K_benemy .enemy_group.spritesenemy.destroied.hero.can_destroiedPlaneGame.__finished_gamekeys_pressed pygame.key.get_presseddir keys_pressedpygame.K_RIGHTkeys_pressedpygame.K_LEFT.hero.speed dir for group in [self.back_group, self.hero_group, self.hero.bullets, self.enemy_group, self.destroy_group]: group.update() group.draw(self.screen) @staticmethod def __finished_game(): """退出游戏""" print("退出游戏") pygame.quit() exit() if __name__ == '__main__': PlaneGame().start_game()
2、游戏精灵,背景精灵,飞机精灵,英雄精灵,子弹精灵,敌机精灵相关类的实现,代码如下: import random import pygame # 屏幕尺寸 SCREEN_RECT = pygame.Rect(0, 0, 480, 700) class GameSprite(pygame.sprite.Sprite): """游戏精灵""" def __init__(self, image_name, speed=1): super().__init__() self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() self.speed = speed def update(self, *args): self.rect.top += self.speed @staticmethod def image_names(prefix, count): names = [] for i in range(1, count + 1): names.append("./images/" + prefix + str(i) + ".png") return names class Background(GameSprite): """背景精灵""" def __init__(self, is_alt=False): super().__init__("./images/background.png") if is_alt: self.rect.bottom = 0 def update(self, *args): super().update(args) if self.rect.top >= SCREEN_RECT.height: self.rect.bottom = 0 class PlaneSprite(GameSprite): """飞机精灵,包括敌机和英雄""" def __init__(self, image_names, destroy_names, life, speed): image_name = image_names[0] super().__init__(image_name, speed) # 生命值 self.life = life # 正常图像列表 self.__life_images = [] for file_name in image_names: image = pygame.image.load(file_name) self.__life_images.append(image) # 被摧毁图像列表 self.__destroy_images = [] for file_name in destroy_names: image = pygame.image.load(file_name) self.__destroy_images.append(image) # 默认播放生存图片 self.images = self.__life_images # 显示图像索引 self.show_image_index = 0 # 是否循环播放 self.is_loop_show = True # 是否可以被删除 self.can_destroied = False def update(self, *args): self.update_images() super().update(args) def update_images(self): """更新图像""" pre_index = int(self.show_image_index) self.show_image_index += 0.05 count = len(self.images) # 判断是否循环播放 if self.is_loop_show: self.show_image_index %= len(self.images) elif self.show_image_index > count - 1: self.show_image_index = count - 1 self.can_destroied = True current_index = int(self.show_image_index) if pre_index != current_index: self.image = self.images[current_index] def destroied(self): """飞机被摧毁""" # 默认播放生存图片 self.images = self.__destroy_images # 显示图像索引 self.show_image_index = 0 # 是否循环播放 self.is_loop_show = False class Hero(PlaneSprite): """英雄精灵""" def __init__(self): image_names = GameSprite.image_names("me", 2) destroy_names = GameSprite.image_names("me_destroy_", 4) super().__init__(image_names, destroy_names, 0, 0) # 设置初始位置 self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 # 创建子弹组 self.bullets = pygame.sprite.Group() def update(self, *args): self.update_images() # 飞机水平移动 self.rect.left += self.speed # 超出屏幕检测 if self.rect.left < 0: self.rect.left = 0 if self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right def fire(self): """发射子弹""" # bullet_count = len(self.bullets.sprites()) # print("子弹数量 %d" % bullet_count) for i in range(0, 3): # 创建子弹精灵 bullet = Bullet() # 设置子弹位置 bullet.rect.bottom = self.rect.top - i * 20 bullet.rect.centerx = self.rect.centerx # 将子弹添加到精灵组 self.bullets.add(bullet) class Bullet(GameSprite): """子弹精灵""" def __init__(self): image_name = "./images/bullet1.png" super().__init__(image_name, -2) def update(self, *args): super().update(args) # 判断是否超出屏幕 if self.rect.bottom < 0: self.kill() class Enemy(PlaneSprite): """敌机精灵""" def __init__(self): image_names = ["./images/enemy1.png"] destroy_names = GameSprite.image_names("enemy1_down", 4) super().__init__(image_names, destroy_names, 2, 1) # 随机敌机出现位置 width = SCREEN_RECT.width - self.rect.width self.rect.left = random.randint(0, width) self.rect.bottom = 0 # 随机速度 self.speed = random.randint(1, 3) def update(self, *args): super().update(args) # 判断敌机是否移出屏幕 if self.rect.top >= SCREEN_RECT.height: # 将精灵从所有组中删除 self.kill() # 判断敌机是否已经被销毁 if self.can_destroied: self.kill()
三、其他补充
暂时没有
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码