Projeto da disciplina SCC0240 - Bases de Dados
Estrutura do Projeto • Instalação • Uso • Pontos importantes • Processador • Vídeo • Contribuição • Licença • Agradecimentos
Este projeto tem como objetivo implementar o jogo "St. Charles Racing", utilizando o Assembly do processador desenvolvido pelo professor Simões, no contexto da disciplina de Prática em Organização de Computadores. Além de codificar o jogo, foi projetada e implementada uma nova funcionalidade para o processador, ampliando suas capacidades e explorando os desafios do desenvolvimento em baixo nível. Este trabalho visa demonstrar a integração entre a criação de software para sistemas embarcados e a extensão de funcionalidades de hardware, proporcionando uma experiência prática em organização de computadores e programação em Assembly.
Abaixo está a estrutura do projeto com uma breve explicação do conteúdo de cada pasta:
-
imgs/
Contém as imagens utilizadas no README para ilustrar e documentar o projeto. -
assets/
Armazena os arquivos.asm
referentes ao personagem principal e aos inimigos do projeto. -
src/
Contém o arquivo.asm
principal do projeto, onde está o código-fonte central. -
tools/
Guarda as ferramentas necessárias para o desenvolvimento e teste do projeto, incluindo o montador, o simulador e o charmap.
Para obter o projeto em sua máquina, execute:
git clone https://github.com/MatheusPaivaa/StCharles_Racing.git
cd StCharles_Racing
Abaixo estão os comandos disponíveis para compilar, executar e gerenciar o projeto:
-
Compilar o projeto
Gera o arquivo.mif
compilado.make
-
Executar o simulador
Roda o programa no simulador.make run
-
Compilar e executar em modo de desenvolvimento
Compila o código e executa o simulador.make dev
-
Empacotar o projeto
Cria um arquivo.zip
com todos os arquivos do projeto.make zip
-
Limpar os arquivos gerados
Remove a pastabin/
e o arquivo.zip
.make clean
Certifique-se de ter o Make, montador e simulador configurados corretamente no ambiente. Para mais detalhes, consulte o repositório Processador-ICMC.
-
dif:
var #1
Armazena a dificuldade do jogo, podendo ser ajustada para 1 (fácil), 2 (médio) ou 3 (difícil). -
posCarro:
var #1
Contém a posição atual do personagem principal. -
posAntCarro:
var #1
Contém a posição anterior do personagem principal. -
Inimigos
Cada inimigo possui variáveis individuais para sua posição e velocidade:- posInimigoX: Contém a posição atual do inimigo X (onde X = 1, 2, 3, 4).
- posAntInimigoX: Contém a posição anterior do inimigo X.
- velInimigoX: Contém a velocidade do inimigo X.
-
score:
var #1
Armazena a pontuação atual do jogador.
- Tela Principal (
main
)
A função principal do jogo realiza as seguintes ações:- Exibe a tela inicial com as opções:
- 1: Iniciar o jogo
- 2: Configurar a dificuldade
- 3: Sair
- Aguarda a entrada do usuário e direciona para a função correspondente.
- Exibe a tela inicial com as opções:
-
startGame
Inicia o jogo:- Apaga a tela principal e imprime o mapa principal.
- Inicializa os inimigos e o personagem principal.
- Define os contadores de pontuação e velocidade.
- Entra no loop principal de controle do jogo:
- Move o personagem (com base na entrada do teclado).
- Move os inimigos verticalmente.
- Ajusta a pontuação e a dificuldade com o tempo.
- Detecta colisões.
-
inicializaInimigos
Configura a posição inicial e a velocidade dos 4 inimigos. -
ajustarVelocidades
Ajusta a velocidade dos inimigos de acordo com a dificuldade escolhida pelo jogador. -
MoveCarro
Controla o movimento do personagem principal.MoveCarro_RecalculaPos
: Recalcula a posição do personagem com base na entrada de teclado ('a' para esquerda, 'd' para direita).- Apaga a posição anterior e redesenha o personagem.
-
MoveInimigoX
Controla o movimento vertical de cada inimigo:- Move o inimigo para baixo.
- Quando o limite da tela é atingido, reposiciona o inimigo no topo.
-
DetectaColisao
Detecta colisões entre o personagem principal e os inimigos:- Utiliza vetores de sobreposição para verificar posições.
-
rotinaDerrota
Aciona a tela de derrota quando ocorre uma colisão:- Exibe a pontuação final.
- Permite reiniciar o jogo ou retornar ao menu principal.
-
config
Tela de configuração onde o jogador pode ajustar a dificuldade:- 1: Fácil
- 2: Médio
- 3: Difícil
- 4: Voltar ao menu principal.
-
ApagaTela
Apaga a tela atual. -
prinTela
Imprime a tela com base em um mapa armazenado na memória. -
PrintPontos
ePontua
Atualizam e imprimem a pontuação do jogador. -
Delay
Adiciona um atraso para suavizar os movimentos no jogo.
- O jogador inicia o jogo na tela principal e escolhe uma das opções.
- Ao iniciar o jogo:
- O personagem pode se mover horizontalmente usando 'a' e 'd'.
- Os inimigos descem verticalmente.
- A velocidade aumenta conforme a dificuldade e o tempo.
- O sistema detecta colisões entre o personagem e os inimigos.
- Caso ocorra uma colisão, o jogo exibe a tela de derrota com a pontuação final.
- O jogador pode reiniciar ou sair do jogo.
Nesta seção, destacamos algumas informações essenciais sobre o desenvolvimento do projeto e as ferramentas utilizadas.
Para facilitar a criação dos cenários utilizados no jogo, foi utilizado o repositório Create-Screens-in-Assembly-with-Python, que permite gerar telas em Assembly por meio de scripts em Python.
Essa ferramenta foi fundamental para agilizar o processo de construção e organização das telas, garantindo uma implementação eficiente e visualmente estruturada no código-fonte.
Todas as informações relacionadas ao processador utilizado no projeto, bem como seu montador e simulador, podem ser encontradas no repositório:
Processador-ICMC.
Este repositório fornece:
- Detalhes sobre o funcionamento do processador.
- Documentação completa do montador e do simulador.
- Exemplos e instruções de uso para implementar e testar códigos Assembly.
Esses recursos foram essenciais para o desenvolvimento do jogo, fornecendo tanto ferramentas práticas para criação dos cenários quanto uma base sólida para a execução e teste do projeto.
Este processador foi desenvolvido com base nas aulas do Professor Simões e implementado utilizando o software Quartus. Para executar o processador corretamente, siga os seguintes passos:
- Escreva o programa normalmente utilizando o editor de texto, salvando-o no formato
.ASM
. - Utilize a tecla
F7
para montar o arquivo binário (.MIF
) e simular seu funcionamento antes de compilá-lo no Quartus. - Renomeie o arquivo gerado (
nome.MIF
) paraCPURAM.MIF
. - Copie o arquivo
CPURAM.MIF
para a pasta do projeto no Quartus. - Compile o projeto dentro do Quartus.
- Programe a placa e reinicialize-a para garantir o correto funcionamento.
- Altere a entrada do monitor para VGA para visualizar a execução corretamente.
Abaixo, algumas imagens do processador em execução. Todos os arquivos necessários estão disponíveis na pasta processador
deste repositório.
Obs: Ao passar o jogo do Simulador para a FPGA tivemos que diminuir o delay entre os movimentos (do nosso personagem, inimigos e score), isso pode mudar de jogo para jogo. No nosso caso, diminuimos para um delay de 40 e um decrementador de 10.
Link: Vídeo
Contribuições são bem-vindas! Por favor, faça um fork do repositório e envie um pull request com suas alterações.
Este projeto está licenciado sob a Licença MIT. Veja o arquivo LICENSE para mais detalhes.
Gostaríamos de agradecer a Eduardo Valle Simões, o Poderoso, pela sua orientação e apoio ao longo deste projeto.
- Matheus Paiva Angarola - 12560982 (Github)