Hundir la flota

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
Avatar de Usuario
Lost
Mensajes: 11
Registrado: 01/03/2006 12:00 am

Hundir la flota

#1 Mensaje por Lost » 14/03/2006 4:02 am

Alguien dispone del codigo de este juego? gracias

Avatar de Usuario
Lost
Mensajes: 11
Registrado: 01/03/2006 12:00 am

#2 Mensaje por Lost » 19/03/2006 9:15 am

dispongo del siguiente codigo:
como puedo hacer para que me genera la posicion aleatoriamente la maquina con los barcos? gracias

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define FILAS 10
#define COLUMNAS 10


/*Dclaramos las funciones que vamos a usar*/
void mostrar_tablero();
void mostrar_lin(int n);

int matriz[FILAS][COLUMNAS];
int i,j,opcion;

/*Inicio*/
void main(){
	for(i=0;i<FILAS;i++){
	  for(j=0;j<COLUMNAS;j++){
		matriz[i][j] = 0;
	  }
  }
	mostrar_tablero();
	scanf("%i",&opcion);
	do{
		printf("\nError!!!.La opcion escogida no es correcta.\n\n");
		getch();
		clrscr();
		mostrar_tablero();
		scanf("%i",&opcion);
	}
	while(opcion<1 || opcion>2);
	//if(opcion==1){
		//colocar();
}
void mostrar_lin(int n)/*Nos enseña las lineas horizontales*/
{
  int i;
  printf(" ");
  for (i=0;i<n;i++)
  {
	 printf("-");
  }
}
/*Imprimimos el tablero*/
void mostrar_tablero(){

int num;

		num = (COLUMNAS +1) + ((FILAS/COLUMNAS)*2 + 1)*FILAS;
		printf("\n             Hundir La Flota");
		printf("\n\n");
		for(i=0;i<FILAS;i++){
			if((i%(FILAS/COLUMNAS)) == 0)
	  {
		 mostrar_lin(num);
		 printf("\n");
	  }

	  for(j=0;j<COLUMNAS;j++)
	  {
		 if((j%(FILAS/COLUMNAS)) == 0) printf(" |");/*Para delimitar los subtableros*/
		 if(matriz[i][j] == 0) printf("  ");
		 //else printf(" %i",matriz[i][j]);
	  }
	  printf(" |");
	  printf("\n");

  }
  mostrar_lin(num);
  printf("\n");

  printf("\n1) Disparar.");
  printf("\n2) Salir del juego.");
  printf("\nOpcion: ");
}

/*void colocar1(void)
{
randomize();

	for (i=0;x<FILAS;i++){
		for(j=0;j<COLUMNAS;y++){
			matriz[i][j]=0;}
		}  */



Avatar de Usuario
Slim
Mensajes: 8
Registrado: 19/03/2006 12:00 am

#3 Mensaje por Slim » 19/03/2006 4:48 pm

Lo puedes hacer con la funcion random, algo parecido a esto:

void main();

int num=0;

num=random(rando_de_numeros);

La cosa esta en q tienes q colocar posiciones contiguas. Para resolverlo, por ejemplo puedes hacer q se generen tantos numeros como barcos vayas a meter, siendo ese numero el inicio del barco en el tablero. Luego tendras q darle una direccion, hacia arriba, abajo, derecha o izquierda. Y mientras haces todo esto, debes controlar primero q los barcos no se salgan del tablero (por ejemplo posiciones 1,1, hacia arriba, se sale del tablero) y tb q un barco no choque con otro, es decir, q no haya otro barco de por medio en las posiciones donde vas a colocar el barco.

Precisamente hace una semana hice este juego en unas 1.000 lineas de codigo. Se puede hacer de miles de maneras y tienes q hacer un buen control de errores.

Avatar de Usuario
Lost
Mensajes: 11
Registrado: 01/03/2006 12:00 am

#4 Mensaje por Lost » 20/03/2006 8:37 am

