クリック座標

マウスがクリックされた座標から、山と石を計算します。

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

座標から石を計算

  1. OnMyMouseDown() でマウスの座標を設定して ManPlay(pt) を呼び出します。
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {   Point pt = new Point();
            pt.X = e.X;
            pt.Y = e.Y;
            VerMsg(App.Yama(pt), App.Num(pt));
            App.ManPlay(pt);
            Invalidate();
        }
        
  2. VerMsg() はデバッグ情報をタイトルバーに表示するメソッドです。
        // Title Var Message
        public void VerMsg(int v1, int v2)
        {   string wstr;
            wstr = "v1=" + v1.ToString() + "  v2=" + v2.ToString();
            this.Text = wstr;
        }
        
  3. App.ManPlay(pt) でクリックされた座標を元に石の数を設定します。
    エラーの判定をしていないので、石を取り除くことも増やすことも出来ます。
    wy = Yama(pt); が山の番号で、wn = Num(pt); が山の石の数です。
    クリックした座標に合わせて、石が設定されることを確認して下さい。
        // Player がプレイする
        public bool ManPlay(Point pt)
        {   int wy,wn;
            wy = Yama(pt);
            wn = Num(pt);
            if (wy<0 || wy>2)  return false;
            if (wn<0 || wn>14) return false;
            T[wy] = wn;
            return true;
        }
        
  4. 山の番号(0,1,2)を計算するメソッドです。
        // 座標の山番号(0,1,2)
        public int Yama(Point pt)
        {   int wk;
            wk = (pt.X-bas.X)/xsiz;
            return wk;
        }
        
  5. 山の石の数(0 ~ 14)を計算するメソッドです。
        // 座標の石の数(0 ~ 14)
        public int Num(Point pt)
        {   int wk,wx;
            wx = (pt.X-bas.X)%xsiz;
            wx = (wx/50)*5;
            wk = (bas.Y-pt.Y+50)/50+wx;
            return wk;
        }
        

プレイする

  1. マウスの左ボタンで人間側がプレイします。
    マウスの右ボタンでコンピュータがプレイします。
    人間側のプレイは、石を取り除くことも増やすことも出来ます。
    様々な局面を設定して、コンピュータが正しくプレイすることを確認して下さい。
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {   Point pt = new Point();
    
            if (e.Button == MouseButtons.Left)  //マウスの左ボタン
            {   pt.X = e.X;
                pt.Y = e.Y;
                VerMsg(App.Yama(pt), App.Num(pt));
                App.ManPlay(pt);
            }
            if (e.Button == MouseButtons.Right) //マウスの右ボタン
            {   App.Play();
            }
            Invalidate();
        }
        
  2. ゲームの心臓部であるコンピュータのプレイです。
    return(1) はコンピュータが勝ったときです。
    return(2) はコンピュータが負けたときです。
    return(0) はゲームが続くときです。
        // コンピュータがプレイする
        public int Play()
        {   int     n1;         //石が残っている山の数
            int     n2;         //石が一個だけの山の数
            int     w;          //石が一番多い山の番号
            int     i,n=0;
    
            for(i=n1=n2=0,w=0; i<3; i++)
            {   if (T[i]!=0)
                {   n1++;
                    if (T[i]==1)    n2++;
                    if (T[i]>T[w])  w= i;
                }
            }
            switch(n1)
            {   case 0: return(1);                  //三個の山が空(コンピュータの勝ち)
                case 1: //石が残っている山は一個
                        if (n2==1)                  //最後の石(コンピュータの負け)
                        {   T[w] = 0;
                            return(2);
                        }
                        //一個を残して全て取り除く
                        T[w] = 1;
                        return(0);
                case 2: //石が残っている山は二個
                        if (n2==0)  break;
                        T[w] = 0;
                        return(0);
                case 3: //石が残っている山は三個 
                        if (n2!=2)  break;
                        T[w] = 1;                   //1,1,1
                        return(0);
            }
            w= T[0]^T[1]^T[2];
            for(i=0; i<3; i++)
            {   n=T[i]^w;
                if (n<T[i]) break;
            }
            if (i>2)    //人間側の勝ち筋に入っている
            {   while(T[i=rand.Next(3)]==0);
                n= rand.Next(T[i]);
            }
            T[i] = n;
            return(0);
        }
        

[Next Chapter ↓] Alpha 版
[Previous Chapter ↑] 石の画像を描画

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