Расстановка кораблей Морской бой - 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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д