c++三维移动射击

大家好,我是love-putter,距离上一篇文章的发布已经一年了,在这一年里,经过时间的沉淀,希望给大家带来更好的作品,废话不多说,上代码

#include <iostream>
#include <ctime>
#include <cstdlib>

// 模拟玩家类
class Player {
public:
    int x;
    int y;
    int z;
    int health;

    Player() : x(0), y(0), z(0), health(100) {}

    void move(int dx, int dy, int dz) {
        x += dx;
        y += dy;
        z += dz;
    }
};

// 模拟敌人类
class Enemy {
public:
    int x;
    int y;
    int z;
    int health;

    Enemy() : x(rand() % 10), y(rand() % 10), z(rand() % 10), health(50) {}

    void move(int dx, int dy, int dz) {
        x += dx;
        y += dy;
        z += dz;
    }
};

// 模拟射击函数,简单判断是否击中敌人
bool shoot(Player& player, Enemy& enemy) {
    // 这里简单用距离判断是否击中,实际游戏要复杂得多的碰撞检测
    int distance = (player.x - enemy.x) * (player.x - enemy.x) +
                   (player.y - enemy.y) * (player.y - enemy.y) +
                   (player.z - enemy.z) * (player.z - enemy.z);
    if (distance < 4) {  // 假设距离小于某个值算击中
        enemy.health -= 20;
        return true;
    }
    return false;
}

int main() {
    srand(static_cast<unsigned int>(time(nullptr)));
    Player player;
    Enemy enemy;

    std::cout << "游戏开始!你是玩家,尝试击败敌人吧!" << std::endl;
    while (player.health > 0 && enemy.health > 0) {
        std::cout << "你的位置 (x, y, z): (" << player.x << ", " << player.y << ", " << player.z << "),生命值: " << player.health << std::endl;
        std::cout << "敌人位置 (x, y, z): (" << enemy.x << ", " << enemy.y << ", " << enemy.z << "),生命值: " << enemy.health << std::endl;
        std::string command;
        std::cout << "输入移动命令(格式如 'move 1 0 0' 表示x方向移动1单位)或者射击命令'shoot': ";
        std::cin >> command;
        if (command == "move") {
            int dx, dy, dz;
            std::cin >> dx >> dy >> dz;
            player.move(dx, dy, dz);
            enemy.move(rand() % 3 - 1, rand() % 3 - 1, rand() % 3 - 1);
        } else if (command == "shoot") {
            if (shoot(player, enemy)) {
                std::cout << "击中敌人了!" << std::endl;
            } else {
                std::cout << "没击中敌人。" << std::endl;
            }
        }
    }
    if (player.health <= 0) {
        std::cout << "你输了,被敌人击败了!" << std::endl;
    } else {
        std::cout << "你赢了,成功击败敌人!" << std::endl;
    }
    return 0;
}

  1. 类定义方面
    • 定义了 Player 类,代表玩家,有 xyz 三个坐标属性以及 health(生命值)属性,通过构造函数初始化坐标为 (0, 0, 0),生命值为 100,同时提供 move 方法用于改变玩家在 3D 空间中的位置。
    • 定义了 Enemy 类,类似玩家,坐标属性初始化为 0 到 9 之间的随机值,生命值初始为 50,同样有 move 方法用于移动敌人在空间中的位置。
  2. 游戏逻辑方面
    • shoot 函数实现了简单的射击判定逻辑,通过计算玩家和敌人在 3D 空间中的距离(使用坐标差值平方和来模拟距离计算),若距离小于 4 则判定击中敌人,减少敌人 20 点生命值,并返回 true,否则返回 false
    • 在 main 函数中,先初始化随机数生成器,创建玩家和敌人对象,然后进入主循环。在循环里,不断输出玩家和敌人的位置、生命值信息,等待用户输入 move 命令(后跟坐标增量来移动角色)或者 shoot 命令(尝试射击敌人),根据不同命令执行相应操作,直到玩家或者敌人生命值小于等于 0,最后输出游戏胜负结果。

  1. 命名规范

    • 变量名和函数名可以更加具有描述性,比如 move 函数的参数 dxdydz,可以使用类似 movementXmovementYmovementZ 这样的名称,让代码可读性更强,尤其是对于复杂项目后续维护或者他人阅读代码时更友好。
    • 类名也可以遵循更常见的命名规范,比如采用大写字母开头的驼峰命名法,像 Player 和 Enemy 这样是合适的,但如果项目扩充,保持统一规范很重要。
  2. 输入处理健壮性

    • 当前代码对于用户输入的命令及参数没有做充分的错误处理。例如,当用户输入 move 命令但没有按正确格式输入三个参数时,程序会出现未定义行为(可能崩溃或者导致后续逻辑出错)。可以添加输入验证逻辑,确保输入的参数是合法的数字等,比如可以使用 std::stringstream 结合异常处理来解析输入的字符串为数字并验证格式。

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

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

相关文章

LLM之RAG实战(五十)| FastAPI:构建基于LLM的WEB接口界面

FastAPI是WEB UI接口&#xff0c;随着LLM的蓬勃发展&#xff0c;FastAPI的生态也迎来了新的机遇。本文将围绕FastAPI、OpenAI的API以及FastCRUD&#xff0c;来创建一个个性化的电子邮件写作助手&#xff0c;以展示如何结合这些技术来构建强大的应用程序。 下面我们开始分步骤操…

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…

CNAS软件实验室认可费用清单,如何规划预算方案?

CNAS软件实验室在申请认可前&#xff0c;需要按照CNAS相关认可文件的要求&#xff0c;建立完善的CNAS软件实验室质量管理体系&#xff0c;试运行六个月&#xff0c;且覆盖全部质量要素后&#xff0c;向CNAS认可委提交申请&#xff0c;等待专家的审查。在前期的筹备工作中&#…

