クリックで石を置く

マウスのクリックで石を置きます。

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

プログラムの説明

  1. 今回は、碁盤の上にマウスの左クリックで黒石を、右クリックで白石を置きます。
    マウスのクリックを検出するイベントハンドラを設定します。
        public MyForm()
        {
            ・・・
    
            MouseDown += new MouseEventHandler(OnMyMouseDown);
        }
    
  2. OnMyMouseDown() 関数です。
    左クリックが黒石(1)で、右クリックが白石(-1)です。
    ClickPos(ref pos) でクリック座標を碁盤の座標に変換します。
    19 * 19 の m_Ban に石を設定します。
    Invalidate(); で MyHandler() 関数を呼び出して描画します。
    マウスのクリックは マウスのクリックを検出する を参照して下さい。
        short[,]    m_Ban = new short[19, 19];
    
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {
            Point pos = new Point(e.X, e.Y);
            if (ClickPos(ref pos) == false) return;
            if (e.Button == MouseButtons.Left)  m_Ban[pos.X, pos.Y] = 1;
            if (e.Button == MouseButtons.Right) m_Ban[pos.X, pos.Y] = -1;
            Invalidate();
        }
    
  3. クリックされた座標を碁盤の座標に変換する ClickPos(ref pos); 関数です。
    クリック座標を pos で受け取って、碁盤の座標を設定して返すので ref パラメータを使います。
    盤の外がクリックされたときは false をリターンします。
    m_Rect は碁盤のサイズで m_Wp, m_Hp はマス目のピッチです。
        int         m_Width, m_Height, m_Hp, m_Wp;
        Rectangle   m_Rect;
    
    	// クリック座標を盤座標に変換
        private bool ClickPos(ref Point pos)
        {   int xw,yw;
            xw = pos.X-m_Rect.X;
            yw = pos.Y-m_Rect.Y;
            if (xw < 0 || xw > m_Rect.Width)    return false;
            if (yw < 0 || yw > m_Rect.Height)   return false;
            pos.X = (xw+m_Wp/2)/m_Wp;
            pos.Y = (yw+m_Hp/2)/m_Hp;
            return true;
        }
    
  4. 碁盤と石を描画する MyHandler() 関数です。
    View(g) 関数で m_Ban[19,19] に格納されている石を描画します。
    View() 関数は 碁盤に石を置く を参照して下さい。
        private void MyHandler(object sender, PaintEventArgs e)
        {   int width,height,i;
            Color cor = Color.FromArgb(255, 210, 170, 50);
    
            m_Hp = m_Height / 23;
            m_Wp = (m_Hp*43)/45;		//縦45:横43
            width = m_Wp * 20;
            height = m_Hp * 20;
            m_Rect = new Rectangle(24, 24, m_Wp * 18, m_Hp * 18);
            Rectangle rect = new Rectangle(m_Rect.X-m_Wp, m_Rect.Y-m_Hp, m_Rect.Width+m_Wp*2, m_Rect.Height+m_Hp*2);
            Graphics g = e.Graphics;
            g.FillRectangle(new SolidBrush(cor), rect);
            for(i=0; i < 19; i++)
            {
                WLine(g, new Pen(Color.Black), m_Rect.X, i*m_Hp+m_Rect.Y, m_Rect.Width);
                HLine(g, new Pen(Color.Black), i*m_Wp+m_Rect.X, m_Rect.Y, m_Rect.Height);
            }
    
            int j, xp, yp;
            yp = m_Hp * 3 + m_Rect.Y;
            for(i=0; i < 3; i++)
            {
                xp = m_Wp * 3 + m_Rect.X;
                for (j = 0; j < 3; j++)
                {
                    g.FillEllipse(new SolidBrush(Color.Black), xp - 3, yp - 3, 6, 6);
                    xp += m_Wp * 6;
                }
                yp+= m_Hp*6;
            }
            View(g);
        }
    
  5. このままではウインドウを再描画するときに多少チラツキます。
    チラツキを無くす方法は Double Buffer で描画する を参照して下さい。
  6. マウスの右クリックで黒石が、左クリックで白石が描画されることを確かめて下さい。
    既に石が置かれていることや、エラーのチェックはしていません。
    碁盤や石の描画は、図形で描画するよりも画像(Image)を使う方が簡単で見映えも良くなります。

[Next Chapter ↓] 打ち上げと禁じ手
[Previous Chapter ↑] 碁盤に石を置く

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