找回密码
 中文实名注册
搜索
查看: 676|回复: 2

像素枪战(上)(0.1)

[复制链接]

23

主题

12

回帖

793

积分

高级会员

积分
793
发表于 2025-7-15 11:56:37 | 显示全部楼层 |阅读模式
购买主题 已有 2 人购买  本主题需向作者支付 2 金钱 才能浏览
回复

使用道具 举报

23

主题

12

回帖

793

积分

高级会员

积分
793
 楼主| 发表于 2025-7-15 11:57:41 | 显示全部楼层
[Python] 纯文本查看 复制代码
#像素枪战(下)

# 更新所有精灵
all_sprites.update()

# 检测子弹与敌人的碰撞
hits = pygame.sprite.groupcollide(enemies, bullets, False, True)
for enemy, bullet_list in hits.items():
enemy.health -= len(bullet_list)
if enemy.health <= 0:
# 创建爆炸效果
explosion = Explosion(enemy.rect.center)
all_sprites.add(explosion)
enemy.kill()
score += SCORE_PER_KILL

# 检测敌人与玩家的碰撞
hits = pygame.sprite.spritecollide(player, enemies, True)
for hit in hits:
player.health -= 1
explosion = Explosion(hit.rect.center)
all_sprites.add(explosion)
if player.health <= 0:
game_over = True

# 渲染
screen.fill(BLACK)

if show_menu:
# 显示菜单
title_text = game_font.render("像素枪战", True, WHITE)
start_text = small_font.render("按空格键开始游戏", True, WHITE)
exit_text = small_font.render("按ESC键退出", True, WHITE)

