C++学习之格斗小游戏综合案例

C++格斗游戏效果视频

1.案例简介

#include "broadSword.h"


//构造函数
BroadSword::BroadSword()
{
    FileManager fm;
    map<string, map<string, string>> mWeapon;
    fm.loadCSVData("Weapons.csv", mWeapon);

    //武器id
    string id = mWeapon["2"]["weaponId"];

    //武器名称
    this->weaponName = mWeapon[id]["weaponName"];
    //武器攻击力
    this->baseDamage = atoi(mWeapon[id]["weaponAtk"].c_str());
    //武器暴击系数
    this->critPlus = atoi(mWeapon[id]["weaponCritPlus"].c_str());
    //武器暴击率
    this->critRate = atoi(mWeapon[id]["weaponCritRate"].c_str());
    //武器吸血系数
    this->suckPlus = atoi(mWeapon[id]["weaponSuckPlus"].c_str());
    //武器吸血率
    this->suckRate = atoi(mWeapon[id]["weaponSuckRate"].c_str());
    //武器冰冻率
    this->frozenRate = atoi(mWeapon[id]["weaponFrozenRate"].c_str());
}

//获取基础伤害
int BroadSword::getBaseDamage()
{
    return this->baseDamage;
}

//暴击效果  返回值大于0 触发暴击 否则不触发
int BroadSword::getCrit()
{
    if (isTrigger(this->critRate))
    {
        return this->baseDamage * this->critPlus;
    }
    else
    {
        return 0;
    }
}

//吸血效果 返回值大于0 触发吸血 否则不触发
int BroadSword::getSuckBlood()
{
    if (isTrigger(this->suckRate))
    {
        return this->baseDamage * this->suckPlus;
    }
    else
    {
        return 0;
    }

}

//冰冻效果 返回true代表触发 否则不触发
bool BroadSword::getFrozen()
{
    if (isTrigger(this->frozenRate))
    {
        return true;
    }
    else
    {
        return false;
    }

}

//触发概率的算法
bool BroadSword::isTrigger(int rate)
{
    int num = rand() % 100 + 1;  // 1 ~ 100
    if (num <= rate)
    {
        return true;
    }
    return false;

}

2.CSV文件制作

3.解析单行CSV数据

#include "fileManager.h"

//加载CSV格式文件
void FileManager::loadCSVData(string path, map<string, map<string, string>>& mData)
{
    //读文件
    ifstream ifs(path);

    if (!ifs.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }

    //第一个数据
    string firstLine;
    ifs >> firstLine;


    //cout << "第一行数据为: " << firstLine << endl;
    //heroId,heroName,heroHp,heroAtk,heroDef,heroInfo

    vector<string>vFirst; //第一行解析后数据放入的容器

    this->parseLineToVector(firstLine, vFirst);

    //测试
    /*for (vector<string>::iterator it = vFirst.begin(); it != vFirst.end(); it++)
    {
        cout << *it << endl; 
    }*/

    string otherLine;
    while (ifs >> otherLine)
    {
        //cout << "otherLine = " << otherLine << endl;

        vector<string>vOther;

        this->parseLineToVector(otherLine, vOther);

        map<string, string>m;
        for (int i = 0; i < vFirst.size(); i++)
        {
            m.insert(make_pair(vFirst[i], vOther[i]));
        }
        //将小map容器插入到大map容器中
        mData.insert(make_pair(vOther[0], m));
    }

    //cout << "第一个英雄姓名: " << mData["1"]["heroName"] << endl;
    //cout << "第二个英雄血量: " << mData["2"]["heroHp"] << endl;
    //cout << "第三个英雄攻击力: " << mData["3"]["heroAtk"] << endl;
}

//解析单行数据到vector容器中
void FileManager::parseLineToVector(string line, vector<string>& v)
{
    int pos = -1;
    int start = 0;

    while (true)
    {
        pos = (int)line.find(",", start);
        if (pos == -1)
        {
            //最后一个单词处理
            string temp = line.substr(start);
            v.push_back(temp);
            break;
        }
        string temp = line.substr(start, pos - start);
        v.push_back(temp);
        start = pos + 1;
    }

}

4.解析全部CSV数据

5.创建武器基类

6.小刀类实现

7.其他武器类实现

8.英雄类实现

9.怪物类实现

10.英雄的攻击实现

11.战斗交互实现

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

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

相关文章

LeetCodeHot100

1.两数之和 解题思路&#xff1a; 1.暴力解法 两个for循环解决问题 时间复杂度为 O(n2) class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] nums[j] target) {…

