前田稔(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; } } |