Duda hundir la flota vs maquina

ReBeNTuk0

Buenas, estoy intentando poder jugar a hundir la flota vs la maquina. No se mucho de C, aun voy por arrays en el insti y ni he dado punteros ni muchas cosas. Aun asi, estoy intentando hacerlo.
He conseguido el tablero para yo poner las casillas y cuando pongo el turno de la maquina no se bien como hacerlo. El programa tiene 3 barcos a poner: Submarino pone una casilla a 1, Destructor pone 2 casillas a 2 y Portaviones pone 3 casillas a 3. Cuando el ordenador coloca el Submarino lo pone aleatoriamente sin problema (ya que el tablero esta vacio). El problema viene cuando intento poner el Destructor, que primero compruebo que no este ocupada la casilla y luego la pongo en un lugar al azar y despues hago otro azar para que sea vertical u horizontal y si es horizontal que me sume 1 a las columnas y si es vertical que sume 1 a las sumas. Aqui os dejo el codigo a ver si me podeis ayudar. Por cierto, la variable maquina vale 1:

http://rafb.net/p/ezxiwC93.html

Khanser

pero que basto eres XD haciendo randoms ahi to basto, yo lo que haria para barcos de > 1 casilla es, un random para colocar la primera casilla en todo el tablero, otro random mod 4 para que me de una dirección al azar y poder colocar el 2º bloque a partir del primero, en la dirección dada al azar por el 2º random, y a partir de aqui, es ir sumando bloques en esa direccion para lo grande que sea el barco.

Lo que tendrás que mirar es que para poner barcos de N bloques tendras que usar el random sobre filas-n,columnas-n. para asi asegurarte que no choca con los bordes al hacer el random sobre una esquina, para que no choque con un barco ya puesto ya tendrás k montartelo tu.

ReBeNTuk0

Pff a ver si entiendo algo porque como soy nuevo me esta costando la vida hacer esto.

El tablero es de 5 x 5, aunque es un array multidimensional porque tengo [maquina][filas][columnas].

Cuando hago
fila2=rand()%(((FILAS-1)-0+1)+0); columna2=rand()%(((COLUMNAS-1)-0+1)+0);

Me crea dos numeros entre 0 y 4 tanto en filas como en columnas no? Por ejemplo: [0][3]

Con esto compruebo que la casilla generada no este ocupada, es decir, que no sea 0.
if (barcos_ordenador[maquina][fila2][columna2]!=0){

Y si esta ocupada que se repita de nuevo los rand de fila y columna.

Despues con esto genero un numero al azar entre 1 y 2 (1 para vertical y 2 para horizontal)
horizontal_vertical=rand()%(2-1+1)+1;

Suponiendo que sea siempre vertical hago, compruebo que fila+1 (es decir, si era [0][3] se convertiria en [1][3]) y miro que fila2>FILAS-2 para que no se salga del tablero.

if(barcos_ordenador[maquina][fila2+1][columna2]!=0 || fila2>FILAS-2)

Y si es 0, pues con un else le pongo esto para asignar el valor de 2 a [0][3] y a [1][3]:

barcos_ordenador[maquina][fila2][columna2]=2; barcos_ordenador[maquina][fila2+1][columna2]=2;

Que falla entonces? O estoy flipando yo! jaja

PD: Cuando lo hago siempre me da o [1][0] y [2][0] o [3][0] y [4][0]. Es como si las columnas no valiesen para nada :(

En cambio, cuando introduzco yo manualmente en la primera parte del programa las casillas, usando el mismo algoritmo me funciona perfectamente :S

¿Tambien puede ser que al usar el rand con el reloj del ordenador para crear numeros aleatorios me de numeros parecidos al volver a realizar los rand? :S

1 comentario moderado
Khanser

Mira, ahora que lo miro bien, pa empezar lo de rand()%(((ALGO INFUMABLE))) es bastante... eso de +0+1+0+1 es un poco cutrillo, piensa que cuando haces el modulo a%b, lo que te va a devolver va a ser un rango (0..b-1) por lo que el (-1) ya te sobra, y el +1 que viene despues no tengo ni puta idea de pa k lo pones, basicamente el -1 y luego el +1 se te keda el tema igual, y pa que se te quede igual pa eso lo quitas no? o que? XD

horizontal_vertical=rand()%(2-1+1)+1 <-- WHAT THE FUCK

horizontal_vertical=rand()%2 <--(0..1) te sobra, no?

No entiendo pa que complicarlo tanto +1-1 = 0 verdad? :\
Y si haces rand()%2+1 te da un rango (0..2) y solo te interesa que te devuelva 0 o 1.

Tendras que cambiar el if que controla esto.

Tio.. te complicas demasiado, y hay casos que no miras, cuando haces :
if(barcos_ordenador[maquina][fila2+1][columna2]!=0 || fila2>FILAS-2)

si esta posicion está ocupada, deberias mirar también la posicion opuesta no?, fila2-1 para ver si también está ocupada, lo mismo con las columnas.

Tio, te voy a dar un consejo, cuando veas que algo no te sale, te rayas, es demasiado complicado....... Ctrl+E, Supr

Siempre hay una manera mas sencilla (siempre añadiendo mas variables) mirate bien los "%" y aclarate con ello tio :/

ReBeNTuk0

Lo saque de esto: rand()%(hasta-desde+1)+desde;

Aqui hasta seria 4 y desde seria 0, por eso lo puse asi

Khanser

Pues eso no tiene ni pies ni cabeza xD al ser la suma asociativa -> rand()%((hasta-desde+1)+desde) -> rand()%((hasta+1)+(desde-desde)) -> rand()%((hasta+1)+0)

Pero claro si usas el "%" con (hasta+1) el % te dará un rango (0..hasta) cosa que no estaria muy bien porque el array está definido en (0..hasta-1) por lo que cuando accedas a la posicion "hasta" del array, te saldrá algo infumable, miles de errores y polladas por todos sitios

MTX_Anubis

#7 eso lo habrá sacado de algún sitio para saber qué número debe de poner, vamos digo yo xD. Tipica expresión 'matemática' xD

La expresión está bien, si tu quieres un número 0..4 tienes que poner rand()%5, es decir 'hasta+1' xD

Khanser

Coño es verda XD pensé k el array era de 4 >_<, yo me referia a que usara el valor con el que inicializa el array, no se si me expliqué bien :\

JuAn4k4

haz una funcion q sea : int cabe (int posx_ini, int posy_ini,int forma , int* direccion);

en direccion q te ponga ( izq - der ) ( arriba - abajo ) o (no cabe ) dependiend ode la forma q le pasas ( vertical - horizontal ).

Haces random hasta que quepa y lo metes ahi.

ej:
int x,y,forma,dir;

dir = derecha; // por ej.
forma = horizontal; // por ej.

calcular(&x,&y); // posicion inicial

while ( !cabe(x,y,forma,&dir) )
{recalcular (&x, &y) ;}

// cabe en direccion = dir.
// Meter barco en x,y -> de la forma "forma" y en la direccion "dir".

PD: Incluso puedes hacer que cabe te indique tambien la forma en la que cabe.
cabe devolvera 0 sino cabe, 1 si der 2 si izq ( por ej. )

Usuarios habituales