基于pygame的雷电战机小游戏

news2024/11/13 9:30:59
import pygame
import sys
import random

# 初始化 Pygame
pygame.init()

# 设置窗口尺寸
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("雷电战机")

# 设置颜色
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
WHITE = (255, 255, 255)

# 战机初始位置
plane_pos = [WIDTH // 2, HEIGHT - 100]  # 战机的中心位置

# 敌机列表
enemies = []
enemy_speed = 5  # 敌机移动速度

# 积分
score = 0

# 子弹类
class Bullet:
    def __init__(self, x, y, speed, damage):
        self.x = x
        self.y = y
        self.speed = speed
        self.damage = damage

    def move(self):
        self.y -= self.speed  # 子弹向上移动

    def draw(self):
        pygame.draw.rect(screen, YELLOW, (self.x - 2, self.y, 4, 10))  # 绘制子弹

# 创建敌机
def create_enemy():
    x = random.randint(0, WIDTH - 30)  # 随机生成敌机的 x 坐标
    enemies.append([x, 0])  # 敌机初始位置在屏幕顶部

# 创建子弹
def create_bullet():
    x = plane_pos[0]  # 子弹的 x 坐标与战机相同
    y = plane_pos[1] - 20  # 子弹的 y 坐标在战机上方
    # 随机选择子弹类型
    bullet_type = random.choice([
        {"speed": 10, "damage": 1},  # 普通子弹
        {"speed": 15, "damage": 2},  # 强力子弹
        {"speed": 5, "damage": 0.5}   # 弱力子弹
    ])
    return Bullet(x, y, bullet_type["speed"], bullet_type["damage"])

# 游戏主循环
bullets = []  # 子弹列表
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 获取按键状态
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and plane_pos[0] > 0:
        plane_pos[0] -= 5  # 向左移动
    if keys[pygame.K_RIGHT] and plane_pos[0] < WIDTH:
        plane_pos[0] += 5  # 向右移动
    if keys[pygame.K_UP] and plane_pos[1] > 0:
        plane_pos[1] -= 5  # 向上移动
    if keys[pygame.K_DOWN] and plane_pos[1] < HEIGHT:
        plane_pos[1] += 5  # 向下移动
    if keys[pygame.K_SPACE]:  # 按空格键发射子弹
        bullets.append(create_bullet())  # 添加新子弹到列表

    # 填充背景
    screen.fill(BLACK)

    # 绘制三角形作为战机
    point1 = (plane_pos[0], plane_pos[1] - 20)  # 顶点
    point2 = (plane_pos[0] - 15, plane_pos[1] + 10)  # 左下角
    point3 = (plane_pos[0] + 15, plane_pos[1] + 10)  # 右下角
    pygame.draw.polygon(screen, RED, [point1, point2, point3])  # 绘制战机

    # 创建敌机
    if random.randint(1, 30) == 1:  # 每30帧大约生成一个敌机
        create_enemy()

    # 更新并绘制敌机
    for enemy in enemies:
        enemy[1] += enemy_speed  # 敌机向下移动
        # 绘制敌机(使用三角形表示)
        enemy_points = [
            (enemy[0], enemy[1] - 20),  # 顶点
            (enemy[0] - 15, enemy[1] + 10),  # 左下角
            (enemy[0] + 15, enemy[1] + 10)   # 右下角
        ]
        pygame.draw.polygon(screen, GREEN, enemy_points)  # 绘制敌机

    # 更新并绘制子弹
    for bullet in bullets[:]:  # 使用切片以避免修改列表时出错
        bullet.move()  # 移动子弹
        bullet.draw()  # 绘制子弹

    # 检查子弹与敌机的碰撞
    bullets = [bullet for bullet in bullets if bullet.y > 0]  # 移除超出屏幕的子弹
    for bullet in bullets[:]:  # 使用切片以避免修改列表时出错
        for enemy in enemies[:]:  # 使用切片以避免修改列表时出错
            if (bullet.x > enemy[0] - 15 and bullet.x < enemy[0] + 15 and
                bullet.y < enemy[1] + 10 and bullet.y > enemy[1] - 20):
                bullets.remove(bullet)  # 移除子弹
                enemies.remove(enemy)  # 移除敌机
                score += 10 * bullet.damage  # 根据子弹的伤害增加积分
                break  # 退出内层循环

    # 移除超出屏幕的敌机
    enemies = [enemy for enemy in enemies if enemy[1] < HEIGHT]

    # 显示当前积分
    font = pygame.font.Font(None, 36)  # 创建字体对象
    score_surface = font.render(f"Score: {int(score)}", True, WHITE)  # 渲染积分文本
    screen.blit(score_surface, (10, 10))  # 在屏幕上绘制积分

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

    # 控制帧率
    pygame.time.Clock().tick(60)

实现效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

波束管理简介

波束管理简介 3GPP中&#xff0c;波束管理被定义为一组物理层或接入网高层的过程&#xff0c;用于获取和维护一组用于上行和下行传输或接收的gNB和UE波束。波束管理大致由&#xff1a;波束扫描&#xff0c;波束测量&#xff0c;波束判决&#xff0c;上报和指示&#xff0c;波束…

点亮星星的世界:当小孩得了自闭症该怎么办

在这个丰富多彩的世界里&#xff0c;每一个孩子都是独一无二的天使。然而&#xff0c;有一些孩子却仿佛被困在了自己的小小世界中&#xff0c;难以与外界正常交流和互动。他们是自闭症儿童&#xff0c;他们的世界充满了挑战和困惑&#xff0c;也让家长们陷入了深深的担忧和焦虑…

深入解析并发与并行:如何利用住宅代理加速网页抓取

引言 什么是并发执行&#xff1f;基本单位是什么&#xff1f; 什么是并行执行&#xff1f;和并发执行的区别是什么&#xff1f; 导致网页抓取缓慢的原因有哪些&#xff1f; 使用python进行网页抓取的并发性 并行性如何加速网页抓取 总结 引言 在当今数据驱动的世界中&am…

泛微Ecology9建模问题及解决办法记录(一)(按钮变灰、批量修改、导出、显示转换等)

1、为管理员和普通用户分别设置显示模版,其中普通用户的显示模版,“编辑‘’按钮置灰,不允许使用的方法 在用户显示模版页面中插入E9代码块如下: <script type="text/javascript"> /* * 请在下面编写JS代码 */ ModeForm.controlBtnDisabled(true); </…

“我王多鱼投了!”疯狂烧钱的AI大模型公司如何赚钱?

AI大模型到底有多烧钱&#xff1f; 或许最有发言权的就是OpenAI了&#xff0c;2022年其亏损大约翻了一番&#xff0c;达到约5.4亿美元。据悉&#xff0c;Altman曾私下建议&#xff0c;OpenAI可能会在未来几年尝试筹集多达1000亿美元的资金&#xff0c;以实现其开发足够先进的通…

Thinkphp6 反序列化漏洞分析

本文来自无问社区&#xff0c;更多实战内容可前往查看http://wwlib.cn/index.php/artread/artid/10431.html 版本&#xff1a;Thinkphp6&PHP7.3.4 TP 环境搭建利用 composer 命令进行&#xff0c;同时本次分析在 windows 环境下进行 composer create-project topthink/t…

佰朔资本:上市有什么好处?为什么有公司不愿上市?

公司上市或许带来的长处有&#xff1a; 1、融资途径拓宽。上市为公司供给了更广大的融资途径&#xff0c;通过发行股票公司可以敏捷筹集到大量资金&#xff0c;用于扩大生产规模、研制新产品、拓宽商场等。与银行贷款、发行债券等传统融资方法比较&#xff0c;上市融资不仅本钱…

【目标检测】YOLOV1

You Only Look Once: Unified, Real-Time Object Detection 1、核心思想 将整张图片作为网络的输入&#xff0c;直接在输出层对 BBox 的位置和类别进行回归。 Resize image&#xff1a;将输入图片resize到448x448。Run ConvNet&#xff1a;使用CNN提取特征&#xff0c;FC层输出…

Python神经网络在基因组学中的应用

在基因组学研究中&#xff0c;神经网络作为一种强大的工具&#xff0c;被广泛应用于基因型和表型之间的关联分析。通过构建神经网络模型&#xff0c;我们可以更好地理解遗传变异是如何影响个体的性状表现。本文将详细介绍如何使用Python实现这一过程&#xff0c;利用已知群体的…

一文读懂大语言模型:基础概念篇

在当今AI时代&#xff0c;大语言模型正以前所未有的速度重塑我们的世界。作为NLP领域的明星&#xff0c;它们不仅理解语言&#xff0c;更创造语言&#xff0c;开启了智能交互的新纪元。 本文将介绍着重介绍大模型的概念&#xff0c;帮助大家简单了解其技术原理、发展历程&#…

C++学习笔记----5、重用之设计(二)---- 为最优化重用结构化你的代码(1)

一定要在所有的层面在设计的一开始就考虑重用&#xff0c;也就是说&#xff0c;从一个独立的函数到一个类&#xff0c;直到整个库与框架。我们以后就把这些统称为部件。下面的策略会帮助你正确地组织代码。记住所有的这些策略关注的是你的代码的的通用目的。设计可重用代码第二…

2024上半年营业收入同比增长17%,一图看懂亚信安全2024半年报

2024上半年营业收入同比增长17%&#xff0c;贯彻健康经营&#xff0c;业绩企稳向好&#xff01; 云网安筑基 AI智绘未来 | 一图看懂亚信安全2024半年报

SAP DRC 交易与报表合规化

交易与报表合规化- SAP Document and Reporting Compliance(DRC) SAP DRC通过嵌入到端到端业务流程的源系统中的国家和地区特定内容&#xff0c;保证全球处理合规&#xff1b;利用统一的解决方案管理全球电子发票和法定报表&#xff0c;从而优化合规性&#xff0c;提高效率并提…

无线麦克风什么牌子最好,无线直播麦克风十大名牌推荐

​在数字化飞速发展的今天&#xff0c;无线领夹麦克风已经成为自媒体创作者、直播主播和专业录音师的重要工具。它们不仅小巧便携、操作简便&#xff0c;还具有出色的录音质量&#xff0c;极大地提升了音频录制的效率和质量。无论是户外探险的Vlog拍摄&#xff0c;还是室内直播…

基于Linux系统和ncurses库的贪吃蛇小游戏

目录 前言 一、地图&#xff0c;蛇身&#xff0c;食物设计 二、蛇和食物的初始化 食物 蛇 三、添加和删除蛇身节点 四、main函数和蛇运行方向线程 五、地图刷新线程 最终源码 前言 ncurses库是什么我并没有深入了解&#xff0c;本文的重点也不是ncurses的使用&#xff…

BUUCTF PWN wp--pwn1_sctf_2016

第一步 checksec&#xff0c;并检查该题的保护机制&#xff0c;32位 Arch: i386-32-little 这表示程序的架构是32位的i386&#xff08;即x86&#xff09;&#xff0c;并且使用小端序&#xff08;little-endian&#xff09;存储方式。这意味着程序是为32位系统设计的。RELRO: Pa…

期权末日轮行情即将来临!注意两个操作更好盈利!

今天带你了解期权末日轮行情即将来临&#xff01;注意两个操作更好盈利&#xff01;期权末日轮&#xff0c;就是指在期权合约到期前的最后几天&#xff0c;比如50ETF期权品种的到期日是每个月第四个星期的星期三&#xff0c;那么在最后一个星期就有可能发生末日轮行情了。 末日…

Linux安装Navicat Premium

一、安装Navicat Premium17 1、下载安装包 https://www.navicat.com.cn/download/navicat-premium#linux 2、赋执行权限 //假设安装包在/etc/navicat目录下 cd /etc/navicat chmod x navicat17-premium-cs-x86_64.AppImage 3、启动应用程序 ./navicat17-premium-cs-x86_64…

python.exe -m pip install --upgrade pip报错解决

引言 在执行命令的时候&#xff0c;提示可以更新版本 [notice] A new release of pip is available: 24.1.2 -> 24.2 [notice] To update, run: python.exe -m pip install --upgrade pip按照提示&#xff0c;直接使用 python.exe -m pip install --upgrade pip 命令进行更…

Cocos Creator2D游戏开发(15)---预制体和按钮的绑定以及冷却效果的实现

场景: 植物大战僵尸中,种植植物前,要判断状态,只有在阳光充足时才能点击 图片资源: 预制体的创建,创建一个空节点命名: CardTemplate,将三张豌豆射手相关的图片拖入 如下图 其中card_mask图片中的透明度改为150; 在assets中创建prefab文件夹,将CardTemplate节点直接拖入pre…