安装Pygame
Pygame是一组功能强大的模块,可用于管理图形、动画、声音。 在windows安装:就很简单,在cmd命令窗先看有没有pip,然后直接输入命令安装
Pygame最常用的15个模块详解 pygame—精灵
项目
一个可以上下左右移动的飞船,三次机会,按键开始。失败以后显示开始按键。记录分数,提高难度,显示等级,显示最高分。
用了五天,磕磕绊绊码完了,啊,好难。 文件压缩在我的资源里。
涉及的函数
函数模板解释实例
pygame.init()初始化背景设置pygame.init()pygame.display.set_mode()根据元组参数(长,高)创建屏幕screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption()根据字符串参数创建标题pygame.display.set_caption(“Alien Invasion”)pygame.display.flip()让最近绘制的屏幕可见pygame.display.flip()pygame.event.get()访问pygame检测到的时间for event in pygame.event.get()pygame.KEYDOWN/pygame.KEYUP/pygame.QUIT按键、松开、退出if event.type == pygame.QUITpygame_K_UP/pygame_K_1/pygame_K_XX表示按键if event.key == pygame.K_UPsys.exit()退出程序sys.exit()screen.fill()根据提供的RGB值[元组(红,绿,蓝)]颜色填充屏幕screen.fill(ai_settings.bg_color)pygame.image.load()返回一个表示图像的surfaceself.star_image = pygame.image.load(‘image/kiki.bmp’)get_rect()获取surface的属性rect,Rect 是用于存储矩形坐标的Pygame对象self.rect = self.image.get_rect()pygame.rect()从空白开始创建一个矩形,需要提供x/y坐标、矩形长/宽self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)rect.x ;rect.width;rect.y ;rect.height;以及属性center/centerx/centery/top/bottom/left/right矩形对象的左上角坐标(x,y)self.rect.x = self.rect.widthpygame.draw.rect()根据提供的屏幕,颜色,矩形,填充所占的屏幕比pygame.draw.rect(self.screen, self.color, self.rect)aliens.draw()对编组调用draw(),pygame自动绘制编组的每个元素,位置由rect属性决定aliens.draw(screen)screen.blit()对surface对象调用bilit(),根据提供的图片,形状绘制屏幕self.screen.blit(self.image,self.rect)Group()返回pygame.sprite.Group的一个实例,类似于列表/编组aliens = Group()bullets.sprites()返回一个列表,包含编组中的所有精灵for bullet in bullets.sprites()pygame.sprite.groupcollide(group1,group2,dokill1,dokill2,collided=None)比较两个编组的rect属性,返回一个字典,包括发生碰撞的。键是Group1,相应的值是击中的Group2。实数True表示发生碰撞就删除。collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)pygame.sprite.spritecollide(sprite,group,dokill1,collided=None)接受一个精灵和一个编组,检查是否有编组成员与精灵碰撞,True将移除成员。碰撞后停止遍历编组并返回第一个碰撞的成员iif pygame.sprite.spritecollide(ship, aliens, False)pygame.sprite.collide_rect(first, second)精灵与精灵empty()清空编组bullets.empty()pygame.font.SysFont()从字库系统中创建一个Font对象,两个参数:字体、字号self.font = pygame.font.SysFont(None, 48)pygame.font.Font.render()在一个新的Surface对象上绘制文本,接收‘文字/布尔/文字色/背景色’,背景色默认透明。self.msg_image = self.front.render(msg, True, self.text_color, self.button_color)pygame.mouse.get_pos()返回一个元组,包含单击鼠标时的x/y坐标mouse_x, mouse_y = pygame.mouse.get_pos() # 返回一个元组,包含单击鼠标时的x/y坐标rect.collidepoint(x,y)检测坐标是否在rect图形内if play_button.rect.collidepoint(mouse_x, mouse_y)pygame.mouse.set_visible(False)隐藏光标pygame.mouse.set_visible(False)round()返回一个浮点数,将小数精确到小数点后多少位,小数点位数由第二个实参指定。第二实参为负,表示10的整倍数rounded_score = int(round(self.stats.score, -1))
alien_invasion.py
'''
游戏主程序:
一个可以上下左右移动的飞船、向右移动碰到墙壁会下移并转向的外星人、
限制数量的子弹。
子弹碰到外星人,外星人死;外星人碰到飞船重新开始
'''
import pygame
from setting
import Settings
from ship
import Ship
import game_functions
as gf
from pygame
.sprite
import Group
from game_stats
import GameStats
from button
import Button
from scoreboard
import Scoreboard
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")
ship
=Ship
(ai_settings
,screen
)
bullets
= Group
()
aliens
= Group
()
gf
.create_fleet
(ai_settings
, screen
, ship
, aliens
)
stats
= GameStats
(ai_settings
)
play_button
= Button
(ai_settings
, screen
, "PLAY")
scoreboard
= Scoreboard
(ai_settings
, screen
, stats
)
while True:
gf
.check_events
(ai_settings
, screen
, stats
, scoreboard
, play_button
, ship
, aliens
, bullets
)
if stats
.game_active
:
gf
.update_ship
(ship
)
gf
.update_bullets
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
)
gf
.update_aliens
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
)
gf
.update_screen
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
, play_button
)
run_game
()
game_functions.py
'''
包含一系列函数,完成游戏的大部分工作
'''
import sys
import pygame
from random
import randint
from time
import sleep
from bullet
import Bullet
from alien
import Alien
def check_keydown_events(event
, ai_settings
, screen
, ship
, bullets
):
if event
.key
== pygame
.K_RIGHT
:
ship
.moving_right
= True
if event
.key
== pygame
.K_LEFT
:
ship
.moving_left
= True
if event
.key
== pygame
.K_UP
:
ship
.moving_up
= True
if event
.key
== pygame
.K_DOWN
:
ship
.moving_down
= True
if event
.key
== pygame
.K_SPACE
:
fire_bullet
(ai_settings
, screen
, ship
, bullets
)
if event
.key
== pygame
.K_q
:
sys
.exit
()
def check_keyup_events(event
,ship
):
if event
.key
== pygame
.K_RIGHT
:
ship
.moving_right
= False
if event
.key
== pygame
.K_LEFT
:
ship
.moving_left
= False
if event
.key
== pygame
.K_UP
:
ship
.moving_up
= False
if event
.key
== pygame
.K_DOWN
:
ship
.moving_down
= False
def check_events(ai_settings
, screen
, stats
, scoreboard
, 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
, scoreboard
, play_button
, ship
, aliens
, bullets
, mouse_x
, mouse_y
)
def check_play_button(ai_settings
, screen
, stats
, scoreboard
, play_button
, ship
, aliens
, bullets
, mouse_x
, mouse_y
):
button_clicked
= play_button
.rect
.collidepoint
(mouse_x
, mouse_y
)
if button_clicked
and not stats
.game_active
:
ai_settings
.initialize_dynamic_settings
()
pygame
.mouse
.set_visible
(False)
stats
.reset_stats
()
stats
.game_active
= True
scoreboard
.prep_score
()
scoreboard
.prep_high_score
()
scoreboard
.prep_level
()
scoreboard
.prep_ship
()
aliens
.empty
()
bullets
.empty
()
create_fleet
(ai_settings
, screen
, ship
, aliens
)
ship
.center_ship
()
def fire_bullet(ai_settings
, screen
, ship
, bullets
):
if len(bullets
) < ai_settings
.bullet_allowed
:
new_bullet
= Bullet
(ai_settings
, screen
, ship
)
bullets
.add
(new_bullet
)
def update_screen(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
, play_button
):
'''填充图片
back = pygame.image.load('images/back.bmp')
screen.blit(back,(0,0))
'''
screen
.fill
(ai_settings
.bg_color
)
for bullet
in bullets
.sprites
():
bullet
.draw_bullet
()
ship
.blitme
()
aliens
.draw
(screen
)
scoreboard
.show_score
()
if not stats
.game_active
:
play_button
.draw_button
()
pygame
.display
.flip
()
def update_ship(ship
):
ship
.update
()
def update_bullets(ai_settings
, screen
, stats
, scoreboard
,ship
, aliens
, bullets
):
bullets
.update
()
for bullet
in bullets
.copy
():
if bullet
.rect
.bottom
<= 0:
bullets
.remove
(bullet
)
check_bullet_alien_collisions
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
)
def ship_hit(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
):
if stats
.ship_left
> 0:
stats
.ship_left
-= 1
scoreboard
.prep_ship
()
aliens
.empty
()
bullets
.empty
()
create_fleet
(ai_settings
, screen
, ship
, aliens
)
ship
.center_ship
()
sleep
(0.5)
else:
stats
.game_active
= False
pygame
.mouse
.set_visible
(True)
def check_aliens_bottom(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
):
screen_rect
= screen
.get_rect
()
for alien
in aliens
.sprites
():
if alien
.rect
.bottom
>= screen_rect
.bottom
:
ship_hit
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
)
break
def update_aliens(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
):
check_fleet_edges
(ai_settings
, aliens
)
aliens
.update
()
if pygame
.sprite
.spritecollide
(ship
, aliens
, True):
ship_hit
(ai_settings
, screen
,stats
, scoreboard
, ship
, aliens
, bullets
)
check_aliens_bottom
(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
)
def get_number_aliens_x(ai_settings
, alien_width
):
availible_space_x
= ai_settings
.screen_width
- 2 * alien_width
number_alien_x
= int(availible_space_x
/ 2 / alien_width
)
return number_alien_x
def get_number_alien_y(ai_settings
, ship_height
, alien_height
):
availible_space_y
= ai_settings
.screen_height
- 3 * alien_height
- ship_height
number_alien_y
= int(availible_space_y
/ 2 / alien_height
)
return number_alien_y
def create_alien(ai_settings
, screen
, aliens
, alien_number_x
, alien_number_y
):
alien
= Alien
(ai_settings
, screen
)
alien_width
= alien
.rect
.width
alien
.x
= alien_width
+ 2 * alien_width
* alien_number_x
+ randint
(-10,10)
alien
.rect
.x
= alien
.x
alien
.rect
.y
= alien
.rect
.height
+ 2*alien
.rect
.height
*alien_number_y
+ randint
(-10,10)
aliens
.add
(alien
)
def create_fleet(ai_settings
, screen
, ship
, aliens
):
alien
= Alien
(ai_settings
, screen
)
number_alien_x
= get_number_aliens_x
(ai_settings
, alien
.rect
.width
)
number_alien_y
= get_number_alien_y
(ai_settings
, ship
.rect
.height
, alien
.rect
.height
)
for row
in range(number_alien_y
):
for alien_number
in range(number_alien_x
):
create_alien
(ai_settings
, screen
, aliens
, alien_number
, row
)
def check_fleet_edges(ai_settings
, aliens
):
for alien
in aliens
.sprites
():
if alien
.check_edges
():
change_fleet_direction
(ai_settings
, aliens
)
break
def change_fleet_direction(ai_settings
, aliens
):
for alien
in aliens
:
alien
.rect
.y
+= ai_settings
.alien_drop_factor
ai_settings
.alien_fleet_direction
*= -1
def check_bullet_alien_collisions(ai_settings
, screen
, stats
, scoreboard
, ship
, aliens
, bullets
):
collisions
= pygame
.sprite
.groupcollide
(bullets
, aliens
, True, True)
if collisions
:
for aliens
in collisions
.values
():
stats
.score
+= ai_settings
.alien_points
* len(aliens
)
scoreboard
.prep_score
()
check_high_score
(stats
, scoreboard
)
if len(aliens
) == 0:
bullets
.empty
()
ai_settings
.increase_speed
()
stats
.level
+= 1
scoreboard
.prep_level
()
create_fleet
(ai_settings
, screen
, ship
, aliens
)
def check_high_score(stats
, scoreboard
):
if stats
.score
> stats
.high_score
:
stats
.high_score
= stats
.score
scoreboard
.prep_high_score
()
settings.py
'''
包含一个类,初始化控制游戏外观和飞行速度等属性
'''
class Settings():
def __init__(self
):
self
.screen_width
= 900
self
.screen_height
= 600
self
.bg_color
= (230, 230, 230)
self
.ship_limit
= 3
self
.bullet_width
= 3
self
.bullet_height
= 15
self
.bullet_color
= (250, 0, 0)
self
.bullet_allowed
= 10
self
.alien_drop_factor
= 10
self
.speedup_scale
= 1.1
self
.score_scale
= 1.5
self
.initialize_dynamic_settings
()
def initialize_dynamic_settings(self
):
self
.ship_speed_factor
= 1.5
self
.alien_speed_factor
= 0.5
self
.alien_fleet_direction
= 1
self
.bullet_speed_factor
= 1
self
.alien_points
= 10
def increase_speed(self
):
self
.ship_speed_factor
*= self
.speedup_scale
self
.alien_speed_factor
*= self
.speedup_scale
self
.alien_fleet_direction
*= self
.speedup_scale
self
.alien_points
= int(self
.alien_points
* self
.score_scale
)
print(self
.alien_points
)
game_stats.py
'''
一个用于跟踪游戏统计信息的新类
'''
class GameStats():
def __init__(self
, ai_settings
):
self
.ai_settings
= ai_settings
self
.reset_stats
()
self
.high_score
= 0
self
.game_active
= False
def reset_stats(self
):
self
.ship_left
= self
.ai_settings
.ship_limit
self
.score
= 0
self
.level
= 1
ship.py
'''
包含一个类,管理飞船的位置以及绘制飞船图像
'''
import pygame
from pygame
.sprite
import Sprite
class Ship(Sprite
):
def __init__(self
, ai_settings
, screen
):
super(Ship
, self
).__init__
()
self
.screen
= screen
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
.centerx
self
.rect
.bottom
= self
.screen_rect
.bottom
self
.center
= float(self
.rect
.centerx
)
self
.y
= float(self
.rect
.y
)
self
.moving_right
= False
self
.moving_left
= False
self
.moving_up
= False
self
.moving_down
= False
def update(self
):
if self
.moving_right
and self
.rect
.right
<self
.screen_rect
.right
:
self
.center
+= self
.ai_settings
.ship_speed_factor
if self
.moving_left
and self
.rect
.left
>0:
self
.center
-= self
.ai_settings
.ship_speed_factor
if self
.moving_up
and self
.rect
.bottom
>50:
self
.y
-= self
.ai_settings
.ship_speed_factor
if self
.moving_down
and self
.rect
.bottom
<self
.ai_settings
.screen_height
:
self
.y
+= self
.ai_settings
.ship_speed_factor
self
.rect
.centerx
= self
.center
self
.rect
.y
= self
.y
def blitme(self
):
self
.screen
.blit
(self
.image
, self
.rect
)
def center_ship(self
):
self
.rect
.centerx
= self
.screen_rect
.centerx
self
.rect
.bottom
= self
.screen_rect
.bottom
self
.center
= float(self
.rect
.centerx
)
self
.y
= float(self
.rect
.y
)
alien.py
'''
放置外星人类
'''
import pygame
from pygame
.sprite
import Sprite
class Alien(Sprite
):
def __init__(self
, ai_settings
, screen
):
super(Alien
, self
).__init__
()
self
.ai_settings
= ai_settings
self
.screen
= screen
self
.image
= pygame
.image
.load
('images/alien.bmp')
self
.rect
= self
.image
.get_rect
()
self
.rect
.x
= self
.rect
.width
self
.rect
.y
= self
.rect
.height
self
.x
= float(self
.rect
.x
)
def blitme(self
):
self
.screen
.blit
(self
.image
, self
.rect
)
def check_edges(self
):
screen_rect
= self
.screen
.get_rect
()
if self
.rect
.right
>= screen_rect
.right
:
return True
elif self
.rect
.left
<= 0:
return True
def update(self
):
self
.x
+= self
.ai_settings
.alien_speed_factor
* self
.ai_settings
.alien_fleet_direction
self
.rect
.x
= self
.x
bullet.py
'''
包含一个类,管理子弹的属性
'''
import pygame
from pygame
.sprite
import Sprite
class Bullet(Sprite
):
def __init__(self
, ai_settings
, screen
, ship
):
super(Bullet
, self
).__init__
()
self
.screen
=screen
self
.rect
= pygame
.Rect
(0, 0, ai_settings
.bullet_width
, ai_settings
.bullet_height
)
self
.rect
.centerx
= ship
.rect
.centerx
self
.rect
.top
= ship
.rect
.top
self
.y
= float(self
.rect
.y
)
self
.color
= ai_settings
.bullet_color
self
.speed_factor
= ai_settings
.bullet_speed_factor
def update(self
):
self
.y
-= self
.speed_factor
self
.rect
.y
= self
.y
def draw_bullet(self
):
pygame
.draw
.rect
(self
.screen
, self
.color
, self
.rect
)
button.py
'''
按键类
'''
import pygame
.font
class Button():
def __init__(self
, ai_settings
, screen
, msg
):
self
.screen
= screen
self
.screen_rect
= screen
.get_rect
()
self
.width
= 200
self
.height
= 50
self
.button_color
= (0, 0, 0)
self
.text_color
= (255, 255, 255)
self
.font
= pygame
.font
.SysFont
(None, 48)
self
.rect
= pygame
.Rect
(0, 0, self
.width
, self
.height
)
self
.rect
.center
= self
.screen_rect
.center
self
.prep_msg
(msg
)
def prep_msg(self
, msg
):
self
.msg_image
= self
.font
.render
(msg
, True, self
.text_color
, self
.button_color
)
self
.msg_image_rect
= self
.msg_image
.get_rect
()
self
.msg_image_rect
.center
= self
.rect
.center
def draw_button(self
):
self
.screen
.fill
(self
.button_color
, self
.rect
)
self
.screen
.blit
(self
.msg_image
, self
.msg_image_rect
)
scoreboard.py
'''
一个显示分数信息的类
'''
import pygame
.font
from pygame
.sprite
import Group
from ship
import Ship
class Scoreboard():
def __init__(self
, ai_settings
, screen
, stats
):
self
.screen
= screen
self
.screen_rect
= self
.screen
.get_rect
()
self
.ai_settings
= ai_settings
self
.stats
= stats
self
.text_color
= (200, 0, 0)
self
.font
= pygame
.font
.SysFont
(None, 40)
self
.prep_score
()
self
.prep_high_score
()
self
.prep_level
()
self
.prep_ship
()
def prep_ship(self
):
self
.ships
= Group
()
for ship_number
in range(self
.stats
.ship_left
):
ship
= Ship
(self
.ai_settings
, self
.screen
)
ship
.rect
.x
= 10 + ship_number
* ship
.rect
.width
ship
.rect
.y
= 10
self
.ships
.add
(ship
)
def prep_score(self
):
rounded_score
= int(round(self
.stats
.score
, -1))
score_str
= "{:,}".format(rounded_score
)
self
.score_image
= self
.font
.render
(score_str
, True, self
.text_color
)
self
.score_rect
= self
.score_image
.get_rect
()
self
.score_rect
.right
= self
.screen_rect
.right
- 30
self
.score_rect
.top
= 20
def prep_high_score(self
):
high_score
= int(round(self
.stats
.high_score
, -1))
high_score_str
= "{:,}".format(high_score
)
self
.high_score_image
= self
.font
.render
(high_score_str
, True, self
.text_color
)
self
.high_score_rect
= self
.high_score_image
.get_rect
()
self
.high_score_rect
.centerx
= self
.screen_rect
.centerx
self
.high_score_rect
.top
= 20
def prep_level(self
):
self
.level_image
= self
.font
.render
(str(self
.stats
.level
), True, self
.text_color
)
self
.level_rect
= self
.level_image
.get_rect
()
self
.level_rect
.right
= self
.score_rect
.right
self
.level_rect
.top
= self
.score_rect
.bottom
+ 10
def show_score(self
):
self
.screen
.blit
(self
.score_image
, self
.score_rect
)
self
.screen
.blit
(self
.high_score_image
, self
.high_score_rect
)
self
.screen
.blit
(self
.level_image
, self
.level_rect
)
self
.ships
.draw
(self
.screen
)
运行截图