public Result_Ajimi Ajimi(SkyConst src_Sky) { Result_Ajimi result_Ajimi = Result_Ajimi.Empty; RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now); RO_Star_Koma koma2 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now); Logger.Trace("将棋サーバー「ではここで、王さまがどこにいるか確認してみましょう」"); Logger.Trace("▲王の置き場=" + Util_Masu.GetOkiba(koma1.Masu)); Logger.Trace("△王の置き場=" + Util_Masu.GetOkiba(koma2.Masu)); if (Util_Masu.GetOkiba(koma1.Masu) != Okiba.ShogiBan) { // 先手の王さまが将棋盤上にいないとき☆ result_Ajimi = Result_Ajimi.Lost_SenteOh; } else if (Util_Masu.GetOkiba(koma2.Masu) != Okiba.ShogiBan) { // または、後手の王さまが将棋盤上にいないとき☆ result_Ajimi = Result_Ajimi.Lost_GoteOh; } else { result_Ajimi = Result_Ajimi.Empty; } return(result_Ajimi); }
/// <summary> /// 局面に合わせて、駒ボタンのx,y位置を変更します /// </summary> /// <param name="btnKoma">駒</param> public static void Redraw_KomaLocation( Finger figKoma, NarabeRoomViewModel shogiGui ) { RO_Star_Koma koma = Util_Koma.AsKoma(shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(figKoma).Now); Shape_BtnKoma btnKoma = Util_InGui.FingerToKomaBtn(figKoma, shogiGui); int suji; int dan; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Util_MasuNum.MasuToDan(koma.Masu, out dan); switch (Util_Masu.GetOkiba(koma.Masu)) { case Okiba.ShogiBan: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.Shogiban.SujiToX(suji), shogiGui.Shape_PnlTaikyoku.Shogiban.DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Sente_Komadai: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Gote_Komadai: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.KomaBukuro: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; } }
public override void Step() { // 入っているマウス操作イベントのうち、マウスムーブは 1つに 集約 します。 bool bMouseMove_SceneB_1TumamitaiKoma = false; // 入っているマウス操作イベントは、全部捨てていきます。 MouseEventState[] queue = this.MouseEventQueue.ToArray(); this.MouseEventQueue.Clear(); foreach (MouseEventState eventState in queue) { switch (this.shogiGui.Scene) { case SceneName.SceneB_1TumamitaiKoma: { #region つまみたい駒 switch (eventState.Name2) { case MouseEventStateName.Arive: { #region アライブ //------------------------------ // メナス //------------------------------ Util_Menace.Menace(this.shogiGui); #endregion } break; case MouseEventStateName.MouseMove: { #region マウスムーブ if (bMouseMove_SceneB_1TumamitaiKoma) { continue; } bMouseMove_SceneB_1TumamitaiKoma = true; SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst; Point mouse = eventState.MouseLocation; //---------- // 将棋盤:升目 //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && Okiba.ShogiBan == widget.Okiba) { Shape_BtnMasuImpl cell = (Shape_BtnMasuImpl)widget.Object; cell.LightByMouse(mouse.X, mouse.Y); if (cell.Light) { shogiGui.ResponseData.ToRedraw(); } break; } } //---------- // 駒置き、駒袋:升目 //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && widget.Okiba.HasFlag(Okiba.Sente_Komadai | Okiba.Gote_Komadai | Okiba.KomaBukuro)) { Shape_BtnMasuImpl cell = (Shape_BtnMasuImpl)widget.Object; cell.LightByMouse(mouse.X, mouse.Y); if (cell.Light) { shogiGui.ResponseData.ToRedraw(); } } } //---------- // 駒 //---------- foreach (Shape_BtnKomaImpl btnKoma in shogiGui.Shape_PnlTaikyoku.BtnKomaDoors) { btnKoma.LightByMouse(mouse.X, mouse.Y); if (btnKoma.Light) { shogiGui.ResponseData.ToRedraw(); RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(btnKoma.Koma).Now); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(koma.Masu)) { // マウスオーバーした駒の利き TimedB.Check_MouseoverKomaKiki(shogiGui, btnKoma.Koma); break; } } } foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if (widget.IsLight_OnFlowB_1TumamitaiKoma) { widget.LightByMouse(mouse.X, mouse.Y); if (widget.Light) { shogiGui.ResponseData.ToRedraw(); } } } #endregion } break; case MouseEventStateName.MouseLeftButtonDown: { #region マウス左ボタンダウン SceneName nextPhaseB = SceneName.Ignore; SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst; //---------- // 駒 //---------- foreach (Shape_BtnKomaImpl btnKoma in shogiGui.Shape_PnlTaikyoku.BtnKomaDoors) { if (btnKoma.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { //>>>>>>>>>> 駒にヒットしました。 if (null != shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui)) { //>>>>>>>>>> 既に選択されている駒があります。→★成ろうとしたときの、取られる相手の駒かも。 goto gt_Next1; } // 既に選択されている駒には無効 if (shogiGui.Shape_PnlTaikyoku.FigTumandeiruKoma == (int)btnKoma.Koma) { goto gt_Next1; } if (btnKoma.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) //>>>>> 駒をつまみました。 { // 駒をつまみます。 shogiGui.Shape_PnlTaikyoku.SetFigTumandeiruKoma((int)btnKoma.Koma); shogiGui.Shape_PnlTaikyoku.SelectFirstTouch = true; nextPhaseB = SceneName.SceneB_2OkuKoma; shogiGui.Shape_PnlTaikyoku.SetMouseStarlightOrNull2( src_Sky.StarlightIndexOf(btnKoma.Koma) //TODO:改造 ); shogiGui.Shape_PnlTaikyoku.SetHMovedKoma(Fingers.Error_1); shogiGui.ResponseData.ToRedraw(); } } gt_Next1: ; } //---------- // 既に選択されている駒 //---------- Shape_BtnKoma btnKoma_Selected = shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui); //---------- // 各種ボタン //---------- { foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if (widget.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { if (null != widget.Delegate_MouseHitEvent) { widget.Delegate_MouseHitEvent( shogiGui , btnKoma_Selected ); } } } } shogiGui.SetScene(nextPhaseB); //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; case MouseEventStateName.MouseLeftButtonUp: { #region マウス左ボタンアップ SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst; //---------- // 将棋盤:升目 //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && Okiba.ShogiBan == widget.Okiba) { Shape_BtnMasuImpl cell = (Shape_BtnMasuImpl)widget.Object; if (cell.DeselectByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { shogiGui.ResponseData.ToRedraw(); } } } //---------- // 駒置き、駒袋:升目 //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && widget.Okiba.HasFlag(Okiba.Sente_Komadai | Okiba.Gote_Komadai | Okiba.KomaBukuro)) { Shape_BtnMasuImpl cell = (Shape_BtnMasuImpl)widget.Object; if (cell.DeselectByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { shogiGui.ResponseData.ToRedraw(); } } } //---------- // 駒 //---------- foreach (Shape_BtnKomaImpl btnKoma in shogiGui.Shape_PnlTaikyoku.BtnKomaDoors) { if (btnKoma.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { //>>>>> つまんでいる駒から、指を放しました shogiGui.Shape_PnlTaikyoku.SetFigTumandeiruKoma(-1); RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf((int)btnKoma.Koma).Now); if (Okiba.ShogiBan == Util_Masu.GetOkiba(koma1.Masu)) { //---------- // 移動済表示 //---------- shogiGui.Shape_PnlTaikyoku.SetHMovedKoma(btnKoma.Koma); //------------------------------ // 棋譜に符号を追加(マウスボタンが放されたとき)TODO:まだ早い。駒が成るかもしれない。 //------------------------------ // 棋譜 Starlight dstStarlight = shogiGui.Shape_PnlTaikyoku.MouseStarlightOrNull2; System.Diagnostics.Debug.Assert(null != dstStarlight, "mouseStarlightがヌル"); Starlight srcStarlight = src_Sky.StarlightIndexOf(btnKoma.Koma); System.Diagnostics.Debug.Assert(null != srcStarlight, "komaStarlightがヌル"); ShootingStarlightable move = new RO_ShootingStarlight( //btnKoma.Koma, dstStarlight.Now, srcStarlight.Now, shogiGui.Shape_PnlTaikyoku.MousePos_FoodKoma != null ? shogiGui.Shape_PnlTaikyoku.MousePos_FoodKoma.Syurui : PieceType.None ); // 選択している駒の元の場所と、移動先 // TODO: 一手[巻戻し]のときは追加したくない Node <ShootingStarlightable, KyokumenWrapper> newNode = new KifuNodeImpl(move, new KyokumenWrapper(new SkyConst(src_Sky)), KifuNodeImpl.GetReverseTebanside(((KifuNode)shogiGui.GameViewModel.Kifu.CurNode).Tebanside) ); //マウスの左ボタンを放したときです。 ((KifuNode)KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu)).AppendChildA_New(newNode); Util_InServer.SetCurNode_Srv(shogiGui, newNode); shogiGui.ResponseData.ToRedraw(); //------------------------------ // 符号表示 //------------------------------ FugoJ fugoJ; RO_Star_Koma koma2 = Util_Koma.AsKoma(move.LongTimeAgo); fugoJ = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)](move, new KyokumenWrapper(src_Sky)); //「▲2二角成」なら、馬(dst)ではなくて角(src)。 shogiGui.Shape_PnlTaikyoku.SetFugo(fugoJ.ToText_UseDou( KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu) )); //------------------------------ // チェンジターン //------------------------------ if (!shogiGui.Shape_PnlTaikyoku.Requested_NaruDialogToShow) { shogiGui.ChangeTurn(); //マウス左ボタンを放したのでチェンジターンします。 } shogiGui.ResponseData.OutputTxt = ResponseGedanTxt.Kifu; shogiGui.ResponseData.ToRedraw(); } } } //------------------------------------------------------------ // 選択解除か否か //------------------------------------------------------------ { foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if (widget.DeselectByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y, shogiGui)) { shogiGui.ResponseData.ToRedraw(); } } } //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; } #endregion } break; case SceneName.SceneB_2OkuKoma: { #region 置く駒 switch (eventState.Name2) { case MouseEventStateName.MouseLeftButtonUp: { #region マウス左ボタンアップ Node <ShootingStarlightable, KyokumenWrapper> siteiNode = KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu); SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst; //---------- // 駒 //---------- foreach (Shape_BtnKomaImpl btnKoma in shogiGui.Shape_PnlTaikyoku.BtnKomaDoors) { if (btnKoma.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { //>>>>> マウスが重なっていました if (shogiGui.Shape_PnlTaikyoku.SelectFirstTouch) { // クリックのマウスアップ shogiGui.Shape_PnlTaikyoku.SelectFirstTouch = false; } else { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(btnKoma.Koma).Now); if (Okiba.ShogiBan == Util_Masu.GetOkiba(koma.Masu)) { //>>>>> 将棋盤の上に置いてあった駒から、指を放しました //System.C onsole.WriteLine("つまんでいる駒を放します。(4)"); shogiGui.Shape_PnlTaikyoku.SetFigTumandeiruKoma(-1); //---------- // 移動済表示 //---------- shogiGui.Shape_PnlTaikyoku.SetHMovedKoma(btnKoma.Koma); //------------------------------ // 棋譜に符号を追加(マウスボタンが放されたとき)TODO:まだ早い。駒が成るかもしれない。 //------------------------------ ShootingStarlightable move = new RO_ShootingStarlight( //btnKoma.Koma, shogiGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now, src_Sky.StarlightIndexOf(btnKoma.Koma).Now, shogiGui.Shape_PnlTaikyoku.MousePos_FoodKoma != null ? shogiGui.Shape_PnlTaikyoku.MousePos_FoodKoma.Syurui : PieceType.None ); // 選択している駒の元の場所と、移動先 ShootingStarlightable last; { last = siteiNode.Key; } //ShootingStarlightable previousMove = last; //符号の追加が行われる前に退避 Node <ShootingStarlightable, KyokumenWrapper> newNode = new KifuNodeImpl( move, new KyokumenWrapper(new SkyConst(src_Sky)), KifuNodeImpl.GetReverseTebanside(((KifuNode)shogiGui.GameViewModel.Kifu.CurNode).Tebanside) ); //マウスの左ボタンを放したときです。 ((KifuNode)KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu)).AppendChildA_New(newNode); Util_InServer.SetCurNode_Srv(shogiGui, newNode); shogiGui.ResponseData.ToRedraw(); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ここでツリーの内容は変わっている。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //------------------------------ // 符号表示 //------------------------------ RO_Star_Koma koma2 = Util_Koma.AsKoma(move.LongTimeAgo); FugoJ fugoJ; fugoJ = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)](move, new KyokumenWrapper(src_Sky)); //「▲2二角成」なら、馬(dst)ではなくて角(src)。 shogiGui.Shape_PnlTaikyoku.SetFugo(fugoJ.ToText_UseDou( KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu) )); //------------------------------ // チェンジターン //------------------------------ if (!shogiGui.Shape_PnlTaikyoku.Requested_NaruDialogToShow) { //System.C onsole.WriteLine("マウス左ボタンを放したのでチェンジターンします。"); shogiGui.ChangeTurn(); //マウス左ボタンを放したのでチェンジターンします。 } shogiGui.ResponseData.OutputTxt = ResponseGedanTxt.Kifu; shogiGui.ResponseData.ToRedraw(); } } } } //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; case MouseEventStateName.MouseLeftButtonDown: { #region マウス左ボタンダウン SceneName nextPhaseB = SceneName.Ignore; //System.C onsole.WriteLine("B2マウスダウン"); //---------- // つまんでいる駒 //---------- Shape_BtnKoma btnTumandeiruKoma = shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui); if (null == btnTumandeiruKoma) { //System.C onsole.WriteLine("つまんでいる駒なし"); goto gt_nextBlock; } //>>>>> 選択されている駒があるとき Starlight tumandeiruLight = shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf((int)btnTumandeiruKoma.Finger); //---------- // 指したい先 //---------- Shape_BtnMasuImpl btnSasitaiMasu = null; //---------- // 将棋盤:升目 <移動先など> //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && Okiba.ShogiBan == widget.Okiba) { if (widget.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) //>>>>> 指したいマスはここです。 { btnSasitaiMasu = (Shape_BtnMasuImpl)widget.Object; break; } } } //---------- // 駒置き、駒袋:升目 //---------- foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if ("Masu" == widget.Type && widget.Okiba.HasFlag(Okiba.Sente_Komadai | Okiba.Gote_Komadai | Okiba.KomaBukuro)) { Shape_BtnMasuImpl btnSasitaiMasu2 = (Shape_BtnMasuImpl)widget.Object; if (btnSasitaiMasu2.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) //>>>>> 升目をクリックしたとき { bool match = false; shogiGui.GameViewModel.GuiSkyConst.Foreach_Starlights((Finger finger, Starlight ml, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(ml.Now); if (koma.Masu == btnSasitaiMasu2.Zahyo) { //>>>>> そこに駒が置いてあった。 #if DEBUG // MessageBox.Show("駒が置いてあった","デバッグ中"); #endif match = true; toBreak = true; } }); if (!match) { btnSasitaiMasu = btnSasitaiMasu2; goto gt_EndKomaoki; } } } } gt_EndKomaoki: ; if (null == btnSasitaiMasu) { // 指したいマスなし goto gt_nextBlock; } //指したいマスが選択されたとき // TODO:合法手かどうか判定したい。 if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(btnSasitaiMasu.Zahyo)) //>>>>> 将棋盤:升目 <移動先など> { //------------------------------ // 成る/成らない //------------------------------ // // 盤上の、不成の駒で、 / 相手陣に入るものか、相手陣から出てくる駒 ※先手・後手区別なし // RO_Star_Koma koma = Util_Koma.AsKoma(tumandeiruLight.Now); if ( Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(koma.Masu) && Util_Sky.IsNareruKoma(tumandeiruLight) && ( Util_Masu.InAitejin(btnSasitaiMasu.Zahyo, Util_InServer.CurPside(shogiGui)) || Util_Sky.InAitejin(tumandeiruLight) ) ) { // 成るか/成らないか ダイアログボックスを表示します。 shogiGui.Shape_PnlTaikyoku.Request_NaruDialogToShow(true); } if (shogiGui.Shape_PnlTaikyoku.Requested_NaruDialogToShow) { // 成る/成らないボタン表示 shogiGui.Shape_PnlTaikyoku.GetWidget("BtnNaru").Visible = true; shogiGui.Shape_PnlTaikyoku.GetWidget("BtnNaranai").Visible = true; shogiGui.Shape_PnlTaikyoku.SetNaruMasu(btnSasitaiMasu); nextPhaseB = SceneName.SceneB_3ErabuNaruNaranai; } else { shogiGui.Shape_PnlTaikyoku.GetWidget("BtnNaru").Visible = false; shogiGui.Shape_PnlTaikyoku.GetWidget("BtnNaranai").Visible = false; // 駒を動かします。 { // GuiからServerへ渡す情報 PieceType syurui; Starlight dst; Util_InGui.Komamove1a_49Gui(out syurui, out dst, btnTumandeiruKoma, btnSasitaiMasu, shogiGui); // ServerからGuiへ渡す情報 bool torareruKomaAri; RO_Star_Koma koma_Food_after; Util_InServer.Komamove1a_50Srv(out torareruKomaAri, out koma_Food_after, dst, btnTumandeiruKoma.Koma, Util_Koma.AsKoma(dst.Now), shogiGui); Util_InGui.Komamove1a_51Gui(torareruKomaAri, koma_Food_after, shogiGui); } nextPhaseB = SceneName.SceneB_1TumamitaiKoma; } shogiGui.ResponseData.ToRedraw(); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Util_Masu.GetOkiba(btnSasitaiMasu.Zahyo))) //>>>>> 駒置き:升目 { //System.C onsole.WriteLine("駒台上"); RO_Star_Koma koma = Util_Koma.AsKoma(shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(btnTumandeiruKoma.Koma).Now); SkyBuffer buffer_Sky = new SkyBuffer(shogiGui.GameViewModel.GuiSkyConst); buffer_Sky.AddOverwriteStarlight(btnTumandeiruKoma.Koma, new RO_MotionlessStarlight( //btnTumandeiruKoma.Koma, new RO_Star_Koma(Converter04.Okiba_ToPside(Util_Masu.GetOkiba(btnSasitaiMasu.Zahyo)),// 先手の駒置きに駒を置けば、先手の向きに揃えます。 btnSasitaiMasu.Zahyo, KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku))) )); shogiGui.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky)); nextPhaseB = SceneName.SceneB_1TumamitaiKoma; shogiGui.ResponseData.RedrawStarlights(); // 駒の再描画要求 shogiGui.ResponseData.ToRedraw(); } gt_nextBlock: //---------- // 既に選択されている駒 //---------- Shape_BtnKoma btnKoma_Selected = shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui); //---------- // 初期配置ボタン //---------- { foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if (widget.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { if (null != widget.Delegate_MouseHitEvent) { widget.Delegate_MouseHitEvent( shogiGui , btnKoma_Selected ); } } } } shogiGui.SetScene(nextPhaseB); //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; case MouseEventStateName.MouseRightButtonDown: { #region マウス右ボタンダウン // 各駒の、移動済フラグを解除 //System.C onsole.WriteLine("つまんでいる駒を放します。(5)"); shogiGui.Shape_PnlTaikyoku.SetFigTumandeiruKoma(-1); shogiGui.Shape_PnlTaikyoku.SelectFirstTouch = false; //------------------------------ // 状態を戻します。 //------------------------------ shogiGui.SetScene(SceneName.SceneB_1TumamitaiKoma); //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; } #endregion } break; case SceneName.SceneB_3ErabuNaruNaranai: { #region 成る成らない switch (eventState.Name2) { case MouseEventStateName.MouseLeftButtonDown: { #region マウス左ボタンダウン SceneName nextPhaseB = SceneName.Ignore; //GuiSky この関数の途中で変更される。ローカル変数に入れているものは古くなる。 //---------- // 既に選択されている駒 //---------- Shape_BtnKoma btnKoma_Selected = shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui); string[] buttonNames = new string[] { "BtnNaru", // [成る]ボタン "BtnNaranai" // [成らない]ボタン }; foreach (string buttonName in buttonNames) { UserWidget widget = shogiGui.Shape_PnlTaikyoku.GetWidget(buttonName); if (widget.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { if (null != widget.Delegate_MouseHitEvent) { widget.Delegate_MouseHitEvent( shogiGui , btnKoma_Selected ); } } } // //---------- // 既に選択されている駒 //---------- //Shape_BtnKomaImpl btnKoma_Selected = shogiGui.Shape_PnlTaikyoku.Btn_TumandeiruKoma(shogiGui); //---------- // 初期配置ボタン //---------- { foreach (UserWidget widget in shogiGui.Shape_PnlTaikyoku.Widgets.Values) { if (widget.HitByMouse(eventState.MouseLocation.X, eventState.MouseLocation.Y)) { if (null != widget.Delegate_MouseHitEvent) { widget.Delegate_MouseHitEvent( shogiGui , btnKoma_Selected ); } } } } shogiGui.SetScene(nextPhaseB); //------------------------------ // このメインパネルの反応 //------------------------------ shogiGui.Response("MouseOperation"); #endregion } break; } #endregion } break; } } //gt_EndMethod1: // ; }
/// <summary> /// 駒を動かします(1)。マウスボタンが押下されたとき。 /// /// 成る、成らない関連。 /// /// </summary> public static void Komamove1a_50Srv( out bool torareruKomaAri, out RO_Star_Koma koma_Food_after, Starlight dst, Finger btnTumandeiruKoma_Koma, RO_Star_Koma koma1, IRoomViewModel roomViewModel ) { Finger btnKoma_Food_Koma; torareruKomaAri = false; // 取られることになる駒のボタン btnKoma_Food_Koma = Util_Sky.Fingers_AtMasuNow(roomViewModel.GameViewModel.GuiSkyConst, koma1.Masu).ToFirst(); if (Fingers.Error_1 == btnKoma_Food_Koma) { koma_Food_after = null; btnKoma_Food_Koma = Fingers.Error_1; goto gt_EndBlock1; } //>>>>> 取る駒があったとき torareruKomaAri = true; PieceType koma_Food_pre_Syurui = Util_Koma.AsKoma(roomViewModel.GameViewModel.GuiSkyConst.StarlightIndexOf(btnKoma_Food_Koma).Now).Syurui; // その駒は、駒置き場に移動させます。 SyElement akiMasu; switch (koma1.Pside) { case Playerside.P2: akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, roomViewModel.GameViewModel.GuiSkyConst); if (Masu_Honshogi.Error != akiMasu) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P2, akiMasu, //駒台へ KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P2, Util_Masu.OkibaSujiDanToMasu( Okiba.Gote_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; case Playerside.P1: //thru default: akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, roomViewModel.GameViewModel.GuiSkyConst); if (Masu_Honshogi.Error != akiMasu) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P1, akiMasu, //駒台へ KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P1, Util_Masu.OkibaSujiDanToMasu( Okiba.Sente_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; } gt_EndBlock1: if (torareruKomaAri) { { SkyBuffer buffer_Sky1; // 取られる動き buffer_Sky1 = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky1.AddOverwriteStarlight( btnKoma_Food_Koma, new RO_MotionlessStarlight( //btnKoma_Food_Koma, koma_Food_after ) ); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky1)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ } //------------------------------ // 成りは解除。 //------------------------------ switch (Util_Masu.GetOkiba(koma_Food_after.Masu)) { case Okiba.Sente_Komadai: //thru case Okiba.Gote_Komadai: // 駒台へ移動しました //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SkyBuffer buffer_Sky2 = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky2.AddOverwriteStarlight( btnKoma_Food_Koma, new RO_MotionlessStarlight( //btnKoma_Food_Koma, koma_Food_after ) ); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky2)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ break; } } SkyBuffer buffer_Sky = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky.AddOverwriteStarlight(btnTumandeiruKoma_Koma, dst); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ }
/// <summary> /// HTML出力。(これは作者のホームページ用に書かれています) /// </summary> public static string CreateHtml(NarabeRoomViewModel shogiGui) { StringBuilder sb = new StringBuilder(); sb.AppendLine("<div style=\"position:relative; left:0px; top:0px; border:solid 1px black; width:250px; height:180px;\">"); // 後手の持ち駒 sb.AppendLine(" <div style=\"position:absolute; left:0px; top:2px; width:30px;\">"); sb.AppendLine(" △後手"); sb.AppendLine(" <div style=\"margin-top:10px; width:30px;\">"); sb.Append(" "); SkyConst siteiSky = shogiGui.GameViewModel.GuiSkyConst; siteiSky.Foreach_Starlights((Finger finger, Starlight ml, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(ml.Now); if (Util_Masu.GetOkiba(koma.Masu) == Okiba.Gote_Komadai) { sb.Append(KomaSyurui14Array.Fugo[(int)Haiyaku184Array.Syurui(koma.Haiyaku)]); } }); sb.AppendLine(" </div>"); sb.AppendLine(" </div>"); // 将棋盤 sb.AppendLine(" <div style=\"position:absolute; left:30px; top:2px; width:182px;\">"); sb.AppendLine(" <table>"); for (int dan = 1; dan <= 9; dan++) { sb.Append(" <tr>"); for (int suji = 9; 1 <= suji; suji--) { bool isSpace = true; siteiSky.Foreach_Starlights((Finger finger, Starlight ml, ref bool toBreak) => { RO_Star_Koma koma2 = Util_Koma.AsKoma(ml.Now); int suji2; Util_MasuNum.MasuToSuji(koma2.Masu, out suji2); int dan2; Util_MasuNum.MasuToDan(koma2.Masu, out dan2); if ( Util_Masu.GetOkiba(koma2.Masu) == Okiba.ShogiBan && //盤上 suji2 == suji && dan2 == dan ) { if (Playerside.P2 == koma2.Pside) { sb.Append("<td><span class=\"koma2x\">"); sb.Append(KomaSyurui14Array.Fugo[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)]); sb.Append("</span></td>"); isSpace = false; } else { sb.Append("<td><span class=\"koma1x\">"); sb.Append(KomaSyurui14Array.Fugo[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)]); sb.Append("</span></td>"); isSpace = false; } } }); if (isSpace) { sb.Append("<td> </td>"); } } sb.AppendLine("</tr>"); } sb.AppendLine(" </table>"); sb.AppendLine(" </div>"); // 先手の持ち駒 sb.AppendLine(" <div style=\"position:absolute; left:215px; top:2px; width:30px;\">"); sb.AppendLine(" ▲先手"); sb.AppendLine(" <div style=\"margin-top:10px; width:30px;\">"); sb.Append(" "); siteiSky.Foreach_Starlights((Finger finger, Starlight ml, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(ml.Now); if (Util_Masu.GetOkiba(koma.Masu) == Okiba.Sente_Komadai) { sb.Append(KomaSyurui14Array.Fugo[(int)Haiyaku184Array.Syurui(koma.Haiyaku)]); } }); sb.AppendLine(" </div>"); sb.AppendLine(" </div>"); // sb.AppendLine("</div>"); return(sb.ToString()); }
/// <summary> /// 入力欄のテキストを取得します。 /// </summary> /// <returns></returns> public string ReadLine2() { int lastTesumi = Util_InServer.CountCurTesumi2(this.ShogiGui); SkyConst src_Sky = this.ShogiGui.GameViewModel.GuiSkyConst; //------------------------------------------------------------ // 表について //------------------------------------------------------------ // // 配列の添え字は次の通り。 // // 9 8 7 6 5 4 3 2 1 // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│一 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ 9│10│11│12│13│14│15│16│17│二 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │18│19│20│21│22│23│24│25│26│三 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │27│28│29│30│31│32│33│34│35│四 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │36│37│38│39│40│41│42│43│44│五 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │45│46│47│48│49│50│51│52│53│六 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │54│55│56│57│58│59│60│61│62│七 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │63│64│65│66│67│68│69│70│71│八 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │72│73│74│75│76│77│78│79│80│九 // └─┴─┴─┴─┴─┴─┴─┴─┴─┘ //------------------------------------------------------------ // 先手駒について //------------------------------------------------------------ // 先手駒の位置を表にします。 bool[] wallSTable = new bool[Ui_PnlMain.NSQUARE]; // 先手駒の利きを表にします。 bool[] kikiSTable = new bool[Ui_PnlMain.NSQUARE]; Node <ShootingStarlightable, KyokumenWrapper> siteiNode = this.ShogiGui.GameViewModel.Kifu.NodeAt( this.ShogiGui.GameViewModel.Kifu.CountTesumi(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui)) ); foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P1).Items) { Starlightable light = src_Sky.StarlightIndexOf(figKoma).Now; RO_Star_Koma koma = Util_Koma.AsKoma(light); int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 壁 wallSTable[(dan - 1) * 9 + (9 - suji)] = true; // 利き kikiSTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘 } //------------------------------------------------------------ // 後手駒について //------------------------------------------------------------ // 先手駒の位置を表にします。 bool[] wallGTable = new bool[Ui_PnlMain.NSQUARE]; // 先手駒の利きを表にします。 bool[] kikiGTable = new bool[Ui_PnlMain.NSQUARE]; foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P2).Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 壁 wallGTable[(dan - 1) * 9 + (9 - suji)] = true; // 利き kikiGTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘 } string tuginoItte = "▲9九王嘘"; Fingers fingers = Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, this.ShogiGui.GameViewModel.Kifu.CountPside(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui))); if (0 < fingers.Count) { ShootingStarlightable tuginoMoveData; Finger finger = fingers[LarabeRandom.Random.Next(fingers.Count)];//ランダムに1つ。 Starlight sl = src_Sky.StarlightIndexOf(finger); RO_Star_Koma koma = Util_Koma.AsKoma(sl.Now); Playerside pside_getTeban = this.ShogiGui.GameViewModel.Kifu.CountPside(lastTesumi); switch (pside_getTeban) { case Playerside.P2: { // 後手番です。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 前に1つ突き出させます。 tuginoMoveData = new RO_ShootingStarlight( //sl.Finger, new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(koma.Masu), suji, dan ), koma.Haiyaku ), new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, suji, dan + 1 ), koma.Haiyaku ), PieceType.None ); break; } default: { // 先手番です。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 前に1つ突き出させます。 tuginoMoveData = new RO_ShootingStarlight( //sl.Finger, new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(koma.Masu), suji, dan ), koma.Haiyaku ), new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, suji, dan - 1 ), koma.Haiyaku ), PieceType.None ); break; } } RO_Star_Koma koma2 = Util_Koma.AsKoma(tuginoMoveData.LongTimeAgo); FugoJ fugoJ = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)](tuginoMoveData, new KyokumenWrapper(src_Sky));//「▲2二角成」なら、馬(dst)ではなくて角(src)。 tuginoItte = fugoJ.ToText_UseDou(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui)); } return(tuginoItte); }