【问题标题】:drawing a board in which each tile has a 0.4 chance to be filled画一个棋盘,每个棋子有 0.4 的机会被填满
【发布时间】:2020-07-25 14:33:15
【问题描述】:

我是 Java 游戏的新手,尤其是 Java 图形的新手。 我正在尝试制作一个游戏,其中棋盘的每个瓷砖都有 40% 的机会成为填充障碍。 我已经对一些部分进行了编码,但它并没有按照我想要的方式工作。它填满了整个电路板,但我只想让一些部分成为障碍。 这是我的机会和绘图方法代码:

    /////////////////////////////////////////
    //Draws the graphics needed for the game.
    ////////////////////////////////////////
    public void paint(Graphics g) { 
        
        g.setColor(Color.BLUE);
        
        
        for(int i=1;i<boardWidth/10;i++) {
            g.drawLine(i*100, 100, i*100, HEIGHT-100);
        }
        
        
        for(int j=1;j<boardHeight/10;j++)
            g.drawLine(100, j*100, WIDTH-100, j*100);
        
        
        for(int i=100;i<WIDTH-200;i++)
            for(int j=100;j<HEIGHT-200;j++)
                if(randomBarrier()) 
                g.fillRect(i, j, 100, 100);
               
        
    }
    
    
    
    
    ///////////////////////////////////////////////////////////////////////////
    //finds a random place for the barrier objects in the beginning of the game.
    ///////////////////////////////////////////////////////////////////////////

    public static boolean randomBarrier() {  //Should put all the parts to this method to see if the are barrier material or not.
        
        
        int row = WIDTH/100;
        int column = HEIGHT/100;
        
        int min = 0;
        int max = row*column;
        
        double random = Math.random();
        
        if(random<0.4)
            return true;
        
        else if(random>=0.4)
           return false;
        
        return true;
        
    }

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您在文本中声明您希望有 0.4% 的机会出现障碍,但您的代码使用了 40% 的机会出现障碍。是哪个?
  • 哦,对不起。实际上是 40%。
  • 就是说,你的方法randomBarrier可以写成一行:return Math.random() &lt; 0.4;

标签: java swing graphics game-development


【解决方案1】:

绘制方法不应改变组件的状态(您无法控制 Swing 何时确定组件需要重新绘制)。

因此,您不应该在绘画方法中使用随机代码。

相反,您可以:

  1. 在包含布尔值的类中创建一个二维数组作为实例变量
  2. 在您的类的构造函数中,您遍历数组中的所有项目并根据您的随机逻辑分配一个真/假值
  3. 在绘画方法中,然后遍历二维数组并根据值绘制每个矩形。

此外,自定义绘画是通过覆盖paintComponent() 方法而不是paint() 来完成的,您需要调用super.paintComponent()

您的绘画代码使用了太多硬编码值。相反,您应该在类中使用实例变量以避免混淆。比如:

int rows = 100;
int columns = 200;
int tileSize = 10;

然后你的绘画代码变成(未经测试的)类似于:

    super.paintComponent();

    int width = columns * tileSize;
    int height = rows * tileSize;

    for(int i = 0; i <= rows; i++) {
        int lineY = i * tileSize;
        g.drawLine(0, lineY, width, lineY);
    }
    
    
    for(int j = 1; j <= columns; j++) {
        int lineX = j * tileSize;
        g.drawLine(lineX, 0, lineX, height);
    }
    
    
    for(int i = 0;i < rows;i++)
        for(int j=0; j < columns;j++)
            if( randomBarrier[i][j]) 
                g.fillRect(i * tileSize, j * tileSize, tileSize, tileSize);
           

现在您可以动态更改行/列/单元格大小而不会影响绘制代码。避免在程序中使用硬编码值。为你的类设置 values 属性。

【讨论】:

    【解决方案2】:

    您可能会为板上的每个像素绘制一个 100x100 的图块,因为 ij 以 1 递增。绘制图块的概率为 40%,您很有可能会在板上的所有像素上结束绘制.您应该将 ij 增加 100 的图块大小:

        for(int i=100; i<WIDTH-200; i += 100)
            for(int j=100; j<HEIGHT-200; j += 100)
                if (randomBarrier()) g.fillRect(i, j, 100, 100);
    

    您还应该遵循 camickr 回答中的建议:使用您当前的代码,在动画中重新绘制组件将填充一组不同的图块,并且您会获得闪烁效果。或者你会看到所有的瓦片都被填满了,因为组件背景没有被绘制出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多