
前田稔(Maeda Minoru)の超初心者のプログラム入門
![]()
![]()
string m_SGF; // SGF FILE Source
int m_Idx; // m_SGF Index
CELL m_Top; // Top Tree
CELL m_PT; // 棋譜 Tree
if (LoadBAN()==')') return; // 出題図をロード
m_Idx = 0;
Token();
m_Top = LoadTree(0); // 棋譜を再起でロード
m_PT = m_Top;
|
private char LoadBAN()
{
Token(); // ; をスキップ
m_Idx++;
while(true)
{
m_WS = "*";
switch(Token())
{
case '(': return '(';
case ')': return ')';
case ';': return ';';
case '*': // 出題図プロパティのチェック
KeyCheck();
break;
case '[':
if (m_Ishi!=0 && Convt())
m_St[m_Pos.X, m_Pos.Y] = m_Ishi;
break;
}
}
}
|
private CELL LoadTree(int lev)
{
CELL PT, TOP, LP, WP;
if (Token()!='(') return null;
TOP = new CELL(0);
PT = TOP;
m_Idx++;
while(true)
{
switch(Token())
{
case '(':
LP = LoadTree(lev+1); // List Tree を生成
for (WP = PT; WP.cdr != null; WP = WP.cdr) ;
WP.cdr = LP;
PT = WP.cdr;
break;
case ')':
m_Idx++;
return TOP.car;
case ';':
m_Idx++;
PT.car = new CELL(m_Num++); // 基本セルを生成
PT = PT.car;
PT.level = lev;
Prpperty(PT);
break;
}
}
}
|
private void Prpperty(CELL pt)
{
while(true)
{
switch(Token())
{
case '(':
case ')':
case ';':
return;
case '*':
if (m_WS == "N")
{
Token();
pt.id = m_WS;
break;
}
if (m_WS == "C")
{
Token();
pt.msg = m_WS;
break;
}
if (m_WS=="B" || m_WS=="W")
{ if (m_WS == "B") pt.teban = 1;
if (m_WS == "W") pt.teban = -1;
Token();
if (Convt()) pt.pos = m_Pos;
break;
}
break;
}
}
}
|
private void OnMyMouseDown(object sender, MouseEventArgs e)
{ Point pos = new Point(e.X, e.Y);
ClickPos(ref pos);
if (e.Button == MouseButtons.Left)
{ Set_Next(pos); }
if (e.Button == MouseButtons.Right)
{ Set_Back(); }
Invalidate();
}
|
// m_PT.back で戻った局面を m_Ban[] に設定
private void Set_Back()
{
if (m_PT == null) return;
if (m_PT.back != null)
{
m_PT = m_PT.back;
m_PT.next = null;
}
Play(m_Top); // 出題図から現在までの手順を再現
}
|
// 一手進んだ局面を m_Ban[] に設定
private void Set_Next(Point pos)
{
CELL wp;
int ch, lv, i;
if (m_PT == null) return;
if (m_PT.car == null && m_PT.cdr != null) // 選択手順
{
ch = 0;
if (pos.X>=0 && m_Ban[pos.X, pos.Y] > 1)
{
ch = m_Ban[pos.X, pos.Y] - 2;
MessageBox.Show("文字が選択されました: " + ch);
}
lv = m_PT.level+1;
for (i=0, wp=m_PT; wp!= null; wp=wp.cdr)
{
m_Top.CellPrint(wp);
if (wp.level==lv)
{ i++;
if (i>ch) break;
}
}
m_PT.next = wp;
wp.back = m_PT;
m_PT = wp;
}
else // 選択手順が無いとき
{
if (m_PT.car != null)
{
wp = m_PT.car;
m_PT.next = wp;
wp.back = m_PT;
m_PT = wp;
}
}
Play(m_Top); // 出題図から現在までの手順を再現
}
|
// m_Ban[] に現在の局面を再現(CELL の next==null)
private void Play(CELL pt)
{
CELL wp;
int i, j;
string str;
m_Ban = (short[,])m_St.Clone();
for (wp = pt; wp != null; wp = wp.next)
{
switch (Check(wp.pos, wp.teban))
{
case 0:
m_Ban[wp.pos.X, wp.pos.Y] = wp.teban;
break;
case 1: // 打ち上げ
for (i = 0; i < 19; i++)
for (j = 0; j < 19; j++)
if (m_W[i, j] == 3) m_Ban[i, j] = 0;
m_Ban[wp.pos.X, wp.pos.Y] = wp.teban;
break;
default:
str = "不正な石です " + wp.num + " [" + wp.pos.X + "," + wp.pos.Y + "]";
MessageBox.Show(str);
Console.WriteLine(str);
break;
}
}
Bunki();
}
|
private void Bunki()
{
int lv, i;
if (m_PT==null || m_PT.cdr==null) return;
if (m_PT.cdr.level==m_PT.level) return;
lv = m_PT.level+1;
CELL wp = m_PT.cdr;
for(i=2; wp!=null; wp=wp.cdr)
{
if (wp.level == lv)
{
m_Ban[wp.pos.X, wp.pos.Y] = (short)(i);
i++;
}
}
}
|
Bitmap kuro, shiro;
Bitmap bmpabc;
private void Put(Graphics g, int x, int y, int typ)
{
Rectangle rect;
rect = new Rectangle(m_Pitch*x+m_Rect.X+m_Pitch/2, m_Pitch*y+m_Rect.Y+m_Pitch/2, m_Pitch, m_Pitch);
switch (typ)
{
case 0:
break;
case 1:
g.DrawImage(kuro, rect);
break;
case -1:
g.DrawImage(shiro, rect);
break;
default:
g.DrawImage(bmpabc, rect, new Rectangle((typ-2)*32,0,32,32),GraphicsUnit.Pixel);
break;
}
}
|
![]()