1. Java / Говнокод #21788

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    private ArrayList<Point> pointForShootAuto = new ArrayList<Point>();
    
    public void shootAuto(){
            // Разбить поле на 9 клеток случайного размера
            // Выбрать проверяем с диагонали (x = 0, y = 0) или (x = 1, y = 0)  TODO: Выполнить
            // Составить массив кординат который будем проверять, приоритет - нужная нам диагональ
            // Если точка - не подходит - пропускаем
     
            // Вызвали в первый раз - нужно заполнить координатами
            if(pointForShootAuto.isEmpty()){
                Random random = new Random();
                int xLine1 = random.nextInt(10);
                int xLine2 = random.nextInt(10);
                int x1 = Math.min(xLine1,xLine2);
                int x2 = Math.max(xLine1,xLine2);
     
                System.out.println("Первый интервал 0 - " + x1 + "[включтельно]");
                System.out.println("Второй интервал " + x1  + " - " + x2);
                System.out.println("Третий интервал " + x2 + "[включтельно]" + " до конца");
     
                ArrayList<Point> arrayPoint0 = new ArrayList<Point>();
                ArrayList<Point> arrayPoint1 = new ArrayList<Point>();
                ArrayList<Point> arrayPoint2 = new ArrayList<Point>();
     
                for(int y = 0; y < 10; ++y) {
                    for(int x = 0; x < 10; ++x) {
                        Point newPoint = new Point(x,y);
                        if(x <= x1)
                            arrayPoint0.add(newPoint);
                        else if(x > x1 && x < x2)
                            arrayPoint1.add(newPoint);
                        else if(x >= x2)
                            arrayPoint2.add(newPoint);
                    }
                }
     
                // TODO: Адское и немасштабируемое дерьмо
                // Определим в каком порядке склеим массивы
                // Вместо 9 клеток сделаем пока 3
     
                int numberFirstArray;
                int numberSecondArray;
                int numberThirdArray;
     
                do {
                    numberFirstArray = random.nextInt(3);
                    numberSecondArray = random.nextInt(3);
                    numberThirdArray = random.nextInt(3);
                }
                while (numberFirstArray == numberSecondArray || numberSecondArray == numberThirdArray || numberThirdArray == numberFirstArray);
     
                if(numberFirstArray == 0)
                    pointForShootAuto.addAll(arrayPoint0);
                if(numberFirstArray == 1)
                    pointForShootAuto.addAll(arrayPoint1);
                if(numberFirstArray == 2)
                    pointForShootAuto.addAll(arrayPoint2);
     
                if(numberSecondArray == 0)
                    pointForShootAuto.addAll(arrayPoint0);
                if(numberSecondArray == 1)
                    pointForShootAuto.addAll(arrayPoint1);
                if(numberSecondArray == 2)
                    pointForShootAuto.addAll(arrayPoint2);
     
                if(numberThirdArray == 0)
                    pointForShootAuto.addAll(arrayPoint0);
                if(numberThirdArray == 1)
                    pointForShootAuto.addAll(arrayPoint1);
                if(numberThirdArray == 2)
                    pointForShootAuto.addAll(arrayPoint2);
     
            }
            else {
                // Вызвали во второй раз - массив точек есть, соотвественно
                for(int i = 0 ; i < pointForShootAuto.size() ; i++){
                    // Если мы попали в точку в которую не стреляли - стрельнем и выйдем
                    if(board[pointForShootAuto.get(i).y][pointForShootAuto.get(i).x].isShootThisCell() == false){
                        board[pointForShootAuto.get(i).y][pointForShootAuto.get(i).x].setIsShootThisCell(true);
                        break;
                    }
                }
            }
        }

    Реализация функции для игры морской бой. Каждый раз при вызове должна выстрелить в новую точку карты. Для интереса решил разбить проверяемые участки карты на различные зоны. Написал вариант для 3-х зон и без диагоналей и понял что выходит полная фигня. Интересно - какой есть красивый вариант решение этой задачи.

    Запостил: quercus_mikhail, 06 Декабря 2016

    Комментарии (8) RSS

    • А зачем вообще разбивать карту на зоны?
      Ответить
      • Для интереса
        Ответить
      • Что бы ИИ ходил не слишком предсказуемо, но и не полным рандомом. По идее - должен быть наиболее адекватный вариант.
        Ответить
    • List<Point> pointForShootAuto = new ArrayList<>();


      Fixed
      Ответить
      • ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ, БЛЯ!
        Ответить
    • If убрать можно сделав pointsForShootAuto как HashMap<Integer, List>, это как минимум, do while, меняешь на containsKey(random). Но я бы засунул эти данные в обьект.
      Ответить

    Добавить комментарий