最近自己在写东西 出现了点问题
就是在下面代码中的Battle函数中(应该)
会出现程序没有动静了(也不是无响应) 而且CPU占用会偏高的情况 有没有好心人帮忙调一下啊
求求了awa
(代码300行+ 看不懂可以找我)
// Project:
// Name: NameFighting.cpp
// Start Time: 2023.8.19
#include <iostream>
#include <vector>
#include <windows.h>
#include <algorithm>
#include <ctime>
#include <stdlib.h>
#include <fstream>
#include <conio.h>
#include <cstdio>
#include <exception>
#include <stdexcept>
#include <iomanip>
using std::cin;
using std::cout;
using std::string;
using std::random_shuffle;
using std::ifstream;
using std::ofstream;
using std::sort;
using std::endl;
using std::vector;
using std::runtime_error;
using std::unique;
struct Player
{
string name;
int health; // 生命值
double PhysicalAttack; // 物攻
double MagicAttack; // 魔攻
double PhysicalDefend; // 物防
double MagicDefend; // 魔防
int team;
double score;
}p[44];
vector<string> TempNames;
vector<string> TempG1, TempG2; // 临时存放1组2组人员的序号
int G1Amount, G2Amount; // 1队2队的人数
double Damage;
int Attacker, BeAttacked;
int Groups1[22];
int Groups2[22];
int skills[] = {0, 1, 1, 1, 1, 1, 1, 2}; // 这部分后续还会继续加 目前只有 属于物理攻击的普攻还有法术攻击的扔毒药
int NumberOfSkills = sizeof(skills) / sizeof(skills[0]) - 1; // -1是想把第一个去掉
void pop(vector<string> &a){ // 删除头元素
a.erase(a.begin());
}
void ErrorWindows(int reason);
void GainNames(){
// 输入完每一个组都都键入end
cout << "请输入两队的名字 要求输入完一个队的名字后输入end并按下'Enter'" << endl;
int cnt = 0; // 统计个数
string receiver;
while (true){
cin >> receiver;
if (receiver == "end") break;
cnt ++;
TempNames.push_back(receiver);
}
for (int i = 1; i <= cnt; i ++){
string t = TempNames.front();
p[i].name = t;
p[i].team = 1;
pop(TempNames);
}
G1Amount = cnt;
cnt = 0;
TempNames.clear();
receiver = "awa";
while (true){
cin >> receiver;
if (receiver == "end") break;
cnt ++; // 元素个数
TempNames.push_back(receiver);
}
//cout << G1Amount << " " << cnt << endl;
for (int i = G1Amount + 1; i < cnt + G1Amount + 1; i ++){
string t = TempNames.front();
p[i].name = t;
//cout << t << endl;
p[i].team = 2;
pop(TempNames);
}
//cout << "Here?" << endl;
G2Amount = cnt;
if (G1Amount <= 0 || G2Amount <= 0)
ErrorWindows(2);
else
return;
}
void ErrorWindows(int reason){
MessageBox (NULL, "这个窗口为什么会出现?", "来自游戏", MB_OK);
MessageBox (NULL, "那是因为代码出现了一些问题", "来自游戏", MB_OK);
MessageBox (NULL, "这需要你联系作者并反映情况", "来自游戏", MB_OK);
MessageBox (NULL, "并且回想你刚才输入的内容", "来自游戏", MB_OK);
MessageBox (NULL, "比如这里的原因是: ", "来自游戏", MB_OK);
switch (reason){
case 1:{
MessageBox (NULL, "生命值出现非正数", "来自游戏", MB_OK);
break;
}
case 2:{
MessageBox (NULL, "人数出现非正数", "来自游戏", MB_OK);
break;
}
}
MessageBox (NULL, "请务必联系作者", "来自游戏", MB_OK);
MessageBox (NULL, "作者的Luogu ID为: 965233", "来自游戏", MB_OK);
//system("start https://www.luogu.com.cn/user/965233");
throw runtime_error("Please contact with author!");
}
// 应该没啥问题
void InitData(){
int n = 0;
for (int i = 1;i <= (G1Amount + G2Amount); i ++){
if (p[i].name.length() < 5) n = p[i].name.length();
else n = 5;
// 生命值采取前n位字符的ASCII值
for (int j = 1; j <= n; j ++){
p[i].health += (int)p[i].name[j];
}
if (p[i].health <= 0) ErrorWindows(1);
while (p[i].health > 600){
// 防止出现血条过高
if (p[i].health < 600) break;
p[i].health /= 1.2;
p[i].PhysicalAttack += 40;
}
if (p[i].health <= 150) p[i].health += 100;
// 这部分数据后续根据平衡性肯定还要改
p[i].PhysicalAttack += (840 - p[i].health * 1.4);
p[i].MagicAttack += p[i].PhysicalAttack * 0.6 + p[i].health * 0.1;
p[i].PhysicalDefend += (p[i].PhysicalAttack + p[i].health) * 0.15;
p[i].MagicDefend += p[i].MagicAttack * 0.5 + p[i].health * 0.1;
//cout << i << " " << p[i].health << " " << p[i].PhysicalAttack << " " << p[i].MagicAttack << " " << p[i].PhysicalDefend << " " << p[i].MagicDefend;
}
}
// 测试用的
// void InitGroup(){
// // 拿到1组和2组人员的序号
// cout << "进入InitGroup函数" << endl;
// for (int i = 1; i <= (G1Amount + G2Amount); i ++){
// if (p[i].team == 1) printf("%d号的队伍是1, 名字为", i), cout << p[i].name << endl;
// else printf("%d号的队伍是2, 名字为", i), cout << p[i].name << endl;
// }
// getchar();
// }
//void CalcScore(); // 回来再写 今天没空
void Attack(int Attacker, int team, int BeAttacked, char type);
void Battle(){
// 未测试
int cnt = 0;
while (true){
cnt ++;
cout << "循环次数: " << cnt << endl;
// 已经有一组全部趋势
if (G1Amount == 0 || G2Amount == 0){
if (G1Amount == 0){
//cout << "1组胜利" << endl;
MessageBox (NULL, "Congratulation on Group 2!", "游戏提示", MB_OK);
}
else{
//cout << "2组胜利" << endl;
MessageBox (NULL, "Congratulation on Group 1!", "游戏提示", MB_OK);
}
//CalcScore();
return;
}
random_shuffle(skills + 1, skills + 1 + NumberOfSkills);
int skill = skills[1];
// 1组的回合
RETURN1:
Attacker = rand()%G1Amount + 1; // 1组中抽一个
BeAttacked = rand()%G2Amount + 1 + G1Amount;
// 加上G1Amount是因为 本来一队二队已经分清楚了 防止抽到第一组的
if (p[BeAttacked].health <= 0 || p[BeAttacked].team == 1 || p[Attacker].health <= 0) goto RETURN1; // 如果抽到的这个人已经趋势了
switch (skill){
case 1:{
Attack(Attacker, 1, BeAttacked, 'p');
break;
}
case 2:{
Attack(Attacker, 1, BeAttacked, 'm');
break;
}
}
RETURN2:
Attacker = rand()%G2Amount + 1 + G1Amount; // 2组中抽一个
BeAttacked = rand()%G1Amount + 1;
if (p[BeAttacked].health <= 0 || p[BeAttacked].team == 2 || p[Attacker].health <= 0) goto RETURN2;
switch (skill){
case 1:{
Attack(Attacker, 2, BeAttacked, 'p');
break;
}
case 2:{
Attack(Attacker, 2, BeAttacked, 'm');
break;
}
}
}
}
// void Battle(){ // 这里是单轮攻击
// cout << "进入Battle函数" << endl;
// random_shuffle(skills + 1, skills + 1 + NumberOfSkills);
// int skill = skills[1];
// // 1组的回合
// RETURN1:
// Attacker = rand()%G1Amount + 1; // 1组中抽一个
// BeAttacked = rand()%G2Amount + 1 + G1Amount;
// cout << Attacker << " " << BeAttacked << endl;
// // 加上G1Amount是因为 本来一队二队已经分清楚了 防止抽到第一组的
// if (p[BeAttacked].health <= 0) goto RETURN1; // 如果抽到的这个人已经趋势了
// cout << p[BeAttacked].health << endl;
// switch (skill){
// case 1:{
// Attack(Attacker, 1, BeAttacked, 'p');
// break;
// }
// case 2:{
// Attack(Attacker, 1, BeAttacked, 'm');
// break;
// }
// }
// RETURN2:
// Attacker = rand()%G2Amount + 1 + G1Amount; // 2组中抽一个
// BeAttacked = rand()%G1Amount + 1;
// if (p[BeAttacked].health <= 0) goto RETURN2;
// cout << p[BeAttacked].health << endl;
// switch (skill){
// case 1:{
// Attack(Attacker, 2, BeAttacked, 'p');
// break;
// }
// case 2:{
// Attack(Attacker, 2, BeAttacked, 'm');
// break;
// }
// }
// }
void Attack(int Attacker, int team, int BeAttacked, char type){ // 这里的team表示攻击人所属队伍
// 2023.8.20 19:58 还未测试捏
cout << "进入Attack函数" << endl;
if (type == 'p'){ // 物理攻击
// 攻击者和被攻击者已经在Battle函数中产生了就不再写随机数了
// 经过测试 有可能会出现负伤害
Damage = abs(p[Attacker].PhysicalAttack - p[BeAttacked].PhysicalDefend * 1.2);
}
else { // 魔法攻击
Damage = abs((p[Attacker].MagicAttack - p[BeAttacked].MagicDefend) * 1.2);
}
// 这两行是为了避免伤害太高或者太低
if (Damage >= 300) Damage /= 2.5;
if (Damage <= 15) Damage *= 5;
if (Damage >= p[BeAttacked].health){ // 如果说一击致命
cout << "原血量: " << p[BeAttacked].health << endl;
cout << "Damage: " << Damage << endl;
Damage = p[BeAttacked].health;
p[BeAttacked].health = 0;
//printf("%s被%s击倒了", p[BeAttacked].name, p[Attacker].name);
cout << p[BeAttacked].name << "被" << p[Attacker].name << "击倒了" << endl;
cout << "攻击后血量: " << p[BeAttacked].health << endl;
p[Attacker].score += 70;
if (p[BeAttacked].team == 1) G1Amount --;
else G2Amount --;
}
else {
cout << "原血量: " << p[BeAttacked].health << endl;
p[BeAttacked].health -= Damage;
cout << "攻击后血量: " << p[BeAttacked].health << endl;
//printf("%s对%s造成了%lf伤害", p[Attacker].name, p[BeAttacked].name, Damage);
cout << p[Attacker].name << "对" << p[BeAttacked].name << "造成了" << Damage << "点伤害" << endl;
p[Attacker].score += Damage * 0.6;
}
cout << "离开Attack函数" << endl;
}
int main(){
srand ((unsigned int)time(NULL));
//freopen("TestData.txt", "r", stdin);
memset(p, 0, sizeof(p));
memset(Groups1, 0, sizeof(Groups1));
memset(Groups2, 0, sizeof(Groups2));
cout << std::fixed << std::setprecision(5);
GainNames();
InitData();
// InitGroup();
Attacker = rand()%G1Amount + 1; // 1组中抽一个
BeAttacked = rand()%G2Amount + 1;
Battle();
return 0;
}