Как сделать систему повышения уровня?

Я ОЧЕНЬ усердно работал над этим кодом, и есть несколько ошибок, но я опубликую остальные в разных вопросах, потому что я слышал, что это действительно профессиональный веб-сайт, и я ненавижу, когда делаю ошибки. В любом случае, я работал над этим некоторое время, но я хочу сделать так, чтобы, когда игрок получает определенное количество XP, он повышал свой уровень. У меня пока нет кода битвы за уровни, но как мне сделать так, чтобы уровень игрока автоматически повышался при достижении определенного количества XP?

Вот мой код:

/* Skyy Civil
C++ Legend Game
*/
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
/* No files, struct instead.

constructing monsters and hero and damage
*/
struct Monster{
    int monsterCount;
    string monsterType;
    int monsterHealth;
    
};
// Hero
struct Hero{
    
    int XP;
    int coins;
    int level;
    int health;

};


struct Attacks{
    string attack1;
    string attack2;
    string attack3;
    string attack4;
    int damageAttack1;
    int damageAttack2;
    int damageAttack3;
    int damageAttack4;
};

/*
        The actual level starts here
*/


void LevelStart(){
    cout << "WORK IN PROGRESS";
}


/*
Game setup is where the program checks the level and sets it up for the player to begin the game
*/

void levelSetup(){
    struct Hero player;
    struct Attacks playerAttacks;
    struct Attacks monsterAttacks;
    struct Monster easyLevelMonster;
    // Player attacks and stats
    
    player.health = 150;
    playerAttacks.attack1 = "FireBall";
    playerAttacks.attack2 = "Fire Slash";
    playerAttacks.attack3 = "Fire Barrage";
    playerAttacks.attack4 = "Blue Flame Bomb";
    playerAttacks.damageAttack1 = 4;
    playerAttacks.damageAttack2 = 9;
    playerAttacks.damageAttack3 = 14;
    playerAttacks.damageAttack4 = 19;
    // Monster attacks and stats
    easyLevelMonster.monsterCount = 1;
    easyLevelMonster.monsterType = "monster";
    easyLevelMonster.monsterHealth = 100;
    monsterAttacks.attack1 = "bash";
    monsterAttacks.damageAttack1 = 10;
    if (player.health == 150 && easyLevelMonster.monsterCount == 1){
        LevelStart();
    }
}

/*
Game menu includes options for the player to choose to play the game
*/

void GameMenu(string username, string password){
    struct Attacks sword;
    struct Hero player;
    string gameMenuChoice;
    player.level = 1;
    player.XP = 0;
    
    cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    cout << "~~~~~~~+~~~~~~~LEGEND!~~~~~~~+~~~~~~~\n\n\n\n";
    cout << username << "\n\n";
    cout << "Level: " << player.level << "\n\n\n\n\n\n";
    cout << "XP: " << player.XP << "\n\n\n\n";
    cout << "(a) Play Level\n";
    cout << "(b) Exit\n";
    cin >> gameMenuChoice;
    if (gameMenuChoice == "a"){
        levelSetup();
    }
    if (gameMenuChoice == "b"){
        cout << "Game EXITED\n";
    
    }
}


void Login(){
    int loginChoice;
    string username;
    string password;
    fstream login;
    login.open("login.dat", ios::in | ios::out);
    cout << "Username\n";
    cout << "\n > ";
    cin >> username;
    login << "Username: " << username << endl;
    cout << "\n\n\n Password\n";
    cout << "\n > ";
    cin >> password;
    login << "Pass: " << password << endl;
    login.close();
    cout << "loading...\n\n\n";
    cout << "(1) Start\n";
    cin >> loginChoice;
    if (loginChoice == 1){
        GameMenu(username, password);
    }
}

// StoryMode

void StoryMode(void){
    int storyModeChoice;
    cout << "Welcome to story mode!\n\n";
    cout << "(1) Login\n";
    cin >> storyModeChoice;
    if (storyModeChoice == 1){
        Login();
    }
}

// Credits
void Credits(){
    
    int creditsChoice;
    cout << "Creator: Skyy Civil\n\n\n\n";
    cout << "(1) Back to menu\n";
    cout << "(2)Continue to story mode\n";
    cin >> creditsChoice;
    if (creditsChoice == 1){
        void Menu();
    }
    if (creditsChoice == 2){
        StoryMode();
    }
}

// Main Menu

void Menu(){
    int menuChoice;
    cout << "\nLegend\n";
    cout << "(1)Story Mode\n";
    cout << "(2) Credits\n";
    cin >> menuChoice;
    if (menuChoice == 1){
        StoryMode();
    }
    if (menuChoice == 2){
        Credits();
    }
};

// ------------MAIN--------------- \\

int main(void){
    Menu();
}

Извините, если мой код действительно беспорядочный, я программист на С++ среднего уровня, и мои навыки просто очень печальны.

Предложение: начните с очень маленькой программы, которая просто отслеживает XP и повышает уровень. Все остальное будет просто шумом, помогающим скрыть возможные ошибки в системе прокачки. Подумайте о том, чтобы сделать Hero более похожим на class. Если у вас есть метод что-то вроде void AddXP(int newXP) ... И GaryLOL только что опубликовал остальную часть моего комментария в качестве ответа. Голосуй за, Гэри.

user4581301 14.12.2020 19:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
390
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, вам следует создать метод в структуре вашего героя, чтобы заставить его получать опыт и проверять, достаточно ли у него опыта или нет для повышения уровня.

// Hero
struct Hero{

    int XP;
    int coins;
    int level;
    int health;
    void gainXP(int);
};

void Hero::gainXP(int xp)
{
    this->XP += xp;
    if (this->XP >= 100) //Change 100 to the amount of XP it needs to level up.
    {
        this->XP -= 100;
        this->level++;
    }
}

Затем просто вызовите метод, когда он наберет XP.

Дополнительная информация:

  1. using namespace std; считается плохой практикой. (Подробнее здесь)
  2. Вы не используете заголовок <cstring>.
  3. В функции login вы ни в какой момент не читаете из std::fstream, открытого с помощью std::ios::in, поэтому вам, вероятно, следует сделать это с помощью std::ofstream и просто открыть его с помощью std::ios::out.
  4. В функции levelSetup нет необходимости проверять player.health == 150 && easyLevelMonster.monsterCount == 1.

Если вы сделаете массив XP, необходимых для достижения каждого уровня, вы можете обобщить что-то вроде if (this->XP >= levelxp[this->level]) и получить больше D&D-sh (обратите внимание, что я все еще играю во второе издание, когда группа может собраться вместе (и это было редко в эти дни). (<ругательство удалено> COVID))) опыта, требующего разного количества для каждого уровня.

user4581301 14.12.2020 21:19

Другие вопросы по теме