Report#6

Java Applet プログラム{〜01/29(Mon)}

     Java Applet/AWTについて学習し、Java Appletのオリジナルプログラムを
      作成し解説せよ。 

ソースプログラム

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class osero xtends Applet implements
MouseListener,ActionListener{ //クラス本体の始まり
        int[][] ban=new int[10][10];  //10×10の配列の作成(余分に1外
	枠を設定)

        int w=40;  //マス目のサイズ
        int o=30;  //石の直径

        int turn=0;    //手番用変数
        int senko_flag=0;       //先攻ボタン用フラッグ
        int start_flag=0;       //スタートボタン用フラッグ

        Graphics g;  //グラフィック用オブジェクト宣言

        TextField txt_white=new TextField(6); //黒石数の表示用テキスト
	フィールド
        TextField txt_black=new TextField(6); //白石数の表示用テキスト
	フィールド

        Button btn_white=new Button("白");       //白ボタン
        Button btn_black=new Button("黒");       //黒ボタン

        Button btn_start=new Button("Start"); //スタートボタン
        Button btn_reset=new Button("Reset"); //リセットボタン

        Button btn_pass=new Button("Pass");     //パスボタン

        Label lab0=new Label("対戦情報");   //各ラベルの設定
        Label lab1=new Label("先攻の決定");
        Label lab2=new Label("石の獲得数");
        Label lab3=new Label("白");
        Label lab4=new Label("黒");
        Label lab5=new Label("");
        Label lab6=new Label("");

        public void init(){  //初期化メソッド

                setBackground(Color.white);     //アプレット背景色の設定

                g = getGraphics();      //グラフィック用オブジェクトの生
                成

                for(int x=0;x<=9;x++){   //全配列の初期化
                        for(int y=0;y<=9;y++){
                                ban[x][y]=0;
                        }
                }
                ban[4][4]=-1;ban[5][4]=1;       //中央の石の配列初期化
                ban[4][5]=1;ban[5][5]=-1;

                setLayout(null);        //レイアウトを無効にする

                add(lab1);lab1.setBounds(20,325,60,20); //各ラベルやボタ
		ンなどを配置
                add(btn_white);btn_white.setBounds(100,325,50,20);
                add(btn_black);btn_black.setBounds(170,325,50,20);
                add(lab6);lab6.setBounds(240,325,60,20);

                add(lab0);lab0.setBounds(20,350,80,20);
                add(lab5);lab5.setBounds(100,350,140,20);
                add(btn_pass);btn_pass.setBounds(240,350,50,20);

                add(lab2);lab2.setBounds(20,380,60,20);
                add(lab3);lab3.setBounds(100,380,20,20);
                add(lab4);lab4.setBounds(170,380,20,20);
                add(txt_white);txt_white.setBounds(120,380,40,20);
                add(txt_black);txt_black.setBounds(190,380,40,20);
  txt_white.setText("2");txt_black.setText("2");

                add(btn_start);btn_start.setBounds(100,410,60,20);
                add(btn_reset);btn_reset.setBounds(170,410,60,20);

                addMouseListener(this);         //マウス用リスナー

                btn_start.addActionListener(this);      //各ボタン用リス
		ナー
                btn_reset.addActionListener(this);

                btn_white.addActionListener(this);
                btn_black.addActionListener(this);

                btn_pass.addActionListener(this);

        }
        public void paint(Graphics g){  //グラフィック描画メソッド

                g.setColor(new Color(0x3cb371));        //盤の色をグリー
		ンに
                g.fillRect(0,0,320,320);        //320×320

                g.setColor(Color.black);        //8×8のマスを描く
                for(int i=0;i<=8;i++){
                        g.drawLine(i*40,0,i*40,320);
                        g.drawLine(0,i*40,320,i*40);
                }

                g.setColor(Color.white);        //中央の白石をセット
                g.fillOval(w/8+w*3,w/8+w*3,o,o);
                g.fillOval(w/8+w*4,w/8+w*4,o,o);

                g.setColor(Color.black);        //中央の黒石をセット
 g.fillOval(w/8+w*4,w/8+w*3,o,o);
                g.fillOval(w/8+w*3,w/8+w*4,o,o);
        }

        public void actionPerformed(ActionEvent e){  //各ボタンの動作
	メソッド

                if(e.getSource()==btn_white &start_flag!=1){ //白ボ押し
		たとき
                turn=-1;lab5.setText("");lab6.setText("先攻は白
		");senko_flag=1;
                }
                if(e.getSource()==btn_black &start_flag!=1){ //黒ボタン
		を押したとき
                turn=1;lab5.setText("");lab6.setText("先攻は黒
		");senko_flag=1;
                }
   if(e.getSource()==btn_start &senko_flag!=1){//先攻を決めずにスタート
		ボタンを押したとき
                        lab5.setText("先攻を決定してください");
                }
                if(e.getSource()==btn_start &senko_flag==1 &
		   start_flag==0){//スタートボタンを押したとき
                        turn_color(turn);start_flag=1;
                }
                if(e.getSource()==btn_pass &senko_flag==1 &
		  start_flag==1){//パスボタンを押したとき
                        turn=turn*(-1);turn_color(turn);
                }
                if(e.getSource()==btn_reset){//リセットボタンを押したと
		き
                        for(int x=0;x<=9;x++){//全配列の初期化
                                for(int y=0;y<=9;y++){ban[x][y]=0;}
                }                      
                ban[4][4]=-1;ban[5][4]=1;ban[4][5]=1;ban[5][5]=-1;//中央
		の石の配列初期化
                        lab5.setText("");lab6.setText("");//各変数の初期
		化
                        senko_flag=0;start_flag=0;turn=0;
                        txt_white.setText("2");txt_black.setText("2");
                        repaint();
                }
        }
        public void turn_color(int turn){       //手番の色表示メソッド;
if(turn==1){lab5.setText("今、黒の番です");}
                        if(turn==-1){lab5.setText("今、白の番です");}
        }

        public void mousePressed(MouseEvent e){  //マウスプレス反応メ
	ソッド

                int px,py; //マウスクリックポイントの座標変数
                int hx,hy; //配列座標変数
                int x;     //探索用x座標変数
                int y;     //探索用y座標変数
                int i=0;   //はさんだ石の数用変数
                int k=0;   //8方向のはさめる数用変数
                int p=0;   //はさめる総数用変数

  if(start_flag!=1 || senko_flag!=1){return;}     //スタート・先攻ボタン
  が押されていないときは抜ける

                px=e.getX();py=e.getY();        //マウスクリック点の座標
		を取得
                hx=(int)(px/w)+1;hy=(int)(py/w)+1;      //列と行数を取得

                if(turn==1){g.setColor(Color.black);}   //石の色を設定
if(turn==-1){g.setColor(Color.white);}

                if(ban[hx][hy]==0){
                        for(int dx=-1;dx<=1;dx++){//8方向にはさめる数を
                        探索
                                for(int dy=-1;dy<=1;dy++){
               if((dx==0 &dy==0) || ban[hx+dx][hy+dy]==0 ||
                        ban[hx+dx][hy+dy]==turn){continue;}
                                 x=hx;y=hy;i=0;
                             do{ 
                                x=x+dx;y=y+dy;
                                if(ban[x][y]==turn){//はさめる数を取得
                                k=i;
                                x=x-dx;y=y-dy;
                                while(ban[x][y]==turn*(-1)){//石をひっく
                        りかえす
                                g.fillOval(w/8+(x-1)*w,w/8+(y-1)*w,o,o);
                                ban[x][y]=turn;x=x-dx;y=y-dy;
                                                        }
                                                }   
                        i=i+i;
                        }while(x>=1 &x<=8 &                        y>=1
                        &y<=8 &ban[x][y]==turn*(-1));
                        p=p+k;
                                }
                        }
                }
                if(p>0 &hx>0 &hx<9 &hy>0 &hy<9 &
                        ban[hx][hy]==0 &turn==1){     //黒石を置く
                        g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o);
                        ban[hx][hy]=1;
                        turn=-1;
                        turn_color(turn);
                        count();
return;
                }

                if(p>0 &hx>0 &hx<9 &hy>0 &hy<9 &
		ban[hx][hy]==0 &turn==-1){    //白石を置く
                        g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o);
                        ban[hx][hy]=-1;
                        turn=1;
                        turn_color(turn);
                        count();
                        return;
                }
        }

        public void count(){  //白石、黒石の数を表示メソッド
                int wh=0;  //白石数用変数
                int bl=0;  //黒石用変数

                for(int i=1;i<=8;i++){//全配列の白石と黒石の数をカウント
                        for(int j=1;j<=8;j++){
                                if(ban[i][j]==-1){wh=wh+1;}
                                if(ban[i][j]==1){bl=bl+1;}
                        }
                }
                txt_white.setText(String.valueOf(wh));  //黒の石数を表示
                txt_black.setText(String.valueOf(bl));  //白の石数を表示
        }




        // 残りのマウスイベントは全部書く
        public void mouseReleased(MouseEvent e){}
        public void mouseClicked(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}

}


考察


盤面の作成

/*プログラミングに必要な各クラスライブラリをあらかじめ 導入(import)します*/ import java.awt.*;      //awt(abstract windowstoolkit)の略でグラフィック等のパッケージを導入 import java.applet.Applet; //ブラウザ上で動作に必要なパッケージを導入 /*このプログラムの本体をクラス名をotheles1として設定*/ public class otheles1 extends Applet{ //クラス本体の始まり //このクラスがAppletクラスを使えるように継承(extends)します int w=40; //マス目のサイズ用変数(1マスのサイズを40ピクセルとします) int o=30; //石の直径用変数(石の直径を30ピクセルとします)  //intはw,o等の変数に入れる値が整数値であることを示す変数型を表していま す Graphics g;  //グラフィック用オブジェクト変数にgを設定(gでもgrでもなんでも良い) public void init(){ //初期化init()メソッドはプログラムを実行する時に最初に呼び出されます setBackground(Color.white);//setBackground()メソッドで アプレット背景色を白に設定 /*色の設定方法は下記のように三通りあります。*/  //Color.red Color.yellowのように色名で指定  //new Colow(0xff0000) 0x+ffffffのようにおなじみのRGB16進数で色を指定  //new Color(255,255,255)と(r,g,b)のred,green,blueの3ケタの成分値で指 定 g = getGraphics(); //getGraphics()メソッドでグラフィック用オブジェクトを生成 } //初期化メソッドの終わり public void paint(Graphics g){ //グラフィック描画paint()メソッド //グラフィックに描画する時は以下のようにgとdrawLine()などの各メソッドを ドットでつなぐ g.setColor(new Color(0x3cb371)); //setColor()メソッドで盤の色をグリーンに設定 g.fillRect(0,0,320,320); //fillRect()メソッドで(x1,y1,width,height)の四角形座標を塗りつぶす g.setColor(Color.black); //setColor()メソッドでマスを描く線の色を黒に設 定 for(int i=0;i<=8;i++){  //1本ずつ書いても良いが、繰り返すときはこの for命令を使う g.drawLine(i*40,0,i*40,320); //drawLine()メソッドで縦線の描画 g.drawLine(0,i*40,320,i*40); //横線の描画(x1,y1,x2,y2)で座標設定 } g.setColor(Color.white);      //中央の白石を描画 g.fillOval(w/8+w*3,w/8+w*3,o,o);  //fillOval()メソッドで円を描く (x1,y1,width,height) g.fillOval(w/8+w*4,w/8+w*4,o,o);  //x1,y1で左上の座標width,heightで横 縦のサイズを指定 g.setColor(Color.black);      //中央の黒石を描画 g.fillOval(w/8+w*4,w/8+w*3,o,o);//記号w*4の*は×の意味で掛け算を表してい ます g.fillOval(w/8+w*3,w/8+w*4,o,o);//記号w/8の/は÷の意で割り算を表していま す } //グラフィック描画の終わり } //クラス本体の終わり

