Jump to content

[C++] Ajuda: MineSweeper (Resolvido)


ElFurriel

Recommended Posts

Boas! eu sou novato nestas andanças, e tenho de fazer um projecto para uma cadeira da faculdade acerca do jogo de minas do windows.

ou melhor tenho de fazer em C++ o jogo.

?

Eu gostava que me ajudassem numa coisa. eu para fazer a janela estou a pensar utilizar uma tabela [10][10] por exemplo, mas depois não sei o que posso utilizar para por as minas aleatóriamente.

eu sei que existe a função Rand, mas não sei aplica-la... será que alguem me pode dar umas luzes, isto é mostrar-me como se faz para criar aleatóriamente um numero fixo de minas,

neste caso 8?

Atenciosamente....

ElFurriel

Link to comment
Share on other sites

        tipo se fosse 3 X 3 e tivesse a matriz minas[3][3]

        - inicias com algo...

        - depois queres colocar objectos, fazes algo do genero....

    crias a função para gerar os numeros aleatorios:

   

  
int aleatorio(){
int n;

n=rand()%3; // vai gerar um numero que e o resto da divisao por 3 ( porque quero valores : 0, 1, 2)
return n; // devolve o numero gerado

};

 

e depois para gerar a atribuição aleatoria da mina.... algo deste genero  :dontgetit:

  

       mudou=0;// para entrar no ciclo e sinal que ainda nao mudou o valor da matriz....
           inic_Random(); // iniciar a semente
	    while( mudou!=1 && jogadas<10)
	    {   
	      // vai obtendo jogadas ate encontrar uma possivel ou seja, vai escolher os indices da matriz de modo que estejam vazios....  
	              i=aleatorio();
		     j=aleatorio();

                         if( ocupado(i,j)==0 )  // ocupado(i,j) é 1 funcao para ver se a matriz no indice indicado esta vazio....
		  {  
			 minas[i][j]=objecto;  // vai colocar na posicao (i,j) o objecto que quero...
			 jogadas++; // se conseguiu fazer a tal jogada, foi efectuada +1 jogada
			 mudou=1;   // conseguiu obter uma jogada possivel
		}
                  }

espero que tenhas percebido e te tenha ajudado....

tentei adpatar uma parte do codigo do meu jogo do galo ao que perguntavas...e espero que ajude....  😁

Link to comment
Share on other sites

Tenta compreender este código. Se tiveres dúvidas respondo amanhã, que estou a morrer de sono  :sleep1:

#include <algorithm>		//rand(), srand()
#include <time.h>		//time()
#include <memory.h>		//memset()
#include <iostream>		//cout

#define MAX_X 10		//numero maximo de colunas
#define MAX_Y 10		//numero maximo de linhas
#define NUM_MINES 8		//numero de minas a gerar

char matriz[MAX_Y][MAX_X+1];	//matriz bidimiensional com as dimensoes anteriores.
			//o MAX_X+1 e so para facilitar a escrita no ecra do mapa de minas

void main() {
srand((unsigned)time(NULL));		//inicializar a funcao rand()

memset(matriz, '.', (MAX_X+1)*MAX_Y);	//inicializar o conteudo da matriz com pontos
					//para facilitar a visualizacao do mapa de minas

for(int i=0; i<MAX_Y; ++i)		//colocar o ultimo elemento de cada linha a 0
	matriz[i][MAX_X]=0;		//de novo para facilitar a escrita no ecra

int x, y;	//coordenadas da matriz

for (int i=0; i<NUM_MINES; ++i) {	//plantar as minas
	do {
		x=rand() % MAX_X;	//obter coordenadas aleatorias
		y=rand() % MAX_Y;
	}
	while(matriz[y][x] != '.');	//enquanto nao encontrar uma posicao vazia
	matriz[y][x]='M';		//quando encontra uma posicao vazia, coloca uma mina
}

for(int i=0; i<MAX_Y; ++i)		//mostrar o mapa de minas no cout
	std::cout << matriz[i] << '\n';
}

