更新日 Wednesday, 21-Jan-2015 13:47:00 JST

将棋ゲーム 駒の動きを制限する [2]

駒によって動ける範囲が限られています。
以下、されを反映させるクラスです。

引数に
駒の名前、どのこまが動くのか(駒のX軸とY軸)、どこへ動くのか(次の位置のX軸とY軸)
を取ります。

Base.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace MyShougi0001 { class CheckMove { public Boolean CheckNextPosistion(string Koma_name, int komaX_from, int komaY_from, int komaX_next, int komaY_next) { Boolean flag = false; // 駒(升)の大きさ int masu_width = 60; int masu_height = 64; // 移動距離の絶対値の取得 int haba_X = komaX_next - komaX_from; int haba_Y = komaY_next - komaY_from; int retsu = System.Math.Abs(haba_X); int gyosu = System.Math.Abs(haba_Y); // int ratioX = retsu / masu_width; int ratioY = gyosu / masu_height; int ratio = 0; if (ratioX != 0) { try { ratio = ratioX / ratioY; } catch { } finally { } } // string str = ratioX.ToString() + ", " + ratioY.ToString(); // MessageBox.Show(str); // 玉 if (Koma_name.Contains("ou")) { if (ratioX == 1) { flag = true; } if (ratioY == 1) { flag = true; } } // 飛車 if (Koma_name.Contains("hisha")) { flag = false; if (retsu == 0 && gyosu != 0) { flag = true; } if (gyosu == 0 && retsu != 0) { flag = true; } } // 角車 if (Koma_name.Contains("kaku")) { flag = false; if (ratio == 1 ) { flag = true; } } // 先手金 if (Koma_name.Contains("Skin")) { // 玉と同じ設定 if (ratioX == 1) { flag = true; } if (ratioY == 1) { flag = true; } // 下は全てfalse if (haba_Y > 0) { flag = false; } // 真下はOKに if (retsu == 0) { flag = true; } } // 後手金 if (Koma_name.Contains("Gkin")) { // 玉と同じ設定 if (ratioX == 1) { flag = true; } if (ratioY == 1) { flag = true; } // 下は全てfalse if (haba_Y < 0) { flag = false; } // 真下はOKに if (retsu == 0) { flag = true; } } // 先手銀 if (Koma_name.Contains("Sgin")) { // 玉と同じ設定 if (ratioX == 1) { flag = true; } if (ratioY == 1) { flag = true; } // 横への動きはfalse if (gyosu == 0) { flag = false; } // 真下はfalse if (retsu == 0 && haba_Y > 0) { flag = false; } } // 後手銀 if (Koma_name.Contains("Ggin")) { // 玉と同じ設定 if (ratioX > 1) { flag = false; } if (ratioY > 1) { flag = false; } // 横への動きはfalse if (gyosu == 0) { flag = false; } // 真下はfalse if (retsu == 0 && haba_Y < 0) { flag = false; } } // 先手歩 if (Koma_name.Contains("Sfu")) { if (retsu ==0) { flag = true; } if (haba_Y != masu_height * -1) { flag = false; } } // 後手歩 if (Koma_name.Contains("Gfu")) { if (retsu == 0) { flag = true; } if (haba_Y != masu_height) { flag = false; } } // 先手桂馬 if (Koma_name.Contains("Skei")) { if (ratioX == 1 && ratioY == 2) { flag = true; } if (haba_Y > 0) { flag = false; } } // 後手桂馬 if (Koma_name.Contains("Gkei")) { if (ratioX == 1 && ratioY == 2) { flag = true; } if (haba_Y < 0) { flag = false; } } // 先手香車 if (Koma_name.Contains("Skyou")) { if (haba_X == 0) { flag = true; } if (haba_Y >= 0) { flag = false; } } // 後手香車 if (Koma_name.Contains("Gkyou")) { if (haba_X == 0) { flag = true; } if (haba_Y <= 0) { flag = false; } } return flag; } } }

Base.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace MyShougi0001 { public partial class Base : Form { CheckMove checkMove = new CheckMove(); BanMap banMap = new BanMap(); // マウスのクリック位置 //private int ClickX = 0; //private int ClickY = 0; // 駒の元の位置 int komaX_from = 0; int komaY_from = 0; // 駒の移動位置 int komaX_next = 0; int komaY_next = 0; // スタート時の駒配置 private void SetInitialPosition() { // 盤の基準値から相対位置で指定する(Form の移動による変化を避ける) int BAN_X = BAN.Left; // 230 int BAN_Y = BAN.Top; // 27 Sou.Location = new Point(BAN_X + 270, BAN_Y + 542); Gou.Location = new Point(BAN_X + 270, BAN_Y + 30); Shisha.Location = new Point(BAN_X + 450, BAN_Y + 478); Ghisha.Location = new Point(BAN_X + 90, BAN_Y + 94); Skaku.Location = new Point(BAN_X + 90, BAN_Y + 478); Gkaku.Location = new Point(BAN_X + 450, BAN_Y + 94); Sfu1.Location = new Point(BAN_X + 30, BAN_Y + 414); Gfu1.Location = new Point(BAN_X + 510, BAN_Y + 158); Sfu2.Location = new Point(BAN_X + 90, BAN_Y + 414); Gfu2.Location = new Point(BAN_X + 450, BAN_Y + 158); Sfu3.Location = new Point(BAN_X + 150, BAN_Y + 414); Gfu3.Location = new Point(BAN_X + 390, BAN_Y + 158); Sfu4.Location = new Point(BAN_X + 210, BAN_Y + 414); Gfu4.Location = new Point(BAN_X + 330, BAN_Y + 158); Sfu5.Location = new Point(BAN_X + 270, BAN_Y + 414); Gfu5.Location = new Point(BAN_X + 270, BAN_Y + 158); Sfu6.Location = new Point(BAN_X + 330, BAN_Y + 414); Gfu6.Location = new Point(BAN_X + 210, BAN_Y + 158); Sfu7.Location = new Point(BAN_X + 390, BAN_Y + 414); Gfu7.Location = new Point(BAN_X + 150, BAN_Y + 158); Sfu8.Location = new Point(BAN_X + 450, BAN_Y + 414); Gfu8.Location = new Point(BAN_X + 90, BAN_Y + 158); Sfu9.Location = new Point(BAN_X + 510, BAN_Y + 414); Gfu9.Location = new Point(BAN_X + 30, BAN_Y + 158); SkyouL.Location = new Point(BAN_X + 30, BAN_Y + 542); GkyouR.Location = new Point(BAN_X + 30, BAN_Y + 30); SkyouR.Location = new Point(BAN_X + 510, BAN_Y + 542); GkyouL.Location = new Point(BAN_X + 510, BAN_Y + 30); SkeiL.Location = new Point(BAN_X + 90, BAN_Y + 542); GkeiR.Location = new Point(BAN_X + 90, BAN_Y + 30); SkeiR.Location = new Point(BAN_X + 450, BAN_Y + 542); GkeiL.Location = new Point(BAN_X + 450, BAN_Y + 30); SginL.Location = new Point(BAN_X + 150, BAN_Y + 542); GginR.Location = new Point(BAN_X + 150, BAN_Y + 30); SginR.Location = new Point(BAN_X + 390, BAN_Y + 542); GginL.Location = new Point(BAN_X + 390, BAN_Y + 30); SkinL.Location = new Point(BAN_X + 210, BAN_Y + 542); GkinR.Location = new Point(BAN_X + 210, BAN_Y + 30); SkinR.Location = new Point(BAN_X + 330, BAN_Y + 542); GkinL.Location = new Point(BAN_X + 330, BAN_Y + 30); } private PictureBox ActiveKoma = new PictureBox(); public Base() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // スタート時の駒配置 SetInitialPosition(); } private void BAN_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (ActiveKoma != null) { komaX_from = ActiveKoma.Left; komaY_from = ActiveKoma.Top; string str1 = "座標 X=" + komaX_from.ToString() + " Y=" + komaY_from.ToString(); komaIchi_from.Text = str1; // 盤を基準に(スクリーン座標を)クライアント座標に変換 // 移動先のクリック座標 int ClickX = 0; int ClickY = 0; Point clickPosition = BAN.PointToClient(Cursor.Position); ClickX = clickPosition.X; ClickY = clickPosition.Y; string str2 = "座標 X=" + ClickX.ToString() + " Y=" + ClickY.ToString(); label_Click.Text = str2; string NextPosition = banMap.GetBanNo(ClickX, ClickY); // 駒が移動すべき X座標とY座標を取得する komaX_next = banMap.BackKOMA_X(NextPosition); komaY_next = banMap.BackKOMA_Y(NextPosition); string str3 = "座標 X=" + komaX_next.ToString() + " Y=" + komaY_next.ToString(); komaIchi_next.Text = str3; koma_name.Text = ActiveKoma.Name; // 駒が移動可能化をチェックする Boolean go = checkMove.CheckNextPosistion(ActiveKoma.Name, komaX_from, komaY_from, komaX_next, komaY_next); if (go) { // 駒を移動する ActiveKoma.Location = new Point(komaX_next, komaY_next); } else { } } } } private void BAN_Click(object sender, EventArgs e) { } // 前手のクリックされた駒 private void Sou_Click(object sender, EventArgs e) { ActiveKoma = Sou; } private void Shisha_Click(object sender, EventArgs e) { ActiveKoma = Shisha; } private void Skaku_Click(object sender, EventArgs e) { ActiveKoma = Skaku; } private void SkinL_Click(object sender, EventArgs e) { ActiveKoma = SkinL; } private void SkinR_Click(object sender, EventArgs e) { ActiveKoma = SkinR; } private void SginL_Click(object sender, EventArgs e) { ActiveKoma = SginL; } private void SginR_Click(object sender, EventArgs e) { ActiveKoma = SginR; } private void SkeiL_Click(object sender, EventArgs e) { ActiveKoma = SkeiL; } private void SkeiR_Click_1(object sender, EventArgs e) { ActiveKoma = SkeiR; } private void SkyouL_Click(object sender, EventArgs e) { ActiveKoma = SkyouL; } private void SkyouR_Click(object sender, EventArgs e) { ActiveKoma = SkyouR; } private void Sfu1_Click(object sender, EventArgs e) { ActiveKoma = Sfu1; } private void Sfu2_Click(object sender, EventArgs e) { ActiveKoma = Sfu2; } private void Sfu3_Click(object sender, EventArgs e) { ActiveKoma = Sfu3; } private void Sfu4_Click(object sender, EventArgs e) { ActiveKoma = Sfu4; } private void Sfu5_Click(object sender, EventArgs e) { ActiveKoma = Sfu5; } private void Sfu6_Click(object sender, EventArgs e) { ActiveKoma = Sfu6; } private void Sfu7_Click(object sender, EventArgs e) { ActiveKoma = Sfu7; } private void Sfu8_Click(object sender, EventArgs e) { ActiveKoma = Sfu8; } private void Sfu9_Click(object sender, EventArgs e) { ActiveKoma = Sfu9; } // 後手のクリックされた駒 private void Gou_Click(object sender, EventArgs e) { ActiveKoma = Gou; } private void Ghisha_Click(object sender, EventArgs e) { ActiveKoma = Ghisha; } private void Gkaku_Click(object sender, EventArgs e) { ActiveKoma = Gkaku; } private void GkinL_Click(object sender, EventArgs e) { ActiveKoma = GkinL; } private void GkinR_Click(object sender, EventArgs e) { ActiveKoma = GkinR; } private void GginL_Click(object sender, EventArgs e) { ActiveKoma = GginL; } private void GginR_Click(object sender, EventArgs e) { ActiveKoma = GginR; } private void GkeiL_Click(object sender, EventArgs e) { ActiveKoma = GkeiL; } private void GkeiR_Click(object sender, EventArgs e) { ActiveKoma = GkeiR; } private void GkyouL_Click(object sender, EventArgs e) { ActiveKoma = GkyouL; } private void GkyouR_Click(object sender, EventArgs e) { ActiveKoma = GkyouR; } private void Gfu1_Click(object sender, EventArgs e) { ActiveKoma = Gfu1; } private void Gfu2_Click(object sender, EventArgs e) { ActiveKoma = Gfu2; } private void Gfu3_Click(object sender, EventArgs e) { ActiveKoma = Gfu3; } private void Gfu4_Click(object sender, EventArgs e) { ActiveKoma = Gfu4; } private void Gfu5_Click(object sender, EventArgs e) { ActiveKoma = Gfu5; } private void Gfu6_Click(object sender, EventArgs e) { ActiveKoma = Gfu6; } private void Gfu7_Click(object sender, EventArgs e) { ActiveKoma = Gfu7; } private void Gfu8_Click(object sender, EventArgs e) { ActiveKoma = Gfu8; } private void Gfu9_Click(object sender, EventArgs e) { ActiveKoma = Gfu9; } } }

// 駒の移動先のX軸とy軸の取得
BanMap.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyShougi0001 { class BanMap { // 駒の移動先のX軸とy軸の取得 public string GetBanNo(int x, int y) { string MASU = ""; // クリックされた升目の座標(盤の画にたいしての相対値) // 9一クリック if (29 < x && x < 89 && 28 < y && y < 89) { MASU = "92"; } // 8一クリック if (89 < x && x < 149 && 28 < y && y < 92) { MASU = "81"; } // 7一クリック if (149 < x && x < 209 && 28 < y && y < 92) { MASU = "71"; } // 6一クリック if (209 < x && x < 269 && 28 < y && y < 92) { MASU = "61"; } // 5一クリック if (269 < x && x < 329 && 28 < y && y < 92) { MASU = "51"; } // 4一クリック if (329 < x && x < 389 && 28 < y && y < 92) { MASU = "41"; } // 3一クリック if (389 < x && x < 449 && 28 < y && y < 92) { MASU = "31"; } // 2一クリック if (449 < x && x < 509 && 28 < y && y < 92) { MASU = "21"; } // 1一クリック if (509 < x && x < 569 && 28 < y && y < 92) { MASU = "11"; } // 9二クリック if (29 < x && x < 89 && 92 < y && y < 156) { MASU = "92"; } // 8二クリック if (89 < x && x < 149 && 92 < y && y < 156) { MASU = "82"; } // 7二クリック if (149 < x && x < 209 && 92 < y && y < 156) { MASU = "72"; } // 6二クリック if (209 < x && x < 269 && 92 < y && y < 156) { MASU = "62"; } // 5二クリック if (269 < x && x < 329 && 92 < y && y < 156) { MASU = "52"; } // 4二クリック if (329 < x && x < 389 && 92 < y && y < 156) { MASU = "42"; } // 3二クリック if (389 < x && x < 449 && 92 < y && y < 156) { MASU = "32"; } // 2二クリック if (449 < x && x < 509 && 92 < y && y < 156) { MASU = "22"; } // 1二クリック if (509 < x && x < 569 && 92 < y && y < 156) { MASU = "12"; } // 9三クリック if (29 < x && x < 89 && 156 < y && y < 220) { MASU = "93"; } // 8三クリック if (89 < x && x < 149 && 156 < y && y < 220) { MASU = "83"; } // 7三クリック if (149 < x && x < 209 && 156 < y && y < 220) { MASU = "73"; } // 6三クリック if (209 < x && x < 269 && 156 < y && y < 220) { MASU = "63"; } // 5三クリック if (269 < x && x < 329 && 156 < y && y < 220) { MASU = "53"; } // 4三クリック if (329 < x && x < 389 && 156 < y && y < 220) { MASU = "43"; } // 3三クリック if (389 < x && x < 449 && 156 < y && y < 220) { MASU = "33"; } // 2三クリック if (449 < x && x < 509 && 156 < y && y < 220) { MASU = "23"; } // 1三クリック if (509 < x && x < 569 && 156 < y && y < 220) { MASU = "13"; } // 9四クリック if (29 < x && x < 89 && 220 < y && y < 284) { MASU = "94"; } // 8四クリック if (89 < x && x < 149 && 220 < y && y < 284) { MASU = "84"; } // 7四クリック if (149 < x && x < 209 && 220 < y && y < 284) { MASU = "74"; } // 6四クリック if (209 < x && x < 269 && 220 < y && y < 284) { MASU = "64"; } // 5四クリック if (269 < x && x < 329 && 220 < y && y < 284) { MASU = "54"; } // 4四クリック if (329 < x && x < 389 && 220 < y && y < 284) { MASU = "44"; } // 3四クリック if (389 < x && x < 449 && 220 < y && y < 284) { MASU = "34"; } // 2四クリック if (449 < x && x < 509 && 220 < y && y < 284) { MASU = "24"; } // 1四クリック if (509 < x && x < 569 && 220 < y && y < 284) { MASU = "14"; } // 9五クリック if (29 < x && x < 89 && 284 < y && y < 348) { MASU = "95"; } // 8五クリック if (89 < x && x < 149 && 284 < y && y < 348) { MASU = "85"; } // 7五クリック if (149 < x && x < 209 && 284 < y && y < 348) { MASU = "75"; } // 6五クリック if (209 < x && x < 269 && 284 < y && y < 348) { MASU = "65"; } // 5五クリック if (269 < x && x < 329 && 284 < y && y < 348) { MASU = "55"; } // 4五クリック if (329 < x && x < 389 && 284 < y && y < 348) { MASU = "45"; } // 3五クリック if (389 < x && x < 449 && 284 < y && y < 348) { MASU = "35"; } // 2五クリック if (449 < x && x < 509 && 284 < y && y < 348) { MASU = "25"; } // 1五クリック if (509 < x && x < 569 && 284 < y && y < 348) { MASU = "15"; } // 9六クリック if (29 < x && x < 89 && 348 < y && y < 412) { MASU = "96"; } // 8六クリック if (89 < x && x < 149 && 348 < y && y < 412) { MASU = "86"; } // 7六クリック if (149 < x && x < 209 && 348 < y && y < 412) { MASU = "76"; } // 6六クリック if (209 < x && x < 269 && 348 < y && y < 412) { MASU = "66"; } // 5六クリック if (269 < x && x < 329 && 348 < y && y < 412) { MASU = "56"; } // 4六クリック if (329 < x && x < 389 && 348 < y && y < 412) { MASU = "46"; } // 3六クリック if (389 < x && x < 449 && 348 < y && y < 412) { MASU = "36"; } // 2六クリック if (449 < x && x < 509 && 348 < y && y < 412) { MASU = "26"; } // 1六クリック if (509 < x && x < 569 && 348 < y && y < 412) { MASU = "16"; } // 9七クリック if (29 < x && x < 89 && 412 < y && y < 476) { MASU = "97"; } // 8七クリック if (89 < x && x < 149 && 412 < y && y < 476) { MASU = "87"; } // 7七クリック if (149 < x && x < 209 && 412 < y && y < 476) { MASU = "77"; } // 6七クリック if (209 < x && x < 269 && 412 < y && y < 476) { MASU = "67"; } // 5七クリック if (269 < x && x < 329 && 412 < y && y < 476) { MASU = "57"; } // 4七クリック if (329 < x && x < 389 && 412 < y && y < 476) { MASU = "47"; } // 3七クリック if (389 < x && x < 449 && 412 < y && y < 476) { MASU = "37"; } // 2七クリック if (449 < x && x < 509 && 412 < y && y < 476) { MASU = "27"; } // 1七クリック if (509 < x && x < 569 && 412 < y && y < 476) { MASU = "17"; } // 9八クリック if (29 < x && x < 89 && 476 < y && y < 540) { MASU = "98"; } // 8八クリック if (89 < x && x < 149 && 476 < y && y < 540) { MASU = "89"; } // 7八クリック if (149 < x && x < 209 && 476 < y && y < 540) { MASU = "78"; } // 6八クリック if (209 < x && x < 269 && 476 < y && y < 540) { MASU = "68"; } // 5八クリック if (269 < x && x < 329 && 476 < y && y < 540) { MASU = "58"; } // 5八クリック if (329 < x && x < 389 && 476 < y && y < 540) { MASU = "48"; } // 3八クリック if (389 < x && x < 449 && 476 < y && y < 540) { MASU = "38"; } // 2八クリック if (449 < x && x < 509 && 476 < y && y < 540) { MASU = "28"; } // 1八クリック if (509 < x && x < 569 && 476 < y && y < 540) { MASU = "18"; } // 9九クリック if (29 < x && x < 89 && 540 < y && y < 604) { MASU = "99"; } // 8九クリック if (89 < x && x < 149 && 540 < y && y < 604) { MASU = "89"; } // 7九クリック if (149 < x && x < 209 && 540 < y && y < 604) { MASU = "79"; } // 6九クリック if (209 < x && x < 269 && 540 < y && y < 604) { MASU = "69"; } // 5九クリック if (269 < x && x < 329 && 540 < y && y < 604) { MASU = "59"; } // 5九クリック if (329 < x && x < 389 && 540 < y && y < 604) { MASU = "49"; } // 3九クリック if (389 < x && x < 449 && 540 < y && y < 604) { MASU = "39"; } // 2九クリック if (449 < x && x < 509 && 540 < y && y < 604) { MASU = "29"; } // 1九クリック if (509 < x && x < 569 && 540 < y && y < 604) { MASU = "19"; } return MASU; } // 画像貼り付け位置のX座標の配列化 public int BackKOMA_X(string masu_name) { int position = 0; try { string x = masu_name.Substring(0, 1); int position_X = int.Parse(x); int[] X = new int[10] { 0, 740, 680, 620, 560, 500, 440, 380, 320, 260 }; position = X[position_X]; } catch { } finally { } return position; } // 画像貼り付け位置のY座標の配列化 public int BackKOMA_Y(string masu_name) { int position = 0; try { string y = masu_name.Substring(1, 1); int position_Y = int.Parse(y); int[] Y = new int[10] { 0, 57, 121, 185, 249, 313, 377, 441, 505, 569 }; position = Y[position_Y]; } catch { } finally { } return position; } } }
The first written on Jan 21, 2015



更新日 Wednesday, 21-Jan-2015 13:47:00 JST