Écrire une aventure comique en Kotlin

Bonjour à tous! Aujourd'hui, vous trouverez un article simple qui vous expliquera comment écrire un jeu de quiz mobile simple en Kotlin. Ici, je vais montrer clairement à quoi ressemble Kotlin pour le développement mobile et proposer mes idées sur la façon de structurer un tel projet. Eh bien, je ne vais pas vous tourmenter avec la graphomanie, allez-y ! 





Vous verrez maintenant le squelette d'une idée qui a brûlé vivement, mais qui s'est rapidement consumée. Mon ami designer et moi avons eu l'idée de créer un jeu mobile simple au format texte. Le genre était prévu pour être l'aventure, et le texte méchant devait être alimenté par des images uniques dans un certain style. Malheureusement, les choses n'ont pas dépassé le squelette de l'application, j'ai donc décidé de la rendre publique. Soudain, quelqu'un trouvera de nouvelles pensées. Je ferai une réserve tout de suite sur le fait que le projet peut difficilement être qualifié de décision sérieuse, et pour des applications vraiment volumineuses, il pourrait être intéressant d'envisager des abstractions plus complexes. L'application doit être perçue comme une sorte de MVP.





Structure des dossiers

Tout d'abord, parlons de la structure des dossiers. Il est peu probable qu'il y ait quelque chose d'innovant ici, mais je considère que la structure des dossiers dans un projet est l'une des choses les plus importantes et les plus intéressantes de la programmation. 





Structure des dossiers dans l'application

2 Activity, .





StartActivity , - (, “” ..).





MainActivity, - GameActivity, , .





Entity . json , , Entity.





dao ( data access object) , . , Runtime, , .





core , . , .





UI , , - . , presenter- activity.





MVP json-, . :





{
 "id": 2,
 "type": "Q",
 "question": "       .   !",
 "answers": [
   {
     "next_question_id":  5,
     "answer": "  "
   },
   {
     "next_question_id":  3,
     "answer": ",    "
   }
 ]
}

      
      



, : 





  • Id - . . ,





  • type - . Q ,   "question" . F (Fail) S (Success). , ,





  • question - ,





  • answers - . 0 4 . , F S. , , ,





JSON assests. , . , , JSON , sqllite. , .





, , , . , . .





, runtime. Store.





public interface Store {
    fun getAllQuestions(): List<Question>

    fun getQuestionById(id: Int): Question

    fun init(context: Context): Store
}
      
      



, . , - . MVP JSON-, , . , , , , sqllite . , - .





class StoreFactory {
    companion object {
        fun getStore(ctx: Context): Store {
            return LocalStore().init(ctx)
        }
    }
}
      
      



. , . , , ANR. IO - . production , RX. , .





:





class Game {
    private lateinit var store: Store
    private lateinit var question: Question

    fun init(context: Context) {
        this.store = StoreFactory.getStore(context)

        question = store.getQuestionById(1)
    }

    fun isGameEnd(): Boolean {
        return isSuccess() || isFail()
    }

    fun isSuccess(): Boolean {
        return question.isSuccess()
    }

    fun isFail(): Boolean {
        return question.isFail()
    }

    fun chooseAnswer(numberOfAnswer: Int) {
        val answer: Answer = question.getAnswers()[numberOfAnswer - 1]
        question = store.getQuestionById(answer.getNextQuestionId())
    }

    fun getQuestion(): Question {
        return question
    }
}
      
      



2 : Store, , , . , ( type F S). , .





. , , . .





(Question.kt). :





fun getAnswers(): List<Answer> {
        val list: MutableList<Answer> = ArrayList(this.answers)
        val shouldAdd: Int = 4 - list.size

        for (i in 1..shouldAdd) {
            list.add(Answer("", -1))
        }

        return list
    }
      
      



List 4 , , 2. id. , . , .





, 4 , . , presenter:





private fun updateView() {
        if (game.isGameEnd()) {
            showEndGame()
            return
        }

        activity.setQuestion(game.getQuestion().getText())

        val answers: List<Answer> = game.getQuestion().getAnswers()
        answers.forEachIndexed {idx, answer -> activity.setAnswer(idx + 1, answer.getText())}
    }

    fun chooseAnswer(number: Int) {
        game.chooseAnswer(number)
        updateView()
    }
      
      



, StartActivity, ( ) Intent:





private fun showEndGame() {
        val intent = Intent(activity, StartActivity::class.java).apply {
            putExtra(StartActivity.RESULT_MESSAGE, game.getQuestion().getText())
        }
        activity.startActivity(intent)
    }
      
      



, production-ready. , . MVP, , . , :





  • . ,





  • UI- , .  





  • ,





  • json - , loader





  • json sqllite





, .








All Articles