Desaparecido.

Link to comment
Share on other sites

Muito obrigado pela ajuda 😁...

tofas o teu está um pouco confuso para mim, mas o TheDark já está mais proximo da minha maneira de trabalhar... ? mesmo assim há uma coisa que não entendo:

memset(matriz, '.', (MAX_X+1)*MAX_Y);	//inicializar o conteudo da matriz com pontos
			//para facilitar a visualizacao do mapa de minas 	

for(int i=0; i<MAX_Y; ++i)		//colocar o ultimo elemento de cada linha a 0		
matriz[i][MAX_X]=0;		//de novo para facilitar a escrita no ecra

nunca trabalhei com o memset, e não consigo enter muito bem qual o seu trabalho. ?,  e a parte de colocaros pontos... também não entendo o raciocinio, será que me podias ajudar?

muito obrigado pelo tempo dispendido...

Obrigado....

ElFurriel

PS: Usa a ferramenta GeSHi para postares o código, assim o teu código fica mais legível.

      Ass. bk@ero  😉

Link to comment
Share on other sites

Antes de mais ola a todos. Este é o meu primeiro post. 😉😛

memset serve para prencher array com um valor, neste caso os pontos.

Os pontos estão para te mostrar a superficie de jogo.

O ultimo elemento a zero serve para sinalizar o fim de string.

Exactamente 😄 E benvindo!

Tanto os pontos como o 0 no final de cada linha são só para facilitar os couts mais abaixo: os pontos para que o mapa se torne mais legível, e os 0s para o cout saber onde parar.

Desaparecido.

Link to comment
Share on other sites

  • 2 weeks later...

Boas, cá estou de volta, tenho andado a trabalhar no ambiente gráfico do programa em openGL ?, e n tive muito tempo para ver esta parte...

tb já ficou resolvida mas agora n sei como fazer para acrescentar a contagem das minas á minha função, se utilizo um ciclo for ou if, é preciso muitas linhas de código e sinceramente não me está a dar, o computador até já me devolve smiles  😉 em vez de numeros!!!!!~

se me pudessem dar uma maozinha...

obrigado e desculpem pelo incómodo...

Link to comment
Share on other sites

Eu não me fiz entender.... 😉

eu consig colocar as minas, e etilizo um contador para saber quantas lá estão, o meu problemas é mesmo conseguir contabilizar as que estão nas proximidades, ou seja, como é quer faço para que as casas á volta da mina teren a quantidade de minas na proximidade.

já tentei fazer com if e for, mas deu para lá de 50 linhas de código e não funcionou como eu esperava. vou tentar encontrar uma solução mas se fosse possivel darem-me uma mãozinha e darem uma ideia ajudava...

Atenciosamente...

ElFurriel

Link to comment
Share on other sites

Ah ok. Então, segundo o que disseste no post anterior, tens neste momento um quadro com 10x10. Uma ideia do que terás que fazer é:

int avolta=0;
for (int yy=-1; yy<=1; ++yy) {				//percorre a linha acima, a linha da casa escolhida, e a linha abaixo
if (y+yy < 0 || y+yy > 9) continue;		//se a linha estiver fora do quadro, passa para a proxima linha
for (int xx=-1; xx<=1; ++xx) {
	if (x+xx < 0 || x + xx > 9) continue;	//a casa esta fora do quadro, passa a proxima coluna
	if (linhas[y+yy][x+xx]) == 'M')		//se existir mina na casa verificada, incrementa o contador de minas existentes a volta
		++avolta;
}
}

O código anterior supõe que:

  • x e y contêm as coordenadas da casa escolhida;
  • linhas é um array de 2 dimensões que contém o quadro de jogo;
  • uma mina no array linhas é representada pelo caracter 'M'

Penso que é tudo...

EDIT: isto não faz com que o array fique com o numero de minas existentes à volta de cada casa. O que faz é dada uma casa, conta o número de minas à sua volta.

Desaparecido.

Link to comment
Share on other sites

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.