好的,我来为你写一个难度较高的Python游戏,这个游戏名字叫做“飞碟大战”。
游戏规则如下:
1.玩家通过鼠标控制一个小飞船在屏幕上移动,发射子弹消灭飞来的敌人飞碟。
2.敌人飞碟会从屏幕上方不断飞来,玩家需要通过发射子弹击中敌人飞碟,每击中一个敌人飞碟,得到一定的分数。
3.如果敌人飞碟撞到玩家的小飞船,或者敌人飞碟到达屏幕下方,则游戏失败。
4.玩家有三条命,每次游戏失败后,可以选择是否继续游戏,如果选择继续,则重新开始游戏;如果选择退出,则程序结束。
下面是代码实现:
import pygame
import random
# 初始化pygame
pygame.init()
# 设置游戏窗口的大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飞碟大战")
# 加载图片
bg_image = pygame.image.load("images/background.jpg").convert_alpha()
ship_image = pygame.image.load("images/ship.png").convert_alpha()
bullet_image = pygame.image.load("images/bullet.png").convert_alpha()
disk_image = pygame.image.load("images/disk.png").convert_alpha()
# 加载音效
shoot_sound = pygame.mixer.Sound("sounds/shoot.wav")
explosion_sound = pygame.mixer.Sound("sounds/explosion.wav")
# 设置字体
font = pygame.font.SysFont("simhei", 32)
# 设置颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 定义玩家飞船的类
class Ship(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed = 5
self.bullets = pygame.sprite.Group()
def update(self, keys):
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def shoot(self):
bullet = Bullet()
bullet.rect.centerx = self.rect.centerx
bullet.rect.bottom = self.rect.top - 10
self.bullets.add(bullet)
shoot_sound.play()
# 定义子弹的类
class Bullet(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = bullet_image
self.rect = self.image.get_rect()
self.speed = -10
def update(self):
self.rect.y += self.speed
if self.rect.bottom < 0:
self.kill()
# 定义敌人飞碟的类
class Disk(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = disk_image
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randint(-SCREEN_HEIGHT, -self.rect.height)
self.speed = random.randint(1, 5)
self.score = self.speed * 10
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT:
self.kill()
定义游戏结束函数
def game_over(score):
explosion_sound.play()
screen.blit(bg_image, (0, 0))
text = font.render("游戏结束,得分:{}".format(score), True, WHITE)
text_rect = text.get_rect()
text_rect.centerx = SCREEN_WIDTH // 2
text_rect.centery = SCREEN_HEIGHT // 2
screen.blit(text, text_rect)
pygame.display.update()
pygame.time.delay(3000)
定义主函数
def main():
# 创建玩家飞船
ship = Ship()
all_sprites = pygame.sprite.Group(ship)
# 创建敌人飞碟
disks = pygame.sprite.Group()
for i in range(10):
disk = Disk()
disks.add(disk)
all_sprites.add(disk)
# 初始化游戏变量
score = 0
lives = 3
# 开始游戏循环
running = True
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
ship.shoot()
# 更新玩家飞船
keys = pygame.key.get_pressed()
ship.update(keys)
# 更新子弹
for bullet in ship.bullets:
bullet.update()
# 更新敌人飞碟
for disk in disks:
disk.update()
# 检测碰撞
hits = pygame.sprite.groupcollide(disks, ship.bullets, True, True)
for hit in hits:
score += hit.score
disk = Disk()
disks.add(disk)
all_sprites.add(disk)
hits = pygame.sprite.spritecollide(ship, disks, False)
if hits:
lives -= 1
if lives == 0:
game_over(score)
running = False
else:
explosion_sound.play()
ship.rect.centerx = SCREEN_WIDTH // 2
ship.rect.bottom = SCREEN_HEIGHT - 10
pygame.time.delay(1000)
# 绘制屏幕
screen.blit(bg_image, (0, 0))
all_sprites.draw(screen)
text = font.render("得分:{}".format(score), True, WHITE)
screen.blit(text, (10, 10))
text = font.render("生命:{}".format(lives), True, WHITE)
screen.blit(text, (SCREEN_WIDTH - 100, 10))
pygame.display.update()
# 退出pygame
pygame.quit()
运行游戏
if name == "main":
main()