Juego de las 8 reinas

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Fede_Suarez
Mensajes: 39
Registrado: 29/10/2017 1:05 pm

Juego de las 8 reinas

#1 Mensaje por Fede_Suarez » 02/07/2018 3:24 pm

Hola, que tal, les comento que estaba tratando de resolver el problema de las 8 reinas, que consiste en colocar 8 reinas en un tablero de ajedrez sin que ninguna amenace a la otra, y la verdad es que creo que el programa está bien, es decir, no le encuentro errores, pero de todas formas no funciona:
-El programa se detiene y se cierra.
-El programa se congela y no pasa nada.
-El programa coloca mal las reinas.

Bueno...acá las dejo el código:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

int tablero[8][8], x, y, c=0;

void titulo(){
	system ("cls");
	printf ("\n\t\t 8 REINAS\n\n");
}

void imp(){
	titulo();
	for(int i=0; i<8 ;i++){
		for (int j=0; j<8 ;j++){
			
			if (tablero[i][j]==0){
				printf ("   %c", 176);
			}
			else{
				printf ("   0");
			}
			
		}
		printf ("\n\n");
	}
}

void inicializar(){
	for (int i=0; i<8 ;i++){
		for(int j=0; j<8 ;j++){
			tablero[i][j]=0;
		}
	}
}

bool verificar(int a, int b){
	int aux=0;
	//HORIZONTAL_1
	
	for (int i=a; i<8 ;i++){
		if (tablero[b][i]==1){
			aux++;
		}
	}
	
	//HORIZONTAL_2
	
	for (int i=a; i>0 ;i--){
		if (tablero[b][i]==1){
			aux++;
		}
	}
	
	//VERTICAL_1
	
	for (int i=b; i<8 ;i++){
		if (tablero[i][a]==1){
			aux++;
		}
	}
	
	//VERTICAL_2
	
	for (int i=b; i>0 ;i--){
		if (tablero[i][a]==1){
			aux++;
		}
	}
	
	// IZQ-SUP
	
	int j=a, i=b;
	while(j>0 && i>0){
		i--;j--;
		if(tablero[i][j]==1){
			aux++;
		}
	}
	
	// IZQ-INF
	j=a; i=b;
	while(j>0 && i<8){
		i++;j--;
		if(tablero[i][j]==1){
			aux++;
		}
	}
	
	// DER-SUP
	
	j=a; i=b;
	while(j<8 && i>0){
		i--;j++;
		if(tablero[i][j]==1){
			aux++;
		}
	}
	
	// DER-INF
	
	j=a; i=b;
	while(j<8 && i<8){
		i++;j++;
		if(tablero[i][j]==1){
			aux++;
		}
	}
	
	/*--------verificar-------*/
	if (aux==0){
		return true;
	}
	else{
		return false;
	}
}

void colocar(){
	srand(time(NULL));
	x=rand()%9;
	y=rand()%9;
	if (verificar(x,y)==true){
		c++;
		tablero[y][x]=1;
		imp();
	}
	else{
		colocar();
	}
}

int main(){
	inicializar();
	do{
		colocar();
	}
	while(c<=8);
	return 0;
}
Desde ya muchas gracias : )

mollok
Mensajes: 521
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Juego de las 8 reinas

#2 Mensaje por mollok » 03/07/2018 7:59 am

A tu código le falta mucho. El obtener una posición aleatoria buena que posiciones las ocho reinas puede tardar muchísimo en producirse.
Te paso un vídeo que explica de una manera muy entretenida como resolver tu problema. Para aligerar se basa en 4 reinas, pero puedes hacerlo extensible a 8 con poco trabajo.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Fede_Suarez
Mensajes: 39
Registrado: 29/10/2017 1:05 pm

Re: Juego de las 8 reinas

#3 Mensaje por Fede_Suarez » 03/07/2018 5:17 pm

Que te parece la idea de colocar una reina y a partir de esa marcar todas las posiciones en las que no se puede colocar una reina, y cuando se encuentra un lugar que si se puede, la coloca y vuelve a marcar las posiciones que esta reina amenaza, y que las reinas no se vallan colocando aleatoriamente, sino que vallan incrementando a partir de el teblero[0][0]

mollok
Mensajes: 521
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Juego de las 8 reinas

#4 Mensaje por mollok » 04/07/2018 4:56 am

No me gusta, si ves el video verás que en la casilla 0, 0 no puede ir una reina. Si fuese así el juego no sería un desafío para humanos.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: Juego de las 8 reinas

#5 Mensaje por daltomi » 07/07/2018 1:24 pm

Buenas.

Nota: se recomienda (y mucho) que la función srand debe llamarse una sóla vez, al inicio del programa.
Ya que time(NULL) devuelve el tiempo en segundos y la función colocar, que usa a srand, tiene muchos ciclos en ese segundo srand(time(NULL)) va a devolver la misma semilla.
+Info

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 4 invitados