public PlayerState( int number, string name, ColorState color, PositionState position, DirectionState direction, bool alive) { this.Number = number; this.Name = name; this.Color = color; this.Position = position; this.Direction = direction; this.Alive = alive; }
/// <summary> /// 与えられた位置から与えられた方向に進んだ次の位置を求める。 /// 例えば (1, 2), Right を渡すと (2, 2) を返す。 /// </summary> /// <param name="pos">位置</param> /// <param name="dir">向き</param> /// <returns>次の位置</returns> public static PositionState GetNextPosition(PositionState pos, DirectionState dir) { switch (dir.Value) { case Direction.Right: return new PositionState(pos.X + 1, pos.Y); case Direction.RightUp: return new PositionState(pos.X + 1, pos.Y - 1); case Direction.Up: return new PositionState(pos.X, pos.Y - 1); case Direction.LeftUp: return new PositionState(pos.X - 1, pos.Y - 1); case Direction.Left: return new PositionState(pos.X - 1, pos.Y); case Direction.LeftDown: return new PositionState(pos.X - 1, pos.Y + 1); case Direction.Down: return new PositionState(pos.X, pos.Y + 1); case Direction.RightDown: return new PositionState(pos.X + 1, pos.Y + 1); } throw new ArgumentException(); }
public InitialPlayerState(PositionState position, DirectionState direction) { this.Position = position; this.Direction = direction; }
public bool Equals(PositionState other) { if ((object)other == null) return false; return this.X.Equals(other.X) && this.Y.Equals(other.Y); }
/// <summary> /// 与えられた位置がフィールド内か否かを調べる。 /// </summary> /// <param name="field">フィールド</param> /// <param name="pos">位置</param> /// <returns>位置がフィールド内なら true 、そうでなければ false</returns> public static bool IsIn(FieldState field, PositionState pos) { return pos.X >= 0 && pos.Y >= 0 && pos.X < field.Width && pos.Y < field.Height; }
private void stepMovePlayer(int playerNumber, Action action) { var player = State.Players[playerNumber]; var dir = player.Direction.Value; if (player.Dead) { return; } if (action == Action.Right) { switch (dir) { case Direction.Right: dir = Direction.RightDown; break; case Direction.RightUp: dir = Direction.Right; break; case Direction.Up: dir = Direction.RightUp; break; case Direction.LeftUp: dir = Direction.Up; break; case Direction.Left: dir = Direction.LeftUp; break; case Direction.LeftDown: dir = Direction.Left; break; case Direction.Down: dir = Direction.LeftDown; break; case Direction.RightDown: dir = Direction.Down; break; } } else if (action == Action.Left) { switch (dir) { case Direction.Right: dir = Direction.RightUp; break; case Direction.RightUp: dir = Direction.Up; break; case Direction.Up: dir = Direction.LeftUp; break; case Direction.LeftUp: dir = Direction.Left; break; case Direction.Left: dir = Direction.LeftDown; break; case Direction.LeftDown: dir = Direction.Down; break; case Direction.Down: dir = Direction.RightDown; break; case Direction.RightDown: dir = Direction.Right; break; } } var pos = player.Position; switch (dir) { case Direction.Right: pos = new PositionState(pos.X + 1, pos.Y); break; case Direction.RightUp: pos = new PositionState(pos.X + 1, pos.Y - 1); break; case Direction.Up: pos = new PositionState(pos.X, pos.Y - 1); break; case Direction.LeftUp: pos = new PositionState(pos.X - 1, pos.Y - 1); break; case Direction.Left: pos = new PositionState(pos.X - 1, pos.Y); break; case Direction.LeftDown: pos = new PositionState(pos.X - 1, pos.Y + 1); break; case Direction.Down: pos = new PositionState(pos.X, pos.Y + 1); break; case Direction.RightDown: pos = new PositionState(pos.X + 1, pos.Y + 1); break; } var players = State.Players.ToList(); players[playerNumber] = new PlayerState( player.Number, player.Name, player.Color, pos, new DirectionState(dir), player.Alive); State = new GameState(State.Field, players.AsReadOnly()); }
private bool isInField(PositionState pos) { return pos.X >= 0 && pos.Y >= 0 && pos.X < State.Field.Width && pos.Y < State.Field.Height; }