Морсокой бой. Автоматическая расстановка кораблей. - C (СИ)
Формулировка задачи:
Доброго времени суток.
Моской бой должен быть классическим. Один четырехпалубный, два трехпалубных, три двух и четыре одно. У меня три цикла. Один выбирает палубность, вложенный кол-во кораблей и while устанавливает корабль.
Как все работает. Рэндом выбирает горизонтально или вертикально поставить, и потом выбирается место куда поставить. Если на этом предполагаемом месте встречается занятая клетка, то бесконечный цикл срабатывает вновь пока весь корабль не окажется на пустых клетках.
Я еще только учусь и потому мог допустить простую ошибку. А дело в том, что если несколько раз подряд вызывать программу, то обнаруживается, что не всегда все корабли рисуются в массиве. Но, в меньшинстве случаев корабли встают все. Помогите разобраться.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#define ix 10
void basing();//Function of ship arrangement
int a[ix][ix];
int b[ix][ix];
int flag=0;
int i_breac=0;
int r,x,y,x_p,y_p,rship;
int i,j,ship,k,n;
int main()
{
srand(time(NULL));
basing(); //Calling a function ship arrangement
//Preview
for(i=0; i<ix; i++)
{
for(n=0; n<ix; n++)
{
printf("%d", a[i][n]);
}
printf("\n");
}
printf("\n");
for(i=0; i<ix; i++)
{
for(j=0; j<ix; j++)
{
printf("%d", b[i][j]);
}
printf("\n");
}
getch();
//Preview^
}
void basing() //Call of Basing
{
for(i=0;i<ix;i++)
{
for(j=0;j<ix;j++)
{
a[i][j]=0;
}
}
for(i=0;i<ix;i++)
{
for(j=0;j<ix;j++)
{
b[i][j]=0;
}
}
//Cycle-based ships--------
for(ship=4, k=1, rship=7; ship>0; ship--, k++, rship++) //Four different ship
{
for(j=k; j>0; j--) //One ship K time
{
//----------------------------------
//User
r=rand()%2;
while(1>0)
{
if(r==0) // Horizontal Ship
{
x=rand()%ix;
y=rand()%rship;
//This is a ship or a shadow?
y_p=y;
for(flag=0, i=0; i<ship; i++, y++)
{
if(a[x][y]!=0)
{flag++;
break;}
}
y=y_p;
//This is a ship!
if(flag==0)
{
for(i_breac=0, i=0; i<ship; i++, y++, i_breac++) // Save break for Horizontal Ship
{
a[x][y]=ship;
}
}
}
else // Vertical Ship
{
x=rand()%rship;
y=rand()%ix;
//This is a ship or a shadow?
x_p=x;
for(flag=0, i=0; i<ship; i++, x++)
{
if(a[x][y]!=0)
{flag++;
break;}
}
x=x_p;
//If not a ship!
if(flag==0)
{
for(i_breac=0, i=0; i<ship; i++, x++, i_breac++) // Save break for Vertical Ship
{
a[x][y]=ship;
}
}
}if(i_breac==ship)break;
}
}
}
}Решение задачи: «Морсокой бой. Автоматическая расстановка кораблей.»
textual
Листинг программы
if(r==0) // Horizontal Ship
{
.....
.....
if(flag==0)
{
for(i=0; i<ship; i++, y++, i_breac++) // Save break for Horizontal Ship
{
a[x][y]=ship;
if(x>0)
a[x-1][y]=5;
if(x<9)
a[x+1][y]=5;
}
if(y_p>0)
{
a[x][y_p-1]=5;
if(x>0)
a[x-1][y_p-1]=5;
if(x<9)
a[x+1][y_p-1]=5;
}
if(y<10)
{
a[x][y]=5;
if(x>0)
a[x-1][y]=5;
if(x<9)
a[x+1][y]=5;
}
}
.....
.....
}