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.pswp.cn/bicheng/73040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73040.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《用Python+PyGame開發雙人生存游戲!源碼解析+完整開發思路分享》

導語? "你是否想過用Python開發一款可玩性高的雙人合作游戲&#xff1f;本文將分享如何從零開始實現一款類《吸血鬼幸存者》的生存射擊游戲&#xff01;包含完整源碼解析、角色系統設計、敵人AI邏輯等核心技術點&#xff0c;文末提供完整代碼包下載&#xff01;" 哈…

【理想解法學習筆記】

目錄 理想解法原理簡介算法步驟屬性值規范化方法代碼示例 理想解法 原理簡介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一種逼近理想解的排序方法。其基本的處理思路是&#xff1a;首先建立初始化決策矩陣&#xff0c;而后基于規范化后的初…

Linux基礎開發工具—vim

目錄 1、vim的概念 2、vim的常見模式 2.1 演示切換vim模式 3、vim命令模式常用操作 3.1 移動光標 3.2 刪除文字 3.3 復制 3.4 替換 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全稱是Vi IMproved&#xff0c;即說明它是Vi編輯器的增強…

Skyvern AI 實現 瀏覽器爬蟲+自動化工具

一、前言 本文Skyvern是一款功能強大的模擬瀏覽器自動化操作爬蟲軟件。它通過模擬人類在瀏覽器中的操作&#xff0c;實現對目標網站的自動化訪問、數據抓取和處理。Skyvern支持多種編程語言&#xff0c;用戶可根據需求編寫腳本&#xff0c;實現高效的數據采集。同時&#xff0c…

Spring Boot + MyBatis + MySQL:快速搭建CRUD應用

一、引言 1. 項目背景與目標 在現代Web開發中&#xff0c;CRUD&#xff08;創建、讀取、更新、刪除&#xff09;操作是幾乎所有應用程序的核心功能。本項目旨在通過Spring Boot、MyBatis和MySQL技術棧&#xff0c;快速搭建一個高效、簡潔的CRUD應用。我們將從零開始&#xff…

【Academy】OAuth 2.0 身份驗證漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份驗證漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth&#xff1f;2. OAuth 2.0 是如何工作的&#xff1f;3. OAuth 授權類型3.1 OAuth 范圍3.2 授權代碼授權類型3.3 隱式授權類型 4. OAuth 身份驗證4.1 識別 OAuth 身份驗證4.2 偵察OAuth…

C#常用的循環語句

在C#中&#xff0c;循環是一種控制結構&#xff0c;用于重復執行一組語句直到滿足特定條件。C#提供了幾種循環結構&#xff0c;包括for循環、while循環、do-while循環和foreach循環。每種循環都有其特定的用途和場景。下面我將逐一介紹這些循環的用法。 一、C#循環類型 1. fo…

C語言(23)

字符串函數 11.strstr函數 1.1函數介紹&#xff1a; 頭文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一個字符串&#xff08;str1&#xff09;中尋找另外一個字符串&#xff08;str2&#xff09;是否出現過 如果找到…

Vue3實戰學習(Vue3的基礎語法學習與使用(超詳細))(3)

目錄 &#xff08;1&#xff09;Vue3工程環境準備、項目基礎腳手架搭建詳細教程。(博客鏈接) &#xff08;2&#xff09;Vue3的基礎語法學習與使用。 &#xff08;1&#xff09;"{{}}"綁定數據。 <1>ref()函數定義變量——綁定數據。 <2>reactive({...})…

vtkDepthSortPolyData 根據相機視圖方向對多邊形數據進行排序

1. 作用 在 3D 渲染中&#xff0c;透明對象的渲染順序非常重要。如果透明對象的渲染順序不正確&#xff0c;可能會導致錯誤的視覺效果&#xff08;例如&#xff0c;遠處的透明對象遮擋了近處的透明對象&#xff09;。vtkDepthSortPolyData 通過對多邊形數據進行深度排序&#…

【2025力扣打卡系列】0-1背包 完全背包

