第一步:构建基本框架

  1. 当前需要达到基本的模型:

    2.构建屏幕大小,可移动敌人与可移动游戏角色。
# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((50, 40))self.image.fill(GREEN)self.rect = self.image.get_rect()self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((30, 40))self.image.fill(RED)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = False# updateall_sprites.update()# Draw / renderscreen.fill(BLACK)# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)pygame.display.flip() pygame.quit()
  1. 构建冲突, 碰撞后退出游戏

​# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((50, 40))self.image.fill(GREEN)self.rect = self.image.get_rect()self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((30, 40))self.image.fill(RED)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((10, 20))self.image.fill(YELLOW)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:m = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False)if hits:running = False# Draw / renderscreen.fill(BLACK)# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)pygame.display.flip() pygame.quit()
  1. 增加图形界面,看起来更像游戏:
    相关图片,可在pygame 官网下载
​# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = meteor_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:m = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thing# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)pygame.display.flip() pygame.quit()
  1. 改善碰撞功能

    构建完美碰撞:
# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = meteor_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:m = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thing# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)pygame.display.flip() pygame.quit()
  1. 增加动画效果, 增加不同石头
# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:m = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thing# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)pygame.display.flip() pygame.quit()
  1. 增加打分功能, 并能够发射子弹
# pygame template - skeleton for  a  new python project, shmup game
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, WHITE)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
score = 0
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:score += 50 - hit.radiusm = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thing# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)draw_text(screen, str(score), 18, WIDTH / 2, 10)pygame.display.flip() pygame.quit()
  1. 增加背景音乐和音效
# pygame template - skeleton for  a  new python project, shmup game
# music : Instrument samples in this recording are from the Garritan Personal Orchestra.
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
snd_dir = path.join(img_dir, 'snd2')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, WHITE)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)shoot_sound.play()class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())
# load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'Laser_Shoot30.wav'))
expl_sounds = []
for snd in ['Explosion30.wav', 'Explosion41.wav']:expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
# ;oad music
pygame.mixer.music.load(path.join(snd_dir, 'little_town.ogg'))
pygame.mixer.music.set_volume(0.6)bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)
score = 0
pygame.mixer.music.play(loops = -1)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:score += 50 - hit.radiusrandom.choice(expl_sounds).play()m = Mob()all_sprites.add(m)mobs.add(m)# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thing# after drawing everything, flip the display# TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERall_sprites.draw(screen)draw_text(screen, str(score), 18, WIDTH / 2, 10)pygame.display.flip() pygame.quit()
  1. 增加血量,不然一击必死
# pygame template - skeleton for  a  new python project, shmup game
# music : Instrument samples in this recording are from the Garritan Personal Orchestra.
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
snd_dir = path.join(img_dir, 'snd2')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, WHITE)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)def newmob():m = Mob()all_sprites.add(m)mobs.add(m)def draw_shield_bar(surf, x, y, pct):if pct < 0:pct = 0BAR_LENGTH = 100BAR_HEIGHT = 10fill = (pct / 100) * BAR_LENGTHoutline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)pygame.draw.rect(surf, GREEN, fill_rect)pygame.draw.rect(surf, WHITE, outline_rect, 2)class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0self.shield = 100def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -5if keystate[pygame.K_RIGHT]:self.speedx = 5self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)shoot_sound.play()class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())
# load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'Laser_Shoot30.wav'))
expl_sounds = []
for snd in ['Explosion30.wav', 'Explosion41.wav']:expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
# ;oad music
pygame.mixer.music.load(path.join(snd_dir, 'little_town.ogg'))
pygame.mixer.music.set_volume(0.6)bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):newmob()score = 0
pygame.mixer.music.play(loops = -1)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:score += 50 - hit.radiusrandom.choice(expl_sounds).play()newmob()# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)for hit in hits:player.shield -= hit.radius * 2newmob()if player.shield <= 0:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thingall_sprites.draw(screen)draw_text(screen, str(score), 18, WIDTH / 2, 10)draw_shield_bar(screen, 5, 5, player.shield)# after drawing everything, flip the display, TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERpygame.display.flip() pygame.quit()
  1. 增加爆炸效果,增加生命数量
