前田稔(Maeda Minoru)の超初心者のプログラム入門
private bool Taboo(int x, int y, short kuro) { int siro; siro = 0 - kuro; if (XY(x, y)==false) return false; // 盤の外 if (m_W[x, y]==0) return true; // OK if (m_W[x, y]==siro) return false; // 白の壁 if (m_W[x, y]==kuro) { m_W[x, y] = 2; if (Taboo(x + 1, y, kuro)) return true; if (Taboo(x, y + 1, kuro)) return true; if (Taboo(x - 1, y, kuro)) return true; if (Taboo(x, y - 1, kuro)) return true; } m_W[x, y] = 3; // 打ち上げの石 return false; // 禁じ手(詰まっている) } |
private bool XY(int x, int y) { if (x < 0 || x > 18) return false; if (y < 0 || y > 18) return false; return true; } |
int[] m_x = { 1, -1, 0, 0 }; // 上下左右の隣接定数 int[] m_y = { 0, 0, 1, -1 }; private bool Utiage(int x, int y, short kuro) { short siro; bool rc; int wx, wy, k, i, j; siro = (short)(0 - kuro); rc = false; for(k=0; k<4; k++) // 上下左右に隣接する石を調べる { m_W = (short[,])m_Ban.Clone(); m_W[x, y] = kuro; wx = x+m_x[k]; wy = y+m_y[k]; if (XY(wx, wy) && m_W[wx, wy] == siro && Taboo(wx, wy, siro) == false) { for (i = 0; i < 19; i++) for (j = 0; j < 19; j++) if (m_W[i, j] == 3) m_Ban[i, j] = 0; rc = true; } } return rc; } |
private void OnMyMouseDown(object sender, MouseEventArgs e) { short teban = 1; Point pos = new Point(e.X, e.Y); if (ClickPos(ref pos) == false) return; if (e.Button == MouseButtons.Right) teban = -1; switch(Check(pos, teban)) { case 0: m_Ban[pos.X, pos.Y] = teban; break; case 1: // 打ち上げです m_Ban[pos.X, pos.Y] = teban; break; case 2: // 手番の石です m_Ban[pos.X, pos.Y] = 0; break; case 3: // 相手の石です break; case 4: MessageBox.Show("禁じ手です"); break; } Invalidate(); } |
private int Check(Point pos, short kuro) { int siro; if (kuro == 0) return 0; siro = 0 - kuro; if (m_Ban[pos.X, pos.Y]==kuro) return 2; // 手番の石 if (m_Ban[pos.X, pos.Y]==siro) return 3; // 相手の石 if (Utiage(pos.X,pos.Y,kuro)) return 1; // 打ち上げ m_W = (short[,])m_Ban.Clone(); m_W[pos.X, pos.Y] = kuro; if (Taboo(pos.X,pos.Y,kuro)) return 0; // OK return 4; // 禁じ手 } |
[Next Chapter ↓] SGF ファイルを入力
[Previous Chapter ↑] クリックで石を置く