/// <summary> /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。 /// </summary> /// <param name="args"></param> /// <returns></returns> public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args) { double score = 0.0d; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // まず、プレイヤー1の視点で得点計算します。 double score_player1 = 0.0d; src_Sky.Foreach_Starlights((Finger finger, Starlight light, ref bool toBreak) => { RO_MotionlessStarlight ms = (RO_MotionlessStarlight)light; RO_Star_Koma koma = Util_Koma.AsKoma(ms.Now); // 単純に駒の種類による点数。 double komaScore = 0.0d; switch (koma.Syurui) { case PieceType.P: komaScore = 1.0d; break; case PieceType.L: komaScore = 3.0d; break; case PieceType.N: komaScore = 3.5d; break; case PieceType.S: komaScore = 9.0d; break; case PieceType.G: komaScore = 9.5d; break; case PieceType.K: komaScore = 100.0d; break; case PieceType.R: komaScore = 25.0d; break; case PieceType.B: komaScore = 20.0d; break; case PieceType.PR: komaScore = 25.0d; break; case PieceType.PB: komaScore = 20.0d; break; case PieceType.PP: komaScore = 9.5d; break; case PieceType.PL: komaScore = 10.0d; break; case PieceType.PN: komaScore = 10.5d; break; case PieceType.PS: komaScore = 11.0d; break; default: komaScore = 0; break; } if (koma.Pside == Playerside.P1) { // プレイヤー1の駒はそのまま } else { // プレイヤー1の駒以外は、ひっくり返します。 komaScore *= -1; } score_player1 += komaScore; }); if (args.PlayerInfo.Playerside == Playerside.P1) { // プレイヤー1はそのまま score = score_player1; } else { // プレイヤー1以外は、ひっくり返します。 score = 100.0d - score_player1; } string meisai = ""; #if DEBUG // 明細 { StringBuilder sb = new StringBuilder(); sb.Append("駒得"); meisai = sb.ToString(); } #endif kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }
/// <summary> /// [巻戻し]時の、駒台にもどる動きを吸収。 /// </summary> /// <param name="syurui2"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="kifu"></param> /// <param name="isMakimodosi"></param> /// <returns></returns> private static Starlight Kifusasi35_NextMasu( PieceType syurui2, ShootingStarlightable move, KifuTree kifu, bool isMakimodosi) { Starlight dst; RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); //移動元 RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); //移動先 if (isMakimodosi) { SyElement masu; if ( Okiba.Gote_Komadai == Util_Masu.GetOkiba(srcKoma.Masu) || Okiba.Sente_Komadai == Util_Masu.GetOkiba(srcKoma.Masu) ) { //>>>>> 1手前が駒台なら // 駒台の空いている場所 Node <ShootingStarlightable, KyokumenWrapper> node6 = kifu.CurNode; masu = KifuIO.GetKomadaiKomabukuroSpace(Util_Masu.GetOkiba(srcKoma.Masu), node6.Value.ToKyokumenConst); // 必ず空いている場所があるものとします。 } else { //>>>>> 1手前が将棋盤上なら // その位置 masu = srcKoma.Masu;//戻し先 } dst = new RO_MotionlessStarlight( //move.Finger, new RO_Star_Koma(dstKoma.Pside, masu,//戻し先 syurui2) ); } else { // 次の位置 dst = new RO_MotionlessStarlight( //move.Finger, new RO_Star_Koma(dstKoma.Pside, dstKoma.Masu, syurui2) ); } return(dst); }