堅持按題型打卡&刷&梳理力扣算法題系列&#xff0c;語言為python3&#xff0c;Day5 0-1背包【目標和】 有n個物品&#xff0c;第i個物品的體積為w[i], 價值為v[i]。每個物品至多選一個&#xff0c;求體積和不超過capacity時的最大價值和常見變形 至多裝capacity&#x…

MyBatis-Plus 分頁查詢接口返回值問題剖析

在使用 MyBatis-Plus 進行分頁查詢時,很多開發者會遇到一個常見的問題:當分頁查詢接口返回值定義為 Page<T> 時,執行查詢會拋出異常;而將返回值修改為 IPage<T> 時,分頁查詢卻能正常工作。本文將從 MyBatis-Plus 的分頁機制入手,詳細分析這一問題的根源,并提…

《人月神話》:軟件工程的成本寓言與生存法則

1975年&#xff0c;Fred Brooks在《人月神話》中寫下那句振聾發聵的斷言——“向進度落后的項目增加人力&#xff0c;只會讓進度更加落后”——時&#xff0c;他或許未曾料到&#xff0c;這一觀點會在半個世紀后的人工智能與云原生時代&#xff0c;依然如達摩克利斯之劍般懸在每…

三維建模與視頻融合(3D-Video Integration)技術初探。

三維建模與視頻融合&#xff08;3D-Video Integration&#xff09;是一種將虛擬三維模型無縫嵌入實拍視頻場景的技術&#xff0c;廣泛應用于影視特效、增強現實&#xff08;AR&#xff09;、游戲開發、廣告制作 、視頻監控 等領域。 一、技術核心流程 三維建模與動畫 使用工具…

SpringMVC-全局異常處理

文章目錄 1. 全局異常處理2. 項目異常處理方案2.1 異常分類2.2 異常解決方案2.3 異常解決方案具體實現 1. 全局異常處理 問題&#xff1a;當我們在SpingMVC代碼中沒有對異常進行處理時&#xff0c;三層架構的默認處理異常方案是將異常拋給上級調用者。也就是說Mapper層報錯會將…

2025 cv2.imwrite存儲帶有中文路徑

一、前言 cv使用的更多一些&#xff0c;不過cv讀取和寫入帶有中文路徑的圖片會報錯有寫出亂碼。 以下代碼是從視頻中獲取第2幀保存在中文文件夾下的實例&#xff1a; cap cv2.VideoCapture("***.mp4")cap.set(cv2.CAP_PROP_POS_FRAMES, 2)ret, framecap.read()cv2…

在 CentOS 上,常用幾種方法來確保 Python 腳本在斷開終端后繼續運行

在 CentOS 上&#xff0c;你可以使用以下幾種方法來確保 Python 腳本在斷開終端后繼續運行&#xff1a; 1. 使用 nohup 命令 nohup 命令可以讓進程在終端關閉后繼續運行。 nohup python main.py > output.log 2>&1 &nohup&#xff1a;忽略掛斷信號&#xff0c…

blazemeter工具使用--用于自動生成jmeter腳本并進行性能測試

1、安裝blazemeter&#xff08;網上有很多詳情的教程&#xff09; 2、開始錄制&#xff1a;設置號你的文件名稱后開始錄制 3、錄制完成后保存為jmeter(jmx)文件 4、在jmeter中打開文件 5、添加一個后置處理器&#xff1a;查看結果樹&#xff0c;后運行看看能否成功&#xf…

6-langchang多模態輸入和自定義輸出

6-langchang多模態輸入和自定義輸出 多模態數據輸入urlbase64url list工具調用自定義輸出: JSON, XML, YAML如何解析 JSON 輸出json如何解析xmlYAML解析器多模態數據輸入 這里我們演示如何將多模態輸入直接傳遞給模型。我們目前期望所有輸入都以與OpenAI 期望的格式相同的格式…

【C#實現手寫Ollama服務交互,實現本地模型對話】

前言 C#手寫Ollama服務交互&#xff0c;實現本地模型對話 最近使用C#調用OllamaSharpe庫實現Ollama本地對話&#xff0c;然后思考著能否自己實現這個功能。經過一番查找&#xff0c;和查看OllamaSharpe源碼發現確實可以。其實就是開啟Ollama服務后&#xff0c;發送HTTP請求&a…