石取りゲームα版

石取りゲームα版です。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして alpha.java の名前で保存して下さい。
    //★ 考えてプレイする    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    
    public class alpha extends JApplet implements MouseListener
    {   static  Image   img;
        static  Random  rand;
        static  int     Count;          // 山に積まれた石の数
        static  int     Max;            // 一度に取り除く最大数
        static  int     Teban= 0;       // 手番と勝敗
    
        // Initialize
        public void init()
        {   img = getImage(getDocumentBase(),"jewel.gif");
            addMouseListener(this);
            rand = new Random();
            Count= rand.nextInt(20)+11;
            Max  = rand.nextInt(5)+2;
        }
    
        // Paint
        public void paint(Graphics g)
        {   int   i,x,y;
            Dimension  size = getSize();
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            g.setFont(new Font("Helvetica",Font.PLAIN,32));
            g.setColor(Color.black);
            g.drawString("最後の石を取らされた方が負けです", 20,50);
            g.drawString("最大" + Integer.toString(Max) + "個まで取ることができます", 20,80);
            if (img!=null)
            {   for(i=0; i<Count; i++)
                {   x= (i%10)*60+20;
                    y= (i/10)*60+100;
                    g.drawImage(img,x,y,this);
                }
            }
            switch(Teban)
            {   case 0:
                    g.drawString("クリックで石を取り除いて下さい", 20,350);
                    break;
                case 1:
                    g.drawString("私の手番です。クリックして下さい", 20,350);
                    break;
                case 2:
                    g.setColor(Color.red);
                    g.drawString("私の勝ちです。確認して下さい", 20,350);
                    break;
                case 3:
                    g.setColor(Color.green);
                    g.drawString("私の負けです。確認して下さい", 20,350);
                    break;
            }
        }
    
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int xp,yp,n;
    
            switch(Teban)
            {   case 0:     // あなたの手番
                    xp= (e.getX()/60);
                    yp= ((e.getY()-80)/60);
                    n= yp*10+xp;
                    if (n<Count-Max || n>=Count)
                    {   System.out.println("クリックの座標エラー" + "  x=" + xp + "  y=" + yp);
                        return;
                    }
                    Count= n;
                    Teban= 1;
                    if (Count==0)   Teban= 2;
                    repaint();
                    return;
                case 1:     // 私の手番
                    Think();
                    Teban= 0;
                    if (Count==0)   Teban= 3;
                    repaint();
                    return;
            }
        }
    
        // コンピュータの手番
        public void Think()
        {   int wk;
            if (Count==1)
            {   Count= 0;
                Teban= 3;
                return;
            }
            wk= (Count+Max) % (Max+1);
            if (wk==0 || ((rand.nextInt(5)==0) && Count>Max))   wk= (rand.nextInt(Max)) + 1;
            Count-= wk;
        }
    
        public void mousePressed(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    }
    
  2. Java Applet を起動する HTMLファイルです。
    <html>
    <body>
    <h3>考えてプレイする</h3>
    <applet code="alpha.class" width="640" height="400">
    </applet>
    </body>
    </html>
    
  3. インターネットブラウザを起動して alpha.htm から実行して下さい。
    マウスの操作でプレイヤーとコンピュータが交互にプレイします。
    プレイヤーがプレイするとき以外は、どこでも適当にクリックして下さい。

Java プログラムの説明

  1. マウスがクリックされたときの処理です。
    Teban の状態によって、処理の内容が異なります。
    Think() がコンピュータの手を決めるメソッドです。
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int xp,yp,n;
    
            switch(Teban)
            {   case 0:     // あなたの手番
                    xp= (e.getX()/60);
                    yp= ((e.getY()-80)/60);
                    n= yp*10+xp;
                    if (n<Count-Max || n>=Count)
                    {   System.out.println("クリックの座標エラー" + "  x=" + xp + "  y=" + yp);
                        return;
                    }
                    Count= n;
                    Teban= 1;
                    if (Count==0)   Teban= 2;
                    repaint();
                    return;
                case 1:     // 私の手番
                    Think();
                    Teban= 0;
                    if (Count==0)   Teban= 3;
                    repaint();
                    return;
            }
        }
        
  2. コンピュータがプレイする Think() メソッドです。
    山に一個だけ残されたときはコンピュータの負けです。
    rand.nextInt(5)==0 で20%の確率で乱数を使います。
        // コンピュータの手番
        public void Think()
        {   int wk;
            if (Count==1)
            {   Count= 0;
                Teban= 3;
                return;
            }
            wk= (Count+Max) % (Max+1);
            if (wk==0 || ((rand.nextInt(5)==0) && Count>Max))   wk= (rand.nextInt(Max)) + 1;
            Count-= wk;
        }
        

石取りゲームの完成

  1. 1ゲームで終わらないで、ゲームを続ける処理と勝敗の表示を追加して下さい。
    ゲームの勝敗を記録する領域です。
        static  int     Win=0, Lose=0;  // 勝敗
        
  2. 勝敗のカウントと表示です。
        public void paint(Graphics g)
        {      ・・・
            switch(Teban)
            {   case 0:
                    g.drawString("クリックで石を取り除いて下さい", 20,330);
                    break;
                case 1:
                    g.drawString("私の手番です。クリックして下さい", 20,330);
                    break;
                case 2:
                    g.setColor(Color.red);
                    g.drawString("私の勝ちです。確認して下さい", 20,330);
                    Win++;
                    break;
                case 3:
                    g.setColor(Color.green);
                    g.drawString("私の負けです。確認して下さい", 20,330);
                    Lose++;
                    break;
            }
            g.setColor(Color.black);
            g.drawString("対戦成績は、私の " + Win + " 勝 " + Lose + " 敗です", 20,360);
        }
        
  3. ゲームが終了したときに、Count, Max に新しい値を設定して、次のゲームを始めます。
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int xp,yp,n;
    
            switch(Teban)
            {     ・・・
                case 2:  case 3:
                    Count= rand.nextInt(20)+11;
                    Max  = rand.nextInt(5)+2;
                    Teban= 0;
                    repaint();
                    return;
            }
        }
        

[Previous Chapter ↑] 交互にプレイする

Java Game Program