Projecto # 4: HangMan Entrega: 1 de Julho as 23:59 Para este problema sua missão é escrever um programa que implementa o jogo Hangman. Deve-se ter em conta dois objectivos. Primeiro, o programa é desenhado para você ter prática em escrever programas que manipulam strings e ficheiros. Segundo, estendendo o programa usando ferramentas gráficas do capitulo 9, você vai ter a oportunidade de trabalhar com diferentes classes em uma única aplicação. Quando o usuário joga HangMan, o computador selecciona uma palavra secreta aleatoriamente a partir de uma lista. O programa então imprime os espaços um para cada letra na palavra secreta. Se o usuário adivinha uma letra que esta na palavra, a palavra e mostrada com a letra adivinhada nos locais correctos, junto com as letras anteriormente adivinhadas. Se a letra não consta da palavra o usuário e penalizado com uma resposta errada. O usuário continua a adivinhar até que (1) adivinhou todas as letras na palavra ou (2) O usuário fez 8 respostas incorrectas. Dois exemplos do programa esta ilustrado na figura 1 na pagina seguinte. Quando este jogo é jogado por crianças e uma verdadeiro fascínio, porque as respostas incorrectas envolve o desenho de um homem enforcado num andaime. Para cada resposta incorrecta uma parte do corpo é desenhada, primeiro a cabeca, depois o corpo, depois os braços, depois as pernas e finalmente os pes. Tudo é adicionado ao andaime ate o enforcamento estar completo. Exemplo o diagrama mostra a primeira resposta incorrecta (Somente a cabeca), a terceira (cabeca, corpo e braco esquerdo), e o facto trágico quando se perde o jogo.
Para escrever o programa que implementa Hangman, você deve projectar e testar seu programa em três partes. A primeira parte consiste em obter a parte interactiva do jogo a trabalhar sem gráficos e com um conjunto fixo de palavras secretas. A segunda parte consiste na construção de uma classe separada, que mantém o esquema de andaime. A parte final exige que você substitui a versão fornecido da lista de palavra secreta com aquela que lê as palavras de um arquivo. O restante deste folheto descreve essas três partes em mais detalhes. Figura 1. Exemplos do jogo Hangman (somente consola)
Note que o programa só precisa ser capaz de jogar o jogo Hangman uma vez através (ou seja, o jogador adivinhar uma palavra), mas deve ser muito fácil estender seu programa para permitir que o jogador jogue várias vezes. Parte I-Jogar um jogo baseado em console Na primeira parte desta missão, sua tarefa é escrever um programa que lida com o componente do jogo de tudo, excepto a exibição gráfica de interacção do usuário. Para resolver o problema, o programa deve ser capaz de: Escolher uma palavra aleatória para usar como palavra secreta. Essa palavra é escolhida a partir de uma lista de palavras, como descrito no parágrafo seguinte. Acompanhar a palavra parcialmente adivinhada pelo usuário, o que começa como uma série de traços e, em seguida, é actualizada com as letras corretas são adivinhadas. Implementar a estrutura de controlo básico e gerenciar os detalhes (pedir ao usuário para adivinhar uma letra, manter o controle do número de palpites restantes, imprima as várias mensagens, detectar o fim do jogo, e assim por diante). A única operação que está além do seu conhecimento actual é a que representa a lista de palavras a partir do qual você pode escolher uma palavra ao acaso. Para as duas primeiras partes da missão, você vai simplesmente fazer uso de uma classe que te dei chamado HangmanLexicon que fornece uma pequena lista de palavras que lhe permitirá testar o programa. (A léxico é muito parecido com um dicionário, mas não necessariamente inclui definições, o que o torna um nome mais apropriado para uma classe que fornece uma lista de palavras sem significados associados.) A implementação da classe que lhe foi dado é apenas um expediente temporário para torná-lo possível para codificar o resto do trabalho. Na Parte III, você vai substituir esta implementação pela que lê uma lista de palavras a partir de um ficheiro. A estratégia de criação de uma aplicação temporária que fornece a funcionalidade suficiente para implementar o resto do programa é uma técnica comum na programação. Tais implementações temporárias são geralmente chamados de stubs. Nesta tarefa, o projeto inicial vem com uma implementação stub da classe HangmanLexicon, que aparece na Figura 2 na página seguinte. A classe contém dois métodos públicos: getwordcount (), que retorna o
número de palavras no léxico, e GetWord (i), que retorna a palavra no índice i. Como todos os índices em Java, o valor i vai de 0 a menos do que o número de palavras. Figure 2. Implementação stub de hangmanlexicon. Um jogo que usou esta implementação da classe HangmanLexicon iria rapidamente tornar-se desinteressante, porque há apenas dez palavras disponíveis. Mesmo assim, ele vai permitirlhe desenvolver o resto do programa e, em seguida, voltar e melhorar essa parte mais tarde. Parte I é um problema de manipulação de string usando os métodos desenvolvidos no Capítulo 8. O exemplo é executado na Figura 1 deve ser suficiente para ilustrar o
funcionamento básico do jogo, mas os seguintes pontos podem ajudar a esclarecer algumas questões: No início do seu método de execução, você precisa criar uma nova HangmanLexicon e armazená-lo em uma variável de instância. Se você estender o programa para permitir o usuário jogar vários jogos, a criação do HangmanLexicon deve ser realizada fora do loop que joga o jogo repetidamente para que esta operação seja realizada uma vez ao invés de cada jogo. Você deve aceitar as suposições do usuário, em qualquer caso inferior ou superior, apesar de todas as letras das palavras secretas são escritos em letras maiúsculas. Se as suposições do usuário algo diferente de uma letra, o programa deve informar ao usuário que o palpite é ilegal e aceitar um novo palpite. Se adivinha o usuário digita uma letra correta mais de uma vez, o programa deve simplesmente não fazer nada. Adivinhar uma letra incorrecta uma segunda vez deve ser contado como um outro palpite errado. (Em cada caso, essas interpretações são a maneira mais fácil de lidar com a situação, e seu programa provavelmente vai fazer a coisa certa, mesmo que você não pensa sobre estes casos em detalhe.) Parte II- Adicionando Graficos Para a Parte II, sua tarefa é simplesmente estender o programa que você já tem escrito de modo que a controlar o display gráfico Hangman. Embora você possa querer apimentar as coisas em suas implementações, a versão mais simples da imagem final para um usuário infeliz que acabou de perder o jogo é parecido com este:
O andaime e o pequeno pedaço de corda acima da cabeça são adicionados antes do início do jogo, e em seguida, as peças são adicionadas na seguinte ordem: cabeça, tronco, braço esquerdo, braço direito, perna esquerda, perna direita, pé esquerdo, pé direito. Porque esta imagem é mais simples do que a maioria dos exercícios que já fez, o desafio do trabalho não reside no uso do pacote acm.graphics mas sim na implementação da separação de funções entre a classe que executa a interacção baseado em console e da classe que gerência da parte grafica. Essa classe é chamada HangmanCanvas e está incluído no projecto de partida na forma de execução mostrado na Figura 3. Figura 3. Implementação Stub de HangmanCanvas
Este esboço é um pouco diferente do mostrado anteriormente para HangmanLexicon. Que realmente fez alguma coisa, mesmo que fosse só uma parcela da implementação completa do que a classe vai fazer. Este esboço declara várias constantes que definem os parâmetros da imagem, mas na verdade não são usados ainda. Os três métodos na implementação stub de HangmanCanvas - reset, displayword e noteincorrectguess não estão implementados. Esta estratégia é comum na programação. O fato das classes existirem e métodos de exportação significa que você pode chamar os métodos da classe Hangman baseado em console, mesmo antes de concluir a sua implementação. A primeira coisa que deve fazer quando começar a Parte II é a criação de uma nova HangmanCanvas (precisamente da forma de não fazer nada em que foi dado) e instalá-lo na janela do programa ao lado do console. A própria classe Hangman é um exemplo de um ConsoleProgram, o que significa que o código de inicialização nas bibliotecas ACM tem instalado um IOConsole na janela que preenche todo o espaço. Sua próxima tarefa é adicionar um HangmanCanvas para a janela do programa também. O código que você precisa para esta peça é extremamente simples. Primeiro, na seção variáveis a instância do programa Hangman, você precisa declarar uma variável de instância para a tela escrevendo e depois adicionar o seguite método init no seu programa: Note-se que o seu programa Hangman terá tanto um init e run método, e isto está perfeitamente bem. Este método init inicializa a tela e adiciona à janela antes de o método run ser executado, o método run é onde a execução do seu jogo vai começar depois que a janela é inicializada. Por padrão, o conteúdo da janela do programa recebem quantidades iguais de lado a lado do espaço. Uma vez que este é um programa de console, vai aparecer na coluna da esquerda. O HangmanCanvas ocupará a segunda coluna, a consola e componentes gráficas da janela irão receber cada uma metade do ecrã, conforme mostrado na Figura 4 abaixo. Entrada e saída do programa Hangman continuará a aparecer no console, e todos os
objectos que você adicionar aos HangmanCanvas armazenados na tela variável irá aparecer na área à direita. Figura4. PrintScreen mostrando lado a lado console (lado esquerdo) e canvas (à direita) Agora você pode adicionar as chamadas para os métodos em HangmanCanvas. Toda vez que você iniciar um jogo, por exemplo, você vai precisar de chamar para apagar todas as partes do corpo da tela e redesenhar o andaime. Da mesma forma, você terá que chamar displayword e noteincorrectguess nos pontos apropriados em seu código. Até agora, nada vai realmente ser exibido na tela quando você faz essas chamadas, mas o programa deve ser executado da mesma forma como fazia antes, libertando-o para se concentrar na implementação dos métodos em HangmanCanvas. Note que você não deve adicionar quaisquer métodos mais públicos para HangmanCanvas (adicionando métodos auxiliares). A implementação de HangmanCanvas deve ser razoavelmente simples. Embora os tamanhos do andaime e as várias partes do corpo são dadas a você, suas posições não são especificados, então você vai ter que fazer alguma aritmética para calcular as coordenadas. A linha central do corpo deve ser centrado horizontalmente na tela, e o andaime deve ser
exibido um pouco maior do que o centro de modo que haja espaço em baixo para dois labels: um label em letras grandes que mostra a palavra secreta na sua forma actual e uma label em uma fonte menor mostrando as suposições incorrectas. A Figura 5 mostra como a tela aparece no fim da sessão trágica em que o utilizador não conseguiu adivinhar. Figura 5. O fim trágico de HangMan Game
Parte III - Lendo o léxico de um ficheiro Parte III desta tarefa é, de longe, o mais fácil e requer muito menos do que metade de uma página de código. O único problema é que você precisa pesquisar sobre as facilidades para fazê-lo. Assim, a idéia é que terminada as partes I e II, preencher este último detalhe. Seu trabalho nesta parte do trabalho é simplesmente reimplementar a classe HangmanLexicon de modo que em vez de seleccionar a partir de uma lista de dez palavras, ele lê uma lista de palavras muito maior de um ficheiro. Os passos envolvidos nesta parte do trabalho são as seguintes: 1. Abra o HangmanLexicon.txt arquivo de dados usando um BufferedReader que permitirá ler o ficheiro linha por linha. 2. Ler as linhas do arquivo em um ArrayList. 3. Reimplementar os métodos e getwordcount GetWord em HangmanLexicon de modo que eles usam o ArrayList a partir do passo 2 como a fonte das palavras. Os dois primeiros passos devem ser feitos em um construtor para HangmanLexicon, que você terá que adicionar ao ficheiro (ver abaixo). O último passo é simplesmente uma questão de mudar a implementação dos métodos que já lá estão. Aqui está como o construtor HangmanLexicon deve ser adicionado à classe HangmanLexicon: Note-se que nada no programa principal deve mudar porque você fez esta mudança na implementação de HangmanLexicon. É um princípio de bom design de software não ter de fazer grandes mudanças em seu programa, deve ser sempre possível fazer seu programa estender.
Estendendo Há muitas maneiras de estender Hangman para torná-lo mais divertido. Aqui estão algumas idéias: Você poderia tornar as imagens mais atractivas. Você poderia animar as imagens. Em vez de ter as partes do corpo e as letras apenas a aparecer na tela, você pode faze-los moverem-se dentro de fora de campo, como as imagens costumam fazer, por exemplo, em slides do PowerPoint. Você poderia em vez de completar palavras completar frases. Use a sua imaginação!