Haciendo un juego llamado hack_exe -- java campo con game camp codereview Relacionados El problema

Making a game called Hack_exe


3
vote

problema

Español

He estado haciendo un pequeño juego que se parece a una terminal de computadoras. No hay mucho en el camino de un juego, pero antes de irme, quiero saber si hay cosas que pueda mejorar, o hacer más eficientes.

  Dictionary<int,Vertex>3  

Se apreciaría cualquier ayuda.

Original en ingles

I have been making a small game which resembles a computers terminal. There isn't much in the way of a game, but before I go any further I want to know if there are any things that I can improve, or make more efficient.

import java.util.ArrayList; import java.util.Scanner; import java.util.Date; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.io.*; import java.text.DateFormat; import java.text.SimpleDateFormat;  import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.DefaultCaret;  @SuppressWarnings("serial") public class Main_Menu extends JFrame{      static volatile Boolean hasInput = false;     static String inputEarly = "";      static JTextArea textWindow = new JTextArea();     static JTextField textInput = new JTextField();     static JFrame frame = new JFrame("Hack_exe");     static BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);     static JScrollPane scrollPane = new JScrollPane(textWindow);     static Action action = new AbstractAction(){         @Override         public void actionPerformed(ActionEvent e) {             textWindow.append(textInput.getText());             inputEarly = textInput.getText();             hasInput = true;             textInput.setText("");         }     };      DefaultCaret caret = (DefaultCaret)textWindow.getCaret();      @SuppressWarnings("unused")     private static Scanner in;      public static String typePhrase(String phrase) {         textInput.setEditable(false);         for(int i = 0; i < phrase.length(); i++) {             try {                 Thread.sleep(50);             } catch (InterruptedException e) {                 e.printStackTrace();             }             textWindow.append(Character.toString(phrase.charAt(i)));             textWindow.setCaretPosition(textWindow.getDocument().getLength());         }         textInput.setEditable(true);         return " ";     }      public static String typeLoad(String phrase) {         for(int i = 0; i < phrase.length(); i += 9) {             try {                 Thread.sleep(50);             } catch (InterruptedException e) {                 e.printStackTrace();             }             textWindow.append(phrase.substring(i, Math.min(i + 9,  phrase.length())));             textWindow.setCaretPosition(textWindow.getDocument().getLength());         }         return " ";     }      public static String getDateTime() {         DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");         Date date = new Date();         return dateFormat.format(date);     }      public static void main(String[] args) throws ClassNotFoundException {         frame.setLayout(boxLayout);         frame.add(scrollPane);         frame.add(textInput);         frame.pack();         frame.setVisible(true);         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setSize(900, 500);         frame.setLocationRelativeTo(null);         textInput.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));         textWindow.setEditable(false);         textInput.addActionListener(action);         scrollPane.setAutoscrolls(true);          String input = "";          in = new Scanner(System.in);          ArrayList<String> openable = new ArrayList<>();         ArrayList<String> commands = new ArrayList<>();         ArrayList<String> mail = new ArrayList<>();         ArrayList<String> mailCommands = new ArrayList<>();         ArrayList<String> previousCommands = new ArrayList<>();          openable.add("Welcome");          commands.add("ls - Lists all files in the current directory");         commands.add("open [] - Opens the file named after 'open'");         commands.add("mail - Opens up the mail application");         commands.add("exit - Quit the game");         commands.add("previous - shows previous commands");         commands.add("help - Opens up the help bar");          mail.add("job opportunity");          mailCommands.add("ls - Lists all emails in the inbox");         mailCommands.add("open [] - Opens the file named after 'open'");         mailCommands.add("exit - Quit the mail application");         mailCommands.add("help - Opens up the help bar");          while(true) {             textWindow.append("localhost " + getDateTime() + " > ");             textWindow.setCaretPosition(textWindow.getDocument().getLength());             while(true) {                 if(hasInput) {                     input = inputEarly;                     hasInput = false;                     break;                 }             }             previousCommands.add(input);             if(previousCommands.size() > 5) {                 previousCommands.remove(0);             } else {              }             for(int i = 0; i < previousCommands.size(); i++) {                 if(previousCommands.get(i).equals("")) {                     previousCommands.remove(i);                 }             }             textWindow.append("\n");             textWindow.setCaretPosition(textWindow.getDocument().getLength());             if(input.length() >= 4) {                 if(input.equals("help")){                     int commandsSize = commands.size();                     for(int i = 0; i < commandsSize; i++) {                         String value = commands.get(i);                         textWindow.append(value + "\n");                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                     }                 } else if((input.substring(0, 4)).equals("open")) {                     while(true) {                         if(input.length() > 5) {                             if(openable.contains(input.substring(5))) {                                 if((input.substring(5)).equals("Welcome")) {                                     typePhrase("Welcome to your computer, I am the Oracle. \n"                                             + "I am the only person that is going to try \n"                                             + "to help you get the password. Your first \n"                                             + "stop will be to find out how to get onto \n"                                             + "your mail application and find a job to \n"                                             + "get you to start earning money. You will \n"                                             + "need at least xc2xa3500 to reach your next level.\n");                                 } else if((input.substring(5)).equals("Connect_Help")) {                                     typePhrase("To connect to a desktop remotely, you need \n"                                             + "its password, and its userID. You can use the \n"                                             + "'connect' command to connect.");                                 } else if((input.substring(5)).equals("Mission 1 - Fishy Buisness")) {                                     typePhrase("Mission 1 - Fishy Buisness: \n\n"                                             + "Connect to the userID 'F15H'.");                                 }                                 break;                             } else {                                 typePhrase("unrecognised file: '" + input.substring(5) + "'");                                 break;                             }                         } else {                             textWindow.append("Type the name of the file that you want to \n"                                     + "open, after the 'open' command.");                             textWindow.setCaretPosition(textWindow.getDocument().getLength());                             break;                         }                     }                    } else if(input.equals("exit")) {                     System.out.println("You are shutting off your computer");                     typePhrase(".     .     .");                     break;                 } else if(input.equals("previous")) {                     int previousSize = previousCommands.size();                     for(int i = 0; i < previousSize; i++) {                         String value = previousCommands.get(i);                         textWindow.append(value + "\n");                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                     }                 } else if(input.substring(0, 4).equals("mail")) {                     while(true) {                         textWindow.append("localhost.mail " + getDateTime() + " > ");                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                         while(true) {                             if(hasInput) {                                 input = inputEarly;                                 hasInput = false;                                 break;                             }                         }                         previousCommands.add(input);                         if(previousCommands.size() > 5) {                             previousCommands.remove(0);                         } else {                          }                         for(int i = 0; i < previousCommands.size(); i++) {                             if(previousCommands.get(i).equals("")) {                                 previousCommands.remove(i);                             }                         }                         textWindow.append("\n");                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                         if(input.length() >= 4) {                             if(input == "exit") {                                 break;                             } else if(input.equals("help")) {                                 int mailCommandsSize = mailCommands.size();                                 for(int i = 0; i < mailCommandsSize; i++) {                                     String value = mailCommands.get(i);                                     textWindow.append(value + "\n");                                     textWindow.setCaretPosition(textWindow.getDocument().getLength());                                 }                             } else if((input.substring(0,4)).equals("open")) {                                 while(true) {                                     if(input.length() > 5) {                                         if(mail.contains(input.substring(5))) {                                             if((input.substring(5)).equals("job opportunity")) {                                                 typeLoad("Hello, \n\n"                                                         + "I am messaging you to say that we have noted you \n"                                                         + "skills as a hacker and want you to help us take \n"                                                         + "down the local competnition. We have sent you some \n"                                                         + "files on email, and have sent an application to let \n"                                                         + "you remotely access their computer. Their password \n"                                                         + "is 'FishingIsFun'. We will message you later with \n"                                                         + "further details. We will speak later.\n\n"                                                         + "All About The Bass\n");                                                 if(mail.contains("Useful things")) {                                                  } else {                                                     mail.add("Useful things");                                                 }                                                 break;                                             } else if((input.substring(5)).equals("Useful things")) {                                                 if(openable.contains("Connect_Help") && openable.contains("Mission 1 - Fishy Buisness")) {                                                  } else {                                                     typePhrase("Downloading files .   .   .   . \n"                                                             + "Unpackaging scripts .   .   .   . \n"                                                             + "Exporting packages .   .   .   . \n"                                                             + "Done\n");                                                     openable.add("Connect_Help");                                                     openable.add("Mission 1 - Fishy Buisness");                                                     commands.add("connect - remotely connect to the chosen machine");                                                 }                                                 break;                                             }                                         } else {                                             typePhrase("unrecognised mail: '" + input + "'\n");                                             break;                                         }                                     } else {                                         textWindow.append("Type the name of the mail that you want to \n"                                                 + "open, after the 'open' command.");                                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                                         break;                                     }                                 }                             } else if(input.equals("previous")) {                                 int previousSize = previousCommands.size();                                 for(int i = 0; i < previousSize; i++) {                                     String value = previousCommands.get(i);                                     textWindow.append(value + "\n");                                     textWindow.setCaretPosition(textWindow.getDocument().getLength());                                 }                              } else {                                 typePhrase("unrecognised command: '" + input + "'\n");                             }                         } else {                             if(input.equals("ls")) {                                 int mailSize = mail.size();                                 for(int i = 0; i < mailSize; i++) {                                     String value = mail.get(i);                                     textWindow.append(value + "\n");                                     textWindow.setCaretPosition(textWindow.getDocument().getLength());                                 }                             } else {                                 typePhrase("unrecognised command: '" + input + "'\n");                             }                         }                      }                 } else {                     typePhrase("unrecognised command: '" + input + "'\n");                 }             } else {                 if(input.equals("ls")){                     int openableSize = openable.size();                     for(int i = 0; i < openableSize; i++) {                         String value = openable.get(i);                         textWindow.append(value + "\n");                         textWindow.setCaretPosition(textWindow.getDocument().getLength());                     }                 } else {                     typePhrase("unrecognised command: '" + input + "'\n");                 }             }         }     } } 

Any help would be appreciated.

     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Recomida para arreglar las advertencias en lugar de suprimirlas en primer lugar.

En relación con el rendimiento, no necesita crear un nuevo 99887766655544330 cada vez que desee crear una respuesta nueva 99887766665544331 , así que refactorelo a un campo privado. < / p>

typePhrase(...)2 y typeLoad(...) son muy similares y, por lo tanto, son un buen punto para la refactorización. Podrías f.E. Pase el paso de incremento a través del parámetro. A ambos, solo devuelven un carácter en blanco, simplemente puede reemplazar esto con cambiar el tipo de retorno para vaciar. RocionWise solo imprimiendo todo el texto a la vez, probablemente sea mejor que iterar y dormir durante 50 ms por / cada 9º carácter.

Para evitar el bloque grande if / también en la parte inferior, refactore esta estructura utilizando una Patrón de comando < / a>. Por lo tanto, su manejo de entrada se puede refactorizar a un 998877666555443344 o similares que realiza un seguimiento de los comandos registrados e instala en un evento de entrada a través de todos los comandos registrados y en una coincidencia ejecuta la lógica de comandos respectivos. Si bien esto puede no producir una mejora de velocidad notable (pero en este momento es una forma de temprano para (sobre-) optimizar su solicitud), hace que su código sea mucho más legible y, por lo tanto, comprensible. Además, a través del uso de patrones, puede reducir la sobrecarga de la documentación, ya que los patrones representan conocimientos comunes.

y recomiendo encarecidamente comenzar a documentar su solicitud temprano. Si detiene su proyecto y devuelva un par de semanas más tarde, se agradecerá si agregó alguna documentación para que sepa qué métodos están haciendo (o deberían).

Por último, pero no menos importante, evite while(true) { ... } construcciones si es posible.


Actualización:

ThrougUOUT Su código tiene un bucle que espera la entrada:

  while(true) {     if(hasInput) {         input = inputEarly;         hasInput = false;         break;     } }   

que básicamente debe esperar la entrada y los ingresos después de que se encontró la entrada. En términos de rendimiento, esto hará que un hilo funcione a plena capacidad. Si tiene varios hilos que esperarán la entrada, esto reducirá drásticamente su solicitud. Para evitar que pueda usar wait() y < CÓDIGO> notify()8 Construcción o mejor su reemplazo ubicado en java.util.concurrent Paquete getDateTime()0 . La entrada en sí debe verificarse en un solo hilo de controlador de IO para obtener la posibilidad de reaccionar en eventos de entrada aunque se realice la representación.

Al analizar su código más encontré esta gema:

  getDateTime()1  

primero, retire el bloque vacío más si no lo necesita. ¿Por qué permite agregar un 99887766655443312

Refactor Las líneas de código igual a un método e invocan el método en lugar de mantener el código duplicado, como su espera para la entrada o el manejo del comando anterior.

 

I'd recomment to fix the warnings instead of suppressing them in first place.

Concerning performance, you don't need to create a new SimpleDateFormat every time you want to create a new getDateTime() response, so refactor it to a private field.

typePhrase(...) and typeLoad(...) are very similar and therefore are a good point for refactoring. You could f.e. pass the increment step through the parameter. As both return only a blank character you can simply replace this with changing the return type to void. Performancewise just printing the whole text at once is probably better then iterating and sleeping for 50ms per/every 9th character.

To avoid the large if/else block at the bottom, refactor this structure using a command pattern. Your input handling can therefore be refactored to a class Console or the like which keeps track of registered commands and iterates on an input-event through all registered commands and on a match executes the respective command logic. While this may not yield a noticable speed improvement (but at this time it is way to early to (over-)optimize your application), it makes your code much more readable and therefore understandable. Also, through the use of patterns you may reduce the documentation overhead as patterns depict common knowledge.

And I highly recommend to start documenting your application early. If you stop your project and return a couple of weeks later you will thank yourself if you added some documentation so you know what which methods is (or should) doing.

Last but not least, avoid while(true) { ... } constructs if possible.


Update:

Througout your code you have a loop that waits for input:

while(true) {     if(hasInput) {         input = inputEarly;         hasInput = false;         break;     } } 

which basically should wait for input and proceeds after input was found. In terms of performance this will cause a thread to work at full capacity. If you have multiple threads that will wait for input, this will drastically slow down your application. To avoid that you can use wait() and notify() construct or better its replacement located in java.util.concurrent package Lock. The input itself should be checked in an own IO handler thread to gain the possibility to react on input events even though the rendering takes place.

On analyzing your code further I found this gem:

previousCommands.add(input); if(previousCommands.size() > 5) {     previousCommands.remove(0); } else {  } for(int i = 0; i < previousCommands.size(); i++) {     if(previousCommands.get(i).equals("")) {         previousCommands.remove(i);     } } 

First, remove the empty else block if you don't need it. Why do you allow to add an empty previousCommand if you later on remove it anyway? Just don't add it in first place so you can avoid the latter iteration which might not work as removing entries while iterating is not possible to my knowledge unsless you explicitely use an iterator and invoke the remove on the iterator object.

Refactor equal code lines to a method and invoke the method instead of keeping the duplicate code like your wait for input or previous command handling.

 
 
   
   
1
 
vote

Reducir el anidamiento, crear funciones o incluso mejor: otras clases, para todos aquellos si ellos) declaraciones.

 

