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