# pygame template - skeleton for  a  new python project, shmup game
# music : Instrument samples in this recording are from the Garritan Personal Orchestra.
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
snd_dir = path.join(img_dir, 'snd2')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60 # define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, WHITE)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)def newmob():m = Mob()all_sprites.add(m)mobs.add(m)def draw_shield_bar(surf, x, y, pct):if pct < 0:pct = 0BAR_LENGTH = 100BAR_HEIGHT = 10fill = (pct / 100) * BAR_LENGTHoutline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)pygame.draw.rect(surf, GREEN, fill_rect)pygame.draw.rect(surf, WHITE, outline_rect, 2)def draw_lives(surf, x, y, lives, img):for i in range(lives):img_rect = img.get_rect()img_rect.x = x + 30 * iimg_rect.y = ysurf.blit(img, img_rect)class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0self.shield = 100self.shoot_delay = 250 # hold space keep shootingself.last_shot = pygame.time.get_ticks()self.lives = 3self.hidden = Falseself.hide_timer = pygame.time.get_ticks()def update(self):# unhide if hiddenif self.hidden and pygame.time.get_ticks() - self.hide_timer > 1000:self.hidden = Falseself.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -8if keystate[pygame.K_RIGHT]:self.speedx = 8if keystate[pygame.K_SPACE]:self.shoot()self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):now = pygame.time.get_ticks()if now - self.last_shot > self.shoot_delay:self.last_shot = now # self.last_shoot = now , keep shootingbullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)shoot_sound.play()def hide(self):# hide the player temporarilyself.hidden = Trueself.hide_timer = pygame.time.get_ticks()self.rect.center = (WIDTH / 2, HEIGHT + 200)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()class Explosion(pygame.sprite.Sprite):def __init__(self, center, size):pygame.sprite.Sprite.__init__(self)self.size = sizeself.image = explosion_anim[self.size][0]self.rect = self.image.get_rect()self.rect.center = centerself.frame = 0self.last_update = pygame.time.get_ticks()self.frame_rate = 75def update(self):now = pygame.time.get_ticks()if now - self.last_update > self.frame_rate:self.last_update = nowself.frame += 1if self.frame == len(explosion_anim[self.size]):self.kill()else:center = self.rect.centerself.image = explosion_anim[self.size][self.frame]self.rect = self.image.get_rect()self.rect.center = center# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
player_mini_img = pygame.transform.scale(player_img, (25, 19))
player_mini_img.set_colorkey(BLACK)
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
explosion_anim['player'] = []
for i in range(1, 11):filename = 'bubble_explo{}.png'.format(i)img = pygame.image.load(path.join(img_dir, filename)).convert()img.set_colorkey(BLACK)img_lg = pygame.transform.scale(img, (75, 75))explosion_anim['lg'].append(img_lg)img_sm = pygame.transform.scale(img, (32, 32))explosion_anim['sm'].append(img_sm)filename = 'E{}.png'.format(i)img = pygame.image.load(path.join(img_dir, filename)).convert()img.set_colorkey(BLACK)explosion_anim['player'].append(img)
# load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'Laser_Shoot30.wav'))
expl_sounds = []
for snd in ['Explosion30.wav', 'Explosion41.wav']:expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
player_die_sound = pygame.mixer.Sound(path.join(snd_dir, 'Explosion49.wav'))
# load music
pygame.mixer.music.load(path.join(snd_dir, 'little_town.ogg'))
pygame.mixer.music.set_volume(0.4)all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):newmob()score = 0
pygame.mixer.music.play(loops = -1)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = False
#         elif event.type == pygame.KEYDOWN:
#             if event.key == pygame.K_SPACE:
#                 player.shoot() # use holding space key to control# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:score += 50 - hit.radiusrandom.choice(expl_sounds).play()expl = Explosion(hit.rect.center, 'lg')all_sprites.add(expl)newmob()# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)for hit in hits:player.shield -= hit.radius * 2expl = Explosion(hit.rect.center, 'sm')all_sprites.add(expl)newmob()if player.shield <= 0:player_die_sound.play()death_explosion = Explosion(hit.rect.center, 'player')all_sprites.add(death_explosion)player.hide()player.lives -= 1player.shield = 100#             running = False# if the player died and expo finishedif player.lives == 0 and not death_explosion.alive():running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thingall_sprites.draw(screen)draw_text(screen, str(score), 18, WIDTH / 2, 10)draw_shield_bar(screen, 5, 5, player.shield)draw_lives(screen, WIDTH - 100, 5, player.lives, player_mini_img)# after drawing everything, flip the display, TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERpygame.display.flip() pygame.quit()
  1. 增加开始界面,开始界面音效, 增加保护罩, 子弹加强功能

