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); }
/// <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)); } } }
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)); } }
/// <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); }
/// <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); }