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

坦克对战游戏

[复制链接]

23

主题

12

回帖

793

积分

高级会员

积分
793
发表于 2025-7-17 10:47:53 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import sys
import random
import math

# 初始化pygame
pygame.init()

# 设置窗口
WIDTH, HEIGHT = 800, 600
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("坦克对战游戏")

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

# 坦克类


class Tank:
    def __init__(self, x, y, color, controls):
        self.x = x
        self.y = y
        self.color = color
        self.width = 40
        self.height = 40
        self.speed = 3
        self.direction = "up"  # 初始方向向上
        self.health = 100
        self.controls = controls  # 控制键位
        self.last_shot = 0
        self.shoot_delay = 500  # 射击延迟(毫秒)

    def draw(self, win):
        # 绘制坦克主体
        pygame.draw.rect(
            win, self.color, (self.x, self.y, self.width, self.height))

        # 绘制坦克炮管
        if self.direction == "up":
            pygame.draw.rect(
                win, YELLOW, (self.x + self.width//2 - 2, self.y - 15, 4, 20))
        elif self.direction == "down":
            pygame.draw.rect(win, YELLOW, (self.x + self.width //
                             2 - 2, self.y + self.height - 5, 4, 20))
        elif self.direction == "left":
            pygame.draw.rect(
                win, YELLOW, (self.x - 15, self.y + self.height//2 - 2, 20, 4))
        elif self.direction == "right":
            pygame.draw.rect(win, YELLOW, (self.x + self.width -
                             5, self.y + self.height//2 - 2, 20, 4))

        # 绘制坦克生命值条
        health_bar_length = 40
        health_bar_height = 5
        pygame.draw.rect(win, RED, (self.x, self.y - 10,
                         health_bar_length, health_bar_height))
        health_ratio = self.health / 100
        pygame.draw.rect(win, GREEN, (self.x, self.y - 10,
                         health_bar_length * health_ratio, health_bar_height))

    def move(self, keys):
        old_x, old_y = self.x, self.y

        # 移动控制
        if keys[self.controls["up"]]:
            self.y -= self.speed
            self.direction = "up"
        if keys[self.controls["down"]]:
            self.y += self.speed
            self.direction = "down"
        if keys[self.controls["left"]]:
            self.x -= self.speed
            self.direction = "left"
        if keys[self.controls["right"]]:
            self.x += self.speed
            self.direction = "right"

        # 边界检查
        if self.x < 0:
            self.x = 0
        if self.x > WIDTH - self.width:
            self.x = WIDTH - self.width
        if self.y < 0:
            self.y = 0
        if self.y > HEIGHT - self.height:
            self.y = HEIGHT - self.height

        # 碰撞检查
        for obstacle in obstacles:
            if (self.x < obstacle.x + obstacle.width and
                self.x + self.width > obstacle.x and
                self.y < obstacle.y + obstacle.height and
                    self.y + self.height > obstacle.y):
                self.x, self.y = old_x, old_y
                break

    def can_shoot(self, current_time):
        return current_time - self.last_shot > self.shoot_delay

    def shoot(self, current_time, bullets, bullet_color):
        if self.can_shoot(current_time):
            self.last_shot = current_time

            if self.direction == "up":
                bullet = Bullet(self.x + self.width//2 - 2,
                                self.y - 15, 4, 10, 8, "up", bullet_color)
            elif self.direction == "down":
                bullet = Bullet(self.x + self.width//2 - 2, self.y +
                                self.height + 5, 4, 10, 8, "down", bullet_color)
            elif self.direction == "left":
                bullet = Bullet(self.x - 15, self.y + self.height //
                                2 - 2, 10, 4, 8, "left", bullet_color)
            elif self.direction == "right":
                bullet = Bullet(self.x + self.width + 5, self.y +
                                self.height//2 - 2, 10, 4, 8, "right", bullet_color)

            bullets.append(bullet)
            return True
        return False

# 子弹类


class Bullet:
    def __init__(self, x, y, width, height, speed, direction, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.speed = speed
        self.direction = direction
        self.color = color

    def draw(self, win):
        pygame.draw.rect(
            win, self.color, (self.x, self.y, self.width, self.height))

    def move(self):
        if self.direction == "up":
            self.y -= self.speed
        elif self.direction == "down":
            self.y += self.speed
        elif self.direction == "left":
            self.x -= self.speed
        elif self.direction == "right":
            self.x += self.speed

    def off_screen(self):
        return (self.x < 0 or self.x > WIDTH or
                self.y < 0 or self.y > HEIGHT)

    def check_collision(self, tank):
        return (self.x < tank.x + tank.width and
                self.x + self.width > tank.x and
                self.y < tank.y + tank.height and
                self.y + self.height > tank.y)

    def check_obstacle_collision(self, obstacles):
        for obstacle in obstacles:
            if (self.x < obstacle.x + obstacle.width and
                self.x + self.width > obstacle.x and
                self.y < obstacle.y + obstacle.height and
                    self.y + self.height > obstacle.y):
                return True
        return False

# 障碍物类


class Obstacle:
    def __init__(self, x, y, width, height, color=GRAY):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color

    def draw(self, win):
        pygame.draw.rect(
            win, self.color, (self.x, self.y, self.width, self.height))

# 创建地图


def create_map():
    obstacles = []

    # 边界墙
    obstacles.append(Obstacle(0, 0, WIDTH, 10))
    obstacles.append(Obstacle(0, 0, 10, HEIGHT))
    obstacles.append(Obstacle(0, HEIGHT - 10, WIDTH, 10))
    obstacles.append(Obstacle(WIDTH - 10, 0, 10, HEIGHT))

    # 中间障碍物
    for _ in range(8):
        x = random.randint(100, WIDTH - 100)
        y = random.randint(100, HEIGHT - 100)
        width = random.randint(50, 150)
        height = random.randint(50, 150)
        obstacles.append(Obstacle(x, y, width, height))

    return obstacles

# 显示文字


def draw_text(win, text, size, x, y, color=WHITE):
    font = pygame.font.SysFont("simsun", size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    win.blit(text_surface, text_rect)

# 主函数


def main():
    clock = pygame.time.Clock()

    # 创建玩家坦克
    player1 = Tank(100, HEIGHT // 2, BLUE, {
        "up": pygame.K_w,
        "down": pygame.K_s,
        "left": pygame.K_a,
        "right": pygame.K_d,
        "shoot": pygame.K_SPACE
    })

    player2 = Tank(WIDTH - 100, HEIGHT // 2, RED, {
        "up": pygame.K_UP,
        "down": pygame.K_DOWN,
        "left": pygame.K_LEFT,
        "right": pygame.K_RIGHT,
        "shoot": pygame.K_RCTRL
    })


回复

使用道具 举报

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

本版积分规则

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