```# pygame template - skeleton for  a  new python project, shmup game
# music : Instrument samples in this recording are from the Garritan Personal Orchestra.
import pygame
import random
from os import path# find path if file
game_folder = path.dirname('C:\\Users\\ZZJ\\img')
img_dir = path.join(game_folder, 'img')
snd_dir = path.join(img_dir, 'snd2')
# define screen size
WIDTH = 480 # 360
HEIGHT = 600 # 480# FRAME PER SECOND
FPS = 60
POWERUP_TIME = 5000
# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create wiindow
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Space Shooter')
clock = pygame.time.Clock()font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, WHITE)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)def newmob():m = Mob()all_sprites.add(m)mobs.add(m)def draw_shield_bar(surf, x, y, pct):if pct < 0:pct = 0BAR_LENGTH = 100BAR_HEIGHT = 10fill = (pct / 100) * BAR_LENGTHoutline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)pygame.draw.rect(surf, GREEN, fill_rect)pygame.draw.rect(surf, WHITE, outline_rect, 2)def draw_lives(surf, x, y, lives, img):for i in range(lives):img_rect = img.get_rect()img_rect.x = x + 30 * iimg_rect.y = ysurf.blit(img, img_rect)class Player(pygame.sprite.Sprite):# sprite for the playerdef __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.radius = 20# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0self.shield = 100self.shoot_delay = 250 # hold space keep shootingself.last_shot = pygame.time.get_ticks()self.lives = 3self.hidden = Falseself.hide_timer = pygame.time.get_ticks()self.power = 1self.power_time = pygame.time.get_ticks()def update(self):# timeout for powerupsif self.power >= 2 and pygame.time.get_ticks() - self.power_time > POWERUP_TIME:self.power -= 1self.power_time = pygame.time.get_ticks()# unhide if hiddenif self.hidden and pygame.time.get_ticks() - self.hide_timer > 1000:self.hidden = Falseself.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -8if keystate[pygame.K_RIGHT]:self.speedx = 8if keystate[pygame.K_SPACE]:self.shoot()self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def powerup(self):self.power += 1self.power_time = pygame.time.get_ticks()def shoot(self):now = pygame.time.get_ticks()if now - self.last_shot > self.shoot_delay:self.last_shot = now # self.last_shoot = now , keep shootingif self.power == 1:bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)shoot_sound.play()if self.power >= 2:bullet1 = Bullet(self.rect.left, self.rect.centery)bullet2 = Bullet(self.rect.right, self.rect.centery)all_sprites.add(bullet1)all_sprites.add(bullet2)bullets.add(bullet1)bullets.add(bullet2)shoot_sound.play()def hide(self):# hide the player temporarilyself.hidden = Trueself.hide_timer = pygame.time.get_ticks()self.rect.center = (WIDTH / 2, HEIGHT + 200)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image_orig = random.choice(meteor_images)self.image_orig.set_colorkey(BLACK)self.image = self.image_orig.copy()self.rect = self.image.get_rect()self.radius = int(self.rect.width * .85 / 2)# pygame.draw.circle(self.image, RED, self.rect.center, self.radius)self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-150, -100)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)self.rot = 0self.rot_speed = random.randrange(-8, 8)self.last_update = pygame.time.get_ticks()def rotate(self):now = pygame.time.get_ticks()if now - self.last_update > 50:self.last_update = nowself.rot = (self.rot + self.rot_speed) % 360new_image = pygame.transform.rotate(self.image_orig, self.rot)old_center = self.rect.centerself.image = new_imageself.rect = self.image.get_rect()self.rect.center = old_centerdef update(self):self.rotate()self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()class Pow(pygame.sprite.Sprite):def __init__(self, center):pygame.sprite.Sprite.__init__(self)self.type= random.choice(['shield', 'gold'])self.image = powerup_images[self.type]self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.center = centerself.speedy = 2def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.top > HEIGHT:self.kill()class Explosion(pygame.sprite.Sprite):def __init__(self, center, size):pygame.sprite.Sprite.__init__(self)self.size = sizeself.image = explosion_anim[self.size][0]self.rect = self.image.get_rect()self.rect.center = centerself.frame = 0self.last_update = pygame.time.get_ticks()self.frame_rate = 75def update(self):now = pygame.time.get_ticks()if now - self.last_update > self.frame_rate:self.last_update = nowself.frame += 1if self.frame == len(explosion_anim[self.size]):self.kill()else:center = self.rect.centerself.image = explosion_anim[self.size][self.frame]self.rect = self.image.get_rect()self.rect.center = center# load all game graphics
background = pygame.image.load(path.join(img_dir, 'blue.png')).convert()
background = pygame.transform.scale(background, (480, 600)) # change the size
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png'))
player_mini_img = pygame.transform.scale(player_img, (25, 19))
player_mini_img.set_colorkey(BLACK)
# meteor_img = pygame.image.load(path.join(img_dir, 'meteorBrown_med1.png'))
bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png'))
meteor_images = []
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png','meteorBrown_med2.png', 'meteorBrown_small1.png', 'meteorBrown_small2.png','meteorBrown_tiny1.png']
for img in meteor_list:meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert())explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
explosion_anim['player'] = []
for i in range(1, 11):filename = 'bubble_explo{}.png'.format(i)img = pygame.image.load(path.join(img_dir, filename)).convert()img.set_colorkey(BLACK)img_lg = pygame.transform.scale(img, (75, 75))explosion_anim['lg'].append(img_lg)img_sm = pygame.transform.scale(img, (32, 32))explosion_anim['sm'].append(img_sm)filename = 'E{}.png'.format(i)img = pygame.image.load(path.join(img_dir, filename)).convert()img.set_colorkey(BLACK)explosion_anim['player'].append(img)
powerup_images = {}
powerup_images['shield'] = pygame.image.load(path.join(img_dir, 'shield.png')).convert()
powerup_images['gold'] = pygame.image.load(path.join(img_dir, 'gun.png')).convert()
# load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'Laser_Shoot30.wav'))
shield_sound = pygame.mixer.Sound(path.join(snd_dir, 'Powerup33.wav'))
power_sound = pygame.mixer.Sound(path.join(snd_dir, 'Powerup46.wav'))
expl_sounds = []
for snd in ['Explosion30.wav', 'Explosion41.wav']:expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
player_die_sound = pygame.mixer.Sound(path.join(snd_dir, 'Explosion49.wav'))
# load music
pygame.mixer.music.load(path.join(snd_dir, 'little_town.ogg'))
pygame.mixer.music.set_volume(0.4)all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
powerups = pygame.sprite.Group()
powerups = pygame.sprite.Group()player = Player()
all_sprites.add(player)
for i in range(8):newmob()score = 0
pygame.mixer.music.play(loops = -1)
# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# process input (event)for event in pygame.event.get():# check for closing windowsif event.type == pygame.QUIT:running = False
#         elif event.type == pygame.KEYDOWN:
#             if event.key == pygame.K_SPACE:
#                 player.shoot() # use holding space key to control# updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:score += 50 - hit.radiusrandom.choice(expl_sounds).play()expl = Explosion(hit.rect.center, 'lg')all_sprites.add(expl)if random.random() > 0.9:pow = Pow(hit.rect.center)all_sprites.add(pow)powerups.add(pow)newmob()# check if a mob hit a playerhits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)for hit in hits:player.shield -= hit.radius * 2expl = Explosion(hit.rect.center, 'sm')all_sprites.add(expl)newmob()if player.shield <= 0:player_die_sound.play()death_explosion = Explosion(hit.rect.center, 'player')all_sprites.add(death_explosion)player.hide()player.lives -= 1player.shield = 100#             running = False# if a player hits a poweruphits = pygame.sprite.spritecollide(player, powerups, True)for hit in hits:if hit.type == 'shield':shield_sound.play()player.shield += random.randrange(10, 30)if player.shield >= 100:player.shield = 100if hit.type == 'gold':power_sound.play()player.powerup()# if the player died and expo finishedif player.lives == 0 and not death_explosion.alive():running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect) # copy pixel of  one thing to another thingall_sprites.draw(screen)draw_text(screen, str(score), 18, WIDTH / 2, 10)draw_shield_bar(screen, 5, 5, player.shield)draw_lives(screen, WIDTH - 100, 5, player.lives, player_mini_img)# after drawing everything, flip the display, TWO SIDE OF SCREEN ONE FOR PROGRAMMER ONE FOR PLAYERpygame.display.flip() pygame.quit()
最终效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827135030258.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzAxMjc5Ng==,size_16,color_FFFFFF,t_70#pic_center)
--总结:学习如何使用Python pygame

python游戏-space shooter相关推荐

  1. Unity3D官方案例1-星际航行游戏Space Shooter

    Unity3D官方案例1-星际航行游戏Space Shooter [1]学习中的使用的类 1.Input:使用此类读取常规游戏设置中的轴,访问移动设备的多点触控和加速度. 本例使用到的方法: GetA ...

  2. 将Unity官方射击游戏 Space Shooter 改为实时对战小游戏,使用天梯实时对战服务(NanoLink)

    将Unity官方射击游戏(Space Shooter)改为实时对战小游戏,使用天梯实时对战服务(NanoLink) io 类型游戏如此热门,有没有蠢蠢欲动? 如何让自己的游戏快速实现可实时联机对战? ...

  3. Unity官方案例之星际航行游戏(Space Shooter)学习总结

    这几天我学习了<Unity官方案例精讲>的Space Shooter部分,这个案例作为刚刚学习Unity的入门还是不错的,这是整个案例的代码. 下面对我觉得比较常见的几个用法进行一下总结. ...

  4. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

    目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...

  5. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

    最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...

  6. 小学生python游戏编程arcade----灯光示例

    小学生python游戏编程arcade----灯光示例 前言 灯光阴影效果 1.灯光效果 1.1 玩家灯光效果 1.2 代码 2.灯光效果 2.1 软效果 2.2码实现 3.硬效果 3.1 灯光硬效果 ...

  7. 小学生python游戏编程arcade----坦克大战2

    小学生python游戏编程arcade----坦克大战2 前言 多摄象头显得分,title地图加载,精灵分层管理,移动精灵 1.提示框制作 1.1养眼绿色 1.2 画距形提示框 1.3 效果图 1.4 ...

  8. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(下)

    这部分内容关注的是游戏性的提升,包括音效.计分等功能的实现. 传送门: 太空射击(Space Shooter)流程介绍与代码分析(上) 太空射击(Space Shooter)流程介绍与代码分析(中) ...

  9. python游戏之愤怒的小鸟(一)

    题记:上一次用python写游戏还是一年前初学pyhon(虽然到现在也没完全精通),对pygame有简单的应用和了解(当时写的是经典的飞机大战,如果有需要的童鞋可以评论),这一次也是第一次用到物理引擎 ...

最新文章

  1. npm : 无法加载文件 D:\...\nodejs\npm.ps1,因为在此系统上禁止运行脚本
  2. linux系统管理工具sar(一)
  3. ASP.NET AJAX学习记要(2)-下手之DOM
  4. Openssl rand命令
  5. windows7内存诊断工具有用吗_windows内存诊断工具有什么用
  6. 服务器日志记录_5种改善服务器日志记录的技术
  7. php 之 ajax,PHP之AJAX
  8. 前端学习(2620):新增品牌
  9. (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
  10. 汇编:输出寄存器AX中的内容
  11. 问题:jquery event.which详解
  12. 内存颗粒与内存体质的关系
  13. vue2引入ionicons图标
  14. 轩小陌的Python笔记-Pandas 高级数据处理
  15. 微信小程序 全局状态管理 ,响应式
  16. 【牛客网 - 华为机试 - HJ56 完全数计算】
  17. Markdown表格中换行、合并单元格
  18. mysql怎样添加唯一标识_MySql设置唯一标识,主键等设置
  19. QFont/QFontInfo方法功能(QT5.12)
  20. Go换国内源解决go get -u 问题

热门文章

  1. ARTS-19(C++引用形参,查理芒格的智慧)
  2. 2008七款免费杀毒软件权威推荐
  3. 程序员减肥-肥胖程序员让你上班时间减肥
  4. signature=d0108467db7c8f306f2bd7cd45de4c83,Programmable data-routing multiplexer
  5. 带你读懂串口RS232和RS485本质区别!!
  6. 程序猿如何理财之如何研究好一家上市公司?
  7. python学习_day7---数据分析matplotlib+pandas
  8. 全国计算机一级取代,全国计算机等级考试如何替代自考科目?
  9. html禁止qq管家弹出广告,教你两招系统自带永久关闭电脑弹窗广告、流氓软件
  10. Win11添加IP安全策略的方法