screen.blit(title_text, (SCREEN_WIDTH//2 -
title_text.get_width()//2, SCREEN_HEIGHT//3))
screen.blit(start_text, (SCREEN_WIDTH//2 -
start_text.get_width()//2, SCREEN_HEIGHT//2))
screen.blit(exit_text, (SCREEN_WIDTH//2 -
exit_text.get_width()//2, SCREEN_HEIGHT//2 + 50))

elif game_over:
# 显示游戏结束画面
game_over_text = game_font.render("游戏结束", True, WHITE)
score_text = game_font.render(f"得分: {score}", True, WHITE)
restart_text = small_font.render("按空格键重新开始", True, WHITE)
exit_text = small_font.render("按ESC键退出", True, WHITE)

screen.blit(game_over_text, (SCREEN_WIDTH//2 -
game_over_text.get_width()//2, SCREEN_HEIGHT//4))
screen.blit(score_text, (SCREEN_WIDTH//2 -
score_text.get_width()//2, SCREEN_HEIGHT//3))
screen.blit(restart_text, (SCREEN_WIDTH//2 -
restart_text.get_width()//2, SCREEN_HEIGHT//2))
screen.blit(exit_text, (SCREEN_WIDTH//2 -
exit_text.get_width()//2, SCREEN_HEIGHT//2 + 50))

else:
# 绘制所有精灵
all_sprites.draw(screen)

# 显示分数和生命值
score_text = small_font.render(f"得分: {score}", True, WHITE)
health_text = small_font.render(f"生命值: {player.health}", True, WHITE)

screen.blit(score_text, (10, 10))
screen.blit(health_text, (10, 40))

# 显示准星
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, WHITE, (mouse_x, mouse_y), 8, 1)
pygame.draw.line(screen, WHITE, (mouse_x-5, mouse_y),
(mouse_x+5, mouse_y), 1)
pygame.draw.line(screen, WHITE, (mouse_x, mouse_y-5),
(mouse_x, mouse_y+5), 1)

# 更新显示
pygame.display.flip()

# 退出游戏
pygame.quit()
sys.exit()
[/mw_shl_code]
回复

使用道具 举报

23

主题

12

回帖

793

积分

高级会员

积分
793
 楼主| 发表于 2025-7-15 12:00:19 | 显示全部楼层
[C++] 纯文本查看 复制代码
[mw_shl_code=python,true]import pygame
import random
import math
import sys

# 初始化pygame
pygame.init()

# 确保中文显示正常
pygame.font.init()
font_path = pygame.font.match_font(
    'simsun') or pygame.font.match_font('simhei')
if not font_path:
    # 如果没有找到中文字体,使用默认字体
    font_path = pygame.font.get_default_font()
game_font = pygame.font.Font(font_path, 24)
small_font = pygame.font.Font(font_path, 16)

# 游戏窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("像素枪战")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 50, 50)
GREEN = (50, 255, 50)
BLUE = (50, 50, 255)
YELLOW = (255, 255, 0)
GRAY = (150, 150, 150)

# 游戏参数
FPS = 60
PLAYER_SPEED = 50
ENEMY_SPEED = 2
BULLET_SPEED = 50
ENEMY_SPAWN_RATE = 3000  # 毫秒
BULLET_COOLDOWN = 300  # 毫秒
MAX_ENEMIES = 10
ENEMY_HEALTH = 0
PLAYER_HEALTH = 114514
SCORE_PER_KILL = 10

# 精灵类


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.centery = SCREEN_HEIGHT // 2
        self.speed_x = 0
        self.speed_y = 0
        self.health = PLAYER_HEALTH
        self.last_shot = pygame.time.get_ticks()

    def update(self):
        self.speed_x = 0
        self.speed_y = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT] or keystate[pygame.K_a]:
            self.speed_x = -PLAYER_SPEED
        if keystate[pygame.K_RIGHT] or keystate[pygame.K_d]:
            self.speed_x = PLAYER_SPEED
        if keystate[pygame.K_UP] or keystate[pygame.K_w]:
            self.speed_y = -PLAYER_SPEED
        if keystate[pygame.K_DOWN] or keystate[pygame.K_s]:
            self.speed_y = PLAYER_SPEED

        # 移动玩家
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        # 保持玩家在屏幕内
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT
        if self.rect.top < 0:
            self.rect.top = 0

    def shoot(self):
        now = pygame.time.get_ticks()
        if now - self.last_shot > BULLET_COOLDOWN:
            self.last_shot = now
            mouse_x, mouse_y = pygame.mouse.get_pos()
            bullet = Bullet(self.rect.centerx,
                            self.rect.centery, mouse_x, mouse_y)
            all_sprites.add(bullet)
            bullets.add(bullet)
            return True
        return False


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((25, 25))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机在屏幕边缘生成敌人
        side = random.randint(1, 4)
        if side == 1:  # 上边
            self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
            self.rect.y = -self.rect.height
        elif side == 2:  # 右边
            self.rect.x = SCREEN_WIDTH
            self.rect.y = random.randint(0, SCREEN_HEIGHT - self.rect.height)
        elif side == 3:  # 下边
            self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
            self.rect.y = SCREEN_HEIGHT
        else:  # 左边
            self.rect.x = -self.rect.width
            self.rect.y = random.randint(0, SCREEN_HEIGHT - self.rect.height)
        self.speed = random.randint(1, ENEMY_SPEED)
        self.health = ENEMY_HEALTH

    def update(self):
        # 向玩家移动
        dx = player.rect.centerx - self.rect.centerx
        dy = player.rect.centery - self.rect.centery
        distance = max(1, math.sqrt(dx*dx + dy*dy))  # 避免除以零
        self.rect.x += (dx / distance) * self.speed
        self.rect.y += (dy / distance) * self.speed

        # 保持敌人在屏幕内
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT
        if self.rect.top < 0:
            self.rect.top = 0


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, target_x, target_y):
        super().__init__()
        self.image = pygame.Surface((8, 8))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y

        # 计算子弹方向
        dx = target_x - x
        dy = target_y - y
        distance = max(1, math.sqrt(dx*dx + dy*dy))  # 避免除以零
        self.speed_x = (dx / distance) * BULLET_SPEED
        self.speed_y = (dy / distance) * BULLET_SPEED

    def update(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        # 如果子弹超出屏幕,删除它
        if (self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT or
                self.rect.right < 0 or self.rect.left > SCREEN_WIDTH):
            self.kill()


class Explosion(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.size = random.randint(15, 30)
        self.image = pygame.Surface((self.size, self.size))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.lifetime = 10
        self.frame = 0

    def update(self):
        self.frame += 1
        if self.frame >= self.lifetime:
            self.kill()
        else:
            # 爆炸效果逐渐消失
            alpha = 255 - (self.frame * 255 // self.lifetime)
            self.image.set_alpha(alpha)


# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()

# 创建玩家
player = Player()
all_sprites.add(player)

# 游戏变量
score = 0
last_enemy_spawn = pygame.time.get_ticks()
game_over = False
show_menu = True
clock = pygame.time.Clock()

# 游戏循环
running = True
while running:
    clock.tick(FPS)

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and not game_over and not show_menu:
            if event.button == 1:  # 左键点击
                player.shoot()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and (game_over or show_menu):
                # 重置游戏
                game_over = False
                show_menu = False
                score = 0
                player.health = PLAYER_HEALTH

                # 清空精灵组
                for sprite in all_sprites:
                    if sprite != player:
                        sprite.kill()
                enemies.empty()
                bullets.empty()

                # 重新添加玩家
                if player not in all_sprites:
                    all_sprites.add(player)

            elif event.key == pygame.K_ESCAPE:
                running = False

    # 游戏逻辑
    if not game_over and not show_menu:
        # 生成敌人
        now = pygame.time.get_ticks()
        if now - last_enemy_spawn > ENEMY_SPAWN_RATE and len(enemies) < MAX_ENEMIES:
            last_enemy_spawn = now
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)
回复

使用道具 举报

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

本版积分规则

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