🔴 P03: Genius Game (Simon Says)

Este é o seu projeto de Transição. Você continuará usando o desenho em XML, mas escreverá toda a lógica em Kotlin. É aqui que você sentirá o poder da linguagem moderna!


🎯 Objetivo do Projeto

Criar o clássico jogo de memória das cores. O app pisca uma sequência de botões coloridos e o jogador deve repetir a sequência exata para ganhar pontos.


📦 Download de Assets (Sons Originais)

Para tornar a experiência real, use os áudios originais do console Simon:

📂 Como usar os áudios:

  1. Clique com o botão direito na pasta res do seu projeto no Android Studio.
  2. Vá em New > Android Resource Directory.
  3. Em Resource type, escolha raw e clique em OK.
  4. Copie os arquivos .wav baixados para dentro desta nova pasta res/raw.

⚙️ Lógica em Kotlin (Moderno)

1. Tocando Sons

Em Kotlin, tocar um som é muito simples usando a classe MediaPlayer:

private fun tocarSom(indice: Int) {
    val somResId = when (indice) {
        0 -> R.raw.green
        1 -> R.raw.red
        2 -> R.raw.yellow
        3 -> R.raw.blue
        else -> 0
    }
    
    // Cria, toca e libera a memória ao terminar
    MediaPlayer.create(this, somResId).apply {
        setOnCompletionListener { release() }
        start()
    }
}

2. Animações com Coroutines

Em vez de usar “Handlers” complexos, usamos o Delay do Kotlin:

// Dentro de um lifecycleScope.launch
botao.alpha = 0.3f
delay(400) // Aguarda 400 milissegundos
botao.alpha = 1.0f

🎨 Design Gamer Pro (XML Shapes)

Para chegar no visual original sem usar imagens pesadas, utilizamos Gradients e Corner Radii assimétricos:

  • Radial Gradient: Cria o efeito de brilho e profundidade (3D).
  • Corners: Cada botão tem um raio maior no canto externo (150dp) e menor no interno (10dp) para formar o “setor” circular.

✅ Gabarito Comentado (Lógica Principal)

class MainActivity : AppCompatActivity() {
 
    private val sequenciaComputador = mutableListOf<Int>()
    private var passoJogador = 0
 
    private fun iniciarNovaRodada() {
        passoJogador = 0
        // Sorteia nova cor e adiciona à lista
        sequenciaComputador.add((0..3).random())
        
        // Dispara a sequência visual e sonora
        lifecycleScope.launch {
            tocarSequencia()
        }
    }
 
    private fun verificarJogada(corClicada: Int) {
        if (corClicada == sequenciaComputador[passoJogador]) {
            passoJogador++
            if (passoJogador == sequenciaComputador.size) {
                // Ganhou o nível!
                iniciarNovaRodada()
            }
        } else {
            // Game Over!
            Toast.makeText(this, "ERROU!", Toast.LENGTH_SHORT).show()
        }
    }
}

??? Requisitos de Configuração

Suporte ao ViewBinding

Certifique-se de que o ViewBinding está ativado no seu build.gradle (Module: app):

android {
    buildFeatures {
        viewBinding true
    }
}

📐 Organização de Pastas

Mantenha seu projeto limpo: br.com.curso.genius.ui (Atividades) br.com.curso.genius.logic (Opcional: Classes de jogo)