Squares
終了判定を行うため全マス目をチェックする。八方に同じ印(✕、〇)が3つ並んでいれば勝利だ。また全てマス目が埋まっているなら引き分けだ。これをクラスSquaresに実装する。
実現するために座標増減値用の配列を用意した。
| 1 2 3 4 5 |     var houkou = arrayOf(         arrayOf(-1,-1), arrayOf(-1,0), arrayOf(-1,1),         arrayOf(0,-1), arrayOf(0,1),         arrayOf(1,-1), arrayOf(1,0), arrayOf(1,1)     ) | 
このX,Y座標の増減値で座標を探索し、基準マス目から八方に2つ同じマークがないか確認する。
三目並べと決め打ちすれば、もっとシンプルなロジックで実現できる。しかし四目、五目並べと拡張したいために、今回はこのロジックを採用している。
実際のコードは次の通りだ。関数jugを呼び出すと、勝負がついていないなら0、✕が勝利なら1、〇が勝利なら2、マス目が埋まっているなら3、が返ってくる。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |     fun jug():Int{  //戻り値 0:勝負つかず、1:✕勝利、2:〇勝利、3:マス目が埋まっている         var isFinal = true                          //マス目が全て埋まっているかフラグ         for(idx1 in square.indices){             for(idx2 in square[idx1].indices){                 if( square[idx1][idx2].state == 0 ){//マス目が空白なら探索しない                     isFinal=false                       //空白があるのでフラグOFF                     break;                 }                 var ret = eightCheck(idx1,idx2)     //八方チェック関数を呼び出す                 if(ret != 0){                       //0:勝負つかず以外なら試合終了                     return ret                 }             }         }         if(isFinal){                                 //マス目が全て埋まっているなら             return 3         }else {             return 0         }     }     fun eightCheck(idx1:Int,idx2:Int):Int{          //戻り値 0:勝負つかず、1:✕勝利、2:〇勝利         for(h in houkou.indices){                   //八方を探索             var count = 1             var x= idx1             var y= idx2             while(true){                            //マス目をはみ出すまで永久ループ                 x =  x + houkou[h][0]               //x,y座標を増減し探索                 y = y + houkou[h][1]                //                 if(x >= 3 || x < 0){                //横軸はみ出ている?                     break                 }                 if(y >= 3 || y < 0){                //縦軸はみ出ている?                     break                 }                 if(square[idx1][idx2].state == square[x][y].state){//基準と同じマークならcountアップ                     count++                 }             }             if(count >= 3){                         //マークが3つ以上並んだか?                 return square[idx1][idx2].state             }         }         return 0     } | 
MainActivity
終了処理をMainActivityに記述していく。まずプロパティを2つ追加する。1つ目は終了メッセージ用の配列MESSAGE_FINALだ。2つ目はゲーム終了か判断するためのフラグisFinalを設ける。
| 1 2 |     val MESSAGE_FINAL = arrayOf("","✕の勝利です。","〇の勝利です。","手が無くなりました。")     var isFinal = false | 
onClick関数に終了処理を追加し、新たな関数finalを作成する。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |     override fun onClick(p0: View?) {         if(isFinal){                                //試合終了なら処理しない             return         }         var button = p0 as ImageButton         var array  = button.getTag() as Array<Int>         textView3.text = ""         if(squares.isKUHAKU(array[0],array[1])){             squares.click(array[0], array[1], next)             var win = squares.jug()                 //終了判定処理呼び出し             if(win != 0){                           //試合終了なら終了処理呼び出し                 final(win)             }             next = !next         }else {             textView3.text =  "既に打たれています。"         }     }     fun final(win:Int){         textView3.text = MESSAGE_FINAL[win]         //終了メッセージ表示         isFinal = true                              //終了フラグON     } | 
実行
 
人対人の対戦なので面白みはないが、とりあえず完成!・・・と思ったが…これゲーム開始、再開始のUIがないことに気付く。次回ゲーム開始ボタンなど作りたいと思う。

 
  
  
  
  