====== 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]]