Расстановка кораблей Морской бой - 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);
                         
                        }       
               }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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