- Título do projeto: Tamaccino
- Tema: Jogo de simulação / Tamagotchi
- Integrantes da equipe: Maria Mariana de Melo Cavalcante, Maria Rita de Figueiredo Feitosa e Sérgio Gabriel Rodrigues Freitas
- Disciplina: Programação Orientada a Objetos
- Professor: Gabriel da Silva Belarmino
- Introdução
- Modelagem
- Ferramentas utilizadas
- Estrutura dos pacotes
- Como rodar o projeto
- Resultados e considerações
O projeto é um jogo estilo Tamagotchi, no qual o jogador cria e cuida de um bichinho virtual que passa por diferentes fases de vida. A experiência é dividida em três momentos:
- Fase Ovo: o bichinho ainda não nasceu; o jogador precisa brincar com o ovo para acelerar a eclosão.
- Fase Filhote: o bicho nasce e começa a ter necessidades reais (fome, felicidade e saúde) que precisam ser gerenciadas pelo jogador ao longo do tempo.
- Fase Adulto: o bichinho evolui com comportamentos ligeiramente diferentes, envelhecendo até o fim de sua vida.
O jogo conta com uma interface gráfica feita em Java Swing, sistema de save/load por serialização de objetos, tela de configurações com opções de tamanho de janela e velocidade do timer, loja de itens com sistema de moedas, minigames para ganhar moedas, além de personalização do ovo com diferentes sprites coloridos.
classDiagram
direction TB
class Tama {
<<abstract>>
#String nome
-int fome, felicidade, idade
-int cansaco, saudeNivel
-boolean saude, sono, vivo
-double peso
-LocalDate dataCriacao
-CorOvo corOvo
-int skinFilhoteSelecionada, skinAdultoSelecionada
-int moedas, itensRemedio, itensBrinquedo
-int itensDoce, itensSaudavel
-int totalRefeicoes, totalBrincadeiras
-ArrayList~String~ coco
+get/setNome(String) void
+get/setFome(int) void
+get/setFelicidade(int) void
+get/setIdade(int) void
+get/setSaudeNivel(int) void
+get/setMoedas(int) void
+get/setCansaco(int) void
+get/setCorOvo(CorOvo) void
+get/setSkinFilhote(int) void
+get/setSkinAdulto(int) void
+alimentar(TipoComida, boolean) void
+brincar() void
+limparCoco() void
+aplicarRemedio() void
+morte() void
+adicionarItem(ItemLoja, int) void
+consumirItem(ItemLoja) boolean
+addMoedas(int) void
+gastarMoedas(int) boolean
+envelhecer()* void
+evoluir()* Tama
}
class Ovo {
+Ovo(String nomeDigitado)
+envelhecer() void
+evoluir() Tama
}
class Filhote {
+Filhote(String nome, int idade)
+envelhecer() void
+evoluir() Tama
}
class Adulto {
+Adulto(String nome, int idade, int fome, int felicidade, double peso, int saudeNivel)
+envelhecer() void
+evoluir() Tama
}
class TipoComida {
+comidaSaudavel(double peso) double
+comidaDoce(double peso) double
}
class ItemLoja {
<<enumeration>>
REMEDIO
BRINQUEDO
COMIDA_DOCE
COMIDA_SAUDAVEL
-String nome
-int preco
+getNome() String
+getPreco() int
}
class CorOvo {
<<enumeration>>
ROXO
ROSA
AZUL
AMARELO
SEM_FUNDO
}
class TamaMortoException {
+TamaMortoException(String mensagem)
}
class EntradaESaida {
+salvar(Tama)$ void
+carregar()$ Tama
+salvarAparenciaOvo(String)$ void
+carregarAparenciaOvo()$ String
}
class Configuracoes {
-TamanhoTela tamanhoTela$
-Dificuldade dificuldade$
-boolean somAtivo$
-boolean musicaAtiva$
+carregar()$ void
+salvar()$ void
+get/setTamanhoTela(TamanhoTela)$ void
+get/setDificuldade(Dificuldade)$ void
+is/setSomAtivo(boolean)$ void
+is/setMusicaAtiva(boolean)$ void
}
class TamanhoTela {
<<enumeration>>
PADRAO
GRANDE
+toDimension() Dimension
+fromValue(String)$ TamanhoTela
}
class Dificuldade {
<<enumeration>>
FACIL
NORMAL
DIFICIL
+getIntervaloMs() int
+fromValue(String)$ Dificuldade
}
class Tamaccino {
+main(String[])$ void
}
class MinigameHubDialog {
-SelecaoMinigame selecao
-SelecaoMinigame destaque
+MinigameHubDialog(JFrame parent)
+MinigameHubDialog(JFrame parent, SelecaoMinigame destaque)
+getSelecao() SelecaoMinigame
}
class SelecaoMinigame {
<<enumeration>>
MEMORIA
REFLEXO
PEDRA_PAPEL_TESOURA
NENHUM
}
class ReflexGameDialog {
-int rodadaAtual
-int acertos, moedasGanhas
+getMoedasGanhas() int
}
class MemoryGameDialog {
-List~Integer~ sequencia
-int rodadaAtual, moedasGanhas
+getMoedasGanhas() int
}
class PedraPapelTesouraDialog {
-int vitoriasJogador, vitoriasCpu
-int moedasGanhas
+getMoedasGanhas() int
}
class GameOver {
+GameOver()
}
Tama <|-- Ovo
Tama <|-- Filhote
Tama <|-- Adulto
TamaMortoException --|> Exception
Tama --> CorOvo : usa
Tama ..> TipoComida : usa
Tama ..> ItemLoja : usa
Tama ..> TamaMortoException : lança
Configuracoes --> TamanhoTela : contém
Configuracoes --> Dificuldade : contém
EntradaESaida ..> Tama : serializa
MinigameHubDialog --> SelecaoMinigame : contém
MinigameHubDialog ..> ReflexGameDialog : abre
MinigameHubDialog ..> MemoryGameDialog : abre
MinigameHubDialog ..> PedraPapelTesouraDialog : abre
Como o bichinho passa por diferentes estágios de vida com comportamentos distintos, foi criada uma classe-mãe abstrata Tama e três classes-filhas que representam cada fase: Ovo, Filhote e Adulto. Esse design permite o uso de herança e polimorfismo, com dois métodos abstratos, evoluir() e envelhecer(), que são implementados de forma diferente em cada fase.
Tama concentra todos os atributos comuns (nome, fome, felicidade, peso, saúde, moedas, itens, etc.) e os métodos concretos compartilhados, como alimentar(), brincar() e fazerCoco(). Cada subclasse sobrescreve apenas o que muda de comportamento em sua fase de vida.
Para o tratamento de situações especiais, foi criada a exceção personalizada:
TamaMortoException
A interface gráfica é gerenciada por três janelas principais:
MenuPrincipal → JanelaPrincipal → (TelaConfiguracoes como overlay)
O ciclo de vida do bicho é controlado por um Timer interno na JanelaPrincipal, que a cada intervalo de tempo incrementa a idade, verifica evoluções e atualiza o estado de fome e felicidade. O estado é persistido automaticamente via serialização Java na pasta saves/.
O jogo também conta com uma loja de itens onde o jogador pode gastar moedas para comprar remédios, brinquedos e comidas, e com três minigames acessíveis pelo MinigameHubDialog: Memória, Reflexo e Pedra-Papel-Tesoura, cada um com sistema de recompensa em moedas.
- Aseprite
- Figma
- Java 21 (ou superior)
- Java Swing (interface gráfica)
- IntelliJ IDEA / VSCode (IDEs)
- Serialização Java nativa (save/load)
- Java Properties (configurações e metadados)
📂 br.com.tamagotchi
├── 📂 model
│ ├── Tama.java ← classe abstrata base
│ ├── TipoComida.java
│ └── ItemLoja.java ← enum de itens da loja
├── 📂 fases
│ ├── Ovo.java
│ ├── Filhote.java
│ └── Adulto.java
├── 📂 exceptions
│ └── TamaMortoException.java
├── 📂 gui
│ ├── 📂 utils
│ │ └── Tamaccino.java ← ponto de entrada (main)
│ └── 📂 screen
│ ├── MenuPrincipal.java
│ ├── JanelaPrincipal.java
│ ├── PainelTama.java
│ ├── TelaConfiguracoes.java
│ ├── GameOver.java
│ ├── MinigameHubDialog.java
│ ├── ReflexGameDialog.java
│ ├── MemoryGameDialog.java
│ └── PedraPapelTesouraDialog.java
├── 📂 io
│ └── EntradaESaida.java
└── 📂 util
└── Configuracoes.java
Para isso, é necessário ter instalado:
- Java 21 (ou superior)
- Uma IDE como IntelliJ IDEA ou VSCode com extensão Java
git clone https://github.com/seu-usuario/seu-repositorio.gitAbra a pasta do projeto na sua IDE preferida.
Certifique-se de que a pasta resources/sprites/ovo/ existe na raiz do projeto e contém os arquivos de sprite .png. Sem eles, o jogo usa um fallback visual desenhado com formas geométricas.
Execute o arquivo principal:
src/main/java/br/com/tamagotchi/gui/utils/Tamaccino.java
Ou via linha de comando, dentro da pasta do projeto compilado:
java -cp out br.com.tamagotchi.gui.utils.TamaccinoNa tela inicial, clique em Novo Jogo, escolha um nome e o estilo do ovo. O jogo cria automaticamente a pasta saves/ para armazenar seu progresso.
| Tecla | Ação |
|---|---|
F11 |
Alterna tela cheia |
ESC |
Sai da tela cheia |
Ao final foi possível alcançar o objetivo inicial com um jogo funcional de ponta a ponta, cobrindo criação, evolução e morte do bichinho virtual. O projeto trouxe aprendizado direto sobre os conceitos de orientação a objetos, especialmente herança, polimorfismo e encapsulamento, aplicados em um contexto real e visual.
Trabalhar com Java Swing para construir a interface gráfica foi um dos maiores desafios do projeto, já que exigiu entender o sistema de layout, pintura customizada com Graphics2D e o ciclo de eventos da EDT. A implementação do sistema de save e load por serialização também foi um ponto de aprendizado importante, tornando o estado do jogo persistente entre sessões.
No geral, foi gratificante ver o bichinho tomando vida, nascendo do ovo, crescendo, sentindo fome e reagindo às ações do jogador, exatamente como planejado desde a modelagem inicial.