AG

Python游玩:外星人侵犯
时间:2021-07-23 17:28 点击:201 次

本文内容是行使pygame包来开发一款python2D游玩,相通于吾们幼时候玩的飞机大战,飞船发射子弹biubiubiu~~然后外星人就息灭了,并且每息灭一群外星人后,玩家都将挑高一个等级,随着等级挑高游玩节奏也会添快。

下面是本文的组织:

规划项现在装配pygame飞船与外星人的创建外星人与飞船的搏斗增补记分牌

详细代码可见吾的github,以下内容只是大致介绍,篇幅有限只放了片面,细节之处能够浏览书籍《Python编程:从入门到实践》,本文是基于这本书的项现在实践章节12-14所写得。

qinliu0901/pythongithub.com

1 规划项现在

在做一件事情之前,吾们都会先想要为什么做,做什么,怎么做,写一个幼游玩也是相通,规划益再脱手写项现在很主要,弄清新游玩预期要实现什么功能,然后针对这些功能去找到解决手段,then let's start.

在外星人侵犯中,吾们要实现的功能有:

飞船能够旁边移动,并用空格键射击;外星人群从左移动到屏幕右端然后下移肯定距离,接着去逆倾向移动;飞船射杀外星人,也就是子弹与外星人碰撞时,子弹与外星人消逝,外星人息灭完后又新创建一群;当外星人撞到飞船,玩家就亏损一艘飞船,满3次游玩终结;记录得分,最高得分,等级,余下的飞船数。

2 装配pygame

Pygame项现在托管在代码分享网站Bitbucket中,访问

pygame / pygame / Downloadsbitbucket.org

可下载相答的pygame包,再行使pip在命令走里装配。

3 飞船与外星人的创建

3.1 主循环的构建

创建一个空的pygame窗口,游玩的基本组织如下:

alien_invasion.py

import sysimport pygamedef run_game():    # 初起化游玩并创建一个屏幕对象    pygame.init()    screen = pygame.display.set_mode((1200, 800))    pygame.display.set_caption("Alien Invasion")        # 开起游玩的主循环    while True:        # 监视键盘和鼠标事件        for event in pygame.event.get():            if event.type == pygame.QUIT:                sys.exit()        # 让近来绘制的屏幕可见        pygame.display.flip()run_game()

3.2 存储一切竖立的类

将一切的竖立存储到一个类中,命名为Settings。

settings.py

class Settings():"""存储一切竖立的类"""def __init__(self):"""初起化游玩的静态竖立"""# 屏幕竖立self.screen_width = 1200self.screen_height = 700self.bg_color = (230, 230, 230)# 飞船的竖立self.ship_limit = 3# 子弹竖立self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60self.bullets_allowed = 3# 外星人竖立self.fleet_drop_speed = 10

在alieninvasion.py中导入Settings类,创建settings的实例ai_settings,在主循环中重绘屏幕.

alien_invasion.py

def run_game():'''初起化游玩并定义一个屏幕对象'''pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))pygame.display.set_caption('Alien Invasion')

3.3 飞船Ship类

选择外示飞船的图像,导入到Ship类中,再在alien_invasion.py中写入表现到屏幕的代码段。

ship.py

import pygamefrom pygame.sprite import Spriteclass Ship(Sprite):"""一个飞船类,方便创建飞船编组"""def __init__(self, ai_settings, screen):"""初起化飞船竖立初起位置"""super().__init__()self.screen = screen # 添self的能够供类中一切手段行使self.ai_settings = ai_settings# 添载飞船图像并获取外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom

在alien_invasion.py中导入Ship类,创建飞船的实例,在主循环中重绘屏幕。

3.4 游玩函数

对于飞船的移动,就必要回响反映按键和鼠标事件,将管理事件的代码放到新函数check_events中,新创建一个game_functions.py用于存储游玩过程中必要用到的函数。原由批准飞船不息移动,因而按键与松开按键必要单独定义。

game_functions.py

def check_keydown_events(event, ai_settings, screen, ship, bullets):"""回响反映按键"""if event.key == pygame.K_RIGHT:# 向右移动飞船ship.moving_right =Trueelif event.key == pygame.K_LEFT:# 向左移动飞船ship.moving_left =Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event, ship):"""回响反映松开"""if event.key == pygame.K_RIGHT:ship.moving_right =Falseelif event.key == pygame.K_LEFT:ship.moving_left =Falsedef check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):"""回响反映键盘和鼠标事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x,mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)

接着在主循环中调用这些函数,及时更新屏幕上的图像。

3.4 子弹bullet类

创建子弹类,将子弹存储到编组Group中,在gamefunctions.py中,添入玩家按空格键时发射子弹。还需修改update_screen(),确保在调用flip()前在屏幕上重绘每颗子弹,删除已消逝的子弹(在屏幕形式的)。

