滑槽和梯子游戏随机放置问题

时间:2013-01-29 20:31:21

标签: java methods random

我是一名学生,从事滑槽和梯子游戏。我正在使用方法来确定应该在游戏板上放置多少个滑槽和梯子。我在主要使用参数中为每个参数指定了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;

3 个答案:

答案 0 :(得分:6)

首先,您写道:

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

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

其次,您不必小心防止同一空间多次分配滑槽或梯子。 rand.nextInt(board.length)不保证每次运行时都会生成唯一值(否则它实际上不是随机的。)这就解释了为什么在代码运行完成后你可能看不到多达11个滑槽和梯子。

为了更清楚,在那里放一个常数值:

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

并注意到你最终得到一个滑槽(在11号空间) - 除非梯形图代码用梯子覆盖它。

希望有所帮助。

祝你好运!

答案 1 :(得分:2)

乍一看,我的猜测是你正在收拾重叠的条目。因为你生成了一个随机的位置,并且没有检查那里是否已经有滑槽或梯子,你可能会重叠。

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

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

答案 2 :(得分:1)

您的for循环具有包含上限检查,0 .. 10产生11个条目。

像迈克所说的那样,结果数量较少是由于碰撞造成的,你可以通过填充所需的元素来设置电路板,然后改组电路板以获得最终结果来阻止它们,例如:

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]);
}

这就像创建一副卡片,其中包含许多梯形卡片,一些滑槽卡片,大量空白卡片以及随机播放游戏板的卡片。