// AI Tank World // // A simple control panel which changes static variables. This means only one set // of parameters can be used between a number of separate simulated worlds. // // Author Matthew Caryl // Created 30.10.96 // // Although under copywrite to the author (Matthew Caryl) this code can be copied and modified for non-commercial // purposes as long as any derivatives contain this condition. package ThinkTank; import java.awt.Frame; import java.awt.Panel; import java.awt.Button; import java.awt.Choice; import java.awt.Label; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Event; final class Control extends Frame { Button cancel; Button ok; Button reset; World owner; Choice lifespan; Choice shellcost; Choice shellspeed; Choice shelldamage; Choice damagetransfer; Choice turretspeed; Choice tankspeed; Choice brainspeed; Choice mutationrate; public Control (World w, long seed) { super("Tank Control"); owner = w; // Add an OK button to the base of the frame cancel = new Button("Cancel"); ok = new Button("OK"); reset = new Button("Reset"); Panel okPanel = new Panel(); okPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 15, 15)); okPanel.add(cancel); okPanel.add(ok); okPanel.add(reset); this.add("South", okPanel); // Add a grid to contain all the controls Panel signiturePanel = new Panel(); signiturePanel.setLayout(new FlowLayout(FlowLayout.CENTER, 15, 15)); signiturePanel.add(new Label("Matthew Caryl 1996")); this.add("North", signiturePanel); // Control tank life span lifespan = new Choice(); for (int i = 100; i <= 6400; i *= 2) lifespan.addItem(Integer.toString(i)); lifespan.select(Integer.toString(Tank.STARTTIME)); // Control shell damage shelldamage = new Choice(); shelldamage.addItem(Integer.toString(0)); for (int i = 1; i <= 128; i *= 2) shelldamage.addItem(Integer.toString(i)); shelldamage.select(Integer.toString(Tank.TAKETIME)); // Control shell damage damagetransfer = new Choice(); damagetransfer.addItem(Integer.toString(0)); for (int i = 1; i <= 128; i *= 2) damagetransfer.addItem(Integer.toString(i)); damagetransfer.select(Integer.toString(Tank.GAINTIME)); // Control shell speed shellspeed = new Choice(); for (int i = 1; i <= 32; i *= 2) shellspeed.addItem(Integer.toString(i)); shellspeed.select(Integer.toString(Tank.SHELLSPEED)); // Control shell cost shellcost = new Choice(); shellcost.addItem(Integer.toString(0)); for (int i = 1; i <= 128; i *= 2) shellcost.addItem(Integer.toString(i)); shellcost.select(Integer.toString(Tank.FIRETIME)); // Control turret speed turretspeed = new Choice(); for (int i = 1; i <= 32; i *= 2) turretspeed.addItem(Integer.toString(i)); turretspeed.select(Integer.toString((int) Classifier.TURRETSPEED)); // Control tank speed tankspeed = new Choice(); for (int i = 1; i <= 32; i *= 2) tankspeed.addItem(Integer.toString(i)); tankspeed.select(Integer.toString((int) Classifier.TANKSPEED)); // Control brain speed brainspeed = new Choice(); for (int i = 1; i <= 32; i *= 2) brainspeed.addItem(Integer.toString(i)); brainspeed.select(Integer.toString(Classifier.CHECKRULES)); // Control mutation rate mutationrate = new Choice(); for (int i = 1; i <= 8; i *= 2) mutationrate.addItem(Integer.toString(i)); mutationrate.select(Integer.toString(Classifier.MUTATIONRATE)); // Add a grid to contain all the controls Panel controlPanel = new Panel(); controlPanel.setLayout(new GridLayout(10, 2, 0, 5)); // 10 rows, 2 columns, 0 horizontal, 5 verticle controlPanel.add(new Label("Lifespan of tank:")); controlPanel.add(lifespan); controlPanel.add(new Label("Cost of shell:")); controlPanel.add(shellcost); controlPanel.add(new Label("Speed of shell:")); controlPanel.add(shellspeed); controlPanel.add(new Label("Damage of shell:")); controlPanel.add(shelldamage); controlPanel.add(new Label("Score of hit:")); controlPanel.add(damagetransfer); controlPanel.add(new Label("Turret speed:")); controlPanel.add(turretspeed); controlPanel.add(new Label("Tank speed:")); controlPanel.add(tankspeed); controlPanel.add(new Label("Brain speed:")); controlPanel.add(brainspeed); controlPanel.add(new Label("Mutation rate:")); controlPanel.add(mutationrate); controlPanel.add(new Label("Random seed:")); controlPanel.add(new Label(Long.toString(seed))); Panel alignPanel = new Panel(); alignPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); alignPanel.add("Center", controlPanel); this.add("Center", alignPanel); // Resize the window and display this.pack(); this.show(); } public boolean action(Event e, Object arg) { if (e.target == reset) owner.reset(); if (e.target == ok || e.target == reset) { // set parameters Tank.STARTTIME = readInt(lifespan, Tank.STARTTIME); Tank.FIRETIME = readInt(shellcost, Tank.FIRETIME); Tank.SHELLSPEED = readInt(shellspeed, Tank.SHELLSPEED); Tank.TAKETIME = readInt(shelldamage, Tank.TAKETIME); Tank.GAINTIME = readInt(damagetransfer, Tank.GAINTIME); Classifier.TURRETSPEED = readInt(turretspeed, (int) Classifier.TURRETSPEED); Classifier.TANKSPEED = readInt(tankspeed, (int) Classifier.TANKSPEED); Classifier.CHECKRULES = readInt(brainspeed, Classifier.CHECKRULES); Classifier.MUTATIONRATE = readInt(mutationrate, Classifier.MUTATIONRATE); // restart world and dispose of controls owner.restart(); this.hide(); this.dispose(); if (e.target == reset) owner.repaint(); return true; } if (e.target == cancel) { // set parameters // restart world and dispose of controls owner.restart(); this.hide(); this.dispose(); return true; } else return false; } private int readInt(Choice c, int d) { int n; try { n = Integer.parseInt(c.getSelectedItem()); } catch (NumberFormatException e) { n = d; } return n; } }