• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ElFurriel

[C++] Ajuda: MineSweeper (Resolvido)

13 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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....  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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';
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado pela ajuda :cheesygrin:...

tofas o teu está um pouco confuso para mim, mas o TheDark já está mais proximo da minha maneira de trabalhar... :hmm: 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  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais ola a todos. Este é o meu primeiro post. ;):P

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais ola a todos. Este é o meu primeiro post. ;):P

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 :D 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, cá estou de volta, tenho andado a trabalhar no ambiente gráfico do programa em openGL :eek:, 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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A contagem das minas? Porque não usas uma variável global que afectas com o número de minas quando inicias o jogo, e decrementas à medida que vão sendo encontradas minas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como é k com o rato posso ter a certeza que ao clicar estou clikar em cima da "celula[ i ][ j ] " ?

props

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens várias maneiras, dependendo a complexidade do método que estás a utilizar para desenhar as casas no ecrã.

Estás a usar botões ou a desenhar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a desenhar, ainda nao percebi pk os desenhos das casas nao estão associados às coordenadas na matriz...

tenho a matriz desenhada num canto do ecra, mas com o rato a passar pelo resto nao desenhado às vezes piso minas ...

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora