Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass[a4paper]{article}
- \usepackage[utf8]{inputenc}
- \usepackage[portuges]{babel}
- \usepackage{a4wide}
- \usepackage{listings}
- \usepackage{graphicx}
- \usepackage{caption}
- \usepackage{subcaption}
- \usepackage[justification=centering]{caption}
- \usepackage{float}
- \usepackage{indentfirst}
- \usepackage{epstopdf}
- \title{Projeto de Laboratórios de Informática 1\\Grupo li1g004}
- \author{Ana Catarina Gomes Rodrigues (A78763) \and Maria Elisa Maciel Valente (A79093)}
- \begin{document}
- \maketitle
- \begin{abstract}
- Este documento apresenta o projeto do jogo Sokoban realizado no âmbito da disciplina Laboratórios de Informática 1, descrevendo o problema dado e a forma como este foi resolvido. Este relatório tem como intuito explicar as seis tarefas realizadas para este projeto, as dificuldades que surgiram ao longo da suas resoluções e os testes feitos para cada uma delas.
- \end{abstract}
- \tableofcontents
- \section{Introdução}
- \label{sec:intro}
- Este projeto, proposto pelos docentes da disciplina Laboratórios de Informática 1 (LI1), consiste na realização de um jogo denominado Sokoban. Este jogo consiste, resumidamente, no jogador controlar um boneco através de comandos muito simples e fazer com que este empurre as caixas e as arrume nos locais determinados.
- Neste relatório são abordadas as seis tarefas que foram necessárias realizar para a concretização do jogo, sendo explicado, pormenorizadamente, o que foi feito em cada uma e as adversidades encontradas em cada uma delas na Secção~\ref{sec:solucao}. De um modo geral, a tarefa 1 (A) consistia na verificação do mapa (se este obedecia aos padrões estabelecidos); a tarefa 2 (B) retirava os caracteres redundantes do mapa fornecido e substituía as coordenadas dadas, no mapa, pelos caracteres correspondentes; a tarefa 3 (C) mostrava a posição final do boneco após a execução de um comando dado pelo jogador; a tarefa 4 (D) recebia o mapa, as coordenas e uma lista de comandos e verificava quantos desses comandos eram, de facto, executados e, também, se todas as caixas ficavam nos locais de arrumação (fim do jogo) ou não (jogo incompleto); a tarefa 5 (E) consistia no cálculo das dimensões do retângulo mínimo que incluía uma figura Gloss (Ex: Circle, Polygon, Line, etc.); por último, a tarefa 6 (F) consistia na realização e execução do jogo.
- Por fim, são, também, referidos os testes realizados para cada tarefa, testes estes que permitiram visualizar os erros existentes no código, possibilitando, assim, o melhoramento do mesmo.
- \section{Descrição do Problema}
- \label{sec:problema}
- Como já foi referido na Secção~\ref{sec:intro}, o problema que foi proposto resolver foi a realização do jogo Sokoban. Para tal, foram fornecidas seis tarefas, encontrando-se em cada uma delas um problema específico.
- \subsection{Tarefa 1 (A)}
- \label{subsec:prob1}
- Na Tarefa 1 era pedido para verificar se o mapa que era fornecido obedecia determinados padrões, que eram os seguintes:
- \begin{itemize}
- \item O mapa tinha de ser um retângulo;
- \item Todos os lados do mapa tinham de ser compostos por cardinais;
- \item O mapa tinha de ser constituído pelo tabuleiro (cardinais, pontos e espaços) e pelas coordenadas (do boneco e das caixas);
- \item Não podia haver mais locais de arrumação (pontos) do que coordenadas de caixas ou vice-versa;
- \item A coordenada do boneco não podia corresponder a um cardinal no tabuleiro, assim como nenhuma das coordenadas das caixas;
- \item O tabuleiro tinha de ser constituído apenas por cardinais, pontos e espaços;
- \item As coordenadas tinham de ser compostas apenas por dois números inteiros positivos;
- \item As coordenadas não podiam sair fora do tabuleiro.
- \end{itemize}
- \subsection{Tarefa 2 (B)}
- \label{subsec:prob2}
- Na Tarefa 2 tinha de se retirar os cardinais redundantes (cardinais que tinham à sua volta outros cardinais) e substituir no tabuleiro a coordenada do boneco por um 'o' e as coordenadas das caixas por 'I' ou 'H', se a caixa se encontrasse num local de arrumação ('.') ou se a caixa se encontrasse num espaço vazio (' '), respetivamente. Era considerado, nesta tarefa, que o mapa era válido, ou seja, que obedecia aos parâmetros descritos na Sub-secção~\ref{subsec:prob1}.
- \subsection{Tarefa 3 (C)}
- Na Tarefa 3 era pedido que se determinasse a posição final do boneco após se ter executado um comando, que apenas poderia ser um destes quatro: 'U' (Up = Cima), 'D' (Down = Baixo), 'L' (Left = Esquerda), 'R' (Right = Direita). Tal como na Tarefa 2, era considerado que o mapa fornecido era válido e que este, para além do tabuleiro e das coordenadas, tinha uma linha adicional contendo um comando dado pelo próprio jogador.
- \subsection{Tarefa 4 (D)}
- \label{subsec:prob4}
- Na Tarefa 4 pretendia-se continuar o que foi feito na Tarefa 3, mas em vez de se executar apenas um comando, executava-se uma sequência de comandos. O programa deveria executar os comandos por ordem e verificar quantos destes eram, de facto, executados. Pretendia-se, também, verificar se, após a execução dos comandos, todas as caixas se encontravam nos locais de arrumação ('.') e, se tal acontecesse, o jogo teria chegado ao fim, caso contrário estaria incompleto.
- \subsection{Tarefa 5 (E)}
- Na Tarefa 5 era pedido para calcular o tamanho do menor retângulo envolvente de uma Picture (Blank, Circle, Polygon, Line, Bitmap, Color, Translate, Scale, Rotate, Pictures). Não eram considerados nesta tarefa os construtores ThickCircle, Arc, ThickArc e Text, já que nesses casos não é evidente qual o retângulo envolvente da figura. O programa teria de dar como resultado uma única linha impressa com os valores, arredondados para inteiros, da largura e da altura do retângulo envolvente, separados por um único espaço.
- \subsection{Tarefa 6 (F)}
- Na Tarefa 6 pretendia-se colocar o jogo a funcionar por completo, ou seja, tinha-se como objetivo criar um meio para o utilizador poder jogar, sendo dado ao grupo a possibilidade de criar as suas próprias regras e desenhar o mapa ao seu agrado.
- \section{Conceção da Solução}
- \label{sec:solucao}
- Nesta Secção será explicado, detalhadamente, o processo realizado para a obtenção da solução pretendida e, para uma melhor compreensão deste, dividiu-se esta Secção em duas partes (Estruturas de Dados e Implementação).
- \subsection{Estruturas de Dados}
- De seguida, serão apresentadas as estruturas de dados mais relevantes para a obtenção da solução pretendida em cada uma das tarefas:
- \begin{lstlisting}
- type Planta = [String]
- type Pos = (Int, Int)
- type Cmd = Char
- type Posfinal = [(Int, Int)]
- type Estado = (Planta, Pos, Posfinal)
- type RectEnv = [Point]
- type Mundo = ([String],[Picture],[Picture],[String],
- String,String,[String],[String],[String])
- \end{lstlisting}
- Todos estes tipos foram criados para facilitar a leitura das funções e a sua compreensão.
- \subsection{Implementação}
- Nesta Secção são apresentadas as soluções propostas para a resolução do problema dado, sendo também referidos os obstáculos encontrados e as decisões tomadas para os ultrapassar.
- \subsubsection{Tarefa 1 (A)}
- Primeiramente, decidiu-se, nesta tarefa, separar o tabuleiro das coordenadas (parteMapa e parteCoordenadas) para facilitar a verificação da validade de cada um. Após a separação destas duas componentes, implementou-se uma função para verificar se o mapa era ou não vazio (mapaNaoVazio) e uma outra para ver se o mapa era ou não um retângulo (retangulo).
- De seguida, para verificar se todos os lados do tabuleiro eram compostos por cardinais, criou-se uma função que via se o primeiro e o último elemento de cada linha do tabuleiro era um cardinal (cardinal1) e uma outra para verificar se a primeira e última linha deste eram compostas só por cardinais (cardinal2).Pretendia-se também saber se o mapa era apenas constituído por cardinais, pontos e espaços e, portanto, escreveu-se uma função (carateres) que verificava essa condição linha a linha do tabuleiro.
- Para além disso, era pedido que as coordenadas fossem apenas constituídos por dois números, e que estes fossem inteiros e positivos, e, portanto, fizeram-se 3 funções (verificaCoordenadas, verificanumcoordenadas e coordenadasPositivas), sendo que cada uma verifica, respetivamente, cada um dos parâmetros anteriormente referidos.
- Seguidamente, comparou-se o número de coordenadas de caixas com o número de pontos no tabuleiro com a função numCoordenadas, que usa como auxiliares duas outras funções, uma que conta o número de pontos (contaPontos) e outra que conta o número de coordenadas de caixas (contaCoordenadasCaixas).
- Outra situação a ter em conta era saber se as coordenadas dadas correspondiam a espaços vazios no tabuleiro, tendo-se implementado assim a função que verifica exatamente isso (erroCoordenadasbem).
- Por fim, criou-se a função juntaerros que, tal como o nome indica, juntava todos os erros existentes no mapa e dava como \textit{output} o número da linha de menor número em que ocorria um dos erros. Caso não houvesse nenhum erro no mapa fornecido, esta função dava como \textit{output} '-1' (número pelo grupo escolhido para representar o mapa válido).
- \subsubsection{Tarefa 2 (B)}
- Em primeiro lugar, tal como na tarefa 1, separou-se o tabuleiro das coordenadas, seguindo-se a verificação de cardinais à volta de um dado cardinal do tabuleiro. Se o cardinal se encontrasse num dos extremos do tabuleiro considerava-se que os espaços vazios à volta deste eram cardinais para facilitar na resolução do problema. Assim, todos os cardinais que tinham como "vizinhos" apenas cardinais eram considerados redundantes e as suas posições no tabuleiro eram armazenadas numa lista para depois serem eliminados.
- A segunda parte desta tarefa consistia em substituir a posição do boneco por um 'o' e as posições das caixas por um 'I' ou um 'H' consoante o que já foi referido na Sub-secção~\ref{subsec:prob2}. Para tal, definiu-se a função setElem que, dado um mapa, uma coordenada e um carácter, substitui no tabuleiro o carácter inicial pelo carácter dado, e as funções inserirCaixas e inserirBoneco que usam esta primeira como auxiliar para substituir as posições de ambos pelos caracteres correspondentes no tabuleiro.
- \subsubsection{Tarefa 3 (C)}
- \label{subsubsec:Imp3}
- Na Tarefa 3 volta-se novamente a fazer a separação do tabuleiro das coordenadas, como também a separação do comando que é fornecido na última linha do mapa. Para verificar se o comando era executado ou não teve de se ter em conta as seguintes situações, válidas para qualquer dos quatro comandos:
- \begin{itemize}
- \item Se à esquerda da posição do boneco se encontra um cardinal - O comando não é executado
- \item Se à esquerda da posição do boneco se encontram duas caixas juntas - O comando não é executado
- \item Se à esquerda da posição do boneco se encontra uma caixa encostada a uma parede - O comando não é executado
- \item Se à esquerda da posição do boneco se encontra uma caixa e ao lado dessa está um espaço vazio - O comando é executado
- \item Se à esquerda da posição do boneco se encontra um espaço vazio ou um local de arrumação onde não se encontre lá nenhuma caixa - O comando é executado
- \end{itemize}
- Caso o comando seja executado então a posição do boneco muda (as das caixas podem mudar ou não, dependendo da situação), daí ter sido criada a função substitui, que, dado duas coordenadas, substitui a primeira (posição inicial do boneco) pela segunda (posição final do boneco). O mesmo acontece com as caixas caso estas mudem de posição.
- \subsubsection{Tarefa 4 (D)}
- Tal como já foi referido na Sub-secção~\ref{subsec:prob4}, a Tarefa 4 continua o que foi feito na Tarefa 3 e, portanto, muitas funções definidas nesta tarefa foram retiradas da anterior. Estando a parte da execução dos comandos resolvida (explicada na Sub-sub-secção~\ref{subsubsec:Imp3}, passou-se para a verificação de quantos comandos eram executados e se o jogo terminava ou se ficava incompleto. Para tal, criaram-se 3 novas funções:
- \begin{itemize}
- \item[execCmd:] Função que, dado um comando de movimento, o tabuleiro, a posição do boneco e a posição das caixas, dá as posições finais do boneco e das caixas após se ter concretizado o comando fornecido. Caso não seja possível realizar o comando, as posições do boneco e das caixas não se alterarão.
- \item[acabou:] Função que verifica se todas as caixas estão nos locais de arrumação, após a execução dos comandos fornecidos, ou seja, verifica se o jogo chega ao fim.
- \item[final:] Função que usa as duas anteriores como auxiliares e dá o \textit{output} pretendido desta tarefa, "FIM x" se todas as caixas estiverem nos locais de arrumação e "INCOMPLETO x" caso contrário, sendo x o número de comandos que foram possíveis de realizar.
- \end{itemize}
- \subsubsection{Tarefa 5 (E)}
- Nesta tarefa 5 tratou-se, no início, dos casos mais simples (\textit{Blank}, \textit{Color}, \textit{Pictures}, \textit{Circle}, \textit{Polygon}, \textit{Line} e \textit{Bitmap}), consistindo, estes quatro últimos, basicamente, em encontrar o x mínimo, o x máximo, o y mínimo e o y máximo da figura e, encontradas estas coordenadas, subtraía-se o x máximo pelo x mínimo e o mesmo acontecia para o y, obtendo-se, assim, as dimensões do retângulo envolvente da respetiva figura. Já o \textit{Blank}, sendo uma figura em branco, não admite retângulo envolvente, e o \textit{Pictures} é uma lista de \textit{Picture}, ou seja, o retângulo envolvente desta obtém-se fazendo o retângulo envolvente de cada \textit{Picture}.
- De seguida, fez-se o \textit{Translate} e o \textit{Scale}, sendo que no primeiro apenas se somou a coordenada do x fornecida ao x máximo e ao x mínimo da figura, e a coordenada do y ao y máximo e ao y mínimo, obtendo-se o retângulo envolvente pelo critério já referido em cima. O \textit{Scale} é praticamente semelhante ao \textit{Translate}, a única diferença entre ambos é que em vez de se somar as coordenadas dadas às outras, multiplica-se.
- Por último, o \textit{Rotate}, devido à sua complexidade, provocou bastantes dificuldades, sobretudo os casos "Rotate a (Translate x y p)" e "Rotate a (Scale x y p)". Embora não se tenha conseguido realizar o \textit{Rotate} para todos os casos possíveis, este foi feito para o caso da figura ser um círculo, um polígono, uma linha ou uma figura em branco, cujo processo é explicado seguidamente passo a passo:
- \begin{itemize}
- \item[1º] Através de um dado ponto, calculou-se a hipotenusa e o ângulo que esse ponto fazia com o eixo das abcissas.
- \item[2º] Criou-se uma função (rodarPonto) que, dado um ângulo e um ponto, rodava esse ponto em função do ângulo dado, que serviu de auxiliar para a função que rodava vários pontos (rodarPontos).
- \item[3º] Depois aplicou-se o rodarPontos aos pontos da figura (\textit{Circle}, \textit{Polygon}, \textit{Line} ou \textit{Blank}).
- \item[4º] Por fim, obteu-se o retângulo envolvente da figura rodada.
- Observação: É de notar que tanto o \textit{Circle} como o \textit{Blank} não se alteram com o \textit{Rotate}.
- \end{itemize}
- \subsubsection{Tarefa 6 (F)}
- Na tarefa 6 são utilizadas funções de praticamente todas as tarefas, uma vez que esta é aquela que executa o jogo, ou seja, nesta tarefa pretende-se dar vida a todo o código que até lá já tinha sido criado.
- O primeiro passo foi a criação do mapa do jogo como imagem. Começou-se por coisas básicas, a criação de uma janela de título “Dogoban” e o desenho do jogo nessa janela. Inicialmente as paredes, caixas, pontos, o boneco e as caixas na posição final eram representados por figuras geométricas criadas a partir de “rectangleSolid”, “circle” e “circleSolid”.
- Mais tarde, com mais informação retirada da biblioteca Gloss, o jogo tornou-se mais apelativo com a utilização de imagens bitmap, pois a parede já era representada por uma imagem de uma parede, o boneco por uma imagem de um cão, o ponto por uma imagem de um osso, a caixa por uma imagem de uma caixa e a caixa na posição final já era representada por uma imagem de um cão com um osso na boca.
- Ainda no desenho do jogo, foi utilizada a Tarefa 2 para que o jogo fosse desenhado com o mapa sem caracteres redundantes.
- Para se poder chamar de jogo ao “Dogoban” teria que haver interação com o jogador. Por isso, o segundo passo foi a implementação dos comandos de jogo. Foram implementados 6 comandos:
- \begin{itemize}
- \item Up – quando pressionada esta tecla o boneco move-se para cima (se possível);
- \item Down – quando pressionada esta tecla o boneco move-se para baixo (se possível);
- \item Left - quando pressionada esta tecla o boneco move-se para a esquerda (se possível);
- \item Right - quando pressionada esta tecla o boneco move-se para a direita (se possível);
- \item F2 - quando pressionada esta tecla o jogo começa de novo, sendo dado o mapa inicial;
- \item F1 - quando pressionada esta tecla é recuado um nível.
- \end{itemize}
- Nos comandos Up, Down, Left, Right foram utilizadas funções da Tarefa 4 pois, foi nessa tarefa que se definiu como o jogo se alteraria em relação a um comando específico.
- Para testar o jogo era necessário jogá-lo e conseguir ganhar mas, muitas vezes, com a execução de alguns comandos errados era impossível ganhar o jogo e para se poder voltar a jogar era necessário ter que ir ao terminal e abrir a tarefa novamente. Para poupar esse trabalho, acrescentou-se o comando F2 para que sempre que fosse impossível ganhar o jogo, o jogo se abrisse novamente após se pressionar nessa tecla.
- O terceiro passo foi adicionar uma condição ao jogo que não é comum num Sokoban normal. Como foi dito no primeiro passo, o nome dado a esta aproximação do Sokoban foi Dogoban. Isto porque o jogo baseia-se em cães. Como a maioria dos cães não gosta de água fez sentido acrescentar um “poço” ao jogo. Sempre que o cão fosse para a posição onde se encontrava o poço, o jogador perdia. Esta condição torna o jogo mais difícil mas também mais atrativo.
- O quarto e último passo resume-se à implementação de níveis. Apenas foram criados três níveis mas uma infinidade deles poderia ter sido criada. Quando completados os três níveis o jogo termina.
- \subsection{Testes}
- Nesta Secção serão abordados os testes feitos em cada tarefa e como estes possibilitaram a perceção de alguns erros existentes nas mesmas.
- \subsubsection{Tarefa 1 (A)}
- Na tarefa 1 foram realizados, no total, 16 testes que se encontram na pasta 'tests/Tarefa1' no svn. Cada teste teve como intuito verificar uma das condições necessárias para a validação do mapa, referidas na Secção~\ref{sec:intro}. De seguida, apresentam-se alguns dos testes feitos para esta tarefa:
- \begin{figure}[H]
- {\centering
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab3}
- \caption{Erro na linha 18}
- \label{fig:figure1}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab7}
- \caption{Erro na linha 12}
- \label{fig:figure2}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab5}
- \caption{Erro na linha 2}
- \label{fig:figure3}
- \end{minipage}\hfill
- }
- \end{figure}
- No teste da Figura~\ref{fig:figure1} verifica-se que o mapa tem mais coordenadas de caixas do que locais de arrumação, a Figura~\ref{fig:figure2} mostra um mapa sem as coordenadas, e na Figura~\ref{fig:figure3}
- pode ver-se que o tabuleiro não é apenas constituído por cardinais, pontos e espaços.
- \hspace{0.3cm}
- \begin{figure}[H]
- {\centering
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab10}
- \caption{Erro na linha 17}
- \label{fig:figure4}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab14}
- \caption{Erro na linha 10}
- \label{fig:figure5}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{1tab16}
- \caption{Mapa válido}
- \label{fig:figure6}
- \end{minipage}\hfill
- }
- \end{figure}
- Verifica-se na Figura~\ref{fig:figure4} que uma das coordenadas é constituída por mais do que 2 números inteiros positivos, na Figura~\ref{fig:figure5} mostra-se que todos os lados do tabuleiro não são compostos por cardinais e, por último, na Figura~\ref{fig:figure6} dá-se um exemplo de um mapa válido.
- \subsubsection{Tarefa 2 (B)}
- Na tarefa 2 foram realizados, no total, 8 testes que se encontram na pasta 'tests/Tarefa2' no svn. Cada teste teve como intuito validar a tarefa e verificar todos os casos possíveis de erros que poderiam ocorrer. De seguida, apresentam-se alguns dos testes feitos para esta tarefa:
- \begin{figure}[H]
- {\centering
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{2tab6}
- \captionof{figure}{Mapa inválido}
- \label{fig:figure7}
- \end{minipage}%
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{2tab8}
- \captionof{figure}{Mapa inválido}
- \label{fig:figure8}
- \end{minipage}
- }
- \end{figure}
- Na Figura~\ref{fig:figure7} verifica-se que a coordenada do boneco é igual a uma das coordenadas das caixas, o que faz com que o \textit{output} seja vazio. O mesmo acontece com o \textit{output} do teste da Figura~\ref{fig:figure8}, uma vez que a coordenada do boneco corresponde a um cardinal no tabuleiro.
- \hspace{0.3cm}
- \begin{figure}[H]
- {\centering
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{2tab5}
- \captionof{figure}{Mapa válido}
- \label{fig:figure9}
- \end{minipage}%
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{2tab5a}
- \captionof{figure}{Solução}
- \label{fig:figure10}
- \end{minipage}
- }
- \end{figure}
- Já na Figura~\ref{fig:figure9} pode-se ver um exemplo de um mapa válido, sendo a Figura~\ref{fig:figure10} o respetivo \textit{output}.
- \subsubsection{Tarefa 3 (C)}
- Na Tarefa 3 foram realizados, no total, 20 testes que se encontram na pasta 'tests/Tarefa3' no svn. Cada teste, tal como na tarefa 2, teve como objetivo verificar possíveis erros no código escrito. De seguida, apresentam-se alguns dos testes feitos para esta tarefa:
- \begin{figure}[H]
- {\centering
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{3tab1}
- \caption{O comando não é executado}
- \label{fig:figure11}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{3tab10}
- \caption{O comando não é executado}
- \label{fig:figure12}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{3tab20}
- \caption{O comando não é executado}
- \label{fig:figure13}
- \end{minipage}\hfill
- }
- \end{figure}
- Nos exemplos acima apresentados verifica-se que os comandos não são executados, cujas razões para tal são:
- \begin{itemize}
- \item Na Figura~\ref{fig:figure11}, à esquerda da posição do boneco encontra-se uma parede ('\#') e, por isso, não é possível este movimentar-se nessa direção.
- \item Na Figura~\ref{fig:figure12}, à esquerda da posição do boneco encontram-se duas caixas juntas, o que impossibilita o movimento deste nessa direção.
- \item Na Figura~\ref{fig:figure13}, à direita da posição do boneco encontra-se uma caixa encostada a uma parede e, portanto, o boneco não se movimenta.
- \end{itemize}
- \hspace{0.3cm}
- \begin{figure}[H]
- {\centering
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{3tab4}
- \captionof{figure}{O comando é executado}
- \label{fig:figure14}
- \end{minipage}%
- \begin{minipage}{.5\textwidth}
- \centering
- \includegraphics[width=.5\linewidth]{3tab8}
- \captionof{figure}{O comando é executado}
- \label{fig:figure15}
- \end{minipage}
- }
- \end{figure}
- Na Figura~\ref{fig:figure14}, na posição acima à do boneco encontra-se um espaço vazio e, como tal, o boneco movimenta-se para cima. Também, na Figura~\ref{fig:figure15}, observa-se que o boneco se consegue movimentar, uma vez que à sua esquerda se encontra apenas uma caixa e, consequentemente, este move a caixa.
- \subsubsection{Tarefa 4 (D)}
- Na tarefa 4 foram realizados, no total, 11 testes que se encontram na pasta 'tests/Tarefa4' no svn. Foram também realizados testes do HUnit, testes estes que permitiram verificar se havia irregularidades nas funções definidas nessa mesma tarefa. De seguida, apresentam-se alguns dos testes feitos para esta tarefa:
- \begin{figure}[H]
- {\centering
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab1}
- \caption{Jogo incompleto}
- \label{fig:figure16}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab7}
- \caption{Jogo incompleto}
- \label{fig:figure17}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab8}
- \caption{Jogo incompleto}
- \label{fig:figure18}
- \end{minipage}\hfill
- }
- \end{figure}
- Nas Figuras~\ref{fig:figure16},~\ref{fig:figure17} e~\ref{fig:figure18}, verifica-se que o jogo não chega ao fim, uma vez que as caixas não se encontram todas nos locais de arrumação, embora se veja que são executados todos os comandos na última figura.
- \hspace{0.3cm}
- \begin{figure}[H]
- {\centering
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab2}
- \caption{Jogo finalizado}
- \label{fig:figure19}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab3}
- \caption{Jogo finalizado}
- \label{fig:figure20}
- \end{minipage}\hfill
- \begin{minipage}[H]{0.3\textwidth}
- \centering
- \includegraphics[width=.8\linewidth]{4tab10}
- \caption{Jogo finalizado}
- \label{fig:figure21}
- \end{minipage}\hfill
- }
- \end{figure}
- Já nas Figuras~\ref{fig:figure19},~\ref{fig:figure20} e~\ref{fig:figure21}, pode ver-se que o jogo termina, sendo que na Figura~\ref{fig:figure19} nem todos os comandos são executados, na Figura~\ref{fig:figure20} todos os comandos são executados e na Figura~\ref{fig:figure21} verifica-se que não são fornecidos comandos.
- \subsubsection{Tarefa 5 (E)}
- Na tarefa 5 foram realizados, no total, 19 testes que se encontram na pasta 'tests/Tarefa5' no svn, como também testes HUnit. Todos eles foram feitos com o intuito de validar a tarefa, verificando, caso houvessem, os erros existentes. De seguida, apresentam-se alguns dos testes feitos para esta tarefa:
- \textbf{Input}: Circle 20
- \textbf{Output}: 40 40
- Como o raio do círculo é 20, o diâmetro é 40, logo o retângulo envolvente terá 40 de comprimento e 40 de largura.
- \textbf{Input}: Blank
- \textbf{Output}: 0 0
- Sendo \textit{Blank} uma figura em branco não admite qualquer retângulo envolvente, daí o \textit{output} ser 0 0 (comprimento e largura).
- \textbf{Input}: Pictures [Circle 20,Pictures [Blank,Translate 10.3 10.3 (Circle 20)]]
- \textbf{Output}: 50 50
- Primeiramente é feita a Picture Blank, que não tem retângulo envolvente como já foi referido, de seguida faz-se o Translate 10.3 10.3 (Circle 20), movendo-se este círculo, de diâmetro 40, 10.3 para a direita e 10.3 para cima, sobrando, assim, o Circle 20. Por fim, calcula-se o tamanho do retângulo envolvente dos dois círculos desenhados, sendo este 50 50 devido ao facto de ter havido um movimento de um dos círculos para cima e para a direita 10.3 e de este valor ser arredondado às unidades.
- \subsection{Tarefa 6 (F)}
- Para esta tarefa foram realizados testes HUnit que se podem ver em 'Tarefa6.hs', de modo a verificar todas as funções da mesma.
- \section{Conclusões}
- \label{sec:conclusao}
- Neste relatório, realizado com o intuito de explicar o projeto do jogo Sokoban, foram abordados os seguintes tópicos: a descrição do problema, a conceção da solução e sua implementação, e os testes.
- O resultado final, apesar de ser um jogo simples, corresponde às expectativas do grupo e permite ao utilizador usufruir de um momento de diversão.
- O objetivo deste projeto sempre foi seguir ao máximo o ideal do jogo Sokoban, um jogo simples mas que requer um razoável nível de perícia.
- Deste projeto, que consistia na realização de um jogo, a que o grupo denominou de Dogoban, apesar das adversidades e de algumas tarefas não terem sido totalmente concretizadas como era previsto, faz-se um balanço positivo, uma vez que a equipa trabalhou bem em conjunto e conseguiu executar o elemento de avaliação proposto na unidade curricular.
- \begin{figure}[H]
- \centering
- \includegraphics[width=.6\linewidth]{ResultadoFinal}
- \caption{Jogo Dogoban}
- \label{fig:my_label}
- \end{figure}
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement