====== Jogo ASCII ======
Projeto: desenvolver um jogo em ASCII para executar em terminal texto no Linux.
Jogos sugeridos:
* [[https://pt.wikipedia.org/wiki/Space_Invaders|Space Invaders]]
* [[http://darshak.free.fr/asctriis/asctriis.html|Tetris]]
* [[http://codeincomplete.com/projects/boulderdash|Boulder Dash]]
* [[https://en.wikipedia.org/wiki/Pac-Man|Pac-man]]
* [[https://en.wikipedia.org/wiki/River_Raid|River Raid]]
* [[https://spectrumcomputing.co.uk/entry/29074/ZX81/Mazogs|Mazogs]]/[[https://en.wikipedia.org/wiki/Maziacs|Maziacs]]
* [[https://en.wikipedia.org/wiki/Bomberman|Bomberman]]
* [[https://en.wikipedia.org/wiki/Frogger|Frogger]]
* [[https://en.wikipedia.org/wiki/Flappy_Bird|Flappy Bird]]
* [[http://www.freegalaga.com/|Galaga]]
* [[https://www.arcade-museum.com/game_detail.php?game_id=10026|Battle City]]
* ... (sugestões dos alunos podem ser analisadas)
Requisitos de execução:
* Executar em um terminal de texto do Linux
* Ter **resolução máxima 160×50** caracteres
* Usar cores!
* Mostrar scores/datas no jogo; os scores devem ser salvos em um arquivo
* Tecla ''h'' abre tela de ajuda
Requisitos de implementação:
* Ser desenvolvido em C padrão (C99 ou similar)
* Ser implementado em vários arquivos ''.c'' e ''.h'' separados, respeitando as regras de [[organização de código]]
* Usar a biblioteca **Ncurses** para a gestão do terminal
* Usar [[alocação de memória]] dinâmica
* Usar [[estruturas]]
* Compilar com o flag ''-Wall'' sem erros nem avisos
* Usar [[o sistema Make]] para compilação, com ao menos os seguintes alvos:
* ''all'': compila e gera o executável
* ''clean'': remove os arquivos temporários (mantém o executável)
* ''purge'': remove tudo, deixando somente os fontes
Para instalar os arquivos de desenvolvimento da biblioteca Ncurses no Debian, Ubuntu e correlatos:
sudo apt-get install libncurses5-dev
O código de inicialização da biblioteca NCurses, com as configurações necessárias para este projeto, é o seguinte:
initscr () ; // inicializa a biblioteca ncurses
raw () ; // ler teclas de controle (^C, ^Z, etc)
nodelay (stdscr, TRUE) ; // leitura não-bloqueante do teclado
keypad (stdscr, TRUE) ; // ativa leitura de teclas de setas, Fn, etc
noecho () ; // não escreve as teclas lidas na tela
curs_set (0) ; // esconde o cursor do terminal
Estrutura típica de um programa de jogo:
* [[https://web.archive.org/web/20161213145118/http://www.kathekonta.com:80/rlguide/|Beginner's Guide to Roguelikes]] (ler ao menos a parte 1)
* [[https://gameprogrammingpatterns.com/game-loop.html]]
Material de apoio para Ncurses:
* [[http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/|Ncurses Programming Howto]] (leia **com atenção** a seção sobre inicialização)
* [[http://invisible-island.net/ncurses/ncurses-intro.html|Writing Programs with Ncurses]]
* [[http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html|Ncurses Programming Guide]]
* Exemplos do ncurses no Linux, em ''/usr/lib/ncurses/examples/'' (pacote ''ncurses-examples'')
* [[http://invisible-island.net/ncurses/ncurses-examples.html|Código-fonte]] do pacote ''ncurses-examples'' disponível no Debian e derivados (Ubuntu, Mint, etc).
Uso de Ncurses em jogos:
* [[https://www.viget.com/articles/game-programming-in-c-with-the-ncurses-library]]
* [[https://web.archive.org/web/20160121083732/http://maupa.co.nz/c-ncurses-bug-shooting-game-tutorial]]
* [[http://www.use-strict.de/list-of-cool-ncurses-games.html|Cool Ncurses games]]