/// <summary> /// 駒台の空いている升を返します。 /// </summary> /// <param name="okiba">先手駒台、または後手駒台</param> /// <param name="uc_Main">メインパネル</param> /// <returns>置ける場所。無ければヌル。</returns> public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky) { SyElement akiMasu = Masu_Honshogi.Error; // 先手駒台または後手駒台の、各マスの駒がある場所を調べます。 bool[] exists = new bool[Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH];//駒台スペースは40マスです。 src_Sky.Foreach_Starlights((Finger finger, Starlight komaP, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(komaP.Now); if (Util_Masu.GetOkiba(koma.Masu) == okiba) { exists[ Util_Masu.AsMasuNumber(koma.Masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba)) ] = true; } }); //駒台スペースは40マスです。 for (int i = 0; i < Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH; i++) { if (!exists[i]) { akiMasu = Masu_Honshogi.Items_All[i + Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))]; goto gt_EndMethod; } } gt_EndMethod: //System.C onsole.WriteLine("ゲット駒台駒袋スペース=" + akiMasu); return(akiMasu); }
/// <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); }