Расстановка кораблей Морской бой - C (СИ)
Формулировка задачи:
Помогите расставить корабли в игре морской бой. Уже 2ю ночь не сплю ошибки выдаёт.
Задаю массив 10х10, устанавливаю все значения 0.
Потом ставлю однопалубники. Выбираю рандомные значения по i и j. Проверяю нет ли вокруг них чего, если нет, то ставлю значение 1 однопалубники.
всего 4 однопалубника. ставится норм.
перехожу к двупалубникам. тем же алгоритмом (однопалубников) выбираю клетку, чтоб вокруг было пусто, потом выбираю направление 1 из 4х. и в зависимости от направления - проверяю клетку рядом. если всё усраивает, то ставлю в эти 2 клетки значение 2 - двухпалубник. Но блин почему-то всё идёт через одно место. помогите пжл написать алгоритм расстановки на СИ.
Нужно расставить 1 - 4пал, 2 - 3пал, 3-2пал, 4-1пал.
С остальными пока тупняк. =(
Но блин почему-то не всегда ставится по правилам, иногда либо близко стоят либо друг на друг. (И у меня не хватает мозгов понять, почему).
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <graphics.h>
const int SZ = 9;
int pl1[SZ][SZ];
int pl2[SZ][SZ];
void mainMenu();
void Board();
void BoardExit();
void pole1();
void kyb(int x1,int y1, int x);
void onepal();
void twopal();
void kater();
void twokat();
int main()
{
srand(time (NULL));
initwindow(600,600);
Board();
//onepal();
//twopal();
//kater();
twokat();
pole1();
//BoardExit();
getch();
}
void kater()
{
for (int g=0; g<4;)
{
for (int i = 0; i < SZ; i++)
for (int j = 0; j < SZ; j++)
{
if (pl1[i][j]==1) g++;
}
if (g!=4) onepal();
}
}
void twokat()
{
for (int g=0; g<6;)
{
for (int i = 0; i < SZ; i++)
for (int j = 0; j < SZ; j++)
{
if (pl1[i][j]==2) g++;
}
if (g!=6) twopal();
}
}
void twopal()
{
int k=rand()%10;
int l=rand()%10;
if (pl1[k-1][l]==0 and pl1[k][l-1]==0 and pl1[k-1][l-1]==0
and pl1[k+1][l]==0 and pl1[k][l+1]==0 and pl1[k+1][l+1]==0
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0)
{
int m=rand()%3;
switch (m)
{
case 0: /*Ââåðõ*/ l=l-1; if ( l<0 and pl1[k-1][l]==0 and pl1[k][l-1]==0 and pl1[k-1][l-1]==0
and pl1[k+1][l]==0 and pl1[k+1][l+1]==0
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0) pl1[k][l]=2; pl1[k][l+1]=2;
case 1: /*Г‚Г*ГЁГ§*/ l=l+1; if (l>9 and pl1[k-1][l]==0 and pl1[k-1][l-1]==0
and pl1[k+1][l]==0 and pl1[k][l+1]==0 and pl1[k+1][l+1]==0
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0) pl1[k][l]=2; pl1[k][l-1]=2;
case 2: /*ÂïðГ*ГўГ®*/ k=k+1; if (k>9) {if (pl1[k][l-1]=0 and pl1[k-1][l-1]==0
and pl1[k+1][l]==0 and pl1[k][l+1]==0 and pl1[k+1][l+1]==0
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0) pl1[k][l]=2; pl1[k-1][l]=2;}
case 3: /*Âëåâî*/ k=k-1; if (k<0 and pl1[k-1][l]==0 and pl1[k][l-1]==0 and pl1[k-1][l-1]==0
and pl1[k][l+1]==0 and pl1[k+1][l+1]==0
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0) pl1[k][l]=2; pl1[k+1][l]=2;
default: /*Г€Г*Г*Г·ГҐ*/ break;
}
}
}
void onepal()
{
//printf ("onepal");
int k=rand()%10;
int l=rand()%10;
if (pl1[k-1][l]==0 and pl1[k][l-1]==0 and pl1[k-1][l-1]==0
and pl1[k+1][l]==0 and pl1[k][l+1]!=1 and pl1[k+1][l+1]!=1
and pl1[k+1][l-1]==0 and pl1[k-1][l+1]==0) pl1[k][l]=1;
else onepal();
}
void pole1()
{
cleardevice();
for (int i = 0; i < SZ; i++)
for (int j = 0; j < SZ; j++)
{
int x=pl1[i][j];
kyb(i,j,x);
}
}
void kyb(int x1,int y1, int x)
{
switch(x1)
{
case 0: x1=20; break;
case 1: x1=40; break;
case 2: x1=60; break;
case 3: x1=80; break;
case 4: x1=100; break;
case 5: x1=120; break;
case 6: x1=140; break;
case 7: x1=160; break;
case 8: x1=180; break;
case 9: x1=200; break;
};
switch(y1)
{
case 0: y1=20; break;
case 1: y1=40; break;
case 2: y1=60; break;
case 3: y1=80; break;
case 4: y1=100; break;
case 5: y1=120; break;
case 6: y1=140; break;
case 7: y1=160; break;
case 8: y1=180; break;
case 9: y1=200; break;
};
switch (x)
{
case 0:setfillstyle(1,1); bar3d(x1,y1,x1+20,y1+20,1,4); break;
case 1:setfillstyle(1,4); bar3d(x1,y1,x1+20,y1+20,1,4); break;
case 2:setfillstyle(1,2); bar3d(x1,y1,x1+20,y1+20,1,4); break;
case 3:setfillstyle(1,3); bar3d(x1,y1,x1+20,y1+20,1,4); break;
}
// bar(x1,y1,x1+20,y1+20);
//setfillstyle(1,15);
}
void Board()
{
for (int i = 0; i < SZ; i++)
for (int j = 0; j < SZ; j++)
{
pl1[i][j] = 0;
pl2[i][j] = 0;
}
//pl1[5][1] = 1;
//pl1[3][2] = 2;
//pl1[4][7] = 3;
//pl1[8][3] = 4;
}
void BoardExit()
{
for (int i = 0; i < SZ; i++)
{
for (int j = 0; j < SZ; j++)
printf("%d ",pl1[i][j]);
printf ("\n");
}
printf ("\n");
for (int i = 0; i < SZ; i++)
{
for (int j = 0; j < SZ; j++)
printf("%d ",pl2[i][j]);
printf ("\n");
}
_getch();
}
Тут подумал начать с 4хпалубника
void fourpal()
{
int k=rand()%10;
int l=rand()%10;
int m=rand()%3;
switch (m)
{
case 0: /*Вверх*/ if (l>3){for (int i=0; i<4; i++)
pl1[k][l-i]=4;break;}
case 1: /*Вниз*/ if (l<7)
{for (int i=0; i<4; i++)
pl1[k][l+i]=4;break;}
case 2: /*Вправо*/if (k<7)
{for (int i=0; i<4; i++)
pl1[k+i][l]=4;break;}
case 3: /*Влево*/ if (k>3)
{for (int i=0; i<4; i++)
pl1[k-i][l]=4;break;}
default: /*Иначе*/ fourpal();
}
}
Вот расстановка трёхпалубников. Через цикл проверяет потри клетки вдоль будущего трехпалубника, и +\-1 до и после него. По скольку 4хпалубних обозначен цифрой 4, проверяет на отсутствие 4рок в ближайших клетках, и 3ки (трёхпалубники)соответственно.
void threepal()
{
int g=0;
while (g<4)
{
int k=rand()%10;
int l=rand()%10;
int m=rand()%3;
int q;
int k1;
int l1;
switch (m)
{
case 0: /*Ââåðõ*/ if (l>2)
{
q=0;
k1=k;
l1=l-1;
for (int i=0; i<5; i++)
if (pl1[k1-1][l1-i]!=4 and pl1[k1][l1-i]!=4 and pl1[k1+1][l1-i]!=4 and
pl1[k1-1][l1-i]!=3 and pl1[k1][l1-i]!=3 and pl1[k1+1][l1-i]!=3) q++;
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l-i]=3; g++;
}
}
break;
case 1: /*Г‚Г*ГЁГ§*/ if (l<8)
{
q=0;
k1=k;
l1=l+1;
for (int i=0; i<5; i++)
if (pl1[k1-1][l1+i]!=4 and pl1[k1][l1+i]!=4 and pl1[k1+1][l1+i]!=4 and
pl1[k1-1][l1+i]!=3 and pl1[k1][l1+i]!=3 and pl1[k1+1][l1+i]!=3) q++;
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l+i]=3; g++;
}
}
break;
case 2: /*ÂïðГ*ГўГ®*/if (l>2)
{
q=0;
k1=k;
l1=l-1;
for (int i=0; i<5; i++)
if (pl1[k1-1][l1-i]!=4 and pl1[k1][l1-i]!=4 and pl1[k1+1][l1-i]!=4 and
pl1[k1-1][l1-i]!=3 and pl1[k1][l1-i]!=3 and pl1[k1+1][l1-i]!=3) q++;
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l-i]=3; g++;
}
}
break;
case 3: /*Âëåâî*/ if (l>2)
{
q=0;
k1=k;
l1=l-1;
for (int i=0; i<5; i++)
if (pl1[k1-1][l1-i]!=4 and pl1[k1][l1-i]!=4 and pl1[k1+1][l1-i]!=4 and
pl1[k1-1][l1-i]!=3 and pl1[k1][l1-i]!=3 and pl1[k1+1][l1-i]!=3) q++;
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l-i]=3; g++;
}
}
break;
default: /*Г€Г*Г*Г·ГҐ*/ break;
}
}
}Решение задачи: «Расстановка кораблей Морской бой»
textual
Листинг программы
const int SZ = 12;
void onepal()
{
int g=0;
int q;
int k1;
int l1;
while (g<5)
{
srand(time (NULL));
int k=rand()%10+1;
int l=rand()%10+1;
q=0;
k1=l;
l1=k+1;
for (int i=0; i<3; i++)
if (pl1[k1-1][l1+i]!=4 and pl1[k1][l1+i]!=4 and pl1[k1+1][l1+i]!=4 and
pl1[k1-1][l1+i]!=3 and pl1[k1][l1+i]!=3 and pl1[k1+1][l1+i]!=3 and
pl1[k1-1][l1+i]!=2 and pl1[k1][l1+i]!=2 and pl1[k1+1][l1+i]!=2 and
pl1[k1-1][l1+i]!=1 and pl1[k1][l1+i]!=1 and pl1[k1+1][l1+i]!=1) q++;
if (q=3)
{
pl1[k][l]=1; g++;
} break;
}
}
void twopal()
{
// srand(time (NULL));
int g=0;
while (g<3)
//for (int g=0; g<4;)
{
srand(time (NULL));
int k=rand()%10+1;
int l=rand()%10+1;
int m=rand()%4;
int q;
int k1;
int l1;
switch (m)
{
case 0: /*Вверх*/ if (l>1 and k!=0 and k!=11)
{
q=0;
k1=k;
l1=l-1;
for (int i=0; i<4; i++)
if ((pl1[k1-1][l1-i]!=4) and (pl1[k1][l1-i]!=4) and (pl1[k1+1][l1-i]!=4) and
pl1[k1-1][l1-i]!=3) and (pl1[k1][l1-i]!=3) and (pl1[k1+1][l1-i]!=3) and
(pl1[k1-1][l1-i]!=2) and (pl1[k1][l1-i]!=2) and (pl1[k1+1][l1-i]!=2)) q++;
if (q==4)
{
for (int i=0; i<2; i++)
pl1[k][l-i]=2; g++;
}break;
}
else break;
case 1: /*Вниз*/ if (l<9 and k!=0 and k!=11)
{
q=0;
k1=k;
l1=l+1;
for (int i=0; i<4; i++)
if ((pl1[k1-1][l1+i]!=4) and (pl1[k1][l1+i]!=4) and (pl1[k1+1][l1+i]!=4) and
(pl1[k1-1][l1+i]!=3) and (pl1[k1][l1+i]!=3) and (pl1[k1+1][l1+i]!=3) and
(pl1[k1-1][l1+i]!=2) and (pl1[k1][l1+i]!=2) and (pl1[k1+1][l1+i]!=2)) q++;
if (q==4)
{
for (int i=0; i<2; i++)
pl1[k][l+i]=2; g++;
}break;
}
else break;
case 2: /*Вправо*/if (k<9 and l!=0 and l!=11)
{
q=0;
k1=k-1;
l1=l;
for (int i=0; i<4; i++)
if ((pl1[k1+i][l1-1]!=4) and (pl1[k1+i][l1]!=4) and (pl1[k1+i][l1+1]!=4) and
(pl1[k1+i][l1-1]!=3) and (pl1[k1+i][l1]!=3) and (pl1[k1+i][l1+1]!=3) and
(pl1[k1+i][l1-1]!=2) and (pl1[k1+i][l1]!=2) and (pl1[k1+i][l1+1]!=2)) q++;
if (q==4)
{
for (int i=0; i<2; i++)
pl1[k+i][l]=2; g++;
}break;
}
else break;
case 3: /*Влево*/ if (k>1 and l!=0 and l!=11)
{
q=0;
k1=k+1;
l1=l;
for (int i=0; i<4; i++)
if ((pl1[k1-i][l1-1]!=4) and (pl1[k1-i][l1]!=4) and (pl1[k1-i][l1+1]!=4) and
(pl1[k1-i][l1-1]!=3) and (pl1[k1-i][l1]!=3) and (pl1[k1-i][l1+1]!=3) and
(pl1[k1-i][l1-1]!=2) and (pl1[k1-i][l1]!=2) and (pl1[k1-i][l1+1]!=2)) q++;
if (q==4)
{
for (int i=0; i<2; i++)
pl1[k-i][l]=2; g++;
}break;
}
else break;
default: /*Иначе*/ break;
}
}
}
void threepal()
{
// srand(time (NULL));
int g=0;
while (g<2)
{
srand(time (NULL));
int k=rand()%10+1;
int l=rand()%10+1;
int m=rand()%4;
int q;
int k1;
int l1;
switch (m)
{
case 0: /*Вверх*/ if (l>3 and k!=0 and k!=11)
{
q=0;
k1=k;
l1=l-1;
for (int i=0; i<5; i++)
{if (pl1[k1-1][l1-i]!=4 and pl1[k1][l1-i]!=4 and pl1[k1+1][l1-i]!=4 and
pl1[k1-1][l1-i]!=3 and pl1[k1][l1-i]!=3 and pl1[k1+1][l1-i]!=3) q++;}
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l-i]=3; g++;
}break;
}
// else break;
case 1: /*Вниз*/ if (l<7 and k!=0 and k!=11)
{
q=0;
k1=k;
l1=l+1;
for (int i=0; i<5; i++)
{if (pl1[k1-1][l1+i]!=4 and pl1[k1][l1+i]!=4 and pl1[k1+1][l1+i]!=4 and
pl1[k1-1][l1+i]!=3 and pl1[k1][l1+i]!=3 and pl1[k1+1][l1+i]!=3) q++;}
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k][l+i]=3; g++;
}break;
}
//else break;
case 2: /*Вправо*/if (k<7 and l!=0 and l!=11)
{
q=0;
k1=k-1;
l1=l;
for (int i=0; i<5; i++)
{if (pl1[k1+i][l1-1]!=4 and pl1[k1+i][l1]!=4 and pl1[k1+i][l1+1]!=4 and
pl1[k1+i][l1-1]!=3 and pl1[k1+i][l1]!=3 and pl1[k1+i][l1+1]!=3) q++;}
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k+i][l]=3; g++;
}break;
}
//else break;
case 3: /*Влево*/ if (k>3 and l!=0 and l!=11)
{
q=0;
k1=k+1;
l1=l;
for (int i=0; i<5; i++)
{if (pl1[k1-i][l1-1]!=4 and pl1[k1-i][l1]!=4 and pl1[k1-i][l1+1]!=4 and
pl1[k1-i][l1-1]!=3 and pl1[k1-i][l1]!=3 and pl1[k1-i][l1+1]!=3) q++;}
if (q==5)
{
for (int i=0; i<3; i++)
pl1[k-i][l]=3; g++;
}break;
}
//else break;
default: /*Иначе*/ break;
}
}
}
void fourpal()
{
srand(time (NULL));
int k=rand()%10+1;
int l=rand()%10+1;
int m=rand()%4;
//printf(“k = %d”, k);
//printf(“l = %d”, l);
switch (m)
{
case 0: /*Вверх*/ if (l>5 and k!=0 and k!=11)
{for (int i=0; i<4; i++)
pl1[k][l-i]=4;break;}
case 1: /*Вниз*/ if (l<6 and k!=0 and k!=11)
{for (int i=0; i<4; i++)
pl1[k][l+i]=4;break;}
case 2: /*Вправо*/if (k<7 and l!=0 and l!=11)
{for (int i=0; i<4; i++)
pl1[k+i][l]=4;break;}
case 3: /*Влево*/ if (k>4 and l!=0 and l!=11)
{for (int i=0; i<4; i++)
pl1[k-i][l]=4;break;}
default: /*Иначе*/ fourpal();
}
}
void pole1()
{
cleardevice();
for (int i = 1; i < SZ-1; i++)
for (int j = 1; j < SZ-1; j++)
{
int x=pl1[i][j];
kyb(i,j,x);
}
}