Ecco qui, pozbarche ho visto che era un po' incasinato e l'ho rifatto, spero non ti offenda,
un suggerimento:
se un vettore è di lunghezza 5 --> vettore[5] non puoi fare un for così:
for(int i = 5; i <= 1; i--)
{
... bla bla bla ...
}
perchè vai fuori dalla sua lunghezza, la "i" inizia da 5, ma il vettore è così:
ind 0 ind 1 ind 2 ind 3 ind 4
[bla] [blà] [blù] [blo] [ble]
quindi vai fuori, ricorda che gli indici iniziano da 0
#include <cstdlib>
#include <iostream>
#include <time.h>
using namespace std;
#define N 10
int matrice[N][N];
int vettore[5];
bool ControllaSeIlPostoBarcaVaBene(int num, int x, int y, bool dir)
{
if(!dir)//verticale
{
if(y + num > N)
return 0;
for(int k = y; k < num + y; k++)
if(matrice[x][k] == 1)
return 0;
return 1;
}
else//orizzontale
{
if(x + num > N)
return 0;
for(int k = x; k < num + x; k++)
if(matrice[k][y] == 1)
return 0;
return 1;
}
}
void PosizionaInVerticale(int num)
{
int x,y;
//continuo a cambiare (x,y) finchè non ho trovato un posto che vada bene ;)
do
{
x=rand()%N;
y=rand()%N;
}
while(!ControllaSeIlPostoBarcaVaBene(num, x,y, 0));
//Inserisco la barca nella posizione che ho trovato
for(int k = y; k < num + y; k++)
matrice[x][k] = num;
}
void PosizionaInOrizzontale(int num)
{
int x,y;
//continuo a cambiare (x,y) finchè non ho trovato un posto che vada bene ;)
do
{
x=rand()%N;
y=rand()%N;
}
while(!ControllaSeIlPostoBarcaVaBene(num, x,y, 1));
//Inserisco la barca nella posizione che ho trovato
for(int k = x; k < num + x; k++)
matrice[k][y] = num;
}
void pozbarche(int num)
{
//le direzioni sono due, non conta il verso, che si può ottenere cambiando la x o la y.
//rand()%2 restituisce 0 oppure 1
int direzione=rand()%2;
if(direzione == 0)
{
PosizionaInVerticale(num);
}
else
{
PosizionaInOrizzontale(num);
}
}
int main()
{
srand(time(0));
for(int i=4; i>=0; i--)
{
cout<<"INSERISCI QUANTE NAVI DA "<<i + 1<<" VUOI INSERIRE: ";
cin>>vettore[i];
}
for(int i=4; i>=0; i--)
{
for(int k = 0; k < vettore[i]; k++)
{
pozbarche(i + 1);
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<matrice[i][j];
}
cout<<endl;
}
system("pause");
}