
前田稔(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 ↑] クリックで石を置く