예제 #1
0
        public static Move MakeMove(SquareHand from, SquareHand to, bool promote)
        {
            if (!to.IsBoardPiece())
            {
                return(Move.NONE);
            }

            var to_ = (Square)to;

            if (from.IsHandPiece())
            {
                Piece pr = from.ToPiece();
                return(MakeMoveDrop(pr, to_));
            }
            else if (from.IsBoardPiece())
            {
                var from_ = (Square)from;
                if (promote)
                {
                    return(MakeMovePromote(from_, to_));
                }
                else
                {
                    return(MakeMove(from_, to_));
                }
            }

            return(Move.NONE);
        }
예제 #2
0
파일: Move.cs 프로젝트: mirrorjyu/MyShogi
        /// <summary>
        /// 指し手を生成する
        ///
        /// from : 盤上の升のみでなく手駒もありうる
        /// to   : 盤上の升
        /// promote : 成るかどうか
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="promote"></param>
        /// <returns></returns>
        public static Move MakeMove(SquareHand from, SquareHand to, bool promote)
        {
            // ありえないはずだが…。
            if (!to.IsBoardPiece())
            {
                return(Move.NONE);
            }

            var to2 = (Square)to;

            if (from.IsHandPiece())
            {
                // 打ちと成りは共存できない
                if (promote)
                {
                    return(Move.NONE);
                }

                return(MakeMoveDrop(from.ToPiece(), to2));
            }
            else
            {
                var from2 = (Square)from;

                if (promote)
                {
                    return(MakeMovePromote(from2, to2));
                }
                else
                {
                    return(MakeMove(from2, to2));
                }
            }
        }
예제 #3
0
        public static Vector3 SquareToPosition(SquareHand sq)
        {
            if (sq.IsBoardPiece())
            {
                return(SquareToPosition((Square)sq));
            }

            int index = (int)sq.ToPiece();

            if (sq < SquareHand.HandWhite)
            {
                return(new Vector3(RookHandX + HAND_X[index], RookHandY, 0));
            }
            else
            {
                return(new Vector3(-RookHandX - HAND_X[index], -RookHandY, 0));
            }
        }
예제 #4
0
        /// <summary>
        /// sqの描画する場所を得る。
        /// Config.BoardReverseも反映されている。
        /// </summary>
        /// <param name="sq"></param>
        /// <returns></returns>
        private Point PieceLocation(SquareHand sq)
        {
            var   reverse = TheApp.app.config.BoardReverse;
            var   color   = sq.PieceColor();
            Point dest;

            if (color == ShogiCore.Color.NB)
            {
                // 盤面の升
                Square sq2 = reverse ? ((Square)sq).Inv() : (Square)sq;
                int    f   = 8 - (int)sq2.ToFile();
                int    r   = (int)sq2.ToRank();

                dest = new Point(board_location.X + piece_img_size.Width * f, board_location.Y + piece_img_size.Height * r);
            }
            else
            {
                if (reverse)
                {
                    color = color.Not();
                }

                var v = (TheApp.app.config.KomadaiImageVersion == 1) ? 0 : 1;

                var pc = sq.ToPiece();

                if (color == ShogiCore.Color.BLACK)
                {
                    // Point型同士の加算は定義されていないので、第二項をSize型にcastしている。
                    dest = hand_table_pos[v, (int)color] + (Size)hand_piece_pos[v, (int)pc - 1];
                }
                else
                {
                    // 180度回転させた位置を求める
                    // 後手も駒の枚数は右肩に描画するのでそれに合わせて左右のmarginを調整する。
                    dest = new Point(
                        hand_table_pos[v, (int)color].X + (hand_table_size[v].Width - hand_piece_pos[v, (int)pc - 1].X - piece_img_size.Width - 10),
                        hand_table_pos[v, (int)color].Y + (hand_table_size[v].Height - hand_piece_pos[v, (int)pc - 1].Y - piece_img_size.Height + 0)
                        );
                }
            }

            return(dest);
        }
예제 #5
0
        /// <summary>
        /// sqの描画する場所を得る。
        /// reverse : 盤面を180度回転するのかのフラグ
        /// </summary>
        /// <param name="sq"></param>
        /// <param name="reverse"></param>
        /// <returns></returns>
        private Point PieceLocation(SquareHand sq, bool reverse)
        {
            Point dest;

            if (sq.IsBoardPiece())
            {
                // -- 盤上の升

                Square sq2 = reverse ? ((Square)sq).Inv() : (Square)sq;
                int    f   = 8 - (int)sq2.ToFile();
                int    r   = (int)sq2.ToRank();

                dest = new Point(board_location.X + piece_img_size.Width * f, board_location.Y + piece_img_size.Height * r);
            }
            else if (sq.IsHandPiece())
            {
                // -- 手駒

                var color = sq.PieceColor();
                if (reverse)
                {
                    color = color.Not();
                }

                var v = PieceTableVersion;

                var pc = sq.ToPiece();

                if (color == ShogiCore.Color.BLACK)
                {
                    // Point型同士の加算は定義されていないので、第二項をSize型にcastしている。
                    dest = hand_table_pos[v, (int)color] + (Size)hand_piece_pos[v, (int)pc - 1];
                }
                else
                {
                    // 180度回転させた位置を求める
                    // 後手も駒の枚数は右肩に描画するのでそれに合わせて左右のmarginを調整する。
                    dest = new Point(
                        hand_table_pos[v, (int)color].X + (hand_table_size[v].Width - hand_piece_pos[v, (int)pc - 1].X - piece_img_size.Width - 10),
                        hand_table_pos[v, (int)color].Y + (hand_table_size[v].Height - hand_piece_pos[v, (int)pc - 1].Y - piece_img_size.Height + 0)
                        );
                }
            }
            else
            {
                // -- 駒箱の駒

                // 並び替える
                // pc : 歩=0,香=1,桂=2,銀=3,金=4,角=5,飛=6,玉=7にする。
                var pc = (int)sq.ToPiece() - 1;
                if (pc == 6)
                {
                    pc = 4;
                }
                else if (pc == 4 || pc == 5)
                {
                    ++pc;
                }

                if (PieceTableVersion == 0)
                {
                    // 駒箱の1段目に3枚、2段目に2枚、3段目に3枚表示する。

                    // 5を欠番にして2段目を2枚にする。
                    if (pc >= 5)
                    {
                        ++pc;
                    }

                    int file = pc % 3;
                    int rank = pc / 3;

                    int x = (int)(file * piece_img_size.Width * .8);
                    int y = (int)(rank * piece_img_size.Height * .88);

                    if (rank == 1)
                    {
                        x += (int)(piece_img_size.Width / 2 * 0.8);
                    }

                    dest = new Point(
                        hand_box_pos[0].X + x,
                        hand_box_pos[0].Y + y
                        );
                }
                else
                {
                    int file = pc % 2;
                    int rank = pc / 2;

                    int x = (int)(file * piece_img_size.Width * .5);
                    int y = (int)(rank * piece_img_size.Height * .65);

                    dest = new Point(
                        hand_box_pos[1].X + x,
                        hand_box_pos[1].Y + y
                        );
                }
            }

            return(dest);
        }