3

私は単純なコンソール アプリケーションに取り組んでおり、中世の兵士の 2 つの大きなユニット間の戦闘を計算する方法のプロトタイプを作成しています。アイデアは、計算をセットアップし、さまざまなパラメーターを使用してプログラムを数回実行して、その感触をつかみ、それが私が望むものであるかどうかを確認することです。とにかく、問題に進みます。

2 つのユニットはそれぞれ、Unit クラスによって表されます。このクラスには、「攻撃」、「防御」、「戦術」、「ユニットサイズ」の変数と、この問題を修正するまでコメントアウトして無視する他のいくつかの変数が含まれています。クラスヘッダーのコードは次のとおりです。

#ifndef UNITS_H
#define UNITS_H
#include <string>
#include <iostream>

class Unit
{
  public:
      int attack;
      int defense;
      int charge;
      int brace;
      int tactics;
      int unit_size;

  public:
      bool isAlive;
      std::string name;
      Unit(std::string name_target)
      {
          name = name_target;
          attack = 1;
          defense = 1;
          charge = 1;
          brace = 1;
          tactics = 1;
          unit_size = 1;
          isAlive = true;
      }

      float GetAttack() {return (float)attack;}
      float GetDefense() {return (float)defense;}
      float GetCharge() {return (float)charge;}
      float GetBrace() {return (float)brace;}
      float GetTactics() {return (float)tactics;}
      float GetSize() {return (float)unit_size;}

      void SetAttack(int change) {attack = change;}
      void SetDefense(int change) {defense = change;}
      void SetCharge(int change) {charge = change;}
      void SetBrace(int change) {brace = change;}
      void SetTactics(int change) {tactics = change;}
      void SetSize (int change) {unit_size = change;}

      void TakeCasualties (int casualties);
      int Defend(Unit enemy, float base_chance, float base_multiplier);
      void DisplayStats();

    };

#endif // UNITS_H

雑で申し訳ありませんが、私は少し素人です。

クラスの .cpp コードを含めますが、そこにあるものはすべて正常に動作します。デフォルト値だけで問題なくテストを実行しました。私が抱えている唯一の問題は、値が構築された後に値を変更することです。

main.cpp には、2 つのユニットが構築されたら呼び出す関数 AssignStats(Unit unit_target) があります。順番に一人ずつ呼んでいきます。そのためのコードは次のとおりです。

void AssignStats (Unit unit_target)
{
    int x;
    cout << unit_target.name << endl;
    cout << "Value for attack?" << endl;
    cin >> x;
    cout << x << endl;
    unit_target.SetAttack(x);

    cout << "Value for defense?" << endl;
    cin >> x;
    unit_target.SetDefense(x);

    //unit_target.SetCharge(x);
    //unit_target.SetBrace(x);

    cout << "Value for tactics?" << endl;
    cin >> x;
    unit_target.SetTactics(x);

    cout << "Value for size?" << endl;
    cin >> x;
    unit_target.SetSize(x);
}

私が知る限り、このコードは機能するはずです。ただし、後で各ユニットの統計を表示すると、コンストラクターによって設定されたデフォルト値が表示されます。私の人生では、セット関数が機能しない理由がわかりません。次のように、コードが正しく入力されているかどうかを確認するために、少し前にコードを書き直しました。

void Unit::SetAttack()
{
    int x;
    std::cout << "Input target value for attack." << std::endl;
    std::cin >> x;
    std::cout << x;
    attack = x;
    std::cout << attack;
}

10 を入力すると、クラスの攻撃変数を表示していると思われるものでさえ、各 couts はすぐに 10 を表示しますが、後で DisplayStats() を呼び出すと、すべてが再びデフォルト値にあることが示されます。 .

私よりも経験豊富な人がこれをクリアしてもらえますか?

4

1 に答える 1

3

AssignStats問題は、関数が引数を値で受け入れることだと思います

void AssignStats (Unit unit_target);

つまり、元のオブジェクトのコピーを処理する関数です。元のオブジェクト自体は変更されません。

以下の方法で変更してください

void AssignStats (Unit &unit_target);
于 2014-06-29T20:13:50.393 に答える