Objectivos

  • Exercitar a utilização da framework de interação com o utilizador a aplicar no projecto

Actividade

  1. Perceber as funcionalidades das classes MenuCommand, Form e Display.
  2. Resolução do enunciado da aula.
  3. Ver o enunciado do 8º Exercício de Programação

A Framework de Interacção com o Utilizador

Os alunos devem ler a documentação respeitante à framework de interacção com o utilizador po-ulib presente na secção po-uilib antes de começarem a realizar o trabalho pedido neste laboratório.

Enunciado da Aula

Nesta aula de laboratório pretende-se adicionar a interface com o utilizador à aplicação Jogo do Galo que tem estado a ser desenvolvida. A interface com o utilizador a desenvolver deverá suportar a seguinte funcionalidade. Inicialmente deve ser apresentado um menu com as opções "Jogar Jogo" e "Ver Histórico". Escolher a opção "Jogar Jogo" deverá permitir jogar um jogo. Assim, a execução desta opção (correspondente à execução do método execute da classe Command que concretiza esta opção) deverá primeiro perguntar a dimensão do jogo a jogar, criar o jogo com a dimensão indicada e mostrar um novo menu com as opções"Jogar Jogador 1" e "Jogar Jogador 2".

A opção "Jogar Jogador 1" deve realizar uma jogada feita pelo jogador 1. Assim, a execução desta opção primeiro pede as coordenadas da jogada a realizar (linha e coluna) e depois deve efectuá-la sobre o jogo em causa. Caso a jogada não seja válida (o método joga de JogoGalo devolve false), então deve ser apresentada uma mensagem de erro. Caso a jogada seja válida, então deve ser apresentado o estado actual do jogo com as várias jogadas já efectuadas. A opção "Jogar Jogador 2" tem um comportamento semelhante ao descrito para a opção anterior mas aplicado ao jogador 2.
Quando se sai do menu "Jogar Jogo", caso o jogo efectuado tenha terminado é necessário então acrescentá-lo aos jogos já realizados daaplicação Jogo do Galo. A opção "Ver Histórico" deverá apresentar um novo menu com as opções "Mostrar Número de Jogos Terminados" e "Mostrar Jogo". A primeira opção deverá escrever o número de jogos terminados já jogados. A segunda escreve o estado final de um jogo efectuado anteriormente, perguntando ao utilizador o índice do jogo que se pretende ver.

O código do jogo do galo já desenvolvido nas aulas de laboratório anteriores deve ser colocado num package diferente do código relacionado com a interface com o utilizador a desenvolver na aula deste laboratório dado estes dois conjuntos de código têm responsabilidades diferentes. O primeiro representa as funcionalidades das entidades do domínio da aplicação Jogo do Galo enquanto que o segundo é responsável pela concretização da interface com o utilizador. Por esta razão, deve criar dois sub-packages do package jogogalo: jogogalo.core e jogogalo.textui. As classes do domínio da aplicação devem ser colocados no primeiro  sub-package (jogogalo.core) enquanto que as relacionadas com a especificação da interface com o utilizador devem ser colocadas no sub-package jogogalo.textui. Pode ainda organizar melhor o código colocando o código relacionado com cada menu num sub-package distinto de jogogalo.textui. Neste caso precisará de criar três novos sub-packages.

O seguinte documento, apoio_ap6.pdf,  apresenta com algum detalhe as alterações efectuadas à aplicação para que esta passasse a suportar  a interacção com utilizador com a funcionalidade descrita anteriormente.

