Você fará um simulador de uma sala com paredes. PARTE I ======= Seu programa lerá um arquivo com caracteres ASCII contendo um diagrama retangular. Exemplo: ################### # - # 3 # # # # ####### ### ### # 2 ! # # # # ######### ### + # 1 # # ################### + uma mesa - uma máquina de café ! um livro * TODAS as linhas do diagrama devem ter o mesmo comprimento * Não pode haver espaços nas bordas do diagrama (se houver, o programa deve sinalizar um erro (use o procedimento error) * Os símbolos significam: espaço espaço livre # parede 1 passagem para sala 1 2 passagem para sala 2 ... ... 9 passagem para sala 9 + um objeto com nome - um objeto com nome ! um objeto com nome @ um objeto com nome Os nomes dos objetos seguem após o diagrama, um objeto por linha (veja no exemplo). A linha + uma mesa Deve ser lida assim: o primeiro token (+) é o símbolo do objeto. O resto, até o final da linha, é o nome dele. TESTE! Teste seu programa neste ponto, mandando ele escrever o mapa em outro arquivo! SUGESTÕES: - Usar matriz de duas dimensões, como vimos em sala (usando um vetor grande ou, neste caso, uma string grande, e calculando o índice) ou usar a srfi-25. Ou ainda (talvez seja mais fácil) criar uma lista de vetores (cada linha é um vetor) e depois fazer list->vector nesta lista. Claro, precisará criar procedimentos para acessar e setar elementos nessa estrutura. PARTE II ======== Faça um servidor TCP que aceite conexões e interaja com o usuário. O servidor deve obedecer EXATAMENTE o protocolo que segue: - O usuário manda exatamente um caracter por linha: n anda para o Norte s anda para o Sul l anda para o Leste o anda para o Oeste - O servidor retorna um dos seguintes: OK se o usuário andou PAREDE se não pode andar (acertou parede) PASSAGEM:1 se andou, mas chegou em uma passagem PASSAGEM:2 idem ... ... "nome de objeto" se andou, mas chegou em um objeto TESTE! Teste seu programa neste ponto. Sua função interage deveria aceitar duas portas, assim voce consegue testá-la sem usar TCP ou telnet. Depois de testar interage, teste via Telnet também. PARTE III ========= Faça um segundo programa que dialogue com o usuário. O programa deve implementar um loop: - Pergunte o que o usuário quer - Aceite um comando - Traduza o comando em n, s, l ou o - Envie para o servidor. - Receba uma resposta do servidor - Traduza a resposta em uma frase para o usuário - Reinicie Quando o usuário chegar a uma passagem, responda algo como "Você vê aqui uma passagem para outro lugar, marcada com o número x" PARTE IV ======== Mude a parte da passagem. Quando o usuário chegar em um local de passagem: - O servidor deve responder: PASSAGEM HOST PORTA - O programa que dialoga recebe a mensagem do servidor e: + Fecha conexão com este servidor + Abre conexão com o novo servidor + Continua normalmente (talvez dizendo ao usuário que ele se vê em um novo ambiente) O mapeamento de passagem para host/porta pode ser feito como voce quiser, no seu programa. PARTE V (opcional) ================== a) Faça seu "dialogador" tocar sons! (É trivial -- veja o Egg "openal" no Chicken) Você pode fazer ele emitir sons interessantes quando o usuário acertar uma parede, por exemplo. b) Crie mais dois comandos: p pega o objeto neste local d deixa o objeto que estiver carregando no local onde estiver c) Você deve ter notado que um servidor terá mais de um usuário conectado. Impeça que usuários fiquem no mesmo local (dois corpos no mesmo lugar...) Voce poderá precisar de mutexes (veja a srfi-18). d) Faça o servidor abrir mais uma thread e ouvir em outra porta. Nesta porta voce poderá dar um telnet e o servidor mostrará o mapa com marcadores nas posições onde houver usuários visitando. e) Faça uma interface gráfica para o programa que dialoga com o usuário (use o "Egg" Tk do Chicken)