【问题标题】:Game board with random game objects and difficulties具有随机游戏对象和困难的游戏板
【发布时间】:2014-02-04 02:03:30
【问题描述】:

我有一个游戏板,我想用随机游戏对象填充它。
让我们在 int[10][10] 数组中为它们提供值 1...6

游戏应该有不同的难度。越容易,允许更多相同的对象彼此相邻;越硬,相邻的相同对象就越少(半径=2)。

示例:
让我们假设一个中等难度。一个物体周围 40% 的物体(半径=2)可以是同一类型。

 -000------
 00000-----
 00100-----
 00000-----
 -000------ 

只有 40% 的 0 被允许为 1 类型。

如何创建这样一个随机数组?或者在这种情况下有没有更好的方法来实现难度?

【问题讨论】:

  • 一般来说,我自己在方格纸上用手做几次来解决这类问题。这给了我关于如何最好地实现它的想法。你能给我们一些好的游戏板的例子吗?
  • 游戏果冻飞溅就是一个例子。在早期的关卡中,总会有一些区域有 4 - 8 个相同类型的果冻彼此相邻。在后面的关卡中,只有少数区域有 3 - 5 个相同类型的果冻。另一个例子是糖果粉碎。第一级充满了 2 种相同的类型 + 1 旁边。在较难的关卡中,这不太可能。
  • 每个问题都由Monte Carlo解决:)

标签: java arrays random


【解决方案1】:

我这样做的方式是随机化索引而不是值本身.. 所以其中 40% 意味着我只会循环总数的 40%。 在你的例子中,这就是我会做的..

int n = 20 * 0.4;
for(i=1; i<n; ++i){
    int r = GetRandomIndex();
    board[r] = 1;
}

【讨论】:

  • 谢谢,但这仅适用于 1 种对象类型。这个想法是整个数组应该用 123456 填充,并考虑到 40% 的半径。
  • 然后对所有对象类型执行此操作:/ 我回答了要记住的一般概念,这取决于您在您的场景中实现它。我的意思是,我不会为你做所有的代码:P 只是说
【解决方案2】:

试试这样的:

import java.awt.Point;
import java.awt.geom.Point2D;
import java.util.*;
import static java.lang.Math.sqrt;
class Game {
    Game() {
        clearGameObjects();
    }
    void clearGameObjects() {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                gameObjects[i][j]=0;
    }
    @Override public String toString() {
        String s="";
        for(int i=0;i<n;i++) {
            List row=Arrays.asList(gameObjects[i]);
            s+="row "+i+" "+row+'\n';
        }
        return s;
    }
    void distributeObjects(int x,int y,double percent,int type) {
        clearGameObjects();
        gameObjects[x][y]=type;
        List<Point> withinRadius=new ArrayList<>(21);
        Point2D p1=new Point2D.Double(x,y);
        Point p;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++) {
                if(p1.distance(p=new Point(i,j))<Math.sqrt(5))
                withinRadius.add(p);
            }
        System.out.println(withinRadius.size()+" points within radius: "+withinRadius);
        int placed=1;
        for(Point p2:withinRadius)
            if(p2.getX()!=x&&p2.getY()!=y) 
                if(placed/(double)withinRadius.size()<percent) {
                    gameObjects[p2.x][p2.y]=type;
                    placed++;
                }

        System.out.println("placed "+placed+" items, "+placed/(double)withinRadius.size()*100+"%");

    }
    final int n=10;
    Integer gameObjects[][]=new Integer[n][n];
}
public class So21541681 {
    public static void main(String[] args) {
        Game game=new Game();
        System.out.println(game);
        game.distributeObjects(5,6,.40,1);
        System.out.println(game);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多