前田稔(Maeda Minoru)の超初心者のプログラム入門
// lev, ps で CELL を検索 static public CELL Scan(CELL pt, int lev, Point ps) { CELL wp; if (pt==null) return null; if (pt.level==lev && pt.pos.X==ps.X && pt.pos.Y==ps.Y) return pt; wp = Scan(pt.cdr, lev, ps); if (wp != null) return wp; return null; } |
private void Set_Next(Point pos) { CELL wp; int lv; if (m_PT == null) return; if (m_PT.car == null && m_PT.cdr != null) // 選択手順 { lv = m_PT.level+1; wp = null; if (pos.X>=0 && m_Ban[pos.X, pos.Y] > 1) { wp = CELL.Scan(m_PT.cdr, lv, pos); } if (wp == null) { //MessageBox.Show("分岐が見つかりません?: " + ch); if (m_PT.cdr.level==lv) wp = m_PT.cdr; } m_PT.next = wp; if (wp != null) { 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); // 出題図から現在までの手順を再現 } |
using System.Collections; // ArrayList // LB 構造体 class LB { public Point pos; //X座標, Y座標 public int ch; //文字Index // Constructor public LB(Point p, int c) { pos = p; ch = c; } } // SGF 形式のセル構造体 class CELL { ・・・ public ArrayList lb; //分岐表示 static string alph = "abcdefghijklmnopqrsABCDEFGHIJKLMNOPQRS"; // Constructor public CELL(int n) { ・・・ lb = new ArrayList(); } static public string lb_edt(CELL pt) { string str; LB wlb; int i; if (pt.lb.Count==0) return string.Empty; str = "LB"; for(i=0; i<pt.lb.Count; i++) { wlb = (LB)pt.lb[i]; str = str + "[" + alph[wlb.pos.X] + alph[wlb.pos.Y] + ":" + alph[wlb.ch] + "]"; } str = str + "]"; return str; } |
private void Prpperty(CELL pt) { ・・・ if (m_WS=="LB") { pt.lb = LB_set(); } break; |
ArrayList m_lb = new ArrayList(); // 出題図の分岐情報 // 出題図プロパティのチェック private void KeyCheck() { ・・・ if (m_WS=="LB") { m_lb = LB_set(); return; } |
private ArrayList LB_set() { ArrayList wlb; LB lb; int ch; wlb = new ArrayList(); while(true) { Token(); m_Pos.X = alph.IndexOf(m_WS[0]); if (m_Pos.X<0) m_Pos.X = 0; m_Pos.Y = alph.IndexOf(m_WS[1]); if (m_Pos.Y<0) m_Pos.Y = 0; ch = 0; if (m_WS.Length>3) ch = alph.IndexOf(m_WS[3]); if (ch<0) ch = 0; lb = new LB(m_Pos, ch); wlb.Add(lb); if (m_SGF[m_Idx]!='[') { if (m_SGF[m_Idx]==']') m_Idx++; break; } } return wlb; } |
// SGF ファイルを入力して表示(m_St 出題図) private void SGFRead(string file) { LoadSGF(file); this.Text = file; if (m_Top != null) { m_Top.id = m_id; m_Top.msg = m_msg; m_Top.lb = m_lb; } } |
// m_Ban[] に分岐文字を設定 private void Bunki() { int lv, i; LB wk; if (m_PT==null) return; if (m_PT.lb.Count>0) { for(i=0; i<m_PT.lb.Count; i++) { wk = (LB)m_PT.lb[i]; m_Ban[wk.pos.X, wk.pos.Y] = (short)(wk.ch+2); } return; } if (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++; } } } |
item = menu.MenuItems.Add("ツール(&T)"); item.MenuItems.Add(new MenuItem("LB tag(&L)...", new EventHandler(this.LB_tag))); // LB tag を生成 private void LB_tag(object sender, EventArgs e) { LBCheck(m_Top); } |
// 分岐を検索して LB[] を設定 private void LBCheck(CELL pt) { int lv, i; LB lb; CELL wp; if (pt==null) return; if (pt.lb.Count>0) pt.lb.Clear(); if (pt.cdr!=null && pt.cdr.level>pt.level) { lv = pt.level+1; wp = pt.cdr; for (i = 0; wp != null; wp = wp.cdr) { if (wp.level == lv) { lb = new LB(wp.pos, i); pt.lb.Add(lb); i++; } } } LBCheck(pt.car); LBCheck(pt.cdr); } |
// 出題図をファイルに書き出す(m_St 出題図) private void SaveBan() { string str; ・・・ if (m_Top.lb.Count>0) // LB tag を書き出す { writer.Write(CELL.lb_edt(m_Top)); } |
// 棋譜をファイルに書き出す private void SaveTree() { CELL wp; ・・・ if (wp.lb.Count>0) // LB tag を書き出す { writer.Write(CELL.lb_edt(wp)); } |
[Next Chapter ↓] SGF Header
[Previous Chapter ↑] Version 4