Trabalho Proposto

  1. Altere o package do código desenvolvido anteriormente do Jogo do Galo para jogogalo.core.
  2. A classe MainMenu (presente no seguinte ficheiro MainMenu.java) é uma classe derivada de Menu e deve concretizar o menu principal da aplicação. Esta classe apenas precisa de definir o construtor, passando a lista de opções do menu (representado por um array de Command's). A versão disponibilizada apenas apresenta uma opção, Jogar Jogo. A outra opção deverá ser concretizada mais tarde.
  3. A opção "Jogar Jogo" deve permitir que os jogadores um e dois joguem, um de cada vez. Esta opção deverá então apresentar um novo menu que deverá apresentar a opção "Jogar Jogador 1" ou "Jogar Jogador 2" enquanto não se chegar ao fim do jogo ou se desistir do jogo. Inicialmente deve ser apresentada apenas a primeira opção. Esta opção deve ser representada como uma classe derivada de Command, devendo criar um menu com as duas opções indicadas atrás e deverá tornar a segunda opção invisível. É possível tornar uma opção de um menu invisível invocando o método invisible sobre a instância de Command que representa essa opção. Para tornar a opção visível depois de ficar invisível basta invocar o método visible. Pode consultar a seguinte concretização desta classe: PlayGame. O método entry aplicado a um menu devolve a opção do menu cujo índice é igual ao indicado no argumento do método. Adicionalmente, esta opção ainda tem a responsabilidade de adicionar cada jogo que termina em caso de vitória ou empate ao histórico da aplicação Jogo do  Galo utilizando a funcionalidade já disponível em AplicacaoJogoGalo.
  4. As opções "Jogar Jogador 1" e "Jogar Jogador 2" podem ser concretizadas pela mesma subclasse de Command. É possível concretizar uma subclasse de Command que é responsável por colocar uma dada peça na posição indicada pelo utilizador. Esta subclasse deverá ter dois atributos: o jogo que está a ser jogado e a peça a jogar. Assim, as opções do menu Jogar podem ser realizadas por duas instâncias distintas desta subclasse indicando um valor distinto no segundo argumento do construtor (que indica se é o primeiro jogador ou segundo). A concretização desta classe HumanPlayer assume que a primeira opção do menu contém a opção Jogar Jogador 1 e a segunda posição do menu contém a opção Jogar Jogador 2.
  5. A classe Main é responsável por começar a criar uma instância do menu inicial da aplicação e por abrir o menu.
  6. Compile o código e execute a classe jogogalo.textui.Main. Atenção, para compilar e correr a aplicação tem que definir correctamente a variável classpath. Supondo que está no directório que contém o package raiz (jogogalo) desta aplicação e que o ficheiro mar com a framework de interacção com o utilizador também está neste directório, então a variável classpath deve ser definido como ".:po-uilib.jar". Assim, para compilar todas as classe pode dar o seguinte comando: javac -cp .:po-uilib.jar: `find jogogalo -name "*.java"`. Caso seja necessário, pode aceder ao código todo da aplicação neste ficheiro jarjogogalo.jar.
  7. Termine a concretização das opções Ver HistóricoMostrar Número de Jogos Terminados e Mostrar Jogo. A opção Ver Histórico (parcialmente concretizada em ViewData.java)  pertence ao menu inicial da aplicação e deve criar um novo menu com as opções Mostrar Número de Jogos Terminados e Mostrar Jogo. A opção "Mostrar Número de Jogos Terminados" (parcialmente concretizada em ShowNumberOfGames.java) escreve o número de jogos já terminados. Foi adicionado um método, obtemNumeroJogos, à classe AplicacaoJogoGalo com esta funcionalidade. A opção Mostrar Jogo (parcialmente concretizada em ShowGame.java) deve apresentar o estado final do jogo indicado pelo utilizador. Esta opção deve perguntar ao utilizador qual é o índice do jogo que ele deseja verificar e deve apresentar o estado final do jogo escolhido. O método obtemEstadoJogo de JogoGalo devolve uma cadeia de caracteres com o estado do jogo.
  8. Actualize a classe MainMenu por forma a apresentar as duas opções: Jogar Jogo e Ver Histórico.
  9. Execute agora a aplicação com todas as opções concretizadas.
  10. Caso tenha tempo, pode começar a realizar o exercício de programação 8.

Exercício de Programação

Caso tenha tempo, pode ler o enunciado do 8º Exercício de Programação (EP8). Este exercício pode ser entregue até ao início da próxima aula de laboratório.