大语言模型进化论:从达尔文到AI的启示与展望

文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…

Spring Boot自动装配原理

实例&#xff1a; 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置服务器 redis自动装配 原理&#xff1a; 一切都源于一个关键的注解…

在Windows系统上安装和配置Redis服务

&#x1f31f; 在Windows系统上安装和配置Redis服务 Redis是一个高性能的键值存储数据库&#xff0c;广泛用于缓存、消息队列和实时分析等场景。虽然Redis最初是为Linux设计的&#xff0c;但也有Windows版本可供使用。今天&#xff0c;我将详细介绍如何在Windows系统上安装Red…

《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期&#xff1a;DIY半导体…

Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)

目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) &#xff08;0&#xff09;Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 &#xff08;1&#xff09;首先找到已建Vue3工程的目录。 &#xff08;2&#xff09;无需再下载依赖包&#xff0c;直接执行npm ru…

Visual Studio 2022新建c语言项目的详细步骤

步骤1&#xff1a;点击创建新项目 步骤2&#xff1a;到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3&#xff1a;到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…

23年以后版本pycharm找不到conda可执行文件解决办法

这个问题很痛苦&#xff0c;折磨了我半天。 就是链接远程服务器的时候 就一直以为这三个都要配置 就这个conda环境这里怎么都找不到服务器的虚拟环境的python可执行文件&#xff0c;非常痛苦。 后面查找了资料&#xff0c;找了好久&#xff0c;才发现&#xff0c;原来只需要配…

基于SpringBoot的商城管理系统(源码+部署教程)

运行环境 数据库&#xff1a;MySql 编译器&#xff1a;Intellij IDEA 前端运行环境&#xff1a;node.js v12.13.0 JAVA版本&#xff1a;JDK 1.8 主要功能 基于Springboot的商城管理系统包含管理端和用户端两个部分&#xff0c;主要功能有&#xff1a; 管理端 首页商品列…

计算机网络软考

1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据&#xff0c;自下而上的解封装数据&#xff0c;实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中&#xff0c;用高电平代表 “1”、低电平代表 “0”&#xff0c…

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…

C语言(队列)

1、队列的原理和作用 1、1 队列的原理 队列的原理其实就像一个管道&#xff0c;如果我们不断的往管道里塞乒乓球&#xff0c;每个乒乓球在管道里就会排列一条队列&#xff0c;先进去的乒乓球会先出来&#xff0c;这个就是队列先进先出的规则 球从左边进去的动作叫入列&#xf…

十七、从0开始卷出一个新项目之瑞萨RZN2L定时器(GPT)+DMA生成PWM的运动控制

一、概述 嵌入式科普(34)通过对比看透DMA的本质 分享瑞萨RZN2L使用DMA生成PWM的运动控制的例程源码 rzn2l必要的外设资源&#xff1a; rzn2l拥有32-bit timer General PWM Timer (GPT) with 18 channels CPU、GPT最高频率400Mhz DMAC0 and DMAC1 8 channels 8 channels 还…

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

第一次开机详细步骤 步骤一&#xff1a;树莓派系统烧录1 搜索打开烧录软件“Raspberry Pi Imager”2 选择合适的设备、系统、SD卡3 烧录配置选项 步骤二&#xff1a;SSH远程树莓派1 树莓派插电2 网络连接&#xff08;有线或无线&#xff09;3 确定树莓派IP地址 步骤三&#xff…

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

文献分享: ConstBERT固定数目向量编码文档

&#x1f602;图放这了&#xff0c;大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR &#x1f449;原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点&#xff1a;相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …

使用marked.min.js编写Markdown文档页面,可做知识库、技术文档、使用文档、教程文档等!

摘要 marked.min.js 是一个高效的 JavaScript Markdown 解析器&#xff0c;它能够将 Markdown 格式的文本转换为 HTML。作为一个轻量级的库&#xff0c;marked 在处理大规模的 Markdown 内容时表现出色&#xff0c;并且具备广泛的兼容性和可定制性。 本文将深入探讨如何使用 …

智慧城市智慧社区项目建设方案

一、项目背景 在全球化进程加速的今天&#xff0c;城市化问题日益凸显&#xff0c;传统的城市管理模式已难以满足现代社会对高效、智能化管理的需求。智慧城市和智慧社区的概念应运而生&#xff0c;其核心目标是通过信息技术手段&#xff0c;提升城市资源的利用效率&#xff0…