C ++ - Criação de Função de combate básico para Texto RPG

votos
0

Atualmente, estou trabalhando em um texto básico RPG para uma classe, e eu estou tendo alguns problemas estranhos acontecendo com o sistema de combate. Basicamente, eu tenho uma opção para atacar ou não para atacar o inimigo durante cada fase de combate. Quando eu atacar o inimigo, a saúde diminui a uma taxa esperada. No entanto, nem quando eu escolher para atacar (o que significa que o inimigo ataca ainda), o dano que eu faço para o inimigo não está diretamente declarou num mesmo turno, mas quando eu escolher para atacar a próxima vez, ele faz o dano esperado para a o inimigo, bem como o dano de quando eu supostamente não atacar.

(Aviso: Eu sei que o meu código será mal escrito e provavelmente não com a melhor lógica de programação ... Eu sou um novo aluno, e estou apenas usando o que eu aprendi até agora.)

Meu código é a seguinte:

int showEnemyHp(int enemyhp, int attack) {
    enemyhp = enemyhp - attack;
    return enemyhp;
}

int showHp(int hp, int enemyattack) {
    hp = hp - enemyattack;
    return hp;
}

void enemyBattle() {
    int hp = 30, enemyhp = 20, attack = 10, enemyattack = 5;
    int hitEnemy;

    while (true) {
        cout << Hit enemy?\n(1) Yes\n(2) No << endl;
        cin >> hitEnemy;

        if (hitEnemy == 1) {
            enemyhp = showEnemyHp(enemyhp, attack);
            hp = showHp(hp, enemyattack);
            cout << You hit the enemy. << endl;
            cout << The enemy now has  << enemyhp << HP left. << endl;
            if (enemyhp <= 0) {
                cout << You've killed the enemy! << endl;
                break;
            } else if (enemyhp > 0) {
                cout << The enemy hits you back. << endl;
                cout << You now have  << hp << HP left. << endl;
            }
        } else if (hitEnemy == 2) {
            enemyHp = showEnemyHp(enemyhp, attack);
            hp = showHp(hp, enemyattack);
            cout << You have chosen not to hit the enemy. << endl;
            cout << The enemy hits you back. << endl;
            cout << You now have  << hp << HP left. << endl;
        } else {
            cout << You can't do that! << endl;
            return enemyBattle();
        }
    }
    while (hp > 0 && enemyhp > 0);
}

Alguém pode me ajudar com o que estou fazendo de errado, e por que isso está acontecendo? Além disso, as dicas para a fixação de uma questão tão seria ótimo. Eu apreciaria também, possivelmente, qualquer ajuda sobre como melhor otimizar esse código. (Como eu disse, minha caixa de ferramentas para C ++ é remarkbly limitado no momento. Estou apenas cerca de um mês ou mais para estudá-lo ... meu professor ainda não foi até mesmo ensinar-nos matrizes, o que eu aprendi sobre a minha própria). Muito obrigado por qualquer ajuda.

Publicado 20/09/2018 em 04:21
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Sua lógica global parece estar bem, exceto por alguns detalhes que você pode não ter tido em conta. Como @Sami Kuhmonen mencionou em seu comentário, a showEnemyHp()função é realmente atualizar valor HP do inimigo e não exibi-lo.

É melhor mudar o nome das funções int showEnemyHp(int, int)e int showHp(int, int)para algo mais apropriado, como int updateEnemyHp(int, int)e int updateUserHp(int, int), se você planeja usá-los apenas para atualizar os valores e nada mais HP.

Além disso, colocando

cout << "The enemy now has " << enemyhp << "HP left." << endl;

antes de verificar se inimigo HP é negativo pode resultar em valores negativos potencialmente indesejados da HP a ser impresso (Assumindo valores negativos da HP não se destinam a ser mostrado). Seria melhor para imprimir os valores da HP depois de lidar com as condições extremas.

cout << "You hit the enemy." << endl;
if (enemyhp <= 0) {
    cout << "You've killed the enemy!" << endl;
    break;
} else if (enemyhp > 0) {
    cout << "The enemy now has " << enemyhp << "HP left." << endl;
    cout << "The enemy hits you back." << endl;
    cout << "You now have " << hp << "HP left." << endl;
}

Também deve-se notar que atualiza o HP do inimigo não está sendo exibido o quando o utilizador decide não atacar, portanto, qualquer dano causado ao inimigo durante esta rodada não é mostrado. Então, simplesmente adicionando a impressão de inimigo HP pode resolver esta questão

} else if (hitEnemy == 2) {
    enemyHp = showEnemyHp(enemyhp, attack);
    // Dammage done when user decides not to attack, probably should be commented?
    hp = showHp(hp, enemyattack);
    cout << "You have chosen not to hit the enemy." << endl;
    cout << "The enemy hits you back." << endl;
    cout << "You now have " << hp << "HP left." << endl;
    // Handle negative values of enemy HP and print final value
    if (enemyhp <= 0) {
        cout << "You've killed the enemy!" << endl;
        break;
    } else if (enemyhp > 0) {
        cout << "The enemy now has " << enemyhp << "HP left." << endl;
        cout << "The enemy hits you back." << endl;
        cout << "You now have " << hp << "HP left." << endl;
    }
}

No ramo condicional final que lida com entradas inválidas, chamando o enemyBattle()período de retorno pode causar uma recursão infinita, que é muito, muito ruim não importa a circunstância. É melhor substituir return enemyBattle();com continue;que simplesmente continuar a execução do loop

} else {
    cout << "You can't do that!" << endl;
    // Continue program
    continue;
}

Se você deseja que o programa para sair quando o usuário insere uma entrada inválida que você pode substituir return enemyBattle();com return;, por isso, o seu código será parecido com este:

} else {
    cout << "You can't do that!" << endl;
    // Exit program
    return;
}

Também é importante lembrar que o programa não está verificando HP do usuário, no caso de HP do usuário torna-se zero ou negativo, em seguida, o programa pode precisar segurá-lo por informar o usuário.

Por fim, não vejo a necessidade de while (hp > 0 && enemyhp > 0);, no final do programa, parece ser redundante, uma vez que a declaração só será executada quando o controle deixa o while(true){...}laço que só acontece quando enemyhp <= 0.

Respondeu 20/09/2018 em 08:45
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more