I've created simple game on android. Now I want to add difficulty levels and I'm wondering what approach to take. I mean, I need to change only one object (CountDownTimer) inside class to change that difficulty, and first I thought that I will make just 3 classes for every level, but my intuition tells me that will be big overkill. Do a class and inherit from it? Or maybe create in some way an object with a parameter? Can you suggest something?
package com.whayway.beerrandom
import android.os.Bundle
import android.os.CountDownTimer
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.navigation.findNavController
import com.whayway.beerrandom.databinding.FragmentGameBinding
import kotlinx.android.synthetic.main.fragment_game.*
import java.util.*
const val KEY_SCORE = "score_key"
class GameFragment : Fragment() {
var handler: Handler = Handler()
var score: Int = 0
var runnable: Runnable = Runnable { }
var imageArray = ArrayList<ImageView>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = DataBindingUtil.inflate<FragmentGameBinding>(
inflater, R.layout.fragment_game, container, false
)
score = 0
if(savedInstanceState != null){
score = savedInstanceState.getInt(KEY_SCORE, 0)
}
hideImages()
object : CountDownTimer(15000, 1000) {
override fun onTick(p0: Long) {
btn_ok.visibility = View.INVISIBLE
timeText.text = "Time: " + (p0 / 1000)
}
override fun onFinish() {
timeText.text = "Time out"
handler.removeCallbacks(runnable)
for (image in imageArray) {
image.visibility = View.INVISIBLE
btn_ok.visibility = View.VISIBLE
}
}
}.start()
score = 0
setHasOptionsMenu(true)
/* val args = .fromBundle(arguments!!)
Toast.makeText(context, "NumCorrect: ${args.numCorrect}, NumQuestions: ${args.numQuestions}", Toast.LENGTH_LONG).show()*/
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
imageArray = arrayListOf(
imageView8,
imageView7,
imageView6,
imageView5,
imageView4,
imageView3,
imageViewPawel,
imageView111
)
scoreText.setOnClickListener {}
imageView8.setOnClickListener { increaseScore() }
imageView7.setOnClickListener { increaseScore() }
imageView8.setOnClickListener{increaseScore() }
imageView6.setOnClickListener { increaseScore() }
imageView5.setOnClickListener { increaseScore() }
imageView4.setOnClickListener { increaseScore()
setImage() }
imageView3.setOnClickListener { decreaseScore()
setImage() }
imageViewPawel.setOnClickListener { increaseScorePawel()
setImage()}
imageView111.setOnClickListener { increaseScore()
setImage()}
btn_ok.setOnClickListener { view: View ->
view.findNavController().navigate(
GameFragmentDirections
.actionGameFragmentToResultFragment(score)
)
}
super.onViewCreated(view, savedInstanceState)
}
private fun setImage(){
var drawableArray = ArrayList<Int>()
drawableArray = arrayListOf(
R.drawable.pawel,
R.drawable.leszek,
R.drawable.lech_free)
val random = Random()
val index = random.nextInt(3 - 1)
val index2 = random.nextInt(8 - 1)
imageArray[index2].setImageResource(drawableArray[index])
}
private fun hideImages() {
runnable = Runnable {
for (image in imageArray) {
image.visibility = View.INVISIBLE
}
val random = Random()
val index = random.nextInt(8 - 1)
imageArray[index].visibility = View.VISIBLE
handler.postDelayed(runnable, 500)
}
handler.post(runnable)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(KEY_SCORE, score)
}
private fun increaseScore() {
score++
scoreText.text = "Score:" + score
}
private fun increaseScorePawel() {
score += 5
scoreText.text = "Score:" + score
}
private fun decreaseScore() {
score -= 10
scoreText.text = "Score:" + score
}
}