私は持っています
class Player
{
public Vector3 position;
public String name;
}
と
class Field
{
public Vector3 position;
public bool isTarget;
}
私は3人のプレーヤー、10個のフィールド、3個のターゲットフィールドを持つゲームを持っています。勝つためには、ユーザーはすべてのプレーヤーをターゲットフィールドに配置する必要があります。2つの異なるオブジェクトリスト(List <Player>とList <Field>)を、同じフィールド(位置)で比較するための良い方法はありますか?
または、プレーヤーとフィールドの両方をから継承する必要があります
class BaseItem
{
public Vector3 position;
}
class Player : BaseItem
{
public String name;
}
と比較しList<BaseItem>
ますか?
編集:いくつか明確にするために:私はリスト<プレーヤー>とリスト<フィールド>を持っており、すべてのプレーヤーがすべてのisTargetフィールドと同じ位置にあるかどうかを確認したいと思います。順序は関係ありません。
var listPlayer = new List<Player>();
listPlayer.Add(new Player { position = new Vector3(1,0,0); name = "a"; }
listPlayer.Add(new Player { position = new Vector3(0,1,0); name = "b"; }
listPlayer.Add(new Player { position = new Vector3(0,0,1); name = "c"; }
var listFields = new List<Field>();
listFields.Add(new Field { position = new Vector3(1,0,0); isTarget = true;}
listFields.Add(new Field { position = new Vector3(0,1,0); isTarget = true;}
listFields.Add(new Field { position = new Vector3(0,0,1); isTarget = true;}
listFields.Add(new Field { position = new Vector3(1,1,0); }
listFields.Add(new Field { position = new Vector3(1,0,1); }
****
すべてのプレーヤーとフィールドを調べて、すべてのプレーヤーに対応するフィールドがあるかどうかを確認するにはどうすればよいですか(同じ位置にあり、isTargetがtrueである必要があります)。
解決策:Aybeの回答を解決策として保持したいのですが、algorytmを終了したので、役立つ場合に備えて共有したいと思います。
private void CheckIfWin()
{
foreach (var target in gameboardTargets)
if (!IsAnyPlayerOnTarget(target))
return;
MessageBox.Show(HandleMessage,"You made it!", "Hooray!", MessageBoxButtons.OK);
}
private bool IsAnyPlayerOnTarget(Field target)
{
foreach (var player in playersList)
if (target.GridPosition.Equals(player.GridPosition)) // can be replaced with BaseItem.ComparePosition()
return true;
return false;
}
2つの異なるものを比較することが正しいアプローチであるかどうかはわかりません。
ただし、次の2つを基本クラスから派生させることができます。
internal class BoardEntity {
public Vector3 Position { get; set; }
}
internal class Player : BoardEntity {
public string Name { get; set; }
}
internal class Field : BoardEntity {
public bool IsTarget { get; set; }
}
今、他にも浮上していることがあります。
floats
結果が間違っている可能性があるため、比較はお勧めしませんコード:
internal class BoardEntity {
public Vector3 Position { get; set; }
protected bool Equals(BoardEntity other) {
return Position.Equals(other.Position);
}
public override bool Equals(object obj) {
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
var other = obj as BoardEntity;
return other != null && Equals(other);
}
public override int GetHashCode() {
return Position.GetHashCode();
}
}
internal class MyClass {
public MyClass() {
var player = new Player();
var field = new Field();
BoardEntity boardEntity1 = player;
BoardEntity boardEntity2 = field;
bool b = boardEntity1.Equals(boardEntity2);
}
}
提案:
ComparePosition()
メソッドを提供すると、より自然なIMOに聞こえます。整数にキャストするため、比較は常に正しくなります。
internal class BoardEntity {
public Vector3 Position { get; set; }
public bool ComparePosition(BoardEntity boardEntity) {
var v1 = new Vector3(boardEntity.Position.X, boardEntity.Position.Y, boardEntity.Position.Z);
var v2 = new Vector3(Position.X, Position.Y, Position.Z);
return v1.Equals(v2);
}
}
internal class MyClass {
public MyClass() {
var player = new Player();
var field = new Field();
bool comparePosition = player.ComparePosition(field);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加