Você está na página 1de 3

AVALIAÇÃO PRÁTICA - COMP1

IMPLEMENTAÇÃO DO JOGO CAMPO MINADO

1. Descrição do jogo
O jogo de campo minado consiste em identificar a posição de uma certa quantidade conhecida
de minas em um campo (tabuleiro) de tamanho variado. Cada casa do tabuleiro contém uma mina
ou um número. Esse número indica quantas minas existem nas 8 casas vizinhas. Inicialmente, o
conteúdo das casas do campo está todo escondido (casas fechadas). O jogador deve pedir para abrir
uma casa de cada vez. Caso seja uma mina, ele perde o jogo. Caso seja um número, ele continua
a jogar, até que só existam casas fechadas contendo minas. O jogador também tem a possibilidade
de marcar uma casa como sendo uma mina. Essa informação não é verificada pelo jogo, ou seja,
a casa fica marcada e fechada independentemente de ser uma mina ou não (serve apenas para o
jogador se lembrar que não deve abrir aquela casa).

2. Especificação do projeto
O jogo que você deve implementar é uma versão simples de um jogo de campo minado, sem
sofisticações gráficas.
A cada jogada as seguintes ações devem ocorrer:
• O jogo pede ao jogador uma nova jogada (explicando na mensagem a sintaxe esperada para
a entrada do jogador). Exemplo: “Digite três informações separadas por vı́rgula: Linha da
casa (1 a 8), coluna da casa (1 a 8) e se é pra cavar ou abrir (0 pra cavar, 1 para abrir)”
• O jogador fornece uma posição e indica se é para cavar (abrir a casa) ou apenas sinalizar
como mina, seguindo a sintaxe especificada.
• O programa valida os dados fornecidos pelo jogador (por exemplo, as coordenadas da casa
devem ser números de 1 até o tamanho do lado do tabuleiro). Caso o dado seja inválido,
avisa ao jogador e pede que o mesmo forneça novo dado.
• O programa abre ou marca a casa escolhida.
– Caso o jogador tenha pedido para marcar a casa, o campo é mostrado mais uma vez
com uma indicação de que a casa correspondente está marcada, e uma nova jogada
começa.
– Caso o jogador tenha pedido para abrir a casa e a casa contenha uma mina, o jogo
termina com um Boom!
– Caso o jogador tenha pedido para abrir uma casa sem mina, o campo é mostrado mais
uma vez com a nova casa aberta, e uma nova jogada começa.
Se o jogador conseguir completar o jogo, dá uma mensagem de parabéns.

Dica para ficar mais bonitinho: Você pode usar o caractere \u2705 (unicode) para marcar
uma casa onde o jogador acha que tem uma mina. Experimente dar print(’\u2705’) no shell
1
2 AVALIAÇÃO PRÁTICA - COMP1 IMPLEMENTAÇÃO DO JOGO CAMPO MINADO

para ver o que aparece. E pode pesquisar outros códigos para usar outros sı́mbolos, se quiser, no
site https://unicode-table.com/pt/blocks/

3. Parte 1: Módulo de inicialização do jogo


Desenvolva o módulo de funções de inicialização do jogo. Esse módulo deve necessariamente
conter uma função inicializa jogo, que cria o campo, distribui aleatoriamente as minas e cria
uma máscara correspondente ao campo que será mostrado para o jogador. Como essa função é
complexa, você deve criar uma ou mais funções que serão chamadas por ela, para fazer as diferentes
tarefas necessárias para montar o tabuleiro do jogo: criar o campo e uma máscara que indique as
casas abertas, fechadas e marcadas, espalhar as minas e fazer com que cada casa sem mina indique
corretamente a quantidade de minas nas casas suas vizinhas.
3.1. Estruturas de dados. O projeto terá duas estruturas de dados principais:
Campo: : O campo será uma matriz de dimensões n × n, contendo o caracter ’b’ nas posições
com minas e um número entre 0 e 8, nas casas sem minas, indicando quantas minas existem
nas 8 casas vizinhas.
Máscara: : A máscara será uma matriz de dimensões n × n, inicialmente toda preenchida
com algum caracter escolhido para indicar casa fechada.
O uso destas estruturas, tal como estão descritas, é obrigatório.
3.2. Funções fornecidas. Junto com o enunciado deste projeto, serão fornecidos o código de duas
funções. Você deve obrigatoriamente utilizá-las no seu projeto.
• Uma função chamada entorno que, dados uma linha (i) e coluna (j) e o tamanho n do lado
campo, devolve uma lista contendo as coordenadas (pares ordenados) das células vizinhas
a (i, j).
• Uma função atualiza vizinhos que, dado um campo já com as minas, atualiza o conteúdo
das células livres (sem mina) para que indiquem a quantidade de minas nas células suas
vizinhas.

3.3. Tarefas da parte 1 do projeto. Você precisará desenvolver:


• uma ou mais funções para a criação do campo vazio e da máscara. Essa(s) função(ões)
recebe(m) o tamanho do campo (n) e devem retornar 2 matrizes de dimensões n × n:
– Campo inicializado: o campo todo preenchido com zeros, onde serão posteriormente
distribuı́das as minas;
– Máscara inicial: a máscara toda preenchida com algum caracter para indicar casa
fechada.
• A função inicializa jogo, que vai usar todas essas outras funções (funções fornecidas e
feitas por você) e funções de sorteio aleatório (lembre-se do módulo random). Essa função
deve colocar as minas em posições aleatórias do campo inicializado e os números nas casas
vizinhas às minas de forma coerente.
• Uma função mostra campo para apresentar a situação do jogo para o usuário. Faça de
maneira que ela receba como argumento a matriz a ser mostrada e não retorne nada, apenas
imprima na tela a informação recebida com uma formatação em quadrado. Em curso de
execução do jogo, essa função imprimirá a máscara, mas durante o desenvolvimento e testes,
você pode querer também utilizar essa função para mostrar o campo de forma que você
possa ver onde foram colocadas as bombas e os números.
AVALIAÇÃO PRÁTICA - COMP1 IMPLEMENTAÇÃO DO JOGO CAMPO MINADO 3

DICA (não é obrigatório, mas pode ajudar): Para espalhar as minas é necessário saber quais
casas estão ainda livres. É útil ter uma variável na função inicializa jogo que mantém o registro
de que posições estão livres no momento de sortear a posição de uma nova mina. Caso contrário,
você pode perder tempo sorteando casas ocupadas, só para perceber depois que aquela casa não
servia (não é muito eficiente, né?). Essa informação pode ser armazenada em uma lista de pares,
inicialmente, contendo n2 elementos (as coordenadas de todas as posições da matriz). Você pode
criar essa lista na mesma função que cria o campo e/ou a máscara, ou pode ter uma função só para
criá-la.

Você também pode gostar