\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\usepackage{pifont}
\usepackage{epsf}

\setlength{\textwidth}     {15.0cm}
\setlength{\textheight}    {21.0cm}
\setlength{\evensidemargin}{ 0.5cm}
\setlength{\oddsidemargin} { 0.5cm}
\setlength{\topmargin}     {-0.5cm}
\setlength{\baselineskip}  { 0.7cm}

\setlength{\parskip}{0.3cm}

\begin{document}

\begin{center}

{\bf \large MAC 110 -- Introdu\c{c}\~ao à Computa\c{c}\~ao}

Terceiro Exerc\'{\i}cio--Programa

{\bf \large O ca\c{c}ador de minas}

\end{center}

Muitos de voc\^es devem conhecer um jogo bastante interessante do
Windows: o {\em campo minado}.  O objetivo desse exerc\'\i
cio--programa \'e implementar uma vers\~ao deste jogo.

\section*{Descri\c c\~ao do jogo}

Inicialmente o usu\'ario define o tamanho da matriz do jogo ($m \times
n$) e o n\'umero de minas $z$ que devem estar escondidas l\'a dentro.
A seguir as $z$ minas s\~ao distribu\'\i das aleatoriamente na matriz.

No in\'\i cio do jogo todas as posi\c c\~oes da matriz est\~ao
fechadas.  A partir da\'{\i} o usu\'ario ``chuta'' posi\c c\~oes da
matriz do jogo onde ele espera que n\~ao existam minas. Se ele chutar
uma posi\c c\~ao com mina o jogo acaba (afinal o usu\'ario morreu...),
sen\~ao a matriz \'e novamente mostrada na tela com essa posi\c c\~ao
aberta, mostrando o n\'umero de minas vizinhas a essa posi\c c\~ao.
Caso n\~ao hajam minas vizinhas \`a posi\c c\~ao que o usu\'ario
forneceu, ent\~ao todos os vizinhos s\~ao abertos. Observe que pode
ocorrer que uma dessas posi\c c\~oes abertas seja novamente uma posi\c
c\~ao que n\~ao tem minas vizinhas, e ent\~ao todos os seus vizinhos
devem ser abertos e assim sucessivamente.

O objetivo do jogo \'e descobrir a posi\c c\~ao de todas as minas, ou
seja, abrir as $m.n - z$ posi\c c\~oes da matriz que n\~ao t\^em
minas.

Exemplo: Dado $m=4$, $n=4$ e $z = 5$. Suponhamos que as posi\c c\~oes
com minas na matriz sejam (1,1), (1,2), (1,3), (2,1) e (4,2) (claro
que o usu\'ario n\~ao sabe disso!!).


\begin{verbatim}
De o numero de linhas da matriz do jogo: 4
De o numero de colunas da matriz do jogo: 4
De o numero de minas: 5
\end{verbatim}
\newpage
\begin{verbatim}
Bem vindo ao caca minas!
Situacao atual (restam 11 posicoes livres)
      1 2 3 4
    +--------+
  1 | . . . .|  1
  2 | . . . .|  2
  3 | . . . .|  3
  4 | . . . .|  4
    +--------+
      1 2 3 4
Proximo chute:  2 4
Situacao atual (restam 10 posicoes livres)
      1 2 3 4
    +--------+
  1 | . . . .|  1
  2 | . . . 1|  2
  3 | . . . .|  3
  4 | . . . .|  4
    +--------+
      1 2 3 4
Proximo chute: 4 4
Situacao atual (restam 5 posicoes livres)
      1 2 3 4
    +--------+
  1 | . . . .|  1
  2 | . . 2 1|  2
  3 | . . 1 0|  3
  4 | . . 1 0|  4
    +--------+
      1 2 3 4
Proximo chute: 1 1
BOOOOOOOM!!! Voce acaba de pisar em uma mina
      1 2 3 4
    +--------+
  1 |-1-1-1 1|  1
  2 |-1 4 2 1|  2
  3 | 2 2 1 0|  3
  4 | 1-1 1 0|  4
    +--------+
      1 2 3 4  
\end{verbatim}


Seu programa deve simular a execu\c c\~ao desse jogo, ou seja, seu
programa deve ler os valores $m, n$ e $z$ dados pelo usu\'ario e criar
uma matriz $A$ de jogo onde

\[ A[i,j] = \left\{ \begin{array}{ll}
                       -1, & \mbox{caso haja uma mina na posi\c c\~ao} (i,j), \\
                        k, & \mbox{caso contr\'ario} 
                    \end{array}\right.
\] 
onde $k$ \'e o n\'umero de minas nas posi\c c\~oes adjacentes a
$(i,j)$ na matriz (s\~ao, no m\'aximo, 8). Al\'em disso, seu programa
deve manter um marcador para cada posi\c c\~ao, indicando se ela
est\'a aberta ou fechada. Para sortear as posi\c c\~oes das minas na
matriz voc\^e pode usar a fun\c c\~ao de geração de números aleatórios
do C (veja as funções \texttt{rand()} e \texttt{srand()} da biblioteca
\texttt{stdlib.h}).

A seguir, seu programa dever\'a ler uma seq\"u\^encia de posi\c c\~oes
da matriz fornecidas pelo usu\'ario. Verifique inicialmente se é uma
posição válida para as dimensões do tabuleiro. Caso a posi\c c\~ao
esteja ocupada por uma mina, voc\^e deve dar uma mensagem, imprimir o
tabuleiro aberto e o jogo acaba. Se a posição fornecida já estiver
aberta, imprima uma mensagem e continue o jogo. Caso seja uma posição
fechada e que não esteja ocupada por uma mina, abra essa posi\c c\~ao
e, caso seja uma posi\c c\~ao sem minas vizinhas, seus vizinhos (e
caso um desses vizinhos também não tenha minas vizinhas, seus
vizinhos, e assim por diante).  O jogo termina quando todas as posi\c
c\~oes livres estiverem abertas.

\end{document}
