Você está na página 1de 6

INF01202 - ALGORITMOS E PROGRAMAÇÃO

Profs. Claudio Jung e Gabriel Ammes - Turmas C/D


Trabalho Prático Final - Semestre 2023/2
FlappyINF

1. MOTIVAÇÃO E OBJETIVOS

No decorrer da disciplina de Algoritmos e Programação são apresentados


diversos conceitos e técnicas de programação, visando ensinar aos alunos as
principais ferramentas lógicas e práticas para construção de algoritmos e
solução de problemas diversos. Como passo fundamental, este trabalho vem
consolidar o
aproveitamento
dos alunos
frente ao que foi
exposto nas
aulas teóricas e
práticas, na
forma de um
jogo que deverá
ser
implementado na linguagem de programação C.
O objetivo é implementar uma versão simplificada do jogo conhecido
como Flappy Bird, chamada FlappyINF, utilizando a biblioteca gráfica
Raylib. Em FlappyINF, o objetivo é o jogador chegar o mais longe possível sem
encostar nos obstáculos e, dessa forma, juntar a maior quantidade de pontos
possíveis. Um exemplo do cenário do jogo pode ser visto na Figura 1 abaixo
usando a Raylib. Além disso, pode-se entender melhor o jogo através de um
gameplay (este gameplay é do jogo original, não do FlappyINF!).
Figura 1: Exemplo de tela do FlappyINF em Raylib. Os "sprites"
(representação visual dos elementos) são livres para você escolher ou você
pode usar os mesmos deste exemplo, disponíveis no moodle.

2. VISÃO GERAL DO JOGO

● O Jogador (pássaro) possui as seguintes informações:


○ Nome
○ Localização (coordenadas x e y)
○ Pontuação
○ Velocidade vertical (medida em pixels por frame)
○ Aceleração vertical para baixo (medida em pixels por frame ^2 )
○ Altura e largura em pixels

● Os obstáculos possuem as seguintes informações


○ Localização (coordenadas x e y)
■ O obstáculo possui duas partes, a parte de cima e a parte
de baixo, cada uma tem coordenadas(x,y) distintas. É
recomendado tratar cada uma separadamente.
○ Altura e Largura
○ Velocidade horizontal (medida em pixels por frame)

● O espaço do jogo possui as seguintes informações:


○ Pontuação
○ Cenário: Deve ter dimensão 1200 pixels de largura por 800 pixels
de altura na janela Raylib

3. REQUISITOS MÍNIMOS (OBRIGATÓRIOS) PARA O PROGRAMA

Os seguintes itens devem estar obrigatoriamente implementados:

● O jogo começa com a apresentação do menu como mostrado na Fig. 2

● As opções do Menu são:


1. Jogar: Inicia um novo jogo com pontuações zeradas
2. Dificuldade: Escolhe dentre as dificuldades disponíveis
3. Ranking: Apresenta o ranking dos 5 jogadores com maiores
pontuações (ver abaixo explicação do arquivo ranking.txt)
4. Sair: Encerra o jogo

Figura 2: Sugestão de tela inicial do jogo em Raylib.

Movimentação do personagem:

● O jogador é controlado pela tecla de espaço, que faz o flappy bird


ganhar impulso e altitude. Matematicamente, a velocidade vertical é
aumentada neste momento.

Dinâmica do jogo:
● Quando o jogo iniciar, deve ser lido um dos 3 arquivo binários (.bin)
disponíveis, referentes à dificuldade escolhida no menu do jogo.
● A dificuldade do jogo (velocidade e tamanhos dos obstáculos) se ajusta
conforme os parâmetros de dificuldade contidos dentro dos arquivos .bin
correspondentes às dificuldades disponíveis no jogo.
● Quando o jogador encosta em um obstáculo, o jogo reinicia. Caso a
pontuação dele for maior que o último da lista de melhores pontuações,
ele será substituído no ranking dos 5 melhores jogadores e o arquivo
que controla as maiores pontuações deve ser atualizado (mais detalhes
dados abaixo).
● Quando o jogador supera um obstáculo, sua pontuação deve ser
incrementada em 50 unidades.
● À medida que o jogador avança no jogo, este começa a aumentar a
dificuldade dinamicamente controlando as variáveis de dificuldade (todas
inteiras), que são:
★ score_threshold: indica o score em que o jogo deve alterar as
variáveis de dificuldade. Quando a pontuação do jogador atingir
cada múltiplo de score_threshold, a dificuldade deve ser
aumentada
★ gap: indica o espaço livre inicial nos obstáculos para o jogador
passar (em pixels)
★ dec_gap: indica o quanto o gap deve ser reduzido a cada
incremento de dificuldade (em pixels)
★ dif_max_altura: indica a diferença máxima de altura inicial entre
obstáculos consecutivos (em pixels)
★ inc_dif_max_altura: indica o quanto a dif_max_altura deve ser
incrementada a cada aumento de dificuldade (em pixels)
★ vel_obstaculos: indica a velocidade inicial dos obstáculos em
relação ao personagem (em pixels)
★ inc_vel_obstaculos: indica o quanto a velocidade dos obstáculos
deve ser incrementada a cada aumento de dificuldade (em pixels)

