0

みなさん、こんにちは!

オブジェクトベースプログラミングのほとんどの側面をよりよく理解するための一環として、私はこれまでよりもはるかに大きなことを試み始めました。これにより、継承、コードの再利用、クラスの使用方法などについて学習しようとしています。この目的のために、私は基本的なRPG/ダンジョンクローラーに必要なすべてのパーツをつなぎ合わせようとしています。これは10億回前に行われたことは知っていますが、実際にそのようなコードを作成しようとすると、思ったよりもはるかに多くの問題が発生することがわかります。これは、学ぶのに最適な方法です(私は思います)。

今のところ、WPFアプリケーションをロードしただけです。これは、作業クラス、ルーチン、関数などをつなぎ合わせることができることに95%関心があるためです。また、どのように表示されるかについてはあまり関心がありません。私は実際にXNAについて読んでいますが、私は主に基本的な動作を把握しようとしているので、これらの側面をグラフィックの側面で複雑にしたくはありません。

私が今直面している問題は、私がキャラクターを攻撃または防御するとき、それが他のどのキャラクターから来たのか、またはどのキャラクターに向けられるべきかを知る必要があるということです。GUIDまたは手動で指定されたIDのいずれかを使用できると思いました。しかし、問題は、私がそのようなことをどのように実装できるかを本当に知らないということです。私が考えたのは、配列への参照(Character [])を追加し、SearchByID関​​数をループさせて正しい配列を見つけ、それを返すことができるということでした。そのようです:

internal Character SearchByID(string _ID)
{
   foreach(Character charToFind in Character[])
   {
       if(charToFind.ID == _ID)
       return charToFind;
   }
}

もちろん、これは現時点での復帰のために少し変更する必要がありますが、単にあなたにアイデアを与えるためです。私が立ち往生しているのは、「Character」クラスの外部に適切な配列を作成する方法です。うまく埋めることができますが、クラスレベルより上に追加するにはどうすればよいですか?「Character」クラスを構築する方法は、すべての新しいキャラクターがCharacterクラスからインスタンス化することです。次に、コンストラクターは適切な値をロードします。しかし、これ以外に、これ以外の配列を初期化する可能性はありません。

私が持っているコード全体を投稿することが望ましい場合、それはまったく問題ありません!

あなたが私に提供するかもしれない洞察に感謝します。

4

5 に答える 5

1

Characterクラスを使用して、他のキャラクターを渡すことができると思います。たとえば、次のようになります。

public class Character
{
    public string Name { get; private set; }

    public int HitPoints { get; private set; }

    public int Offense { get; private set; }

    public int Defense { get; private set; }

    public Character(string name, int hitPoints, int offense, int defense)
    {
        Name = name;
        HitPoints = hitPoints;
        Offense = offense;
        Defense = defense;
    }

    public void Defend(Character source)
    {
        HitPoints = HitPoints - (source.Offense - Defense);
        if (HitPoints <= 0)
        {
             Console.WriteLine("{0} died", Name);
        }
    }

    public void Attack(Character target)
    {
        // Here you can call the other character's defend with this char as an attacker
        target.Defend(this);
        if (target.HitPoints <= 0)
        {
            Console.WriteLine("{0} killed {1}", Name, target.Name);
        }
    }
}

オブジェクト指向プログラミングでは、オブジェクトについて考え始める必要があります。オブジェクトは、具体的な場合は箱のようなものです。新しいものを作成して、名前、高さ、幅、ヒットポイントなどのプロパティを指定できます。これらのオブジェクトにアクションを実行させることもできます。これで、単純なボックス自体はあまり機能しませんが、キャラクターはさまざまなことを実行できるため、これらのアクションをCharacterクラスに配置することは理にかなっています。

キャラクターを持っていることに加えて、ゲームの状態、キャラクター、モンスター、宝箱などを管理するゲームクラスを持っているかもしれません...

この簡単な例では、防御力が攻撃者の攻撃よりも高い場合にHitPointを獲得する可能性がありますが、それは詳細です。正確な実装はあなたに任せます。

于 2012-10-26T13:54:45.363 に答える
0

インスタンス化されたときに文字を配列に挿入する方法が必要だと思います。

静的配列またはリストを作成できます

だから、私の意見ではあなたのクラスは

class Character
{
    static List<Character> characterList=new List<Character>();//all characters are here
    public Character(string id,...)
    {
     //initialize your object
     characterList.Add(this);//store them in the list as and when created
    }

    internal Character SearchByID(string _ID)
    {
       foreach(Character charToFind in characterList)
       {
       if(charToFind.ID == _ID)
       return charToFind;
       }
    }
}

staticメンバーがに関連付けられていclassないことを知っているかもしれません。objectしたがって、新しいcharacterオブジェクトを作成すると、そのオブジェクトは自動的にに追加されます。characterList

于 2012-10-26T13:13:18.410 に答える
0

クライアントサーバーなどの個別のプロセスを扱っている場合を除いて、おそらく「Id」をまったく使用したくないでしょう。

あなたが回っているところはどこでも、代わりstring _IDに実際を渡してください。Characterこれにより、配列などで検索する手間が省けます。

さらにコードを投稿してください。そうすれば、私が何を意味するのかをお見せできます。

于 2012-10-26T13:08:43.870 に答える
0

コントローラクラスでインスタンス化された辞書を使用できます。

Dictionary<Guid, Character> _characterList = new Dictionary<Guid, Character>();

初期化:

var someCharacter = new Character() { stats = something };
var otherCharacter = new Character() { stats = anotherThing };

var char1Id = Guid.NewGuid();
var char2Id = Guid.NewGuid();

_characterList.Add(char1Id, someCharacter);
_characterList.Add(char2Id, otherCharacter);

次に、文字にアクセスするには:

var charToFind = _characterList[char1Id]; 

また

var charToFind = _characterList.Single(c => c.Name = "Fred The Killer");

または他の何でも...

于 2012-10-26T13:11:15.570 に答える
0

キー付きコレクションをチェックしてください

KeyedCollection

これは、キーがクラスのプロパティである辞書のようなものです。 Characters[id] 構文 で文字
を参照できるようになります

Characterクラスで、パフォーマンスのためにGetHashCodeとEqualsを上書きします。
IDにInt32を使用すると、完全なハッシュが得られます。
非常に高速でO(1)。

于 2012-10-26T14:37:19.920 に答える