私はチェッカーのようなボードベースのゲームに取り組んでいます。ボード上のすべてのタイルには特定のプロパティがあります。ボードのステータスを変更する前に、その状態を保存し、それを使用して最後の移動を元に戻したいと考えています。ステータスが変化すると、すべてのオブジェクトが破棄され、新しいオブジェクトが作成されます。デストラクタを呼び出すだけでなく、これらのポインタを保持する方法はありますか?
4 に答える
これは、ポインター/実装の問題というよりも、設計上の問題です。元に戻す/やり直しを考える 1 つの方法は、タスクごとに 1 つずつ、2 つのスタックです。
移動するたびに、構成/ゲームの状態、オブジェクトなどを1つの要素として元に戻すスタックにプッシュします。元に戻すを押すと、そのスタックの要素をポップし、ゲームに適用し、この要素をスタックをやり直します。新しい移動が完了すると、やり直しスタックがクリアされます
デストラクタ、ポインタ、またはポインタなしを呼び出した後は、オブジェクトを使用できません。オブジェクトをスタックにプッシュする前に全体としてコピーするか、オブジェクトへのポインタを使用することができます。
より多くの可能性を提供するため、共有ポインターの使用に興味があるかもしれません
メモリを効果的に使用したい場合、ゲーム全体の状態を保存する以外の別のアプローチは、ゲーム全体のスナップショットではなくゲーム内の変更を保存することですが、これは通常より多くの作業を必要としますが、賢い方法です。
この方法でポインタを保持したくありません。それらが削除された後にこれらのポインターを介してデータにアクセスしようとすると、アクセス違反が発生します。それらが削除されると、それらが指すメモリは、それらのポインターを介してアクセスされるべきではありません。
これらのポインターのコピーを取得すると、それらも同じアドレスを持つため、取得したコピーを介してそのメモリにアクセスすると、同じことが起こります。別のアプローチを検討する必要があります
リンクされたリストなどと同じタイル オブジェクトで UNDO リストへのリンクを使用しないのはなぜですか。ユーザーが状態を元に戻すときに、このリストのデータとタイトルのデータを操作します。
ゲームの状態を保持するには、次の 2 つの方法があります。
- ゲームの状態を構成するすべてのオブジェクトをメモリまたはストレージにシリアル化することで、効果的に状態を保存し、それに戻ることができます。
- あるゲーム状態から別のゲーム状態への変更のみを保持します。
ポインターの使用が設計の中心になるとは思いません。古いポインターを保持する必要はありません。私の知る限り、ポインターはまったく必要ありません。オブジェクト自体の古い状態を保存するか、一連の変更を保存します。この場合、私は後者を使用します。