【2024 Dec 超实时】编辑安装llama.cpp并运行llama

首先讲一下环境 这是2024 年12月&#xff0c;llama.cpp 的编译需要cmake 呜呜呜 网上教程都是make 跑的。反正我现在装的时候make已经不再适用了&#xff0c;因为工具的版本&#xff0c;捣鼓了很久。 ubuntu 18 conda env内置安装。 以下是可以完美编译llama.cpp的测试工具版…

优化移动端H5:常见问题与解决方案

移动端H5开发中的“坑”与解决方案 本文介绍了开发中遇到的几个关于移动端H5开发中的小问题&#xff0c;以及解决的方法。 一、iOS滑动不流畅问题 在iOS设备上&#xff0c;H5页面的滑动效果有时会出现不流畅的情况&#xff0c;特别是在页面高度超过一屏时。这通常是由于iOS的…

Visual Studio 2022+CMake配置PCL1.14.1

前言 本教程只是提供高效的PCL配置流程&#xff0c;不提供Qt环境配置&#xff0c;如果需要GUI界面&#xff0c;则需要自寻查找Cmake配置QT的教程。请相信&#xff0c;在CMake之下没有任何事是困难的&#xff0c;最困难的工作已经由前辈们完成。因此&#xff0c;对于C用户来说学…

Dify工具前奏:一个好玩的镜像,selenium

文章目录 按照惯例,闲聊开篇通义千问给出的回答,蛮有趣的。什么是selenium?使用场景缺点按照惯例,闲聊开篇 眼看就要过0点了,今天写点有把握的。 我先卖个关子,问你们一个问题: 我用mobaxterm或者其它的工具,ssh访问到远程服务器。但我想在那台机器上打开浏览器该怎么…

C++多线程实战:掌握图像处理高级技巧

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 在当今的计算世界中,…

C++在关键嵌入式软件领域逐步取代 Ada 的演进历程

第一章&#xff1a;引言 1.1 Ada 与 C在嵌入式系统中的角色 在嵌入式系统开发领域的漫长演进历程中&#xff0c;Ada 与 C宛如两颗璀璨而又各具特色的星辰&#xff0c;交替影响着该领域的发展轨迹。它们不仅代表了两种不同的编程哲学&#xff0c;也反映了不同时期对软件可靠性…

FedAdam算法:供给方信用,数据质量;更新一致性

FedAdam算法:供给方信用,数据质量;更新一致性 FedAdam算法概述 FedAdam是一种联邦学习(Federated Learning)算法。联邦学习是一种机器学习技术,它允许在多个设备或数据中心(称为客户端)上训练模型,而无需将数据集中到一个中央服务器,从而保护数据隐私。FedAdam主要用于…

高项 - 法律法规与标准规范

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 博文更新参考时间点&#xff1a;2024-12 高项 - 章节与知识点汇总&#xff1a;点击跳转 文章目录 高项 - 法律法规与标准规范法律法规民法典&#xff08;合同编&#xff09;招标投标法政府采购法专利法著作权法商…

css 布局方式

1. 标准流布局&#xff08;Normal Flow&#xff09; 描述&#xff1a;这是最基础的布局方式&#xff0c;元素按照文档的顺序从上到下排列&#xff0c;块级元素垂直排列&#xff0c;内联元素水平排列。应用&#xff1a;适用于大部分简单的网页布局。示例&#xff1a; <div&…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…

基于小程序实现地图定位、轨迹绘制、地图标点、快捷导航、唤醒导航APP、开箱即用

目录 前言研究背景与意义研究目标与内容研究方法与技术路线小程序地图组件介绍定位技术与原理轨迹绘制技术地图标注与标记功能地图定位与轨迹绘制功能实现定位功能设计与实现获取用户当前位置总结说明代码块前言 研究背景与意义 地图定位和轨迹追踪作为智能手机中常见的功能之…

计算机网络之网络层超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

【数字花园】数字花园(个人网站、博客)搭建经历汇总教程

目录 写在最最前面第一章&#xff1a;netlify免费搭建数字花园相关教程使用的平台步骤信息管理 第二章&#xff1a;本地部署数字花园数字花园网站本地手动部署方案1. 获取网站源码2.2 安装 Node.js 3. 项目部署3.1 安装项目依赖3.2 构建项目3.3 启动http服务器 4. 本地预览5. 在…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫 机

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

问题 C: B001 快乐的蠕虫

题目描述 有一只快乐的蠕虫居住在一个mn大小的网格中。在网格的某些位置放置了k块石头。网格中的每个位置要么是空的&#xff0c;要么放置了一块石头。当蠕虫睡觉时&#xff0c;它在水平方向或垂直方向上躺着&#xff0c;把身体尽可能伸展开来。蠕虫的身躯既不能进入到放有石块…

Qt实现自定义行编辑器

引言 开发环境项目结构ui界面设计示例代码运行效果总结qt中原有的行编辑器无法满足当前的需要,所以需要自定义行编辑器。 通过上下按键切换到不同的行编辑器,在选中的行编辑器中输入数字,编辑器呈现边框,编辑后按下回车键保存之前编辑的数值,没有按下回车键直接切换上下键…

得物使用AutoMQ构建海量数据处理的新一代可观测性架构

引言 得物作为全球领先的潮流网购社区&#xff0c;日益增长的用户和数据带来了巨大的技术挑战。当前&#xff0c;得物的可观测性平台每天生成数PB级Trace数据和数万亿条Span记录&#xff0c;要求平台具备高效的实时处理能力和低成本的数据存储解决方案。 传统的存算一体架构将…