Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 駒の移動 盤面編集
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        public void move_piece_for_edit(SquareHand from, SquareHand to)
        {
            var pos = gameServer.Position;

            // 何にせよ、移動、もしくは交換をする。
            // → 交換をする実装、不評なので、将棋所・ShogiGUIに倣い、手駒に移動させる。

            var from_pc = pos.PieceOn(from);
            var from_pt = from_pc.PieceType();
            var from_pr = from_pc.RawPieceType();
            var to_pc   = pos.PieceOn(to);
            var to_pr   = to_pc.RawPieceType();

            // 移動元と移動先が同じなら何もする必要はない。
            if (from == to)
            {
                // このケースを除外しておかないと、toの駒を手駒に移動させる処理などで
                // from == toだと手駒が増えることになる。

                // しかし、駒を掴んでいる状態が変化するのでこのときだけ再描画は必要。
                Dirty = true;
            }
            else if (to.IsBoardPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上と盤上の駒

#if false // 2駒交換する実装 → 不評なので手駒に移動させることに変更。
                    // fromとtoの升の駒を交換する。
                    // fromに駒があることは確定している。toに駒があろうがなかろうが良い。
                    BoardEditCommand(raw =>
                    {
                        raw.board[(int)from] = to_pc;
                        raw.board[(int)to]   = from_pc;
                    });
#endif

#if true // toのほうが手駒に移動する実装
                    BoardEditCommand(raw =>
                    {
                        raw.board[(int)from] = Piece.NO_PIECE;
                        raw.board[(int)to]   = from_pc;
                        if (to_pr != Piece.NO_PIECE && to_pr != Piece.KING)
                        {
                            // 移動元の駒のcolorの手駒に移動させる。玉は、(欠落するので)勝手に駒箱に移動する。
                            raw.hands[(int)from_pc.PieceColor()].Add(to_pr);
                        }
                    });
#endif
                }
                else if (from.IsHandPiece())
                {
                    // -- 手駒を盤面に

                    BoardEditCommand(raw =>
                    {
#if false // 駒箱に移動する実装 → 不評なので手駒になるように変更
                        raw.hands[(int)from.PieceColor()].Sub(from_pt);
                        raw.board[(int)to] = from_pc;
                        // このtoの位置にもし駒があったとしたら、それは駒箱に移動する。
                        // (その駒が欠落するので..)
#endif

#if true // toのほうが手駒に移動する実装
                        raw.hands[(int)from.PieceColor()].Sub(from_pt);
                        raw.board[(int)to] = from_pc;

                        if (to_pr != Piece.NO_PIECE && to_pr != Piece.KING)
                        {
                            // 移動元の駒のcolorの手駒に移動させる。玉は、(欠落するので)勝手に駒箱に移動する。
                            raw.hands[(int)from.PieceColor()].Add(to_pr);
                        }
#endif
                    });
                }
                else if (from.IsPieceBoxPiece())
                {
                    // -- 駒箱の駒を盤面に
                    // toにあった駒は駒箱に戻ってくるが、これは仕方がない。

                    BoardEditCommand(raw => raw.board[(int)to] = from_pc);
                }
            }
            else if (to.IsHandPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上の駒を手駒に移動させる。

                    // 手駒に出来る駒種でなければキャンセル
                    if (from_pt == Piece.KING)
                    {
                        return;
                    }

                    BoardEditCommand(raw =>
                    {
                        raw.board[(int)from] = Piece.NO_PIECE;
                        raw.hands[(int)to.PieceColor()].Add(from_pr);
                    });
                }
                else if (from.IsHandPiece())
                {
                    // -- 手駒を手駒に。手番が違うならこれは合法。

                    if (from.PieceColor() != to.PieceColor())
                    {
                        BoardEditCommand(raw =>
                        {
                            // 同種の駒が駒台から駒台に移動するので、to_prは関係ない。
                            raw.hands[(int)from.PieceColor()].Sub(from_pr);
                            raw.hands[(int)to.PieceColor()].Add(from_pr);
                        });
                    }
                    else
                    {
                        // 手駒を同じ駒台に移動させることは出来ないし、
                        // 選び直しているのでは?

                        if (to_pr != Piece.NO_PIECE)
                        {
                            pick_up_for_edit(to);
                            return;
                        }
                    }
                }
                else if (from.IsPieceBoxPiece())
                {
                    // -- 駒箱の駒を手駒に

                    // 玉は移動手駒に出来ない
                    if (from_pt != Piece.KING)
                    {
                        BoardEditCommand(raw => raw.hands[(int)to.PieceColor()].Add(from_pr));
                    }
                }
            }
            else if (to.IsPieceBoxPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上の駒を駒箱に
                    BoardEditCommand(raw => raw.board[(int)from] = Piece.NO_PIECE);
                }
                else if (from.IsHandPiece())
                {
                    // -- 駒台の駒を駒箱に

                    BoardEditCommand(raw => raw.hands[(int)from.PieceColor()].Sub(from_pr));
                }
                else if (from.IsPieceBoxPiece())
                {
                    // 駒箱の駒を移動させることは出来ないし、
                    // 選び直しているのでは?

                    if (to_pr != Piece.NO_PIECE)
                    {
                        pick_up_for_edit(to);
                        return;
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 駒の移動 盤面編集
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        public void move_piece_for_edit(SquareHand from, SquareHand to)
        {
            var pos = gameServer.Position;

            // 何にせよ、移動、もしくは交換をする。
            var from_pc = pos.PieceOn(from);
            var from_pt = from_pc.PieceType();
            var from_pr = from_pc.RawPieceType();
            var to_pc   = pos.PieceOn(to);
            var to_pr   = to_pc.RawPieceType();

            if (to.IsBoardPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上と盤上の駒

                    // fromとtoの升の駒を交換する。
                    // fromに駒があることは確定している。toに駒があろうがなかろうが良い。
                    BoardEditCommand(raw =>
                    {
                        raw.board[(int)from] = to_pc;
                        raw.board[(int)to]   = from_pc;
                    });
                }
                else if (from.IsHandPiece())
                {
                    // -- 手駒を盤面に

                    BoardEditCommand(raw =>
                    {
                        raw.hands[(int)from.PieceColor()].Sub(from_pt);
                        raw.board[(int)to] = from_pc;
                        // このtoの位置にもし駒があったとしたら、それは駒箱に移動する。
                        // (その駒が欠落するので..)
                    });
                }
                else if (from.IsPieceBoxPiece())
                {
                    // -- 駒箱の駒を盤面に

                    BoardEditCommand(raw => raw.board[(int)to] = from_pc);
                }
            }
            else if (to.IsHandPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上の駒を手駒に移動させる。

                    // 手駒に出来る駒種でなければキャンセル
                    if (from_pt == Piece.KING)
                    {
                        return;
                    }

                    BoardEditCommand(raw =>
                    {
                        raw.board[(int)from] = Piece.NO_PIECE;
                        raw.hands[(int)to.PieceColor()].Add(from_pr);
                    });
                }
                else if (from.IsHandPiece())
                {
                    // -- 手駒を手駒に。手番が違うならこれは合法。

                    if (from.PieceColor() != to.PieceColor())
                    {
                        BoardEditCommand(raw =>
                        {
                            // 同種の駒が駒台から駒台に移動するので、to_prは関係ない。
                            raw.hands[(int)from.PieceColor()].Sub(from_pr);
                            raw.hands[(int)to.PieceColor()].Add(from_pr);
                        });
                    }
                    else
                    {
                        // 手駒を同じ駒台に移動させることは出来ないし、
                        // 選び直しているのでは?

                        if (to_pr != Piece.NO_PIECE)
                        {
                            pick_up_for_edit(to);
                            return;
                        }
                    }
                }
                else if (from.IsPieceBoxPiece())
                {
                    // -- 駒箱の駒を手駒に

                    // 玉は移動手駒に出来ない
                    if (from_pt != Piece.KING)
                    {
                        BoardEditCommand(raw => raw.hands[(int)to.PieceColor()].Add(from_pr));
                    }
                }
            }
            else if (to.IsPieceBoxPiece())
            {
                if (from.IsBoardPiece())
                {
                    // -- 盤上の駒を駒箱に
                    BoardEditCommand(raw => raw.board[(int)from] = Piece.NO_PIECE);
                }
                else if (from.IsHandPiece())
                {
                    // -- 駒台の駒を駒箱に

                    BoardEditCommand(raw => raw.hands[(int)from.PieceColor()].Sub(from_pr));
                }
                else if (from.IsPieceBoxPiece())
                {
                    // 駒箱の駒を移動させることは出来ないし、
                    // 選び直しているのでは?

                    if (to_pr != Piece.NO_PIECE)
                    {
                        pick_up_for_edit(to);
                        return;
                    }
                }
            }

            StateReset();
        }