🔴 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:
- Clique com o botão direito na pasta
resdo seu projeto no Android Studio. - Vá em New > Android Resource Directory.
- Em Resource type, escolha raw e clique em OK.
- Copie os arquivos
.wavbaixados para dentro desta nova pastares/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)