首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java控制台游戏开发方法

Java控制台游戏开发方法
EN

Stack Overflow用户
提问于 2014-06-09 16:57:34
回答 5查看 7.5K关注 0票数 3

好吧,请允许我详细说明我的困境。

我正在用Java制作一个控制台游戏。它不会是超级简单,但我也不希望它真的是先进的。我只是试着用我所学到的基本知识来测试我的技能。我已经开始了几次,但经常遇到同样的“问题”。

不过,这并不是什么问题,只是我可以做得更好。解释它的最好方法就是展示一些示例代码。

这是我的主修班。我们叫它"Main.java“。

代码语言:javascript
复制
package com.mattkx4.cgamedev.main;

public class Main {
    public static void main(String[] args) {

    }
}

好了,现在让我们在Main.java中创建一个新的方法。我们将此方法称为“开始”。我们的主要课程现在看起来是这样的:

代码语言:javascript
复制
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();
        }
    }
}

现在我们再添加两个方法。我们称他们为“中间”和“结束”。我们完成的课程现在看起来是这样的:

代码语言:javascript
复制
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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-09 17:16:27

你的问题有很多种答案。我只列举一些基本的事情。

  1. 你的设计是线性的,完全僵硬的。不灵活。大多数像这样的应用程序,而不是链接任何方法或类似的,以某种方式存储一个状态。这通常是通过enum来实现的。理解基于状态的编程工作是如何实现的,这一点很重要。所以你可能有这样的东西: 公共枚举GameState {加载,开始,停止,开始,中间,结束,GAME_OVER /.等等}
  2. 您正在使用一堆static方法。这当然不是你想做的。它完全抛弃了任何面向对象的方式。如果您正在创建一个游戏世界,理想情况下,您将为您的世界中的每个不同的对象创建一个类,并且它们将被安排在一个逻辑层次结构中,由extends-ing different或implements-ing不同的接口组成。
  3. 您需要学习并发性。您的用户输入几乎必然是异步来呈现您的游戏,如果它有任何复杂的。至少,您可能至少需要秋千来创建一个GUI。

因此,就在这三个非常基本的注释中,您将需要学习目标定向多态并发性以及您可以使用的所有各种数据结构。坦率地说,您的示例具有Java 101项目的复杂性。(我不是说这是刻薄的。)如果你计划做一个真正的游戏,你将需要更多的基础知识,然后你才能取得真正的进展。

很好,你的想法很远大,而且你的编程目标也很大。但是把这个大梦想分解成可管理的小块。它会让你走得更远、更快,也能防止你气馁。

祝你好运!

顺便提一句,如果你开始编写一些简单的游戏(甚至像基于控制台的Hangman或者Tic Toe这样简单的游戏),请转到代码评审Beta。我们非常乐意为您提供详细的代码回顾,并帮助您在成为资深程序员的道路上前进!这是一个很好的社区,有很多建设性的批评。我都帮助过那里的人(用Java),并且在我学习Python时得到了大量的帮助。

票数 5
EN

Stack Overflow用户

发布于 2014-06-09 17:20:36

嗯,我不太明白这与性能或优化有什么关系。但通常情况下,您使用类和方法来构造程序。

尽管如此,在start方法中存在一个巨大的错误。您应该使用不必要的递归并使用循环,并删除exit调用:

代码语言:javascript
复制
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!
    }
}

最好这样做:

代码语言:javascript
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2014-06-09 17:22:49

我想您想要构建的是应用程序的主要框架。我建议搜索“游戏循环”。下面有很多关于这个的好文章。

对于一般的解决方案,该算法在很大的范围内或多或少是这样的:

代码语言:javascript
复制
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

希望能帮上忙!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24125066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档