找回密码
 中文实名注册
查看: 75|回复: 0

双人枪战 python. 温暖 传真

[复制链接]

9

主题

29

帖子

1597

积分

金牌会员

Rank: 6Rank: 6

积分
1597
发表于 2025-2-9 17:41:17 | 显示全部楼层 |阅读模式
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()

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 15:29 , Processed in 0.042181 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表