buff,podias darme el ejemplo referente al tablero :(

Avatar de Usuario
Slim
Mensajes: 8
Registrado: 19/03/2006 12:00 am

#5 Mensaje por Slim » 20/03/2006 3:22 pm

La verdad, el diseño q yo hice era para 2 jugadores, no jugador vs pc. Por eso t he orientado en como tendrias q hacer para q el pc colocara los barcos.

Te explico un poco: En mi diseño, habia 4 tipos de barcos (Portaaviones, cruceros, fragatas y cargueros), ninguno ocupaba lo mismo. Las medidas q yo use era:
Portaaviones: 5 posiciones
Crucero: 4 posiciones
Fragata: 3 posiciones
Carguero: 2 posiciones

En principio inicialice una variable a 1, q se referia al tipo de barco. Asi, si era igual a 1, t permitia meter el portaaviones, 2 el crucero... Esa variable se aumentaba en 1 cada vez q un barco se habia colocado. Por otra parte, tenia otra variable para controlar el tamaño de cada barco, inicializada a 5, q se decrementaba cada vez q un barco habia sido colocado. Justo despues pedia las coordenadas de origen y la direccion. A raiz de la direccion, se metia en una de las 4 opciones (arriba, abajo, izquierda, derecha) y segun el tipo del barco y lo q ocupase, iba escribiendo en el tablero. Primero de todo, antes de escribir nada en el tablero, verificaba q no se salia del tablero. Voy a ponerte un trozo pequeño de mi codigo para q t hagas una idea. El trozo se refiere hacia arriba (a o A, pedido al usuario):

if ((dir=='A')||(dir=='a'))
{//posc es la posicion de la columna-1 pedido al usuario.
//ocup es lo q ocupa el barco
if (posc-ocup<0)
{
printf ("\n No se puede colocar en esa posicion");
ok=1; //Si ok=1, barco mal colocado, se repite el proceso
}
else
{
for (col=posc; col+ocup>posc; col--)
{/*reprensetaba agua (posicion no ocupada) con un 0, si era asi, escribia un simbolo diferente segun el tipo de barco, para diferenciarlos*/
if (flota1[posf][col]=='0')
{
if (tipo==1){
flota1[posf][col]='$';
cont++;}
/*El contador sirve para contar las posiciones q ya se han ocupado. Asi, si mientras se coloca el barco se choca con otro q ya este colocado, tendre q dar marcha atras y volver a poner esas posiciones con agua*/
if (tipo==2){
flota1[posf][col]='#';
cont++;}
if (tipo==3){
flota1[posf][col]='@';
cont++;}
if (tipo==4){
flota1[posf][col]='Ç';
cont++;}
ok=0;
}
else
{
printf ("\n Posicion ocupada por otra flota");
getch();
/*Aqui es donde hago el proceso contrario para colocar el caracter 0 (agua) en caso de haber chocado con otro barco*/
for (col=posc; col<posc+cont; col++)
{
flota1[posf][col]='0';
}
/*Salgo del bucle principal y coloco ok=1 para q vuelva a repetir el proceso, pidiendo nuevas coordenadas*/
col=ocup-posc;
ok=1;
}
} }
if (ok!=1)*/Si esta variable es 0, incremento el tipo (siguiente barco) y decremento lo q ocupa*/
{
tipo++;
ocup--;
}
}

Avatar de Usuario
Lost
Mensajes: 11
Registrado: 01/03/2006 12:00 am

#6 Mensaje por Lost » 21/03/2006 8:05 am

Ok,entiendo.Pero a ver,lo que no se hacer,y lo llevo intentando desde hace unos dias,es el de introducir un numero(que seria la primera posicion)aleatoriamente,es decir ,con la funcion rand,y asi luego usar lo que anteriormente me has dicho.Estoy desesperado ya xD
Gracias de todos modos
aer si me puedes ayudar en generar el puto numero en una posicion aleatoria

Avatar de Usuario
Slim
Mensajes: 8
Registrado: 19/03/2006 12:00 am

#7 Mensaje por Slim » 21/03/2006 6:00 pm

Lo del numero aleatorio es sencillo:

int fila=0, columna=0;

fila=random(10);
columna=random(10);

Esas serian las posiciones de origen. Ahora deberias pedir el sentido de la flota (arriba, abajo, izquierda, derecha), cosa q tb puedes hacer con un random, por ejemplo asignando Arriba=1, abajo=2, derecha=3, izquierda=4. Asi, tendrias algo parecido a esto:

direccion=random(4);

Y despues aplicar algo parecido a lo q he puesto. Evidentemente todo eso esta dentro de un bucle. Lo malo es q C (o la version de Borland q yo uso) tiene la mala mania de generar siempre los mismos numeros aleatorios para un mismo rango, o sea, q si t pasa eso, las flotas siempre estaran en la misma posicion.

Edito: Se me olvidaba, por si no habias caido. Recuerda q la funcion random genera por defecto el numero aleatorio del rango indicado empezando por 0. Si pones random(4) genera numeros entre 0 y 3. Simplemente suma 1 al resultado o en la misma operacion y ya esta.

Avatar de Usuario
Lost
Mensajes: 11
Registrado: 01/03/2006 12:00 am

#8 Mensaje por Lost » 22/03/2006 1:34 am

Muchas gracuas tio,por fin se me ha encendido la bombillia jajaja
En serio,perdona por las molestias
Saludos

Avatar de Usuario
Slim
Mensajes: 8
Registrado: 19/03/2006 12:00 am

#9 Mensaje por Slim » 22/03/2006 3:05 pm

Añado algo mas: Acabo de descubrir q la funcion randomize (); soluciona los problemas del random.

Pmasvidal
Mensajes: 1
Registrado: 15/02/2019 4:00 pm
Contactar:

Re:

#10 Mensaje por Pmasvidal » 15/02/2019 4:11 pm

Slim escribió:
21/03/2006 6:00 pm
Lo malo es q C (o la version de Borland q yo uso) tiene la mala mania de generar siempre los mismos numeros aleatorios para un mismo rango, o sea, q si t pasa eso, las flotas siempre estaran en la misma posicion.

Edito: Se me olvidaba, por si no habias caido. Recuerda q la funcion random genera por defecto el numero aleatorio del rango indicado empezando por 0. Si pones random(4) genera numeros entre 0 y 3. Simplemente suma 1 al resultado o en la misma operacion y ya esta.

El problema de la función random que genera siempre las mismas posiciones """aleatorias""" se soluciona proporcionando a rand() una semilla cambiante.
Generar una semilla se hace con srand() (necesita la librería <stdlib.h>) y la semilla que suele utilizarse es la que genera aleatoriedad a partir del reloj del sistema por medio de la funcion time(NULL) (necesita la librería <time.h>), con lo que queda de la siguiente forma:

Código: Seleccionar todo

#include <stdlib.h>
#include <time.h>

int main(){

	srand(time(NULL));	//srand siempre en el main

	//luego de esto puedes colocar rand() en cualquier parte del código dónde lo necesites y recogerá siempre la semilla de time, generando números aleatorios siempre distintos
	
	int posicion=rand()%10+1; //por ejemplo esto genera números aleatorios entre 1 y 10.

return 0;
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados