発展プログラミング (5) 例題 5-03( 応用プログラム 3 目並べ その 2) 勝敗判定機能をそなえた 3 目並べ のゲーム盤を作りましょう 必要な変数を考えましょう 1 マス目の状態を保持する配列 整数型 :mas[] 2 何手目かを数える変数 整数型 :nante 3 ゲームが終了したかどうかを示す変数 整数型 :endflg 最低限 この 3 種類は必要です 前回作成した例題 5-02 をもとに 新しくプログラムを作成します その方法 1 パッケージ エクスプローラの Rei5_02 を右クリックし コピー を選択 2 再度 パッケージ エクスプローラの Rei5_02 を右クリックし 貼り付け を選択 1 SagamiharaSogoHighSchool
3 新規名として Rei5_03 と入力 4 パッケージ エクスプローラー内の Rei5_03 を右クリック 次で開く WindowBui lder エディター を選択 ソースコードの追加 1. ソース タブをクリックし 次のインスタンス変数を追加する privateintnant e; // 現在何手目か 9になれば引き分け privateintendfl g; // 勝負がついたかどうか 1= 終了,0= は試合中 privateint[]mas; // 0-9 のマスの状態 (0= 空 1=,2= ) 2. setbutt on メソッドからボタンを参照できるように 次のインスタンス変数を追加する privatejbutton button0; privatejbutton button1; privatejbutton button2; privatejbutton button3; privatejbutton buton4; privatejbutton button5; privatejbutton button6; privatejbutton button7; privatejbutton button8; 2 SagamiharaSogoHighSchool
同時に public Rei5_03 メソッドの中で 9 つのボタンについて JButton button0 = new JButton(""); となっている行の先頭の JButton を削除し 次のようにする button0 = new JButton(""); button0~butto n8まで 9つのボタンのすべてについて 変更する 3. public Rei5_03 メソッドの先頭に次のコードを記述する mas=newint[9]; 4. 0~8 のマス目ボタンに actionperformed メソッドを追加する button 0.addActionListener (newactionlis tener() { publicvoidactionp erformed(actionevent e) { clickmas(0) ; ); ボタン 2なら clickmas (2) とする 9つのボタンすべてに同様に記述 5. スタートボタンに actionperformed メソッドを追加する button 9.addActionListener (newactionlis tener() { publicvoidactionp erformed(actionevent e) { nant e= 0; endfl g= 0; for(inti= 0;i< 9;i++){ mas[i] =0; ); dispmas() ; ボタン 2なら clickmas (2) とする 9つのボタンすべてに同様に記述 3 SagamiharaSogoHighSchool
設定した変数 (nant e,endflg,mas []) を元に プログラムの実行にはどのようなメソッドが必 要か 考えましょう 必要なメソッドの例 ( 同じ機能のプログラムであっても 作成者によって異なるはず ) 1 マス目をクリックしたら配列 mas[ ] の値を書き換え を表示する clickma s *2 配列 mas[ ] の値にしたがって9つのマス目すべてに を表示する dispma s *3 9つのマスのうち 指定した1つのマスに文字を表示する setbutto n 4 配列 mas[ ] をチェックして ゲームが終了したかどうか判定する chken d 5 コンピュータ対戦のとき コンピュータがどこに打つかを考えるメソッド think *2 と 3 は 1 の処理に付随するメソッド 5 は次回作成する マス目をクリックしたら 配列 mas[ ] の値を書き換えて を表示する clickma s privatevoidclickm as(intm){ if(endfl g> 0) { // もうゲームが終了しているなら何もしない return; if(mas[m] == { 0) // 空欄ならmas[ ] に1か2を入れて マス目を表示 mas[m] = (nant e% 2) ; + 1 nant e++; dispmas() ; //9 つのマス目をすべて表示 if(chkend() { // > 終了をチェックし どちらの勝ちか表示する 0) endfl g= 1; if((nant e% 2)>0) { textfiel d.settext (" 先手 ( ) の勝ちです."); else{ textfiel d.settext (" 後手 ( ) の勝ちです."); 4 SagamiharaSogoHighSchool
配列 mas[ ] の値にしたがって9つのマス目すべてに を表示する dispma s privatevoiddispma s(){ for(inti= 0;i<9 ;i++){// の表示 if(mas[i] > { 1) setbutton (i," "); elseif(mas[i]==1) { setbutton (i," "); else{ setbutton (i,""); if(endfl g== { 0) if(nant e> 8) { endfl g= 1; textfiel d.settext( " 引き分けです."); elseif((nant e% 2) == { 1) else{ textfiel d.settext( " 後手 ( ) の番です."); textfiel d.settext( " 先手 ( ) の番です."); 9つのマスのうち 指定した1つのマスに文字を表示する setbutto n privatevoidsetbut ton(intc,string s){ switch(c){ case0:button 0.set Text(s);break; case1:button 1.set Text(s);break; case2:button 2.set Text(s);break; case3:button 3.setText(s);break; case4:button 4.set Text(s);break; case5:button 5.set Text(s);break; case6:button 6.set Text(s);break; case7:button 7.set Text(s);break; case8:button 8.set Text(s);break; 5 SagamiharaSogoHighSchool
ヒント ゲームの終了をチェックする方法 1. どちらかが 勝った ということは 縦 横 斜めの3つの番号のうち どれかが同じ番号になったということ 0. 1. 2. 3. 4. 5. 6. 7. 8. 2. 勝つパターンは 8 種類 0,1,2 3,4,5 6,7,8 0,3,6 1,4,7 2,5,8 0, 4,8 2,4,6 のマス目が 1 か 2 の値にそろうこと 配列 mas[ ] をチェックして ゲームが終了したかどうか判定する chken d privateintchkend(){ int c =0; if((mas[0]== mas[1])&&(mas[1] = mas[2]) &&(mas[0]> 0)){ c= 1; elseif (mas[3] ==mas[4]) &(mas[4]==mas[5])&& (mas[3]> 0)){ c= 2; elseif (mas[6] ==mas[7]) &(mas[7]==mas[8])&& (mas[6]> 0)){ c= 3; elseif (mas[0] ==mas[3]) &(mas[3]==mas[6])&& (mas[0]> 0)){ c=4; elseif (mas[1] ==mas[4]) &(mas[4]==mas[7])&& (mas[1]> 0)){ c= 5; elseif (mas[2] ==mas[5]) &(mas[5]==mas[8])&& (mas[2]> 0)){ c= 6; elseif (mas[0] ==mas[4]) &(mas[4]==mas[8])&& (mas[0]> 0)){ c= 7; elseif (mas[2] ==mas[4]) &(mas[4]==mas[6])&& (mas[2]> 0)){ c= 8; returnc; ゲームが終了している場合は1~8のいずれかを返す 終了していなければ0を返す 6 SagamiharaSogoHighSchool
課題 1 今回作成した Java クラスを 正常に動作することを確認後 提出しなさい 今回提出すべきファイル (1 本 ) (Rei5_03) 2 このプログラムを コンピュータが自動的に手を打ってくるようにするには どこを修正すれ ばよいか考えなさい コンピュータが考えるメソッド think を呼び出すのは プログラムのどこで行うのかを 考える 先手の場合と後手の場合があるので それぞれ thin k メソッドを呼び出す場所が必要に なる 7 SagamiharaSogoHighSchool