pygame外星人

---恢复内容开始---

一、Pygame是是一组功能强大而有趣的模块, 可用于管理图形、 动画乃至声音, 让你能够更轻松地开发复杂的游戏。 通过使用
Pygame来处理在屏幕上绘制图像等任务

 

 

二、飞船大战外星人游戏项目,在开发之前,要明确项目涉及的方面,做好规划比立马就写更重要:

在游戏《外星人入侵》 中, 玩家控制着一艘最初出现在屏幕底部中央的飞船。 玩家可以使用箭头键左右移动飞船, 还可使用空格键进行射击。 游戏开始时, 一群外星
人出现在天空中, 他们在屏幕中向下移动。 玩家的任务是射杀这些外星人。 玩家将所有外星人都消灭干净后, 将出现一群新的外星人, 他们移动的速度更快。 只要有
外星人撞到了玩家的飞船或到达了屏幕底部, 玩家就损失一艘飞船。 玩家损失三艘飞船后, 游戏结束。


三、首先创建一个主文件夹alien_invasions,项目相关的文件都放在这里,项目主文件未alien_invasion.py,它可以调用其他模块,从而简化主文件

 1 # -*- coding:utf-8 -*-
 2 
 3 import sys
 4 import pygame
 5 from settings import Settings
 6 from ship import Ship
 7 import game_functions as gf  # 将函数文件导入
 8 from pygame.sprite import Group
 9 from game_stats import GameStats
10 from button import Button
11 from scoreboard import ScoreBoard
12 
13 
14 def run_game():
15     '''初始化游戏,设置并创建一个屏幕对象'''
16     pygame.init()
17     ai_settings = Settings()
18     screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
19     pygame.display.set_caption('Alien Invasion')
20 
21     '''创建一个用于统计游戏信息的实例'''
22     stats = GameStats(ai_settings)
23 
24     '''创建游戏记分牌'''
25     sb = ScoreBoard(screen, ai_settings, stats)
26 
27     '''创建一艘飞船, 一个子弹编组和一个外星人编组'''
28     ship = Ship(ai_settings, screen)
29 
30     '''创建用于储存子弹和外星人的编组'''
31     bullets = Group()
32     aliens = Group()
33 
34     '''创建外星人群'''
35     gf.create_fleet(ai_settings, screen, ship, aliens)
36 
37     '''创建play按钮'''
38     play_button = Button(ai_settings, screen, 'Play')
39 
40     '''开始游戏的主循环'''
41     while True:
42 
43         '''监视键盘鼠标事件'''
44         gf.check_events(ai_settings, screen, ship, bullets, stats, play_button, aliens, sb)
45 
46         if stats.game_active:
47             ship.update()
48 
49             '''更新子弹位置并删除已经消失的子弹'''
50             gf.update_bullets(ai_settings, screen, ship, bullets, aliens, stats, sb)
51 
52             '''更新外星人位置'''
53             gf.update_aliens(ai_settings, stats, aliens, ship, screen, bullets, sb)
54 
55         '''每次循环时重绘背景'''
56         gf.update_screen(ai_settings, stats, screen, ship, aliens, bullets, play_button, sb)
57 
58 
59 run_game()

四、创建游戏所有相关设置模块setting.py,这里包含了屏幕的长宽,子弹的设置等

 1 # -*- coding:utf-8 -*-
 2 
 3 class Settings():
 4     '''存储《外星人入侵》的所有设置的类'''
 5 
 6     def __init__(self):
 7         '''初始化游戏的设置'''
 8         '''飞船和屏幕设置'''
 9         self.screen_width = 1200
10         self.screen_height = 800
11         self.bg_color = (255, 255, 255)
12         self.ship_limit = 3
13 
14         '''子弹设置'''
15         self.bullet_width = 3
16         self.bullet_height = 15
17         self.bullet_color = 60, 60, 60
18         self.bullet_allowed = 3  # 屏幕可容纳的子弹数目
19 
20         '''外星人设置'''
21         self.fleet_drop_speed = 10
22 
23         '''以什么速度加快游戏节奏'''
24         self.speedup_scale = 1.1
25 
26         self.initialize_dynamic_settings()
27 
28     def initialize_dynamic_settings(self):
29 
30         '''初始化随游戏变化的设置'''
31         self.ship_speed_factor = 1.5
32         self.bullet_speed_factor = 3
33         self.alien_speed_factor = 0.5
34 
35         '''记分'''
36         self.alien_points = 50
37 
38 
39         '''fleet_direction为1表示右移,-1表示左移'''
40         self.fleet_direction = 1
41 
42     def increase_speed(self):
43         self.ship_speed_factor *= self.speedup_scale
44         self.alien_speed_factor *= self.speedup_scale
45         self.bullet_speed_factor *= self.speedup_scale
46         self.alien_points = int(self.alien_points * self.speedup_scale)

 

 五、创建好屏幕后,绘制飞船

 1 # -*- coding:utf-8 -*-
 2 
 3 import pygame
 4 from pygame.sprite import Sprite
 5 
 6 class Ship(Sprite):
 7 
 8     def __init__(self, ai_settings, screen):
 9         '''初始化飞船并设置其初始位置'''
