日々是好日~every day is a good day~

日常の中の非日常の備忘録

【Android Studio】Number Puzzle 5回目

今日は『シャッフルボタンと終了ボタン』です

import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.widget.Button
import android.widget.TextView
import android.widget.Toast

private var textData =ArrayList<Int>()  //画面上の数値データ
private var flag_clear = false          //ゲームクリアフラグ
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val text0: TextView = findViewById(R.id.text0)
        val text1: TextView = findViewById(R.id.text1)
        val text2: TextView = findViewById(R.id.text2)
        val text3: TextView = findViewById(R.id.text3)
        val text4: TextView = findViewById(R.id.text4)
        val text5: TextView = findViewById(R.id.text5)
        val text6: TextView = findViewById(R.id.text6)
        val text7: TextView = findViewById(R.id.text7)
        val text8: TextView = findViewById(R.id.text8)
        val text9: TextView = findViewById(R.id.text9)
        val text10: TextView = findViewById(R.id.text10)
        val text11: TextView = findViewById(R.id.text11)
        val text12: TextView = findViewById(R.id.text12)
        val text13: TextView = findViewById(R.id.text13)
        val text14: TextView = findViewById(R.id.text14)
        val text15: TextView = findViewById(R.id.text15)
        val text16: TextView = findViewById(R.id.text16)
        val text17: TextView = findViewById(R.id.text17)
        val text18: TextView = findViewById(R.id.text18)
        val text19: TextView = findViewById(R.id.text19)
        val text20: TextView = findViewById(R.id.text20)
        val text21: TextView = findViewById(R.id.text21)
        val text22: TextView = findViewById(R.id.text22)
        val text23: TextView = findViewById(R.id.text23)
        val text24: TextView = findViewById(R.id.text24)

        val textView = arrayOf(
            text0, text1,text2,text3,text4,text5,text6,text7,
            text8,text9,text10,text11,text12,text13,text14,text15,
            text16,text17,text18,text19,text20,text21,text22,text23,text24)
        val textmsg1: TextView = findViewById(R.id.textmsg1)
        textmsg1.setVisibility(View.INVISIBLE)   //クリアメッセージ非表示
        val shuffle: Button = findViewById(R.id.shuffle)
        val btback: Button = findViewById(R.id.btback)
        val dispData = arrayOf(
            " ","1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "11", "12", "13", "14", "15","16","17","18","19","20",
            "21","22","23","24")
        val list = listOf(
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
            16,17,18,19,20,21,22,23,24)
        var check=false   //不可能配列かどうか(true:可能 false:不可能)
        while(check==false){
            textData = list.shuffled() as ArrayList<Int>
            check = GoalCheck()
        }
        //シャッフルした数字を表示し0を空白にする
        for (i in 0..24) {
            textView[i].text = dispData[textData[i]]
            if(textData[i]==0){
                textView[i].setBackgroundColor(Color.WHITE)
            }
        }
        //シャッフルボタンクリック
        shuffle.setOnClickListener{
            for (i in 0..24) {
                if(textData[i]==0){   //空白を紺に戻す
                    textView[i].setBackgroundResource(R.color.puzzle5)
                    break
                }
            }
            if(flag_clear){
                for (i in 0..24) {
                    textView[i].setClickable(true) //クリック可能にする
                    textView[i].setBackgroundResource(R.color.puzzle5) //背景色を紺にする
                    textmsg1.setVisibility(View.INVISIBLE)   //クリアメッセージ非表示
                }
                flag_clear=false
            }
            check=false
            while(check==false){
                textData = list.shuffled() as ArrayList<Int>
                check = GoalCheck()
            }
            //シャッフルした数字を表示し0を空白にする
            for (i in 0..24) {
                textView[i].text = dispData[textData[i]]
                if(textData[i]==0){
                    textView[i].setBackgroundColor(Color.WHITE)
                }
            }
        }
        //戻るボタンクリック
        btback.setOnClickListener {
            android.os.Process.killProcess(android.os.Process.myPid())
        }
    }
    fun onNumberTap(view: View){
        val text0: TextView = findViewById(R.id.text0)
        val text1: TextView = findViewById(R.id.text1)
        val text2: TextView = findViewById(R.id.text2)
        val text3: TextView = findViewById(R.id.text3)
        val text4: TextView = findViewById(R.id.text4)
        val text5: TextView = findViewById(R.id.text5)
        val text6: TextView = findViewById(R.id.text6)
        val text7: TextView = findViewById(R.id.text7)
        val text8: TextView = findViewById(R.id.text8)
        val text9: TextView = findViewById(R.id.text9)
        val text10: TextView = findViewById(R.id.text10)
        val text11: TextView = findViewById(R.id.text11)
        val text12: TextView = findViewById(R.id.text12)
        val text13: TextView = findViewById(R.id.text13)
        val text14: TextView = findViewById(R.id.text14)
        val text15: TextView = findViewById(R.id.text15)
        val text16: TextView = findViewById(R.id.text16)
        val text17: TextView = findViewById(R.id.text17)
        val text18: TextView = findViewById(R.id.text18)
        val text19: TextView = findViewById(R.id.text19)
        val text20: TextView = findViewById(R.id.text20)
        val text21: TextView = findViewById(R.id.text21)
        val text22: TextView = findViewById(R.id.text22)
        val text23: TextView = findViewById(R.id.text23)
        val text24: TextView = findViewById(R.id.text24)
        val textView = arrayOf(
            text0, text1,text2,text3,text4,text5,text6,text7,
            text8,text9,text10,text11,text12,text13,text14,text15,
            text16,text17,text18,text19,text20,text21,text22,text23,text24)
        val textmsg1: TextView = findViewById(R.id.textmsg1)
        val str = view.tag as String
        val tag = str.toInt()
        val baknumber = textData[tag]

        //スペースクリック
        if(textData[tag] == 0)
            Toast.makeText(this,"移動できません", Toast.LENGTH_SHORT).show()
        //右がスペース
        if(tag%5!=4 && textData[tag+1]==0){
            textView[tag+1].setBackgroundResource(R.color.puzzle5)
            textView[tag+1].text = textData[tag].toString()
            textData[tag+1]=baknumber
            textView[tag].setBackgroundColor(Color.WHITE)
            textData[tag] = 0
        }
        //左がスペース
        else if(tag%5!=0 && textData[tag-1]==0){
            textView[tag-1].setBackgroundResource(R.color.puzzle5)
            textView[tag-1].text = textData[tag].toString()
            textData[tag-1]=baknumber
            textView[tag].setBackgroundColor(Color.WHITE)
            textData[tag] = 0
        }
        //上がスペース
        else if(tag>4 && textData[tag-5]==0){
            textView[tag-5].setBackgroundResource(R.color.puzzle5)
            textView[tag-5].text = textData[tag].toString()
            textData[tag-5]=baknumber
            textView[tag].setBackgroundColor(Color.WHITE)
            textData[tag] = 0
        }
        //下がスペース
        else if(tag<20 && textData[tag+5]==0){
            textView[tag+5].setBackgroundResource(R.color.puzzle5)
            textView[tag+5].text = textData[tag].toString()
            textData[tag+5]=baknumber
            textView[tag].setBackgroundColor(Color.WHITE)
            textData[tag] = 0
        }
        else{
            Toast.makeText(this,"移動できません", Toast.LENGTH_SHORT).show()
        }
        //クリアチェック
        var count=0
        for (i in 0..23) {
            if(textData[i]!=i+1){
                break
            }
            count++
        }
        //ゲームクリア
        if(count == 24){
            flag_clear=true
            for (i in 0..23) {
                textView[i].setClickable(false) //クリアしたら押せなくなる
                textView[i].setBackgroundResource(R.color.puzzle5up) //半透明にする
            }
            textView[24].setBackgroundColor(Color.WHITE)
            textView[24].setClickable(false)
            textmsg1.setVisibility(View.VISIBLE)  //クリアメッセージ表示
            blinkText(textmsg1, 100, 100)
        }
    }
    //不可能配置のチェック
    fun GoalCheck():Boolean{
        var num =IntArray(25)
        var zmove=true
        var nmove=true

        //空白が25の場所に移動するまでの最短距離が偶数か奇数か(1)
        var cnt=0
        for(i in 0..24){
            num[i] = textData[i]
            if(textData[i]==0) {
                num[i]=25
                cnt = i
            }
        }
        val zx=(cnt%5)+1
        val zy=(cnt/5)+1
        if(((5-zx)+(5-zy))%2 == 0) zmove= true
        else zmove= false

        //正しい順に並べるまでの配置変換数が偶数か奇数か(2)
        cnt = 0
        var bak=0
        for(i in 0..24){
            if(num[i]==i+1) continue
            for(j in i..24){
                if(num[j]==i+1) {
                    bak = num[i]
                    num[i] = num[j]
                    num[j]=bak
                    cnt++
                    break
                }
            }
        }
        if(cnt%2==0) nmove=true
        else nmove=false

        //(1)と(2)が同じならtrue 違ったらfalse
        if(zmove == nmove) return true
        else return false
    }
}
//メッセージの点滅
private fun blinkText(txtView: TextView, duration: Long, offset: Long) {
    val anm: Animation = AlphaAnimation(0.0f, 1.0f)
    anm.duration = duration
    anm.startOffset = offset
    anm.repeatMode = Animation.REVERSE
    anm.repeatCount = 3
    txtView.startAnimation(anm)
}

シャッフルボタンをタップされたら可能配列になるまでシャッフルして表示
ゲームクリアしていたら数字の背景色を元に戻してクリアメッセージを非表示にする
終了ボタンをタップされたらゲーム終了

(再生できなくなっていたので2024.1.26に修正しました)
次回効果音をつけて終了です