ボタンやラベルの設置

/*このプログラムの本体をクラス名をotheles1として設定*/ public class otheles1 extends Applet{ //クラス本体の始まり //このクラスがAppletクラスを使えるように継承(extends)します int w=40; //マス目のサイズ用変数(1マスのサイズを40ピクセルとします) int o=30; //石の直径用変数(石の直径を30ピクセルとします) //intはw,o等の変数に入れる値が整数値であることを示す変数型を表しています Graphics g;  //グラフィック用オブジェクト変数にgを設定(gでもgrでもなんでも良い) public void init(){  //初期化init()メソッドはプログラムを実行する時に最初に呼び出されます setBackground(Color.white); //setBackground()メソッドでアプレット背景色を白に設定 /*色の設定方法は下記のように三通りあります。*/  //Color.red Color.yellowのように色名で指定  //new Colow(0xff0000) 0x+ffffffのようにおなじみのRGB16進数で色を指定  //new Color(255,255,255)と(r,g,b)のred,green,blueの3ケタの成分値で指 定 g = getGraphics();//getGraphics()メソッドでグラフィック用オブジェクトを 生成 } //初期化メソッドの終わり public void paint(Graphics g){//グラフィック描画paint() メソッド //グラフィックに描画する時は以下のようにgとdrawLine()などの各メソッドを ドットでつなぐ g.setColor(new Color(0x3cb371)); //setColor()メソッドで盤の色をグリーン に設定 g.fillRect(0,0,320,320);//fillRect()メソッドで(x1,y1,width,height)の四角 形座標を塗りつぶす g.setColor(Color.black); //setColor()メソッドでマスを描く線の色を黒に設 定 for(int i=0;i<=8;i++){  //1本ずつ書いても良いが、繰り返すときはこの for命令を使う g.drawLine(i*40,0,i*40,320); //drawLine()メソッドで縦線の描画 g.drawLine(0,i*40,320,i*40); //横線の描画(x1,y1,x2,y2)で座標設定 } g.setColor(Color.white);      //中央の白石を描画 g.fillOval(w/8+w*3,w/8+w*3,o,o);   //fillOval()メソッドで円を描く(x1,y1,width,height) g.fillOval(w/8+w*4,w/8+w*4,o,o);   //x1,y1で左上の座標width,heightで横縦のサイズを指定 g.setColor(Color.black);      //中央の黒石を描画 g.fillOval(w/8+w*4,w/8+w*3,o,o);//記号w*4の*は×の意味で掛け算を表してい ます g.fillOval(w/8+w*3,w/8+w*4,o,o);//記号w/8の/は÷の意味で割り算を表してい ます } //グラフィック描画の終わり } //クラス本体の終わり

ボタンクリックイベント

import java.awt.*; import java.applet.Applet; import java.awt.event.*; //マウスによるイベントを検知するにはこのパッケージの導入が必要 public class otheles3 extends Applet implementsActionListener{ /*ボタンクリックイベントを有効にするには上記のように  ActionListenerインターフェイスをimplements(実装)します。*/              :              : add(btn_start);btn_start.setBounds(100,410,60,20);//スタートボタンの設置 add(btn_reset);btn_reset.setBounds(170,410,60,20);//リセットボタンの設置 btn_start.addActionListener(this); //各ボタンクリック用リスナーメソッド の設置 btn_reset.addActionListener(this); //各ボタンとaddActionListenerをドッ トでつなぐ btn_white.addActionListener(this); btn_black.addActionListener(this); btn_pass.addActionListener(this);        :        :        } //グラフィック描画メソッドの終わり public void actionPerformed(ActionEvent e){ //各ボタン操作メソッド /*マウスによるボタンクリックを受け取るには  上のようにactionPerformed(ActionEvent e)メソッドで行います。*/ if(e.getSource()==btn_white &start_flag!=1){ //白ボタン押したとき turn=-1;lab5.setText("");lab6.setText("先攻は白");senko_flag=1; } /*各ボタンの検知は上のように  もし白ボタンが押されたら if(e.getSource()==btn_white) という書き方をし ます。 また記号&は<かつ>という論理演算子を表し「白ボタンが押されて いて」<かつ>「スタートボタンが1でないなら」という意味になります。*/ if(e.getSource()==btn_black &start_flag!=1){ //黒ボタンを押したとき turn=1;lab5.setText("");lab6.setText("先攻は黒");senko_flag=1; } if(e.getSource()==btn_start &senko_flag!=1){ //先攻を決めずにスタートボ タンを押したとき lab5.setText("先攻を決定してください"); } if(e.getSource()==btn_start &senko_flag==1 &start_flag==0){  //スタートボタンを押したとき start_flag=1;turn_color(turn); //現在のturnの値1かー1を添えて下のturn_color()メソッドへ送ります } if(e.getSource()==btn_pass &senko_flag==1 &start_flag==1){ //パスボタン を押したとき turn=turn*(-1);turn_color(turn); /* このturn=turn*(-1)はturnの値が1の時は1×(−1)=−1となり turnの値が−1の時は(−1)×(−1)=1となり、押すたびに1、−1と変 化します*/ } //今回はリセットボタンの説明は省いています、詳しい説明は次回に行います。 } //ボタン操作メソッドの終わり public void turn_color(int turn){//手番の色を表示するメソッド //turnの値が1かー1を引数(ひきすう)として受け取り、値に応じて色を表示 します if(turn==1){lab7.setText("今、黒の番です");} if(turn==-1){lab7.setText("今、白の番です");} } } //クラス本体の終わり

盤面状態の作成

public void init(){ //初期化メソッド setBackground(Color.white);//背景の色を白に g= getGraphics();//グラフィックオブジェクトの生成 for(int x=0;x<=9;x++){ //全配列の初期化 for(int y=0;y<=9;y++){ ban[x][y]=0; //配列全部が石が無い状態=0とします } } ban[4][4]=-1;ban[5][4]=1; //中央の黒石=1、白石=−1として配列を初期 化します ban[4][5]=1;ban[5][5]=-1; setLayout(null);//レイアウトを無効にする(ボタンやラベル等を自由に配置す るため)             :             :  turn=turn*(-1);turn_color(turn); } if(e.getSource()==btn_reset){ //リセットボタンを押した とき for(int x=0;x<=9;x++){ //全配列の初期化 for(int y=0;y<=9;y++){ban[x][y]=0;} } ban[4][4]=-1;ban[5][4]=1;ban[4][5]=1;ban[5][5]=-1; //中央の石の配列初期 化 lab6.setText("");lab7.setText(""); //ラベルの初期化 senko_flag=0;start_flag=0; //先攻フラッグとスタートフラッグの初期化 turn=0; //手番の色を初期化 txt_white.setText("2");txt_black.setText("2"); //テキストフィールドの石 数2を設定 repaint(); //盤面を更新 } } //ボタン操作メソッドの終わり

マウスクリックで石を置く

public class otheles5 extends Applet implements ActionListener,MouseListener{//クラス本体の始まり /*  アプレット上のマウスクリックを検知するには  MouseListenerインターフェイスを実装(implements)する必要があります。 */            :            : btn_white.addActionListener(this); btn_black.addActionListener(this); btn_pass.addActionListener(this); addMouseListener(this);  //マウスクリック用リスナーを設置します } //初期化メソッドの終わり            :            : if(turn==-1){lab7.setText("今、白の番です");} } public void mousePressed(MouseEvent e){ //マウスプレス メソッドの始まり /*マウスクリックを受け取るにはmousePressed(MousewEvent e)というメソッド を使います*/ if(start_flag!=1 || senko_flag!=1){return;}  //スタートボタンや先攻ボタンが押されていないときはこのメソッドを抜けま す int px,py; //マウスクリックポイントの座標変数 int hx,hy; //配列用座標変数 px=e.getX();py=e.getY();  //マウスクリック点の座標はe.getX(),e.getY()というメソッドで取得 hx=(int)(px/w)+1;hy=(int)(py/w)+1;  //取得した座標をマスサイズで割り列と行数の整数値を取得、(int)は少数の 切捨てを行います if(hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 ¡#urn==1){ //もし黒の番(turn=1)で、かつ押した点の配列座標が1〜8以内で、かつその点 に石が無い(ban[hx][hy]==0)なら g.setColor(Color.black);//石の色を黒に設定 g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); //クリックした地点を黒円で描 画し ban[hx][hy]=1; //この地点の配列を黒(ban[hx][hy]=1)として turn=-1;turn_color(turn); //次の番の色を白に設定してラベルに表示する count();//黒石数表示メソッドへ return;//このメソッドを抜ける } if(hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 &turn==-1){//白の番も黒の番と 同様に書きます g.setColor(Color.white); g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); ban[hx][hy]=-1; turn=1;turn_color(turn); count(); return; } } public void count(){ //白石、黒石の数表示メソッド int wh=0; //白石用変数 int bl=0; //黒石用変数 for(int i=1;i<=8;i++){//全配列の白石数と黒石数をカウント for(int j=1;j<=8;j++){ if(ban[i][j]==-1){wh=wh+1;} if(ban[i][j]==1){bl=bl+1;} } } txt_white.setText(String.valueOf(wh));//黒の石数を表示 txt_black.setText(String.valueOf(bl));//白の石数を表示 } // MouseListenerを設置した時は残りのマウスイベントは全部書く決まりになっ ています public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} } //クラス本体の終わり if(turn==-1){lab7.setText("今、白の番です");} } public void mousePressed(MouseEvent e){ //マウスプレス メソッドの始まり /*マウスクリックを受け取るにはmousePressed(MousewEvent e)というメソッド を使います*/ if(start_flag!=1 || senko_flag!=1){return;}  //スタートボタンや先攻ボタンが押されていないときはこのメソッドを抜けま す int px,py; //マウスクリックポイントの座標変数 int hx,hy; //配列用座標変数 px=e.getX();py=e.getY();  //マウスクリック点の座標はe.getX(),e.getY()というメソッドで取得 hx=(int)(px/w)+1;hy=(int)(py/w)+1;  //取得した座標をマスサイズで割り列と行数の整数値を取得、(int)は少数の 切捨てを行います if(hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 turn==1){ //もし黒の番(turn=1)で、かつ押した点の配列座標が1〜8以内で、かつその点 に石が無い(ban[hx][hy]==0)なら g.setColor(Color.black);//石の色を黒に設定 g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); //クリックした地点を黒円で描 画し ban[hx][hy]=1; //この地点の配列を黒(ban[hx][hy]=1)として turn=-1;turn_color(turn);  //次の番の色を白に設定してラベルに表示する count(); //黒石数表示メソッドへ return; //このメソッドを抜ける } if(hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 &turn==-1){//白の番も黒の番と 同様に書きます g.setColor(Color.white); g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); ban[hx][hy]=-1; turn=1;turn_color(turn); count(); return; } } public void count(){ //白石、黒石の数表示メソッド int wh=0; //白石用変数 int bl=0; //黒石用変数 for(int i=1;i<=8;i++){//全配列の白石数と黒石数をカウント for(int j=1;j<=8;j++){ if(ban[i][j]==-1){wh=wh+1;} if(ban[i][j]==1){bl=bl+1;} } } txt_white.setText(String.valueOf(wh));//黒の石数を表示 txt_black.setText(String.valueOf(bl));//白の石数を表示 } // MouseListenerを設置した時は残りのマウスイベントは全部書く決まりになっ ています public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} } //クラス本体の終わり

石を裏返す

         : if(start_flag!=1 || senko_flag!=1){return;} int px,py; //マウスクリックポイントの座標変数 int hx,hy; //配列用座標変数 int x; //探索用x座標変数 int y; //探索用y座標変数 int i; //1方向のはさめる数用変数 int k; //8方向のはさめる数用変数 int p=0; //はさめる総数用変数 px=e.getX();py=e.getY();// マウスクリック点の座標を取得 hx=(int)(px/w)+1;hy=(int)(py/w)+1;// 配列用座標を取得 if(turn==1){g.setColor(Color.black);}//石の色を設定 if(turn==-1){g.setColor(Color.white);} if(ban[hx][hy]==0){ //マウスクリックした所の石が置いていない時 for(int dx=-1;dx<=1;dx++){//8方向にはさめる数を探索 for(int dy=-1;dy<=1;dy++){ if((dx==0 &dy==0) || ban[hx+dx][hy+dy]==0 || ban[hx+dx][hy+dy]==turn){continue;} /* 8方向とは(dx,dy)が(0,0)を除き左上(-1,-1)左横(-1,0)左下(-1,1) 真上(0,-1)真下(0,1)右上(1,-1)右横(1,0)右下(1,1)の場合を考える */ x=hx;y=hy; //現在の配列座標を探索用変数に置き換える i=0;k=0; //はさめる数用変数を初期化する do{ //はさめる石数を取得 x=x+dx;y=y+dy; //その方向に向かって1ずつ探索をすすめる if(ban[x][y]==turn){ //手番の色と同じ石になったら k=i; //返す数を取得 x=x-dx;y=y-dy; //1つ探索を戻して while(ban[x][y]==turn*(-1)){ //手番と違う色の場合石をひっくり返す g.fillOval(w/8+(x-1)*w,w/8+(y-1)*w,o,o); //色手番の色で塗る ban[x][y]=turn; //配列を手番の数に x=x-dx;y=y-dy; //その方向に向かって1ずつ探索を戻す } } i=i+1; //はさめる数をカウントする }while(x>=1 &x<=8 &y>=1 &y<=8 &ban[x][y]==turn*(-1));//手番と違う色の場 合探索をすすめる p=p+k; //8方向のはさめる総数をカウントする } } } if(p>0 &hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 &turn==1){//手番が黒の場合//p>0ではさめるなら g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); //クリックした地点を黒円で描 画し ban[hx][hy]=1; //この地点の配列を黒(ban[hx][hy]=1)として turn=-1;turn_color(turn); //次の番の色を白に設定してラベルに表示する count();//黒石数表示メソッドへ return;//このメソッドを抜ける } if(p>0 &hx>0 &hx<9 &hy>0 &hy<9 &ban[hx][hy]==0 &turn==-1){//上の黒の場合と同様 g.fillOval(w/8+(hx-1)*w,w/8+(hy-1)*w,o,o); ban[hx][hy]=-1; turn=1;turn_color(turn); count(); return; } } //マウスプレスメソッドの終わり public void count(){ //白石、黒石の数表示メソッド           : ;