【问题标题】:Make a project more OO Java让项目更OO Java
【发布时间】:2013-11-14 18:15:30
【问题描述】:

我已经制作了一个 12 x 12 的表,它在同一个程序中运行,但我想将其设为 OO,以便我可以将“public static void main”放在另一个“testfile”中,它仍然可以运行正确..我在 OO 方法方面遇到了一些问题,我真的需要帮助...这就是我的代码的样子:

import java.util.Scanner;
import java.util.Arrays;
import java.util.Random;

public class PlayingArea {
    public static void main(String[] args) {
        Random r = new Random();
        Scanner input = new Scanner(System.in);
        System.out.println("How many regions would you like (2- 4)");
        int region = input.nextInt();
        String letters = "";
        while(letters.length() < 2) {
            if (region == 4) {
                letters= "EFGH";
            }
            if (region == 3) {
                letters= "EFG";
            } else if (region == 2) {
                letters= "EF";
            } else if (region < 2) {
                System.out.println("You inputed a wrong value, try again...");
            }
        }
        int N = letters.length();
        char [][] letter = new char[12][12];

        for (int j = 0; j < letter.length; j++) {

            for(int i=0; i < letter.length; i++) {
                letter[i][j] = letters.charAt(r.nextInt(N)) ;
            }
        }

        for (char[] letterRow : letter)
            System.out.println(Arrays.toString(letterRow));
    }
}

【问题讨论】:

  • 如果我理解了这个问题,您是否希望有一个具有static void main 的测试类,然后创建一个PlayingArea 的实例?这是作业吗?
  • 我正在尝试制作游戏 :) 是的,这正是我想要的 :D
  • 酷,看起来下面已经有几个很好的答案了。对于此类游戏的背景问题,简要提及它是(或不是)家庭作业可能会有所帮助。不管怎样,人们都会提供帮助!

标签: java arrays loops methods


【解决方案1】:

如果您对 java 比较陌生,那么您做得很好。请注意,如果您输入 2-4 之外的数字,您的程序中会出现无限循环(已在下面修复)。

首先,您的类PlayingArea 需要一些成员变量来表示状态。

第一个是String letters(EF 或 EFG 或 EFGH),它通过下面代码中的构造函数进行初始化。

第二个是char[][] grid(从代码中的letter重命名),它在populate()方法中分配了一个值,它将字母放入网格中。

另一种方法,gridAsString() 就是这样做的。

如果您愿意,现在可以轻松地将public static void main 移动到另一个班级。

玩得开心。

public class PlayingArea {
    private String letters;
    private char[][] grid;

    public PlayingArea(String letters) {
        this.letters = letters;
    }

    public void populate() {
        int n = letters.length();
        grid = new char[12][12];

        Random r = new Random();
        for (int j = 0; j < grid.length; j++) {
            for (int i = 0; i < grid.length; i++) {
                grid[i][j] = letters.charAt(r.nextInt(n));
            }
        }

    }

    public String gridAsString() {
        StringBuilder sb = new StringBuilder();
        for (char[] letterRow : grid) {
            sb.append(Arrays.toString(letterRow)).append('\n');
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("How many regions would you like (2- 4)");
        String letters = "";
        while (letters.length() < 2) {
            int region = input.nextInt();
            if (region == 4) {
                letters = "EFGH";
            } else if (region == 3) {
                letters = "EFG";
            } else if (region == 2) {
                letters = "EF";
            } else {
                System.out.println("You inputed a wrong value, try again...");
            }
        }
        PlayingArea playingArea = new PlayingArea(letters);
        playingArea.populate();
        System.out.println(playingArea.gridAsString());
    }
}

【讨论】:

  • 嘿,谢谢你的回答:D 如果对你来说不是太难,你能解释一下“private String gridAsString()”的部分吗??
  • 嗨 Tommon,不用担心,方法 populategridAsString 实际上应该是 public。后一个函数在多行上生成一个字符串,您可以将其打印到 sout。 StringBuilder 是构建大字符串的常用方法,尽管您也可以使用普通的 String result = "";,然后在 for 循环中使用 result += Arrays.toString(letterRow)) + '\n';return result;。一个重要的 OO 概念是封装,PlayingArea 类“隐藏”了内部数据表示,并向外界提供了像 gridAsString 这样的公共函数。
  • 谢谢 :) 但现在如果它是一个字符串,我将无法将“E”的所有字符(例如)更改为另一个字符,我会..?
  • 是的,所以在这种情况下,您可以提供另一个公共方法,例如 changeLettersFromTo(char letterFrom, char letterTo)。
  • 抱歉打扰了……但你现在让我有点困惑了xD
猜你喜欢
  • 2012-01-12
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多