/// <summary> /// 設置可能な場所を返す /// </summary> /// <param name="map">盤面状況</param> /// <param name="nowKoma">手番のコマ</param> /// <returns></returns> public HashSet <Location> CanSets(Koma[,] map, Koma nowKoma) { // 戻り用の集合 var canSets = new HashSet <Location>(); // 全箇所チェック for (int y = 0; y < map.GetLength(1); y++) { for (int x = 0; x < map.GetLength(0); x++) { // コマあり if (map[x, y] != Koma.None) { continue; } // コピー作成 var copy = (Koma[, ])map.Clone(); // 1箇所チェック var p = new Location { X = x, Y = y }; copy[p.X, p.Y] = nowKoma; if (_CanSetPoint(copy, p)) { canSets.Add(p); } } } return(canSets); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { // 戻り用の集合 var canMoves = new HashSet <Location>(); // 4方向チェック foreach (var dir in Direction.All4) { // 単方向直進 for (var p = now + dir; p.In(map); p += dir) { var koma = map[p.X, p.Y]; // 空白マス、あるいは相手のコマ if (koma == null || Direction != koma.Direction) { canMoves.Add(p); } // コマに当たった場合 if (koma != null) { break; } } } // なりの場合 if (IsNari) { // ✕型を追加 canMoves.UnionWith(_Batsu(now)); } return(canMoves); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { // なりの場合 if (IsNari) { return(_KinMoveRule(now, map)); } // 戻り用の集合 var canMoves = new HashSet <Location>(); // 前方向直進 for (var p = now + Direction; p.In(map); p += Direction) { var koma = map[p.X, p.Y]; // 空白マス、あるいは相手のコマ if (koma == null || Direction != koma.Direction) { canMoves.Add(p); } // コマに当たった場合 if (koma != null) { break; } } return(canMoves); }
/// <summary> /// 駒台から持ち上げた時設定可能な箇所 /// </summary> /// <param name="map">盤面状況</param> /// <returns></returns> public override HashSet <Location> CanSetFromDai(Koma[,] map) { // var canSets = base.CanSetFromDai(map); // TODO 特別ロジック return(canSets); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { var canMoves = new HashSet <Location>(); // 十字 canMoves.UnionWith(_Cross(now)); // バツ canMoves.UnionWith(_Batsu(now)); return(canMoves); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { // なりの場合 if (IsNari) { return(_KinMoveRule(now, map)); } // 前一歩 return(new HashSet <Location> { now + Direction }); }
/// <summary> /// 移動できる範囲を求める /// 共通処理含める /// </summary> /// <param name="now"></param> /// <param name="map"></param> /// <returns></returns> public HashSet <Location> GetCanMove(Location now, Koma[,] map) { // 駒別処理 var canMoves = _MoveRule(now, map); // 範囲外のマスを除く canMoves.RemoveWhere(p => !p.In(map)); // 味方のいるマスを除く canMoves.RemoveWhere(p => map[p.X, p.Y] != null && map[p.X, p.Y].Direction == Direction); return(canMoves); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { // なりの場合 if (IsNari) { return(_KinMoveRule(now, map)); } var canMoves = new HashSet <Location> { // 前 + 前 + 左 now + Direction + Direction + Direction.Left, // 前 + 前 + 右 now + Direction + Direction + Direction.Right, }; return(canMoves); }
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { // なりの場合 if (IsNari) { return(_KinMoveRule(now, map)); } // 戻り用 var canMoves = new HashSet <Location>(); // バツ canMoves.UnionWith(_Batsu(now)); // 前一歩 canMoves.Add(now + Direction); return(canMoves); }
void createBoard() { GameObject blackPlane = (GameObject)Resources.Load("BlackPlane"); GameObject whitePlane = (GameObject)Resources.Load("WhitePlane"); komaBoard = new Koma[BOARDSIZE, BOARDSIZE]; //Debug.Log(komaBoard[0,0]); panelBoard = new GameObject[BOARDSIZE, BOARDSIZE]; for (int i = 0; i < BOARDSIZE; i++) { for (int j = 0; j < BOARDSIZE; j++) { panelBoard[i, j] = Instantiate(blackPlane, new Vector3(i, 0, j), Quaternion.identity); panelBoard[i, j].name = i + "," + j; } } }
/// <summary> /// 共通:金の移動ルール /// </summary> /// <param name="now"></param> /// <param name="map"></param> /// <returns></returns> protected HashSet <Location> _KinMoveRule( Location now, Koma[,] map) { // 十字型 var canMoves = _Cross(now); // 前斜め canMoves.Add(new Location { X = now.X + 1, Y = now.Y + Direction.OffsetY }); // 前斜め canMoves.Add(new Location { X = now.X - 1, Y = now.Y + Direction.OffsetY }); return(canMoves); }
/// <summary> /// x,yを中心としてして、反転処理 /// </summary> /// <param name="map">盤面</param> /// <param name="now">開始地点</param> /// <returns>反転対象の集合</returns> public HashSet <Location> ReverseList(Koma[,] map, Location now) { // セットした色 var nowKoma = map[now.X, now.Y]; // 反対側の色 var otherKoma = nowKoma == Koma.White ? Koma.Black : Koma.White; // 反転の座標を記録する var reverseList = new HashSet <Location>(); // 8方向解析 foreach (var direction in Direction.All8) { // 一つ方向の反転対象 var reverse = _DirectionReverse(map, now, direction); reverseList.UnionWith(reverse); } return(reverseList); }
/// <summary> /// 該当ポイントのチェック /// </summary> /// <param name="map">盤面</param> /// <param name="check">確認箇所</param> /// <returns>反転対象の集合</returns> private bool _CanSetPoint(Koma[,] map, Location check) { var nowKoma = map[check.X, check.Y]; // 反対側の色 var otherKoma = nowKoma == Koma.White ? Koma.Black : Koma.White; // 8方向解析 foreach (var direction in Direction.All8) { var reverses = _DirectionReverse(map, check, direction); // 一つ方向の反転になるか if (reverses.Count > 0) { return(true); } } return(false); }
/// <summary> /// 駒台から持ち上げた時設定可能な箇所 /// </summary> /// <param name="map">盤面状況</param> /// <returns></returns> public virtual HashSet <Location> CanSetFromDai(Koma[,] map) { // 戻り用のリスト var canSets = new HashSet <Location>(); // 空白マスの集合を作成 for (int x = 0; x < map.GetLength(0); x++) { for (int y = 0; y < map.GetLength(1); y++) { if (map[x, y] != null) { canSets.Add(new Location { X = x, Y = y }); } } } return(canSets); }
/// <summary> /// 一つ方向の反転対象 /// </summary> /// <param name="map">盤面</param> /// <param name="now">開始地点</param> /// <param name="direction">方向</param> /// <returns>一つ方向の反転対象</returns> private HashSet <Location> _DirectionReverse(Koma[,] map, Location now, Direction direction) { // セットした色 var nowKoma = map[now.X, now.Y]; // 反対側の色 var otherKoma = nowKoma == Koma.White ? Koma.Black : Koma.White; // 反転対象の集合 var reverses = new HashSet <Location>(); // 現在座標の次のから解析 for (var p = now + direction; p.In(map); p += direction) { // 現在の解析座標 var checkKoma = map[p.X, p.Y]; // 自分のコマに当たった if (checkKoma == nowKoma) { return(reverses); } // 空白に当たった if (checkKoma == Koma.None) { // 反転しない return(new HashSet <Location>()); } // 相手の石を反転対象に加える reverses.Add(p); } // 最後のコマをチェック if (reverses.Count > 0) { var last = reverses.Last(); var lastKoma = map[last.X, last.Y]; if (lastKoma != nowKoma) { reverses.Clear(); } } return(reverses); }
public Game() { onboards = new Koma[3, 4]; motoas = new Koma[4]; motobs = new Koma[4]; komas = new Koma[8]; mochias = new List<Koma>(); mochibs = new List<Koma>(); }
/// <summary> /// 駒の移動ルールを求める /// 駒別で実装 /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected abstract HashSet <Location> _MoveRule(Location now, Koma[,] map);
/// <summary> /// 移動できる範囲を求めるd /// </summary> /// <param name="now">今クリックいるマスの座標</param> /// <param name="map">盤面状況</param> /// <returns> /// 移動可能のマスの座標の集合 /// </returns> protected override HashSet <Location> _MoveRule(Location now, Koma[,] map) { return(_KinMoveRule(now, map)); }
public Game() { onboards = new Koma[3, 4]; motoas = new Koma[4]; motobs = new Koma[4]; komas = new Koma[8]; mochias = new List <Koma>(); mochibs = new List <Koma>(); }