スタート制御
スタート/リセット動作のため次のようにプログラムを変更する。
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
package com.example.myapplication import android.os.Bundle import android.view.View import android.widget.ImageButton import android.widget.TableRow import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.ticktacktoo.* class MainActivity : AppCompatActivity(), View.OnClickListener { lateinit var squares:Squares var next:Boolean = true val MESSAGE_FINAL = arrayOf("","✕の勝利です。","〇の勝利です。","手が無くなりました。") var isFinal = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.ticktacktoo) var imagebutton = arrayOf( arrayOf(imageButton1,imageButton2,imageButton3), arrayOf(imageButton4,imageButton5,imageButton6), arrayOf(imageButton7,imageButton8,imageButton9) ) for(idx1 in imagebutton.indices){ for(idx2 in imagebutton[idx1].indices){ imagebutton[idx1][idx2].setOnClickListener(this) var array = arrayOf(idx1,idx2) imagebutton[idx1][idx2].setTag(array) } } button.setOnClickListener(this) squares = Squares(imagebutton) init() } override fun onClick(p0: View?) { when (p0!!.id) { R.id.button -> buttonClick() else -> imagebuttonClick(p0) } } fun imagebuttonClick(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 init(){ squares.allClear() next = true; buttonSet() } fun buttonClick(){ if(isFinal){ //START init() textView3.text="手を打ってください。" isFinal = false buttonSet() }else{ //RESET createDialog() } } fun final(win:Int){ textView3.text = MESSAGE_FINAL[win] //終了メッセージ表示 isFinal = true buttonSet() } fun buttonSet(){ if(isFinal){ button.text = "START" button.setBackgroundResource(R.drawable.button_blue) }else{ button.text = "RESET" button.setBackgroundResource(R.drawable.button_red) } } fun createDialog(){ AlertDialog.Builder(this) .setTitle("RESET?") .setMessage("RESETすると全てクリアされます。よろしいでしょうか?") .setPositiveButton("OK", { dialog, which -> //OK選択時処理 init() isFinal = true buttonSet() }) .setNegativeButton("No", { dialog, which ->//NO選択時処理(何もしない) }) .show() } } |
STARTボタンをクリックするとゲーム開始なので、プログラム起動時はゲーム終了状態とする。そのため15行目の終了フラグをオン(true)に設定する。
15 |
var isFinal = true |
ゲームを何度も行ったりリセットしたりするので、ゲームを初期状態に戻す必要がある。これを実現するため関数initを実装した。
65 66 67 68 69 |
fun init(){ squares.allClear() next = true; buttonSet() } |
66行目の「squares.allClear()」は、クラスSquaresの新たな関数allCleartを呼び出している。この関数で全てのマス目を空白にしている。
1 2 3 4 5 6 7 |
fun allClear() { for (idx1 in square.indices) { for (idx2 in square[idx1].indices) { square[idx1][idx2].click(0) } } } |
67行目で手番を初期状態の✕(true)に設定している。
68行目で関数buttonSetを呼び出している。この関数はゲーム状態(終了、プレイ中)により画面右下のボタンテキスト(START/RESET)、画像(青/赤色)を変更している。
88 89 90 91 92 93 94 95 96 97 |
fun buttonSet(){ if(isFinal){ button.text = "START" button.setBackgroundResource(R.drawable.button_blue) }else{ button.text = "RESET" button.setBackgroundResource(R.drawable.button_red) } } |
39行目の関数onClickはマス目がクリックされた際に呼びだされていた。今回STARTボタンを追加したので、これをクリックしてもこの関数が呼び出されることになった。
どのボタンがクリックされたか判別するためにid属性を使い判断する。そしてSTARTボタン(buttonClick)、マス目(imagebuttonClick)、それぞれの処理を行う関数を呼び出している。
39 40 41 42 43 44 |
override fun onClick(p0: View?) { when (p0!!.id) { R.id.button -> buttonClick() else -> imagebuttonClick(p0) } } |
40行目のwhen命令はJavaのswitch命令に相当するものだ。
画面右下のボタンをクリックすると71行目の関数buttonClickが呼び出される。「START」表示時にクリックされるとゲームの初期化を行いゲームを開始する。
71 72 73 74 75 76 77 78 79 80 |
fun buttonClick(){ if(isFinal){ //START init() textView3.text="手を打ってください。" isFinal = false buttonSet() }else{ //RESET createDialog() } } |
「RESET」表示時にクリックすると78行目で関数createDialogを呼び出す。この関数はゲームを中止するか、確認するためのダイアログを表示しているのだ。
ダイアログ
ダイアログの表示はAlertDialog.Builder命令で行っている。※ダイアログは様々な表示ができるので詳細はGoogle Developerを参照してください。
99 100 101 102 103 104 105 106 107 108 109 110 111 |
fun createDialog(){ AlertDialog.Builder(this) .setTitle("RESET?") .setMessage("RESETすると全てクリアされます。よろしいでしょうか?") .setPositiveButton("OK", { dialog, which -> //OK選択時処理 init() isFinal = true buttonSet() }) .setNegativeButton("No", { dialog, which ->//NO選択時処理(何もしない) }) .show() } |
ダイアログの実装で注意点がある。ダイアログを表示するとOKやCANCELの応答があるまで、プログラムが停止すると錯覚しがちだ。実際は表示を行うと次のプログラムが実行されていく。
この動作を忘れてしまうと、思い通りにプログラムが動作せず解消まで時間を費やしてしまうことになる。
動作確認