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

坦克大战框架

[复制链接]

694

主题

1082

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22801
发表于 2023-7-30 19:18:45 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import sys

pygame.init()

# Set up the window
window_width, window_height = 400, 400
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Moving Square with Bullets")

# Colors
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

# Square properties
square_size = 50
square_x, square_y = window_width // 2, window_height // 2
square_speed = 5

# Bullet properties
bullet_radius = 5
bullet_speed = 8
bullets = []

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # Get the state of all keys
    keys = pygame.key.get_pressed()

    # Move the square based on the pressed keys
    if keys[pygame.K_LEFT]:
        square_x -= square_speed
    if keys[pygame.K_RIGHT]:
        square_x += square_speed
    if keys[pygame.K_UP]:
        square_y -= square_speed
    if keys[pygame.K_DOWN]:
        square_y += square_speed

    # Shoot a bullet on pressing the spacebar
    if keys[pygame.K_SPACE]:
        bullets.append([square_x + square_size // 2,
                       square_y + square_size // 2])

    # Move the bullets
    for bullet in bullets:
        bullet[1] -= bullet_speed

    # Clear the screen
    window.fill(white)

    # Draw the square
    pygame.draw.rect(
        window, black, (square_x, square_y, square_size, square_size))

    # Draw the bullets
    for bullet in bullets:
        pygame.draw.circle(window, red, (bullet[0], bullet[1]), bullet_radius)

    # Update the display
    pygame.display.update()

    # Control the frame rate
    clock.tick(60)

回复

使用道具 举报

694

主题

1082

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22801
 楼主| 发表于 2023-7-30 19:33:30 | 显示全部楼层
[Python] 纯文本查看 复制代码
import pygame
import sys
import random
import math

pygame.init()

# 设置窗口
窗口宽度, 窗口高度 = 800, 600
窗口 = pygame.display.set_mode((窗口宽度, 窗口高度))
pygame.display.set_caption("方块和敌人射击游戏")

# 颜色
白色 = (255, 255, 255)
黑色 = (0, 0, 0)
红色 = (255, 0, 0)
蓝色 = (0, 0, 255)

# 方块属性
方块大小 = 50
方块_x, 方块_y = 窗口宽度 // 2, 窗口高度 // 2
方块速度 = 5
方块血量 = 100

# 子弹属性
子弹半径 = 5
子弹速度 = 8
子弹列表 = []

# 敌人属性
敌人大小 = 30
敌人_x, 敌人_y = random.randint(100, 窗口宽度 - 100), random.randint(100, 窗口高度 - 100)
敌人速度 = 3
敌人血量 = 100
敌人发射间隔 = 60
敌人发射计数 = 0
敌人子弹列表 = []

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 获取所有按键的状态
    按键状态 = pygame.key.get_pressed()

    # 根据按下的箭头键来移动方块
    if 按键状态[pygame.K_LEFT]:
        方块_x -= 方块速度
    if 按键状态[pygame.K_RIGHT]:
        方块_x += 方块速度
    if 按键状态[pygame.K_UP]:
        方块_y -= 方块速度
    if 按键状态[pygame.K_DOWN]:
        方块_y += 方块速度

    # 按下空格键发射子弹
    if 按键状态[pygame.K_SPACE]:
        子弹列表.append([方块_x + 方块大小 // 2, 方块_y + 方块大小 // 2])

    # 移动子弹
    for 子弹 in 子弹列表:
        子弹[1] -= 子弹速度

    # 敌人随机移动
    敌人_x += random.randint(-敌人速度, 敌人速度)
    敌人_y += random.randint(-敌人速度, 敌人速度)

    # 碰撞检测,判断子弹是否击中敌人
    for 子弹 in 子弹列表:
        子弹_x, 子弹_y = 子弹
        距离平方 = (敌人_x - 子弹_x) ** 2 + (敌人_y - 子弹_y) ** 2
        if 距离平方 < 敌人大小 ** 2:
            敌人血量 -= 1
            子弹列表.remove(子弹)

    # 敌人发射方形子弹
    敌人发射计数 += 1
    if 敌人发射计数 >= 敌人发射间隔:
        敌人子弹列表.append([敌人_x + 敌人大小 // 2, 敌人_y + 敌人大小])
        敌人发射计数 = 0

    # 移动敌人子弹
    for 子弹 in 敌人子弹列表:
        子弹[1] += 子弹速度

    # 碰撞检测,判断敌人子弹是否击中方块
    for 子弹 in 敌人子弹列表:
        子弹_x, 子弹_y = 子弹
        距离平方 = (方块_x + 方块大小 // 2 - 子弹_x) ** 2 + (方块_y + 方块大小 // 2 - 子弹_y) ** 2
        if 距离平方 < 子弹半径 ** 2:
            方块血量 -= 1
            敌人子弹列表.remove(子弹)

    # 清空屏幕
    窗口.fill(白色)

    # 绘制方块
    pygame.draw.rect(窗口, 黑色, (方块_x, 方块_y, 方块大小, 方块大小))

    # 绘制敌人
    pygame.draw.polygon(窗口, 蓝色, [(敌人_x, 敌人_y), (敌人_x - 敌人大小, 敌人_y + 敌人大小),
                                 (敌人_x + 敌人大小, 敌人_y + 敌人大小)])

    # 绘制子弹
    for 子弹 in 子弹列表:
        pygame.draw.circle(窗口, 红色, (子弹[0], 子弹[1]), 子弹半径)

    # 绘制敌人子弹
    for 子弹 in 敌人子弹列表:
        pygame.draw.rect(窗口, 黑色, (子弹[0] - 子弹半径, 子弹[1], 子弹半径 * 2, 子弹半径 * 2))

    # 显示方块和敌人的血量
    字体 = pygame.font.SysFont(None, 30)
    方块血量文本 = 字体.render(f"方块血量:{方块血量}", True, 黑色)
    敌人血量文本 = 字体.render(f"敌人血量:{敌人血量}", True, 黑色)
    窗口.blit(方块血量文本, (10, 10))
    窗口.blit(敌人血量文本, (10, 40))

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

    # 控制帧率
    clock.tick(60)
回复

使用道具 举报

694

主题

1082

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22801
 楼主| 发表于 2023-7-30 19:44:34 | 显示全部楼层
[Python] 纯文本查看 复制代码
import pygame
import sys
import random
import math

pygame.init()

# 设置窗口
窗口宽度, 窗口高度 = 800, 600
窗口 = pygame.display.set_mode((窗口宽度, 窗口高度))
pygame.display.set_caption("方块和敌人射击游戏")

# 颜色
白色 = (255, 255, 255)
黑色 = (0, 0, 0)
红色 = (255, 0, 0)
蓝色 = (0, 0, 255)

# 方块属性
方块大小 = 50
方块_x, 方块_y = 窗口宽度 // 2, 窗口高度 // 2
方块速度 = 5
方块血量 = 50

# 子弹属性
子弹半径 = 5
子弹速度 = 8
子弹列表 = []

# 敌人属性
敌人大小 = 30
敌人_x, 敌人_y = random.randint(100, 窗口宽度 - 100), random.randint(100, 窗口高度 - 100)
敌人速度 = 3
敌人血量 = 100
敌人发射间隔 = 30
敌人发射计数 = 0
敌人子弹列表 = []

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 获取所有按键的状态
    按键状态 = pygame.key.get_pressed()

    # 根据按下的箭头键来移动方块
    if 按键状态[pygame.K_LEFT]:
        方块_x -= 方块速度
    if 按键状态[pygame.K_RIGHT]:
        方块_x += 方块速度
    if 按键状态[pygame.K_UP]:
        方块_y -= 方块速度
    if 按键状态[pygame.K_DOWN]:
        方块_y += 方块速度

    # 按下空格键发射子弹
    if 按键状态[pygame.K_SPACE]:
        子弹列表.append([方块_x + 方块大小 // 2, 方块_y + 方块大小 // 2])

    # 移动子弹
    for 子弹 in 子弹列表:
        子弹[1] -= 子弹速度

    # 敌人随机移动
    敌人_x += random.randint(-敌人速度, 敌人速度)
    敌人_y += random.randint(-敌人速度, 敌人速度)

    # 碰撞检测,判断子弹是否击中敌人
    for 子弹 in 子弹列表:
        子弹_x, 子弹_y = 子弹
        距离平方 = (敌人_x - 子弹_x) ** 2 + (敌人_y - 子弹_y) ** 2
        if 距离平方 < 敌人大小 ** 2:
            敌人血量 -= 1
            子弹列表.remove(子弹)

    # 敌人连续发射菱形子弹
    敌人发射计数 += 1
    if 敌人发射计数 >= 敌人发射间隔:
        敌人子弹列表.append([敌人_x, 敌人_y + 敌人大小 // 2])
        敌人子弹列表.append([敌人_x + 敌人大小 // 2, 敌人_y])
        敌人子弹列表.append([敌人_x + 敌人大小, 敌人_y + 敌人大小 // 2])
        敌人子弹列表.append([敌人_x + 敌人大小 // 2, 敌人_y + 敌人大小])
        敌人发射计数 = 0

    # 移动敌人子弹
    for 子弹 in 敌人子弹列表:
        dx = 方块_x + 方块大小 // 2 - 子弹[0]
        dy = 方块_y + 方块大小 // 2 - 子弹[1]
        距离 = math.sqrt(dx ** 2 + dy ** 2)
        子弹[0] += int(子弹速度 * dx / 距离)
        子弹[1] += int(子弹速度 * dy / 距离)

    # 碰撞检测,判断敌人子弹是否击中方块
    for 子弹 in 敌人子弹列表:
        子弹_x, 子弹_y = 子弹
        距离平方 = (方块_x + 方块大小 // 2 - 子弹_x) ** 2 + (方块_y + 方块大小 // 2 - 子弹_y) ** 2
        if 距离平方 < 子弹半径 ** 2:
            方块血量 -= 1
            敌人子弹列表.remove(子弹)

    # 清空屏幕
    窗口.fill(白色)

    # 绘制方块
    pygame.draw.rect(窗口, 黑色, (方块_x, 方块_y, 方块大小, 方块大小))

    # 绘制敌人
    pygame.draw.polygon(窗口, 蓝色, [(敌人_x, 敌人_y), (敌人_x - 敌人大小, 敌人_y + 敌人大小),
                                 (敌人_x + 敌人大小, 敌人_y + 敌人大小)])

    # 绘制子弹
    for 子弹 in 子弹列表:
        pygame.draw.circle(窗口, 红色, (子弹[0], 子弹[1]), 子弹半径)

    # 绘制敌人子弹
    for 子弹 in 敌人子弹列表:
        pygame.draw.rect(窗口, 黑色, (子弹[0] - 子弹半径, 子弹[1], 子弹半径 * 2, 子弹半径 * 2))

    # 显示方块和敌人的血量
    字体 = pygame.font.SysFont(None, 30)
    方块血量文本 = 字体.render(f"方块血量:{方块血量}", True, 黑色)
    敌人血量文本 = 字体.render(f"敌人血量:{敌人血量}", True, 黑色)
    窗口.blit(方块血量文本, (10, 10))
    窗口.blit(敌人血量文本, (10, 40))

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

    # 控制帧率
    clock.tick(60)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 02:59 , Processed in 0.044130 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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