等一个比较闲的dalao(代码较长)
  • 板块学术版
  • 楼主_Oxygen_
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/21 21:47
  • 上次更新2023/11/3 02:07:22
查看原帖
等一个比较闲的dalao(代码较长)
965233
_Oxygen_楼主2023/8/21 21:47

最近自己在写东西 出现了点问题

就是在下面代码中的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;
}

2023/8/21 21:47
加载中...