bullet.py

class Bullet(Sprite):"""飞船发射的子弹的类"""def __init__(self, ai_settings, screen, ship):"""在飞船所处位置创建一个子弹对象"""# 初起化父类Sprite的属性super().__init__()self.screen = screen# 在(0,0)处创建一个外示子弹的矩形,再竖立切确的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top

3.5 外星人Alien类

选择外示外星人的图像,导入到Alien类中,再在alien_invasion.py中创建Alien的实例,写入表现到屏幕的代码段。接着按照计算创建外星人群,把它们放到编组中,并向右向下移动。

alien.py

import pygamefrom pygame.sprite import Spriteclass Alien(Sprite):"""一个外星人类"""def __init__(self, ai_settings, screen):"""初起化外星人竖立初起位置"""super().__init__()self.screen = screen # 添self的能够供类中一切手段行使self.ai_settings = ai_settings# 添载外星人图像并获取外接矩形self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个新外星人最初在左上角self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的实在位置self.x = float(self.rect.x)

4 外星人与飞船的搏斗

4.1 检测子弹与外星人的碰撞

当子弹击中外星人时,子弹与外星人都消逝,手段sprite.groupcollide()将每颗子弹的rect与每个外星人的rect,相比较,返回一个字典,包含发生碰撞的子弹和外星人,每个键时一个子弹,相答的值为被击中的外星人。

game_functions.py

def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):# 检查是否有子弹击中了外星人,删除相答子弹外星人,两个true外示删除,两个组之间的collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

4.2 回响反映外星人和飞船碰撞

当外星人与飞船相撞时,议定跟踪游玩的统计新闻来记录飞船被撞了几次,满三次就游玩终结。相对答的编写新类GameStats放入game_stats.py,在alien_invasion.py中创建GameStats的实例。

game_stats.py

class GameStats():"""跟踪游玩的统计新闻"""def __init__(self, ai_settings):"""初起化统计新闻"""self.ai_settings = ai_settingsself.reset_stats()# 游玩启动时处于非运动状态self.game_active = Falseself.hign_score = 0def reset_stats(self):"""初起化在游玩运走期间能够转折的统计新闻"""self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1

飞船数目减1,清空外星人与子弹列外,接着创建一群新外星人,将飞船放在屏幕的底部中央。

# 清空外星人列外和子弹列外aliens.empty()bullets.empty()# 创建一群新外星人,飞船放到屏幕矮端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()sleep(0.5)

5 增补记分牌

5.1 增补play按钮

当玩家点击屏幕中央的play按钮时,开起游玩。创建Button类,实例化按钮,并在屏幕上绘制。

button.py

import pygame.fontclass Button():"""开起游玩终结游玩的按钮"""def __init__(self, ai_settings, screen, msg):"""初起化按钮属性"""self.screen = screenself.screen_rect = screen.get_rect()# 竖立按钮的尺寸和其它属性self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)

5.2 创建记分牌

为在屏幕上表现得分,创建新类Scoreboard,用来表现现在得分,最高得分,玩家等级,余下的飞船数。

scoreboard.py

class Scoreboard():"""表现得分新闻的类"""def __init__(self, ai_settings, screen, stats):"""初起化表现得分新闻涉及的属性"""self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = stats# 表现得分新闻时的字体竖立self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)

在外星人被息灭时更新得分,更新stats.score的值,再更新得分图像。

检查是否产生了最高得分,表现最高分,并将得分圆整为10的倍数。

scoreboard.py

def prep_hign_score(self):"""将最高得分转换为一幅渲染的图像"""# 将得分圆整,为10的倍数,round()让幼批准确到幼批点后几位hign_score = int(round(self.stats.hign_score, -1)) # python3可不要inthign_score_str = "{:,}".format(hign_score)self.hign_score_img = self.font.render(hign_score_str, True, self.text_color, self.ai_settings.bg_color)

表现余下的飞船数必要先创建一艘新飞船,再创建一个新编组,每艘飞船左边距为10像素,将盈余的飞船表现在左下角。

scoreboard.py

def prep_ships(self):"""表现还剩下众少飞船"""self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)

以上就是也许的思路啦啦啦。

近来总是被一些幼事情扰乱心理,也许是吾不足坚定,没能坚持本身的选择吧,未必候就是嫉妒别人怎么那么益,吾要是怎样怎样比他还严害呢,可是吾们做了纷歧样的选择,相通也没法比较了,just remember:

any choice is a good choice.


当前网址:http://ucbcgroup.org/AG/3646.html
tag:Python,游玩,外星人,侵犯,本文,内容,是,行使,