RadioButton

主要な操作は RadioButton で制御します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 囲碁ソフトの主要な操作は RadioButton で制御します。
    RadioButton の説明は Radio Butto を参照して下さい。
    またメニューの説明は ToolBox からメニューを貼り付ける を参照して下さい。
    1. 0: 再生モード
      マウスのクリックで m_Top から棋譜を再生する。
      左クリックで次(next)に、右クリックで前(back)に戻る。
      分岐手順は英字をクリックする。
    2. 1: 詰碁モード
      原則として黒の手番の詰碁です。
      マウスのクリックで詰碁を再生する。
      登録手順をクリックすると次に進む。
      登録されていない手順は?を表示する。
      右クリックで手順を戻す。
      白に複数の応手があるとき、手順を戻すと応手が変わる。
    3. 2: 出題図モード
      出題図(初期盤面)を設定(修正)する。
      左クリックで黒石を、右クリックで白石を置く。
      出題図は棋譜と独立していて、m_St に記録される。
      新たに棋譜を作成するときは、棋譜入力モードを使って下さい。
    4. 3: 棋譜入力モード
      現在の局面以降の棋譜を直接書き換る。
      元に戻すときは、ファイルから再入力して下さい。
      手番はメニューから設定する。
    5. 4: 分岐手順モード
      現在の局面に分岐(追加)手順をタイプして m_Copy に保存する。
      右クリックすると分岐終了で、張り付けの問い合わせがある。
      手順は m_Copy に残されているので、後からでもメニュー操作で張り付けることが出来る。
  2. RadioButton のクリックでモードを設定します。
        // ラジオボタン
        void radioButton_Click(object sender, EventArgs e)
        {   int i;
            for(i=0; i<5; i++)
                if (radioButton[i].Checked) break;
            if (i<5)    Set_Mode(i);
        }
    
  3. モードを切り替える Set_Mode() メソッドです。
        private void Set_Mode(int mode)
        {
            DialogResult rc;
            int     md;
    
            md = mode;
            if (m_Top == null)
            {   m_Top = new CELL(0);
                m_Num = 1;
            }
            if (m_PT == null)
            {   m_PT = m_Top;
                if (md<2)   md = 3;
            }
            if (m_Top.car == null && m_Top.cdr == null && md<2) md = 3;
            radioButton[md].Checked = true;
            m_Mode = md;
            switch(md)
            {   case 0:     //再生モード
                    CELL.Reset(m_Top);
                    m_PT = m_Top;
                    Play(m_Top);    // 現在までの手順を再現
                    Invalidate();
                    break;
                case 1:     //詰碁モード
                    m_Timg = 0;
                    CELL.Reset(m_Top);
                    for(m_PT=m_Top; m_PT!=null && m_PT.teban!=1; Set_Next(m_Pos));
                    Set_Back();
                    Play(m_Top);    // 現在までの手順を再現
                    Invalidate();
                    break;
                case 2:     //出題図モード
                    m_PT = m_Top;
                    m_Ban = (short[,])m_St.Clone();
                    Invalidate();
                    break;
                case 3:     //棋譜入力モード
                    if (m_PT.car != null || m_PT.cdr != null)
                    {
                        rc = MessageBox.Show("以降の手順が書き換えられます", "選択",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (rc == DialogResult.No)
                        {
                            radioButton[0].Checked = true;
                            Set_Mode(0);
                            return;
                        }
                    }
                    m_Ishi = (short)(0-m_PT.teban);
                    if (m_Ishi==0)      m_Ishi = 1;
                    Play(m_Top);
                    Invalidate();
                    break;
                case 4:     //分岐手順の開始
                    rc = MessageBox.Show("分岐手順(コピー手順)を作成します", "選択",
                         MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (rc == DialogResult.No)
                    {
                        radioButton[0].Checked = true;
                        Set_Mode(0);
                        return;
                    }
                    m_Copy = new CELL(0);
                    m_wp = m_Copy;
                    m_Ishi = 1;
                    break;
            }
        }
    
  4. OnMyMouseDown() ではモードによって処理を切り替えます。
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {   Point   pos = new Point(e.X, e.Y);
            CELL    wp;
            int     i;
            DialogResult rc;
    
            ClickPos(ref pos);
            switch (m_Mode)
            {
                case 0:     // 棋譜再生モード
                    if (m_PT == null)   break;
                    if (e.Button == MouseButtons.Left)
                    {   Set_Next(pos);  }
                    if (e.Button == MouseButtons.Right)
                    {   Set_Back();  }
                    break;
                case 1:     // 詰碁モード
                    if (m_PT == null)   break;
                    m_Timg = 0;
                    if (e.Button == MouseButtons.Right)
                    {
                        Set_Back();
                        // 最後が黒番(次が白番)の時
                        if (m_PT.teban == 1)
                        {
                            m_Sn++;
                            Set_Back();
                        }
                        break;
                    }
                    Set_List();     // 黒番の候補リストを作成
                    for(i=0; m_Sel[i]!=null; i++)
                    {   if (m_Sel[i].pos.X==pos.X && m_Sel[i].pos.Y==pos.Y)
                        {   Set_Next(m_Sel[i]);
                            break;
                        }
                    }
                    if (m_Sel[i]==null)
                    {   m_Timg = 1;
                        break;
                    }  
                    Set_List();     // 白番の候補リストを作成
                    if (m_Sel[1] != null)   m_Timg = 2;
                    if (m_Sel[m_Sn] == null) m_Sn = 0;
                    Set_Next(m_Sel[m_Sn]);
                    break;
                case 2:     // 出題図モード
                    if (pos.X<0)    break;
                    if (e.Button == MouseButtons.Left)
                    {
                        if (m_St[pos.X, pos.Y] == 1)
                        {  m_St[pos.X, pos.Y] = 0; }
                        else
                        {  m_St[pos.X, pos.Y] = 1; }
                    }
                    if (e.Button == MouseButtons.Right)
                    {
                        if (m_St[pos.X, pos.Y] == -1)
                        {  m_St[pos.X, pos.Y] = 0; }
                        else
                        {  m_St[pos.X, pos.Y] = -1; }
                    }
                    m_Ban = (short[,])m_St.Clone(); // 出題図を盤に設定
                    break;
                case 3:     // 棋譜入力モード
                    if (e.Button == MouseButtons.Right)
                    {
                        rc = MessageBox.Show("入力モードを終了しますか", "選択",
                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (rc == DialogResult.Yes)
                        {   Set_Mode(0);
                            return;
                        }
                    }
                    Append(pos, m_Ishi);
                    m_Ishi = (short)(0 - m_Ishi);
                    break;
                case 4:     // 手順入力モード
                    if (e.Button == MouseButtons.Right)
                    {
                        cdr_Link();
                        Set_Mode(0);
                        return;
                    }
                    if (pos.X<0)    break;
                    wp = new CELL(m_Num++); // 基本セルを生成
                    wp.pos = pos;
                    wp.teban = m_Ishi;
                    m_wp.car = wp;
                    m_wp = wp;
                    m_Ban[pos.X, pos.Y] = m_Ishi;
                    m_Ishi = (short)(0 - m_Ishi);
                    break;
            }
            Invalidate();
        }
    
  5. 次の手の候補リスト(最大 19)を作成する Set_List() 関数です。
    CELL[] m_Sel = new CELL[19]; をクリアして、黒(白)番の候補手を格納します。
        private void Set_List()
        {   int     i, n;
            CELL    wp; 
            
            for(i=0; i<19; i++) m_Sel[i] = null;
            if (m_PT==null) return;
            if (m_PT.car!=null)
            {   m_Sel[0] = m_PT.car;
                return;
            }
            if (m_PT.cdr!=null)
            {   n = m_PT.level+1;
                for(i=0, wp=m_PT.cdr; wp!=null; wp=wp.cdr)
                {   if (wp!=null && wp.level==n)    m_Sel[i++] = wp;
                }
            }
        }
    

[Next Chapter ↓] Version 4
[Previous Chapter ↑] 分岐の入力

超初心者のプログラム入門(C# Frame Work)