10         super(Ship, self).__init__()
11         self.screen = screen
12         self.ai_settings = ai_settings
13 
14         '''加载飞船图像并获取其外接矩形'''
15         self.image = pygame.image.load('images/ship.bmp')
16         '''原图图像过大,按比例缩小至适合大小'''
17         width, height = self.image.get_size()
18         self.image = pygame.transform.smoothscale(self.image, (width // 27, height // 27))
19         self.rect = self.image.get_rect()
20         self.screen_rect = screen.get_rect()  # 存储表示屏幕的矩形
21 
22         '''将每艘飞船置于屏幕底部中央'''
23         self.rect.centerx = self.screen_rect.centerx
24         self.rect.bottom = self.screen_rect.bottom
25 
26         '''在飞船的属性center中储存小数值,因为rect只支持'''
27         self.center = float(self.rect.centerx)
28         self.center_up = float(self.rect.centery)
29 
30         '''移动标志,用于持续移动判断'''
31         self.moving_right = False
32         self.moving_left = False
33         self.moving_up = False
34         self.moving_down = False
35 
36     def update(self):
37         '''根据移动标志调整飞船位置'''
38         '''更新飞船的center以及center_up值,而非rect'''
39         if self.moving_right and self.rect.right < self.screen_rect.right:
40             self.center += self.ai_settings.ship_speed_factor
41         if self.moving_left and self.rect.left > 0:
42             self.center -= self.ai_settings.ship_speed_factor
43         if self.moving_up and self.rect.top > 0:
44             self.center_up -= self.ai_settings.ship_speed_factor
45         if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
46             self.center_up += self.ai_settings.ship_speed_factor
47 
48         '''更新self.center对象更新rect'''
49         self.rect.centerx = self.center
50         self.rect.centery = self.center_up
51 
52     def blitme(self):
53         '''在指定位置绘制飞机'''
54         self.screen.blit(self.image, self.rect)
55 
56     def center_ship(self):
57         '''将飞船重置在屏幕底部中间'''
58         self.center = self.screen_rect.centerx
59         self.center_up = self.screen_rect.bottom
60         self.rect.centerx = self.center
61         self.rect.centery = self.center_up

 

 六、创建子弹编组

 1 # -*- coding:utf-8 -*-
 2 
 3 import pygame
 4 from pygame.sprite import Sprite
 5 
 6 '''子弹精灵'''
 7 class Bullet(Sprite):
 8     '''一个对飞船发射子弹进行管理的类'''
 9 
10     def __init__(self, ai_settings, screen, ship):
11         '''在飞船所处的位置创建子弹对象'''
12         super(Bullet, self).__init__()
13         self.screen = screen
14 
15         '''在(0, 0)处创建子弹对象,并将其移到飞船位置'''
16         self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
17         self.rect.centerx = ship.rect.centerx
18         self.rect.top = ship.rect.top
19 
20         '''存储用小数表示的子弹位置'''
21         self.y = float(self.rect.y)
22 
23         self.color = ai_settings.bullet_color
24         self.speed__factor = ai_settings.bullet_speed_factor
25 
26     def update(self):
27         '''向上移动子弹'''
28         '''更新表示子弹移动的y值'''
29         self.y -= self.speed__factor
30         '''更新rect,y'''
31         self.rect.y = self.y
32 
33     def draw_bullet(self):
34         '''在屏幕上绘制子弹'''
35         pygame.draw.rect(self.screen, self.color, self.rect)

 

 七、绘制外星人

 1 # -*- coding:utf-8 -*-
 2 import pygame
 3 from pygame.sprite import Sprite
 4 
 5 
 6 class Alien(Sprite):
 7     '''表示单个外星人的类'''
 8 
 9     def __init__(self, ai_settings, screen):
10         '''初始化外星人并设置其起始位置'''
11         super(Alien, self).__init__()
12         self.ai_settings = ai_settings
13         self.screen = screen
14 
15         '''加载外星人图像,并设置其rect属性'''
16         self.image = pygame.image.load('images/alien.bmp')
17         width, height = self.image.get_size()
18         self.image = pygame.transform.smoothscale(self.image, (width//15, height//15))
19         self.rect = self.image.get_rect()
20 
21         '''每个外星人最初都在屏幕左上角附近'''
22         self.rect.x = self.rect.width + 5
23         self.rect.y = self.rect.height
24 
25         '''存储外星人的准确位置'''
26         self.x = float(self.rect.x)
27 
28     def blitme(self):
29         '''在指定位置绘制外星人'''
30         self.screen.blit(self.image, self.rect)
31 
32     def check_edges(self):
33         '''检查外星人是否撞到边缘'''
34         screen_rect = self.screen.get_rect()
35         if self.rect.right >= screen_rect.right:
36             return True
37         elif self.rect.left <= 0:
38             return True
39 
40     def update(self):
41         '''向右移动外星人'''
42         self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
43         self.rect.x = self.x

 

转载于:https://www.cnblogs.com/czmiracle/p/11426497.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值