Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 28.83 KB | None | 0 0
  1. \documentclass[a4paper]{article}
  2.  
  3. \usepackage[utf8]{inputenc}
  4. \usepackage[portuges]{babel}
  5. \usepackage{a4wide}
  6. \usepackage{listings}
  7. \usepackage{graphicx}
  8. \usepackage{caption}
  9. \usepackage{subcaption}
  10. \usepackage[justification=centering]{caption}
  11. \usepackage{float}
  12. \usepackage{indentfirst}
  13. \usepackage{epstopdf}
  14.  
  15. \title{Projeto de Laboratórios de Informática 1\\Grupo li1g004}
  16. \author{Ana Catarina Gomes Rodrigues (A78763) \and Maria Elisa Maciel Valente (A79093)}
  17.  
  18. \begin{document}
  19.  
  20. \maketitle
  21.  
  22. \begin{abstract}
  23. 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.
  24. \end{abstract}
  25.  
  26. \tableofcontents
  27.  
  28.  
  29. \section{Introdução}
  30. \label{sec:intro}
  31.  
  32. 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.
  33.  
  34. 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.
  35.  
  36. 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.
  37.  
  38.  
  39. \section{Descrição do Problema}
  40. \label{sec:problema}
  41.  
  42. 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.
  43.  
  44. \subsection{Tarefa 1 (A)}
  45. \label{subsec:prob1}
  46.  
  47. Na Tarefa 1 era pedido para verificar se o mapa que era fornecido obedecia determinados padrões, que eram os seguintes:
  48. \begin{itemize}
  49.  \item O mapa tinha de ser um retângulo;
  50.  \item Todos os lados do mapa tinham de ser compostos por cardinais;
  51.  \item O mapa tinha de ser constituído pelo tabuleiro (cardinais, pontos e espaços) e pelas coordenadas (do boneco e das caixas);
  52.  \item Não podia haver mais locais de arrumação (pontos) do que coordenadas de caixas ou vice-versa;
  53.  \item A coordenada do boneco não podia corresponder a um cardinal no tabuleiro, assim como nenhuma das coordenadas das caixas;
  54.  \item O tabuleiro tinha de ser constituído apenas por cardinais, pontos e espaços;
  55.  \item As coordenadas tinham de ser compostas apenas por dois números inteiros positivos;
  56.  \item As coordenadas não podiam sair fora do tabuleiro.
  57. \end{itemize}
  58.  
  59. \subsection{Tarefa 2 (B)}
  60. \label{subsec:prob2}
  61.  
  62. 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}.
  63.  
  64.  
  65. \subsection{Tarefa 3 (C)}
  66.  
  67. 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.
  68.  
  69.  
  70. \subsection{Tarefa 4 (D)}
  71. \label{subsec:prob4}
  72.  
  73. 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.
  74.  
  75.  
  76. \subsection{Tarefa 5 (E)}
  77.  
  78. 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.
  79.  
  80.  
  81. \subsection{Tarefa 6 (F)}
  82.  
  83. 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.
  84.  
  85.  
  86. \section{Conceção da Solução}
  87. \label{sec:solucao}
  88.  
  89. 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).
  90.  
  91.  
  92. \subsection{Estruturas de Dados}
  93.  
  94. De seguida, serão apresentadas as estruturas de dados mais relevantes para a obtenção da solução pretendida em cada uma das tarefas:
  95.  
  96. \begin{lstlisting}
  97. type Planta = [String]
  98. type Pos = (Int, Int)
  99. type Cmd = Char
  100. type Posfinal = [(Int, Int)]
  101. type Estado = (Planta, Pos, Posfinal)
  102. type RectEnv = [Point]
  103. type Mundo = ([String],[Picture],[Picture],[String],
  104. String,String,[String],[String],[String])
  105. \end{lstlisting}
  106.  
  107. Todos estes tipos foram criados para facilitar a leitura das funções e a sua compreensão.
  108.  
  109. \subsection{Implementação}
  110.  
  111. 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.
  112.  
  113.  
  114. \subsubsection{Tarefa 1 (A)}
  115.  
  116. 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).
  117.  
  118. 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.
  119.  
  120. 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.
  121.  
  122. 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).
  123.  
  124. 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).
  125.  
  126. 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).
  127.  
  128.  
  129. \subsubsection{Tarefa 2 (B)}
  130.  
  131. 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.
  132.  
  133. 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.
  134.  
  135.  
  136. \subsubsection{Tarefa 3 (C)}
  137. \label{subsubsec:Imp3}
  138.  
  139. 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:
  140.  
  141. \begin{itemize}
  142.     \item Se à esquerda da posição do boneco se encontra um cardinal - O comando não é executado
  143.     \item Se à esquerda da posição do boneco se encontram duas caixas juntas - O comando não é executado
  144.     \item Se à esquerda da posição do boneco se encontra uma caixa encostada a uma parede - O comando não é executado
  145.     \item Se à esquerda da posição do boneco se encontra uma caixa e ao lado dessa está um espaço vazio - O comando é executado
  146.     \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
  147. \end{itemize}
  148.  
  149. 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.
  150.  
  151.  
  152. \subsubsection{Tarefa 4 (D)}
  153.  
  154. 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:
  155. \begin{itemize}
  156.     \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.
  157.     \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.
  158.     \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.
  159. \end{itemize}
  160.  
  161.  
  162. \subsubsection{Tarefa 5 (E)}
  163.  
  164. 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}.
  165.  
  166. 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.
  167.  
  168. 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:
  169. \begin{itemize}
  170.     \item[] Através de um dado ponto, calculou-se a hipotenusa e o ângulo que esse ponto fazia com o eixo das abcissas.
  171.     \item[] 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).
  172.     \item[] Depois aplicou-se o rodarPontos aos pontos da figura (\textit{Circle}, \textit{Polygon}, \textit{Line} ou \textit{Blank}).
  173.     \item[] Por fim, obteu-se o retângulo envolvente da figura rodada.
  174.  
  175. Observação: É de notar que tanto o \textit{Circle} como o \textit{Blank} não se alteram com o \textit{Rotate}.
  176.  
  177. \end{itemize}
  178.  
  179. \subsubsection{Tarefa 6 (F)}
  180.  
  181. 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.
  182.  
  183. 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”.
  184.  
  185. 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.
  186.  
  187. Ainda no desenho do jogo, foi utilizada a Tarefa 2 para que o jogo fosse desenhado com o mapa sem caracteres redundantes.
  188.  
  189. 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:
  190. \begin{itemize}
  191.     \item Up – quando pressionada esta tecla o boneco move-se para cima (se possível);
  192.     \item Down – quando pressionada esta tecla o boneco move-se para baixo (se possível);
  193.     \item Left - quando pressionada esta tecla o boneco move-se para a esquerda (se possível);
  194.     \item Right - quando pressionada esta tecla o boneco move-se para a direita (se possível);
  195.     \item F2 - quando pressionada esta tecla o jogo começa de novo, sendo dado o mapa inicial;
  196.     \item F1 -  quando pressionada esta tecla é recuado um nível.
  197. \end{itemize}
  198.  
  199. 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.
  200.  
  201. 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.
  202.  
  203. 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.
  204.  
  205. 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.
  206.  
  207. \subsection{Testes}
  208.  
  209. 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.
  210.  
  211.  
  212. \subsubsection{Tarefa 1 (A)}
  213.  
  214. 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:
  215.  
  216. \begin{figure}[H]
  217. {\centering
  218. \begin{minipage}[H]{0.3\textwidth}
  219.     \centering
  220.     \includegraphics[width=.8\linewidth]{1tab3}
  221.     \caption{Erro na linha 18}
  222.     \label{fig:figure1}
  223. \end{minipage}\hfill
  224. \begin{minipage}[H]{0.3\textwidth}
  225.     \centering
  226.     \includegraphics[width=.8\linewidth]{1tab7}
  227.     \caption{Erro na linha 12}
  228.     \label{fig:figure2}
  229. \end{minipage}\hfill
  230. \begin{minipage}[H]{0.3\textwidth}
  231.     \centering
  232.     \includegraphics[width=.8\linewidth]{1tab5}
  233.     \caption{Erro na linha 2}
  234.     \label{fig:figure3}
  235. \end{minipage}\hfill
  236. }
  237. \end{figure}
  238.  
  239. 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}
  240. pode ver-se que o tabuleiro não é apenas constituído por cardinais, pontos e espaços.
  241.  
  242. \hspace{0.3cm}
  243.  
  244. \begin{figure}[H]
  245. {\centering
  246. \begin{minipage}[H]{0.3\textwidth}
  247.     \centering
  248.     \includegraphics[width=.8\linewidth]{1tab10}
  249.     \caption{Erro na linha 17}
  250.     \label{fig:figure4}
  251. \end{minipage}\hfill
  252. \begin{minipage}[H]{0.3\textwidth}
  253.     \centering
  254.     \includegraphics[width=.8\linewidth]{1tab14}
  255.     \caption{Erro na linha 10}
  256.     \label{fig:figure5}
  257. \end{minipage}\hfill
  258. \begin{minipage}[H]{0.3\textwidth}
  259.     \centering
  260.     \includegraphics[width=.8\linewidth]{1tab16}
  261.     \caption{Mapa válido}
  262.     \label{fig:figure6}
  263. \end{minipage}\hfill
  264. }
  265. \end{figure}
  266.  
  267. 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.
  268.  
  269.  
  270. \subsubsection{Tarefa 2 (B)}
  271.  
  272. 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:
  273.  
  274. \begin{figure}[H]
  275. {\centering
  276. \begin{minipage}{.5\textwidth}
  277.  \centering
  278.  \includegraphics[width=.5\linewidth]{2tab6}
  279.  \captionof{figure}{Mapa inválido}
  280.  \label{fig:figure7}
  281. \end{minipage}%
  282. \begin{minipage}{.5\textwidth}
  283.  \centering
  284.  \includegraphics[width=.5\linewidth]{2tab8}
  285.  \captionof{figure}{Mapa inválido}
  286.  \label{fig:figure8}
  287. \end{minipage}
  288. }
  289. \end{figure}
  290.  
  291. 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.
  292.  
  293. \hspace{0.3cm}
  294.  
  295. \begin{figure}[H]
  296. {\centering
  297. \begin{minipage}{.5\textwidth}
  298.  \centering
  299.  \includegraphics[width=.5\linewidth]{2tab5}
  300.  \captionof{figure}{Mapa válido}
  301.  \label{fig:figure9}
  302. \end{minipage}%
  303. \begin{minipage}{.5\textwidth}
  304.  \centering
  305.  \includegraphics[width=.5\linewidth]{2tab5a}
  306.  \captionof{figure}{Solução}
  307.  \label{fig:figure10}
  308. \end{minipage}
  309. }
  310. \end{figure}
  311.  
  312. 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}.
  313.  
  314.  
  315. \subsubsection{Tarefa 3 (C)}
  316.  
  317. 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:
  318.  
  319. \begin{figure}[H]
  320. {\centering
  321. \begin{minipage}[H]{0.3\textwidth}
  322.     \centering
  323.     \includegraphics[width=.8\linewidth]{3tab1}
  324.     \caption{O comando não é executado}
  325.     \label{fig:figure11}
  326. \end{minipage}\hfill
  327. \begin{minipage}[H]{0.3\textwidth}
  328.     \centering
  329.     \includegraphics[width=.8\linewidth]{3tab10}
  330.     \caption{O comando não é executado}
  331.     \label{fig:figure12}
  332. \end{minipage}\hfill
  333. \begin{minipage}[H]{0.3\textwidth}
  334.     \centering
  335.     \includegraphics[width=.8\linewidth]{3tab20}
  336.     \caption{O comando não é executado}
  337.     \label{fig:figure13}
  338. \end{minipage}\hfill
  339. }
  340. \end{figure}
  341.  
  342. Nos exemplos acima apresentados verifica-se que os comandos não são executados, cujas razões para tal são:
  343. \begin{itemize}
  344.     \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.
  345.     \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.
  346.     \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.
  347. \end{itemize}
  348.  
  349. \hspace{0.3cm}
  350.  
  351. \begin{figure}[H]
  352. {\centering
  353. \begin{minipage}{.5\textwidth}
  354.  \centering
  355.  \includegraphics[width=.5\linewidth]{3tab4}
  356.  \captionof{figure}{O comando é executado}
  357.  \label{fig:figure14}
  358. \end{minipage}%
  359. \begin{minipage}{.5\textwidth}
  360.  \centering
  361.  \includegraphics[width=.5\linewidth]{3tab8}
  362.  \captionof{figure}{O comando é executado}
  363.  \label{fig:figure15}
  364. \end{minipage}
  365. }
  366. \end{figure}
  367.  
  368. 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.
  369.  
  370.  
  371. \subsubsection{Tarefa 4 (D)}
  372.  
  373. 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:
  374.  
  375. \begin{figure}[H]
  376. {\centering
  377. \begin{minipage}[H]{0.3\textwidth}
  378.     \centering
  379.     \includegraphics[width=.8\linewidth]{4tab1}
  380.     \caption{Jogo incompleto}
  381.     \label{fig:figure16}
  382. \end{minipage}\hfill
  383. \begin{minipage}[H]{0.3\textwidth}
  384.     \centering
  385.     \includegraphics[width=.8\linewidth]{4tab7}
  386.     \caption{Jogo incompleto}
  387.     \label{fig:figure17}
  388. \end{minipage}\hfill
  389. \begin{minipage}[H]{0.3\textwidth}
  390.     \centering
  391.     \includegraphics[width=.8\linewidth]{4tab8}
  392.     \caption{Jogo incompleto}
  393.     \label{fig:figure18}
  394. \end{minipage}\hfill
  395. }
  396. \end{figure}
  397.  
  398. 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.
  399.  
  400. \hspace{0.3cm}
  401.  
  402. \begin{figure}[H]
  403. {\centering
  404. \begin{minipage}[H]{0.3\textwidth}
  405.     \centering
  406.     \includegraphics[width=.8\linewidth]{4tab2}
  407.     \caption{Jogo finalizado}
  408.     \label{fig:figure19}
  409. \end{minipage}\hfill
  410. \begin{minipage}[H]{0.3\textwidth}
  411.     \centering
  412.     \includegraphics[width=.8\linewidth]{4tab3}
  413.     \caption{Jogo finalizado}
  414.     \label{fig:figure20}
  415. \end{minipage}\hfill
  416. \begin{minipage}[H]{0.3\textwidth}
  417.     \centering
  418.     \includegraphics[width=.8\linewidth]{4tab10}
  419.     \caption{Jogo finalizado}
  420.     \label{fig:figure21}
  421. \end{minipage}\hfill
  422. }
  423. \end{figure}
  424.  
  425. 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.
  426.  
  427.  
  428. \subsubsection{Tarefa 5 (E)}
  429.  
  430. 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:
  431.  
  432. \textbf{Input}: Circle 20
  433.  
  434. \textbf{Output}: 40 40
  435.  
  436. Como o raio do círculo é 20, o diâmetro é 40, logo o retângulo envolvente terá 40 de comprimento e 40 de largura.
  437.  
  438. \textbf{Input}: Blank
  439.  
  440. \textbf{Output}: 0 0
  441.  
  442. Sendo \textit{Blank} uma figura em branco não admite qualquer retângulo envolvente, daí o \textit{output} ser 0 0 (comprimento e largura).
  443.  
  444. \textbf{Input}: Pictures [Circle 20,Pictures [Blank,Translate 10.3 10.3 (Circle 20)]]
  445.  
  446. \textbf{Output}: 50 50
  447.  
  448. 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.
  449.  
  450.  
  451. \subsection{Tarefa 6 (F)}
  452.  
  453. Para esta tarefa foram realizados testes HUnit que se podem ver em 'Tarefa6.hs', de modo a verificar todas as funções da mesma.
  454.  
  455.  
  456. \section{Conclusões}
  457. \label{sec:conclusao}
  458.  
  459. 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.
  460.  
  461. 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.
  462.  
  463. 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.
  464.  
  465. 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.
  466.  
  467. \begin{figure}[H]
  468. \centering
  469. \includegraphics[width=.6\linewidth]{ResultadoFinal}
  470. \caption{Jogo Dogoban}
  471. \label{fig:my_label}
  472. \end{figure}
  473.  
  474. \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement