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がないことに気付く。次回ゲーム開始ボタンなど作りたいと思う。