● Os arquivos binários (.bin) de dificuldade contêm os valores das sete


variáveis inteiras mencionadas acima, na mesma ordem em que foram
expostas.

Exemplo de conteúdo do arquivo: 400 150 5 100 5 15 1

● Ao iniciar o jogo, deve ser lido um arquivo binário ranking.txt,


contendo as 5 maiores pontuações já registradas, juntamente com os
nomes dos respectivos jogadores. O arquivo texto terá um total de 10
linhas, alternando o nome do jogador com seu respectivo score (em
ordem decrescente com relação ao score). No início, esse arquivo tem 5
nomes fictícios com 0 pontos cada. Quando o jogo for encerrado, o
programa deve verificar se a pontuação do atual jogador é uma das
cinco melhores. Caso afirmativo, perguntar o nome do jogador e
atualizar o arquivo ranking.txt. Um exemplo de arquivo é dado abaixo:

Pedro Alvares Cabral


0
Joaquim Nabuco
0
Getulio Vargas
0
Osvaldo Aranha
0
Protasio Alves
0

Após a leitura do arquivo texto, os dados sobre as maiores pontuações


deve ser obrigatoriamente armazenados em um arranjo de estruturas
TIPO_SCORE, dado abaixo

typedef struct tipo_score


{
char nome[40];
int score;
} TIPO_SCORE;

● O jogo termina quando o jogador se choca com algum obstáculo. Nese


caso, o programa administra o ranking dos top 5 (caso necessário), zera
o score da última tentativa e reinicia uma nova tentativa.

4. TAREFAS EXTRAS

Se você quer um desafio maior, as seguintes tarefas extras são


propostas. Embora opcionais, essas tarefas podem melhorar a avaliação final
do seu trabalho (nota máxima 11).

● Power ups, como, por exemplo: invencibilidade, slow motion, dobro de


pontos, etc.
● Emitir avisos sonoros em alguma(s) da(s) situação(ões)
● Seja criativo, implemente suas ideias (mas não esqueça dos requisitos
mínimos e converse com o professor antes)!

5. DICAS

● O jogo pode ser implementado em qualquer sistema operacional


● Você pode usar qualquer ambiente para o desenvolvimento, como o
CodeBlocks, Visual Studio Code, Visual Studio, entre outros.
● A exibição na tela exige a biblioteca Raylib. Para familiarização com
essa biblioteca, verifique a prática opcional sobre esse assunto
disponível no moodle

6. OUTRAS INFORMAÇÕES
● O trabalho deverá ser realizado preferencialmente em duplas. Informar
os componentes da dupla até o dia 22/12/2023 ao professor por e-mail
(crjung@inf.ufrgs.br)
● Até o dia 14/02/2023 à meia-noite, a dupla deverá submeter via Moodle
um arquivo zip cujo nome deve conter os nomes dos alunos. O arquivo
zip deve conter:
o uma descrição sucinta do trabalho e uma explicação de como
usar o programa
o os códigos-fonte devidamente organizados e documentados
(arquivos .c)
o o executável do programa
● O trabalho será obrigatoriamente apresentado durante as aulas
práticas do dia 15 de Fevereiro de 2024. Ambos os membros da dupla
deverão saber responder perguntas sobre qualquer trecho do código.
Detalhes sobre essa apresentação serão fornecidos posteriormente
● No dia da apresentação serão fornecidos novos arquivos
dificuldade1.bin e dificuldade2.bin, contendo novos parâmetros para
testar o programa
● Os seguintes itens serão considerados na avaliação do trabalho:
o estruturação do código em módulos
o documentação geral do código (comentários, indentação)
o “jogabilidade” do jogo (deve jogar em tempo-real)
o atendimento aos requisitos definidos
● Importante: trabalhos copiados não serão considerados. Temos
ferramentas que possibilitam a detecção automática de plágio.

Você também pode gostar