|
import pygame
import random
# 初始化Pygame
pygame.init()
pygame.mixer.init()
# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易枪战游戏")
# 颜色定义
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
# 加载音效(需要音效文件)
# shoot_sound = pygame.mixer.Sound('shoot.wav')
# hit_sound = pygame.mixer.Sound('hit.wav')
# 玩家类
class Player(pygame.sprite.Sprite):
def __init__(self, color, x, y, controls):
super().__init__()
self.image = pygame.Surface((40, 40))
self.image.fill(color)
self.rect = self.image.get_rect(center=(x, y))
self.speed = 5
self.health = 100
self.controls = controls # [上, 下, 左, 右, 射击]
self.last_shot = 0
self.shoot_delay = 500 # 射击间隔(毫秒)
def update(self, bullets_group):
keys = pygame.key.get_pressed()
# 移动控制
if keys[self.controls[0]]: self.rect.y -= self.speed
if keys[self.controls[1]]: self.rect.y += self.speed
if keys[self.controls[2]]: self.rect.x -= self.speed
if keys[self.controls[3]]: self.rect.x += self.speed
# 边界限制
self.rect.clamp_ip(WIN.get_rect())
# 射击控制
now = pygame.time.get_ticks()
if keys[self.controls[4]] and now - self.last_shot > self.shoot_delay:
bullet = Bullet(self.rect.centerx, self.rect.top, self)
bullets_group.add(bullet)
self.last_shot = now
# shoot_sound.play()
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, shooter):
super().__init__()
self.image = pygame.Surface((5, 10))
self.image.fill(WHITE)
self.rect = self.image.get_rect(center=(x, y))
self.speed = 10
self.shooter = shooter
def update(self):
self.rect.y -= self.speed if self.shooter == player1 else self.speed
if self.rect.bottom < 0 or self.rect.top > HEIGHT:
self.kill()
# 游戏主循环
def main():
global player1, player2
# 创建精灵组
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
players = pygame.sprite.Group()
# 创建玩家
player1 = Player(RED, WIDTH//4, HEIGHT//2, [pygame.K_w, pygame.K_s, pygame.K_a, pygame.K_d, pygame.K_SPACE])
player2 = Player(BLUE, WIDTH*3//4, HEIGHT//2, [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT, pygame.K_RETURN])
all_sprites.add(player1, player2)
players.add(player1, player2)
clock = pygame.time.Clock()
running = True
while running:
clock.tick(60)
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 更新
all_sprites.update(bullets)
bullets.update()
# 碰撞检测
for bullet in bullets:
hit_players = pygame.sprite.spritecollide(bullet, players, False)
for player in hit_players:
if player != bullet.shooter:
player.health -= 10
# hit_sound.play()
bullet.kill()
if player.health <= 0:
player.kill()
running = False
# 绘制
WIN.fill(BLACK)
all_sprites.draw(WIN)
bullets.draw(WIN)
# 绘制生命值
font = pygame.font.Font(None, 36)
text1 = font.render(f"P1 HP: {player1.health}", True, WHITE)
text2 = font.render(f"P2 HP: {player2.health}", True, WHITE)
WIN.blit(text1, (10, 10))
WIN.blit(text2, (WIDTH - 150, 10))
pygame.display.flip()
# 游戏结束
WIN.fill(BLACK)
font = pygame.font.Font(None, 72)
if player1.health <= 0:
text = font.render("Player 2 Wins!", True, BLUE)
else:
text = font.render("Player 1 Wins!", True, RED)
WIN.blit(text, (WIDTH//2 - text.get_width()//2, HEIGHT//2 - text.get_height()//2))
pygame.display.flip()
pygame.time.wait(3000)
pygame.quit()
if __name__ == "__main__":
main()
|
|