Projetos Kotlin para iniciantes: ideias praticas

A melhor forma de aprender qualquer linguagem de programacao e construindo coisas reais. Nao adianta ficar so lendo tutoriais e assistindo videos – voce precisa escrever codigo, errar, debugar e resolver problemas. Este guia traz uma lista progressiva de projetos para voce praticar Kotlin desde o basico ate o intermediario.

Por que projetos sao tao importantes?

Projetos pessoais ensinam habilidades que nenhum tutorial consegue cobrir:

  • Como planejar e estruturar codigo do zero
  • Como lidar com problemas inesperados
  • Como pesquisar solucoes quando voce trava
  • Como manter a motivacao ao ver resultados concretos
  • Como construir um portfolio que impressiona recrutadores

Nivel 1: Projetos de console (terminal)

Comece com projetos simples que rodam no terminal. Eles focam nos fundamentos da linguagem sem a complexidade de frameworks.

Projeto 1: Calculadora interativa

fun main() {
    println("=== Calculadora Kotlin ===")
    println("Operacoes: +, -, *, /")

    print("Primeiro numero: ")
    val num1 = readLine()?.toDoubleOrNull() ?: run {
        println("Numero invalido")
        return
    }

    print("Operacao: ")
    val operacao = readLine() ?: return

    print("Segundo numero: ")
    val num2 = readLine()?.toDoubleOrNull() ?: run {
        println("Numero invalido")
        return
    }

    val resultado = when (operacao) {
        "+" -> num1 + num2
        "-" -> num1 - num2
        "*" -> num1 * num2
        "/" -> if (num2 != 0.0) num1 / num2 else {
            println("Erro: divisao por zero")
            return
        }
        else -> {
            println("Operacao invalida")
            return
        }
    }

    println("Resultado: $num1 $operacao $num2 = $resultado")
}

Projeto 2: Jogo de adivinhacao

Crie um jogo onde o programa escolhe um numero aleatorio e o jogador tenta adivinhar, recebendo dicas de “maior” ou “menor”. Conceitos praticados: loops, condicionais, Random.

Projeto 3: Gerenciador de contatos

Um sistema de CRUD simples para gerenciar contatos no terminal. Conceitos praticados: listas mutaveis, data classes, funcoes, entrada do usuario.

data class Contato(val nome: String, val telefone: String, val email: String)

class GerenciadorContatos {
    private val contatos = mutableListOf<Contato>()

    fun adicionar(contato: Contato) {
        contatos.add(contato)
        println("Contato '${contato.nome}' adicionado com sucesso!")
    }

    fun listar() {
        if (contatos.isEmpty()) {
            println("Nenhum contato cadastrado.")
            return
        }
        contatos.forEachIndexed { indice, contato ->
            println("${indice + 1}. ${contato.nome} | ${contato.telefone} | ${contato.email}")
        }
    }

    fun buscar(termo: String): List<Contato> =
        contatos.filter {
            it.nome.contains(termo, ignoreCase = true) ||
            it.email.contains(termo, ignoreCase = true)
        }

    fun remover(indice: Int): Boolean {
        if (indice in contatos.indices) {
            val removido = contatos.removeAt(indice)
            println("Contato '${removido.nome}' removido.")
            return true
        }
        return false
    }

    fun totalContatos(): Int = contatos.size
}

Projeto 4: Conversor de unidades

Converta entre diferentes unidades de medida (temperatura, peso, distancia, moedas). Conceitos praticados: funcoes, when expressions, formatacao de numeros.

Projeto 5: Quiz interativo

Um jogo de perguntas e respostas com pontuacao, categorias e feedback imediato. Conceitos praticados: colecoes, aleatoriedade, controle de fluxo.

Nivel 2: Projetos com persistencia de dados

Apos dominar o basico, evolua para projetos que salvam e carregam dados.

Projeto 6: Diario pessoal com arquivos

Um diario que salva entradas em arquivos de texto, permitindo consultar entradas por data.

import java.io.File
import java.time.LocalDate
import java.time.format.DateTimeFormatter

class DiarioPessoal(private val diretorio: String) {

    init {
        File(diretorio).mkdirs()
    }

    fun novaEntrada(texto: String) {
        val hoje = LocalDate.now()
        val arquivo = File("$diretorio/${hoje}.txt")

        arquivo.appendText("--- ${hoje.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))} ---\n")
        arquivo.appendText("$texto\n\n")

        println("Entrada salva com sucesso!")
    }

