好吧,请允许我详细说明我的困境。
我正在用Java制作一个控制台游戏。它不会是超级简单,但我也不希望它真的是先进的。我只是试着用我所学到的基本知识来测试我的技能。我已经开始了几次,但经常遇到同样的“问题”。
不过,这并不是什么问题,只是我可以做得更好。解释它的最好方法就是展示一些示例代码。
这是我的主修班。我们叫它"Main.java“。
package com.mattkx4.cgamedev.main;
public class Main {
public static void main(String[] args) {
}
}好了,现在让我们在Main.java中创建一个新的方法。我们将此方法称为“开始”。我们的主要课程现在看起来是这样的:
package com.mattkx4.cgamedev.main;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
}
public static void start() {
System.out.println("This is the start.");
Scanner s = new Scanner(System.in);
System.out.println("Enter \"NEXT\" to continue.");
String in = s.nextLine();
if(in.equalsIgnoreCase("NEXT")) {
}else{
System.out.println("Please input \"NEXT\".");
start();
}
}
}现在我们再添加两个方法。我们称他们为“中间”和“结束”。我们完成的课程现在看起来是这样的:
package com.mattkx4.cgamedev.main;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
start();
}
public static void start() {
System.out.println("This is the start.");
Scanner s = new Scanner(System.in);
System.out.println("Enter \"NEXT\" to continue.");
String in = s.nextLine();
if(in.equalsIgnoreCase("NEXT")) {
middle();
s.close();
System.exit(0);
}else{
System.out.println("Please input \"NEXT\".");
start();
}
}
public static void middle() {
System.out.println("This is the middle.");
System.out.println("Let's move on to the end.");
end();
}
public static void end() {
System.out.println("This is the end.\nFinishing up, and heading back to the start() method to close program.");
}
}在我看来,我写的是一个效率很低的程序。用它编写代码效率很低。必须有另一种方法来执行这个程序,而不是在其他方法中调用方法来移动程序。
我问题的总结:上面的代码是编写控制台游戏最有效的方法吗?
提前感谢!如果你有什么问题,我很乐意回答。-Matthew
发布于 2014-06-09 17:16:27
你的问题有很多种答案。我只列举一些基本的事情。
enum来实现的。理解基于状态的编程工作是如何实现的,这一点很重要。所以你可能有这样的东西:
公共枚举GameState {加载,开始,停止,开始,中间,结束,GAME_OVER /.等等}static方法。这当然不是你想做的。它完全抛弃了任何面向对象的方式。如果您正在创建一个游戏世界,理想情况下,您将为您的世界中的每个不同的对象创建一个类,并且它们将被安排在一个逻辑层次结构中,由extends-ing different或implements-ing不同的接口组成。因此,就在这三个非常基本的注释中,您将需要学习目标定向、多态、并发性以及您可以使用的所有各种数据结构。坦率地说,您的示例具有Java 101项目的复杂性。(我不是说这是刻薄的。)如果你计划做一个真正的游戏,你将需要更多的基础知识,然后你才能取得真正的进展。
很好,你的想法很远大,而且你的编程目标也很大。但是把这个大梦想分解成可管理的小块。它会让你走得更远、更快,也能防止你气馁。
祝你好运!
顺便提一句,如果你开始编写一些简单的游戏(甚至像基于控制台的Hangman或者Tic Toe这样简单的游戏),请转到代码评审Beta。我们非常乐意为您提供详细的代码回顾,并帮助您在成为资深程序员的道路上前进!这是一个很好的社区,有很多建设性的批评。我都帮助过那里的人(用Java),并且在我学习Python时得到了大量的帮助。
发布于 2014-06-09 17:20:36
嗯,我不太明白这与性能或优化有什么关系。但通常情况下,您使用类和方法来构造程序。
尽管如此,在start方法中存在一个巨大的错误。您应该使用不必要的递归并使用循环,并删除exit调用:
public static void start() {
System.out.println("This is the start.");
Scanner s = new Scanner(System.in);
System.out.println("Enter \"NEXT\" to continue.");
String in = s.nextLine();
if(in.equalsIgnoreCase("NEXT")) {
middle();
s.close();
System.exit(0);
}else{
System.out.println("Please input \"NEXT\".");
start(); // <-- recursion!
}
}最好这样做:
public static void start() {
System.out.println("This is the start.");
Scanner s = new Scanner(System.in);
System.out.println("Enter \"NEXT\" to continue.");
while ( !s.nextLine().equals("NEXT")) {
System.out.println("Please input \"NEXT\".");
}
middle();
// you probably also want to put "end();" here - it is not called in the original code
s.close();
}发布于 2014-06-09 17:22:49
我想您想要构建的是应用程序的主要框架。我建议搜索“游戏循环”。下面有很多关于这个的好文章。
对于一般的解决方案,该算法在很大的范围内或多或少是这样的:
while (notExit()) {
event = getNextEvent(); // this can be the user keyboard input or mouse
renderGame(); // display the graphics on the screen
doGameLogic(event); // do the game logic according to the events occurred
}稍后,您必须考虑到在屏幕(FPS)上每秒钟绘制多少次,以及计算更改(物理帧每秒)多少次。
任何与GUI编程的类比都是纯粹的巧合。我开玩笑的,这不是巧合,这是一个事实,GUI和游戏编程共享一个线程来完成事件分派线程的角色。
有关更多信息,我建议阅读本教程:http://sol.gfxile.net/gp/index.html。
希望能帮上忙!
https://stackoverflow.com/questions/24125066
复制相似问题