3

我是一名学生,正在开发滑梯和梯子游戏。我正在使用方法来确定应该在游戏板上放置多少滑道和梯子。我在主要使用参数中为每个参数指定了 10 个,但我不断得到从 6 到 11 的任何位置。

这两种方法是否相互干扰?

或者我为随机放置设置 for 循环的方式有问题吗?

我是这个网站的新手,如果您需要更多说明,请告诉我,我不想把整个程序放在这里。谢谢。

//main
                  ChutesAndLadders cl = new ChutesAndLadders();
                  cl.setBoard(new String[100]);
                  cl.makeChutes(10);
                  cl.makeLadders(10);

//methods
            public String [] board;
            private int chutes, ladders;
            public int position;
            public Random rand = new Random();


        //set board
                    public void setBoard(String [] n){
                        board = n;
                        for(int i = 0; i < board.length; i++)
                            board[i] = "   ";
                    }
        //set and place chutes
                    public void makeChutes(int n){
                        chutes = n;
                        for(int i = 0; i <= chutes; i++)                    
                            board[rand.nextInt(board.length)] = "C" + chutes;

                    }
        //set and place ladders
                    public void makeLadders(int n){
                        ladders = n;
                            int lcell = 0; 
                        for(int i = 0; i <= ladders; i++)
                                 board[rand.nextInt(board.length)] = "L" + ladders;
4

3 回答 3

6

首先,你写道:

for(int i = 0; i <= chutes; i++)                    
    board[rand.nextInt(board.length)] = "C" + chutes;

循环中的赋值语句将运行 chutes+1 次。(在您的情况下使用了 11 次。) [i < chutes改为使用。] 这在您的梯子代码中是相同的。这解释了为什么在代码运行完成时您可能会有多达 11 个滑槽或梯子。

其次,您没有注意防止多次为同一空间分配滑道或梯子。 rand.nextInt(board.length)不保证每次运行时都会生成唯一值(否则它不会真正随机。)这解释了为什么在代码运行完成时您可能看不到多达 11 个滑槽和梯子。

为了使这一点更清楚,请在其中放置一个常量值:

for(int i = 0; i < chutes; i++)                    
    board[11] = "C" + chutes;

请注意,您最终会得到一个滑槽(在 11 格处)——除非梯形代码用梯形图覆盖它。

希望有帮助。

祝你好运!

于 2013-01-29T20:42:15.660 回答
2

乍一看,我的猜测是你正在结束重叠的条目。因为您生成随机放置并且不检查那里是否已经有滑道或梯子,所以您很可能会遇到重叠。

生成随机位置应该相当简单,然后在放置之前检查是否有东西。如果发现碰撞,只需生成另一个随机数并重复,直到可以放置它。

另外,顺便说一句,避免 for 循环和不带花括号的 if 语句始终是一个好习惯。在块中添加第二个赞并想知道为什么它没有作为块的一部分执行是很容易的。

于 2013-01-29T20:35:09.770 回答
1

你的 for 循环有一个包容性的上限检查,0 .. 10产生 11 个条目。

就像 Mike 所说的,结果数量较少是由于碰撞造成的,您可以通过设置板子来防止这些碰撞,方法是在板上填充所需的元素,然后对板子进行洗牌以获得最终结果,例如:

public void setupBoard(String [] n, int nrLadders, int nrChutes){
    board = n;
    int index = 0;

    while (index < board.length && 0 < nrLadders--) {
        board[index++] = "L" + nrLadders;
    }

    while (index < board.length && 0 < nrChutes--) {
        board[index++] = "C" + nrChutes;
    }

    while (index < board.length) {
        board[index++] = "   ";
    }

    board = Collections.shuffle(Arrays.asList(board)).toArray(new String[board.length]);
}

这就像创建一副包含许多梯形卡、许多滑槽卡、大量空现货卡的牌组,然后将该牌组洗牌以获得游戏板。

于 2013-01-29T20:57:19.307 回答