Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Морской бой - Оптимизация (http://forum.oszone.net/showthread.php?t=246931)

SAU-trade 14-11-2012 14:08 2025463

Морской бой - Оптимизация
 
Здравствуйте! У меня такой вопрос.. Как можно упростить данную часть? Данный блок проверяет смежные клетки на присутствие кораблей. Если корабли отсутствуют - новый корабль устанавливается.
Код:

void set (player *human, int deck)
{
        int isset = 0;
        int e = 0;
        int dir, x, y;

//Направлении
    enum direction
        {
            h = 0,
            v = 1
        };
//        srand(time(NULL));
    while (isset == 0)
    {
        dir = static_cast<direction>(rand()%2);
        x = rand()%10;
        y = rand()%10;

            e = 0;   
          switch (dir)
        {
               
                case 0:
        if (human->ships[x][y+deck-1] == 1)
        {
                if (human->ships[x-1][y-1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|X     
                        3| 2222   
                        4|     
                        */
                }
                if (human->ships[x-1][y+deck] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|    X
                        3| 2222   
                        4|     
                        */
                }
                if (human->ships[x+1][y-1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2222   
                        4|X   
                        */
                }
                if (human->ships[x+1][y+deck] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2222   
                        4|    X
                        */
                }

                if (human->ships[x][y-1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3|X2222   
                        4|     
                        */
                }
                if (human->ships[x][y+deck] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2222X   
                        4|     
                        */
                }
                for (int i = 0; i < deck; i++)
                {
                        if (human->ships[x-1][y+i] == 2)
                        {
                                e = 1;
                                /*
                                  345678
                                #-------
                                2| XXXX   
                                3| 2222   
                                4|     
                                */
                        }
                        if (human->ships[x+1][y+i] == 2)
                        {
                                e = 1;
                                /*
                                  345678
                                #-------
                                2|     
                                3| 2222   
                                4| XXXX   
                                */
                        }
                }

        if (e == 0)
                        {
                                for (int i = 0; i < deck; i++)
                                {
                                        human->ships[x][y+i] = 2; // размещаем корабль в массиве ships
                                }
                                isset = 1;
                        }
                }
                        break;
        case 1:

        if (human->ships[x+deck-1][y] == 1)
        {
                if (human->ships[x-1][y-1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|X     
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7|   
                        */
                }
                if (human->ships[x-1][y+1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|  X   
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7| X   
                        */
                }
                if (human->ships[x+deck][y-1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7|X   
                        */
                }
                if (human->ships[x+deck][y+1] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7|  X 
                        */
                }

                if (human->ships[x-1][y] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2| X   
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7|   
                        */
                }
                if (human->ships[x+deck][y] == 2)
                {
                        e = 1;
                        /*
                          345678
                        #-------
                        2|     
                        3| 2   
                        4| 2 
                        5| 2   
                        6| 2   
                        7| X   
                        */
                }
                for (int i = 0; i < deck; i++)
                {
                        if (human->ships[x+i][y-1] == 2)
                        {
                                e = 1;
                                /*
                                  345678
                                #-------
                                2|     
                                3|X2   
                                4|X2 
                                5|X2   
                                6|X2   
                                7|   
                                */
                        }
                        if (human->ships[x+i][y+1] == 2)
                        {
                                e = 1;
                                /*
                                  345678
                                #-------
                                2|     
                                3| 2X   
                                4| 2X 
                                5| 2X   
                                6| 2X   
                                7|   
                                */
                        }
                }
                if (e == 0)
                {
                        for (int i = 0; i < deck; i++)
                        {
                                human->ships[x+i][y] = 2;
                        }
                        isset = 1;
                }
        }
        break;
        }//switch
    }// while
}//set


lxa85 14-11-2012 15:25 2025509

Выдели блок "корабль+1 клетка по периметру", да проверь циклом на отсутствие в нем кораблей/мин.
В С++ массивы начинаются с нуля. Сделай поле от 0 до 11, рабочее от 1 до 10.
Чуть больше затрат, зато единая функция проверки кораблей, стоящих на линии игрового поля.


Время: 06:06.

Время: 06:06.
© OSzone.net 2001-