    fun lerEntrada(data: LocalDate): String? {
        val arquivo = File("$diretorio/${data}.txt")
        return if (arquivo.exists()) arquivo.readText() else null
    }

    fun listarDatas(): List<String> =
        File(diretorio).listFiles()
            ?.filter { it.extension == "txt" }
            ?.map { it.nameWithoutExtension }
            ?.sorted()
            ?: emptyList()
}

Projeto 7: Sistema de notas escolares

Cadastre alunos, disciplinas e notas. Calcule medias, identifique aprovados e reprovados, gere relatorios. Conceitos praticados: mapas, agrupamento, calculos com colecoes.

Projeto 8: Rastreador de habitos

Registre habitos diarios e visualize estatisticas no terminal (dias seguidos, porcentagem de conclusao, graficos simples com caracteres ASCII).

Nivel 3: Projetos com APIs e rede

Projeto 9: Consulta de CEP

Use a API dos Correios (ViaCEP) para buscar enderecos a partir de um CEP. Conceitos praticados: HTTP clients, JSON parsing, coroutines.

import kotlinx.coroutines.runBlocking
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable

@Serializable
data class Endereco(
    val cep: String,
    val logradouro: String,
    val bairro: String,
    val localidade: String,
    val uf: String
)

suspend fun buscarCEP(cep: String): Endereco? {
    val client = HttpClient {
        install(ContentNegotiation) { json() }
    }

    return try {
        client.get("https://viacep.com.br/ws/$cep/json/").body<Endereco>()
    } catch (e: Exception) {
        println("Erro ao buscar CEP: ${e.message}")
        null
    } finally {
        client.close()
    }
}

fun main() = runBlocking {
    print("Digite o CEP: ")
    val cep = readLine()?.replace("-", "") ?: return@runBlocking

    val endereco = buscarCEP(cep)
    if (endereco != null) {
        println("Logradouro: ${endereco.logradouro}")
        println("Bairro: ${endereco.bairro}")
        println("Cidade: ${endereco.localidade} - ${endereco.uf}")
    } else {
        println("CEP nao encontrado.")
    }
}

Projeto 10: Bot do clima

Consulte APIs de previsao do tempo e exiba informacoes formatadas no terminal.

Nivel 4: Projetos Android com Jetpack Compose

Projeto 11: App de lista de compras

Um aplicativo Android simples onde voce adiciona, marca como comprado e remove itens. Conceitos praticados: Composables, state management, listas.

Projeto 12: Cronometro e timer

App com funcionalidade de cronometro e timer com alarme. Conceitos praticados: LaunchedEffect, coroutines no Compose, notificacoes.

Projeto 13: App de anotacoes

Um app de notas com persistencia local usando Room. Conceitos praticados: Room Database, ViewModel, navegacao entre telas.

Nivel 5: Projetos backend

Projeto 14: API de encurtador de URL

Crie uma API que recebe URLs longas e retorna versoes encurtadas. Conceitos praticados: Ktor/Spring Boot, banco de dados, APIs REST.

Projeto 15: Sistema de votacao

Uma API para criar enquetes e registrar votos, com resultados em tempo real. Conceitos praticados: WebSockets, concorrencia, validacao de dados.

Dicas para maximizar o aprendizado com projetos

  1. Comece pequeno e evolua: nao tente criar algo complexo de cara. Comece com o minimo viavel e va adicionando funcionalidades.

  2. Use Git desde o primeiro projeto: aprenda a versionar seu codigo. Isso tambem constroi seu portfolio no GitHub.

  3. Escreva testes: mesmo para projetos simples, tente escrever pelo menos alguns testes. Isso desenvolve uma habilidade essencial.

  4. Refatore sem medo: depois que o projeto funciona, volte e melhore o codigo. Compare a versao inicial com a refatorada.

  5. Documente suas decisoes: escreva comentarios explicando por que voce fez determinadas escolhas. Isso ajuda na revisao futura.

Pros e contras de diferentes tipos de projetos

Projetos de terminal:

  • Pro: foco nos fundamentos sem distracao de UI
  • Pro: rapidos para implementar
  • Contra: menos motivadores visualmente

Projetos Android:

  • Pro: resultado visual imediato e motivador
  • Pro: habilidade diretamente aplicavel no mercado
  • Contra: curva de aprendizado maior (precisa aprender Compose)

Projetos backend:

  • Pro: habilidade muito valorizada no mercado
  • Pro: fundamentos transferiveis para qualquer tecnologia
  • Contra: resultado menos visivel para mostrar a outros

Perguntas relacionadas