Reduce nesting, create functions or even better: other classes, for all those if else statements.

 
 
   
   

Relacionados problema

4  Juego de Runas: Versión 3  ( Game of runes version 3 ) 
He escrito una versión muy revisada y desarrollada de la juego de runas . Los cambios principales se enumeran: Convertir runas para usar maldiciones. ag...

7  Mecánica de índice para tijeras de papel de roca  ( Index mechanics for rock paper scissors ) 
Acabo de pasar por un ejemplo en línea muy fácil Creando un juego de tijeras de rock-papel, pero parecía que no era un gran uso del poder de la computación. ...

6  Sistema de eventos personalizado en C #  ( Custom event system in c ) 
Actualmente estoy escribiendo un juego y quiero codificar todo lo que sucede (GameObject se ha movido, HP cambió, fue creado / destruido, se ha creado / perdi...

5  Revisión de código para Hangman en C ++  ( Code review for hangman in c ) 
Tengo el siguiente programa C ++: autoConnect.py1 que se supone que replica visualmente el juego clásico de Hangman. ¿El código está totalmente optimiza...

8  IOS7 CHESSGAME UichessOarkView Design  ( Ios7 chessgame uichessboardview design ) 
He estado diseñando UichessboardView en la semejanza de UITYVIEW usando protocolos y delegados. uichessboardview.h @interface UIChessboardView : UIView...

5  Mouselistener Lag en el juego de azulejos de piano  ( Mouselistener lag in piano tiles game ) 
Estaba intentando escribir mi propia versión simple de la aplicación de juegos de piano azulejos en Java, así como un ejercicio divertido. gamelogic.java ...

5  Estructura de datos para entidades  ( Data structure for entities ) 
Estoy trabajando en un motor de componentes de la entidad-componente para juegos, que básicamente significa que una entidad es un objeto que apunta a los comp...

6  Prototipo de javascript blackjack  ( Javascript blackjack prototype ) 
¿Cuál sería la mejor manera de organizar Blackjack en JavaScript y tal vez comience con la pizarra en blanco? Áreas específicas: Actualizando la UI Inc...

4  Atomas Clone en Python  ( Atomas clone in python ) 
Aquí está mi clon de mierda de atomas , un juego de rompecabezas donde combina pequeños átomos en otros más valiosos. 9988776655544337 ¿Hay algún códig...

1  Piedra Papel tijeras  ( Rock paper scissors ) 
Gracias por su tiempo, soy nuevo en la programación y pasé algunos días haciendo este rock, papel y amp; Juego de tijera. ¿Qué otras mejoras posibles podrían ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos