Создания скрипта Lua для карты производитель


Я использую издания для создания скрипта Lua для карты создателя. Кажется программистские со мной, но это работает.

Цели, позволяющие пользователям сделать свои собственные карты для игры.

  • Есть ли лучшая практика для создания скриптов?
  • Вторичный - почему это плохо, чтобы сделать это мой путь?

Я только в том числе функции, чтобы написать этот код на Lua, но если вы хотите запустить его на своем компьютере полный источник здесь.

public void buildLua() {
    block25 : {
        boolean foundGoal = false;
        boolean foundPlayer = false;
        boolean foundWall = false;
        int m = 0;
        while (!(foundGoal && foundPlayer && foundWall)) {
            if (this.mapGridList.get(m).getIcon().equals(this.goalIcon)) {
                foundGoal = true;
            } else if (this.mapGridList.get(m).getIcon().equals(this.playerIcon)) {
                foundPlayer = true;
            } else if (this.mapGridList.get(m).getIcon().equals(this.wallIcon)) {
                foundWall = true;
            }
            if (++m > (this.mapSize - 2) * (this.mapSize - 2)-1) break;
        }
        if (foundGoal && foundPlayer && foundWall) {
            try {
                JFileChooser chooser = new JFileChooser(String.valueOf(System.getProperty("user.home")) + "/Desktop");
                chooser.setFileSelectionMode(2);
                int result = chooser.showSaveDialog(chooser);
                if (result == 0) {
                    this.mapName = chooser.getSelectedFile().getName();
                    if (this.mapName.contains(".lua")) {
                        this.mapName = this.mapName.substring(0, this.mapName.length() - 4);
                    }
                    JRadioButton temp = new JRadioButton();                       
                    System.out.println(temp.getText());
                    this.setMaxWalls();
                    String path = chooser.getSelectedFile().getAbsolutePath();
                    PrintWriter writer = path.endsWith(".lua") ? new PrintWriter(path, "UTF-8") : new PrintWriter(String.valueOf(path) + ".lua", "UTF-8");
                    writer.println("local Map = IceRunner.Map");
                    writer.println("local MapKit = IceRunner.MapKit");
                    writer.println("local Up = IceRunner.MapTools.UpExtent");
                    writer.println("local Down = IceRunner.MapTools.DownExtent");
                    writer.println("local Left = IceRunner.MapTools.LeftExtent");
                    writer.println("local Right = IceRunner.MapTools.RightExtent");
                    writer.println("local Wall = IceRunner.Map.Wall");
                    writer.println("local MapKit = IceRunner.MapTools.MapKit");
                    writer.println("local Player = Map.Player");
                    writer.println("local Goal = Map.Goal");
                    writer.println("");
                    writer.println("local map = Map({");
                    writer.println("name = \"" + this.mapName.toUpperCase() + "\",");
                    writer.println("level = " + this.difficulty + ",");
                    writer.println("kit = MapKit({size = " + this.mapSize + ", walls = " + this.maxWalls + " })");
                    writer.println("})");
                    writer.println("");
                    if (this.mapSize == 15) {
                        writer.println("map:add_walls(Wall(0, 0), Right(14))");
                        writer.println("map:add_walls(Wall(1, 0), Down(13))");
                        writer.println("map:add_walls(Wall(1, 14), Down(13))");
                        writer.println("map:add_walls(Wall(14, 1), Right(13))");
                    } else if (this.mapSize == 20) {
                        writer.println("map:add_walls(Wall(0, 0), Right(19))");
                        writer.println("map:add_walls(Wall(1, 0), Down(18))");
                        writer.println("map:add_walls(Wall(1, 19), Down(18))");
                        writer.println("map:add_walls(Wall(19, 1), Right(18))");
                    } else if (this.mapSize == 25) {
                        writer.println("map:add_walls(Wall(0, 0), Right(24))");
                        writer.println("map:add_walls(Wall(1, 0), Down(23))");
                        writer.println("map:add_walls(Wall(1, 24), Down(23))");
                        writer.println("map:add_walls(Wall(24, 1), Right(23))");
                    }
                    int z = this.mapSize - 2;
                    int i = 1;
                    while (i < z * z + 1) {
                        int x;
                        int y;
                        if ((i - 1) % z > 0) {
                            x = (i - 1) / z;
                            y = (i - 1) % z;
                        } else {
                            x = (i - 1) / z;
                            y = 0;
                        }
                        if (this.mapGridList.get(i - 1).getIcon().equals(this.wallIcon)) {
                            writer.println("map:add_walls(Wall(" + (x + 1) + "," + (y + 1) + "), Up(0))");
                        } else if (this.mapGridList.get(i - 1).getIcon().equals(this.playerIcon)) {
                            writer.println("map:set_player(Player(" + (x + 1) + "," + (y + 1) + "))");
                        } else if (this.mapGridList.get(i - 1).getIcon().equals(this.goalIcon)) {
                            writer.println("map:set_goal(Goal(" + (x + 1) + "," + (y + 1) + "))");
                        }
                        ++i;
                    }
                    writer.println("");
                    writer.println("IceRunner.register_map(map);");
                    writer.close();

                    break block25;
                }
                JOptionPane.showMessageDialog(this.frmIceRunnerMap, "Map Not Saved!");
            }
            catch (IOException e) {
                JOptionPane.showMessageDialog(this.frmIceRunnerMap, "Error Occured While Saving!");
            }
        } else {
            JOptionPane.showMessageDialog(this.frmIceRunnerMap, "Please place at least one wall, start tile, and finish tile...");
        }
    }
}


156
3
задан 15 февраля 2018 в 06:02 Источник Поделиться
Комментарии
2 ответа

Я не могу ответить, если есть лучший путь для создания сценария Lua. Может быть, вы должны Google для некоторых проектов о подключении в Java и Lua. Я видела кучу их, поэтому, возможно, кто-то уже сделал то, что вам нужно. Но я упомяну, как можно сделать свой код на Java лучше ;)


  1. Разделить код в метод

    Вы написали гигантский кусок кода. Трудно понять, что там делает. Поверьте, когда вы покидаете свой проект и вернуться позже, вы будете иметь сложности с полным пониманием его.

    Например, все эти изменения писателя могут быть извлечены методом. Следующий пример - "установка" стены игрока и цели. По данным чистый код Роберт Мартин, функция должна быть не более 20 строк кода.

    Даже извлекать этот метод с параметром String message будут сделать положительные изменения в читаемый код:

    JOptionPane.showMessageDialog(this.frmIceRunnerMap, "...");

  2. Прекратить использование "магических чисел"

    На ваш GitHub РЕПО (и даже в этой части кода), есть некоторые цифры. Я пытался понять его, но я не могу.

    В map.java:

    for(int i = 0; i < 169; i++){
    JLabel label = new JLabel();
    label.setIcon(new ImageIcon(map.class.getResource("/team10/Empty.png")));
    panel.add(label);
    }

    Было бы неплохо, чтобы имя тех переменных, как BoardSize. Вы можете даже создать отдельный класс с этих чисел и попробуйте статические импортировать их в классе, где они используются.


  3. Слишком много вложенных логика

    Если вы используете for in for in if и т. д. вы делаете жесткий код, чтобы понять. И для вас это будет трудно написать несколько тестов для классов. Решение наше 1. точку деления код. Возможно, даже добавить некоторые дополнительные классы.


В начале, это должно быть достаточно. Удачи :)

1
ответ дан 15 февраля 2018 в 11:02 Источник Поделиться

может быть, вы можете нажать некоторые из ваших код в текстовый файл и использовать его для генерации кода?

template.txt:

local Map = IceRunner.Map
local MapKit = IceRunner.MapKit
local Up = IceRunner.MapTools.UpExtent
local Down = IceRunner.MapTools.DownExtent
...
local Goal = Map.Goal
local map = Map({
name = "{0}",
level = "{1}",
kit = MapKit({size = {2}, walls = {3} })
})

в messageformat значение класса будет заменить заполнители с содержанием:

String template = readFile("template.txt"); //please don't use hardcoded file names
String codePart = MessageFormat.format(
template , //template with placeholders
this.mapName.toUpperCase(), // placeholder {0}
this.difficulty, // placeholder {1}
this.mapSize, // placeholder {2}
this.maxWalls ); //placeholder {3}

...
writer.println(codePart); //lua-code with replaced placeholder

Примечание: код для чтения файла шаблона (readFile()) не является частью моего предложения, пожалуйста, сделать самостоятельно

4
ответ дан 16 февраля 2018 в 11:02 Источник Поделиться