Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <summary>
        /// 駒台から持ち上げた時設定可能な箇所
        /// </summary>
        /// <param name="map">盤面状況</param>
        /// <returns></returns>
        public override HashSet <Location> CanSetFromDai(Koma[,] map)
        {
            //
            var canSets = base.CanSetFromDai(map);

            // TODO 特別ロジック

            return(canSets);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
 /// <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
     });
 }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
    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;
            }
        }
    }
Beispiel #11
0
        /// <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);
        }
Beispiel #12
0
        /// <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);
        }
Beispiel #13
0
        /// <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);
        }
Beispiel #14
0
        /// <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);
        }
Beispiel #15
0
        /// <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>();
 }
Beispiel #17
0
 /// <summary>
 /// 駒の移動ルールを求める
 /// 駒別で実装
 /// </summary>
 /// <param name="now">今クリックいるマスの座標</param>
 /// <param name="map">盤面状況</param>
 /// <returns>
 /// 移動可能のマスの座標の集合
 /// </returns>
 protected abstract HashSet <Location> _MoveRule(Location now, Koma[,] map);
Beispiel #18
0
 /// <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>();
 }