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