Морсокой бой. Автоматическая расстановка кораблей. - 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;
 
        }
    }
      .....
      .....
}

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы