Java中的俄罗斯方块形状生成算法

时间:2015-04-10 00:40:50

标签: java algorithm tetris

我使用一些软件设计模式在Java中构建俄罗斯方块游戏。基本上,我创建了一个工厂算法,该算法检索一个字符串,以便在主游戏循环给出请求时确定要使用哪种类型的俄罗斯方块对象,请参阅代码:

public class TVShapeFactory {

    protected TVShape tvShape = null;
    protected GameContainer gc;

    TVShapeFactory(GameContainer gc) {
        this.gc = gc;
    }

    public TVShape createShape(String shape) {
        if (shape=="TVIShape") {
            tvShape = new TVIShape(gc);
        }
        else if (shape=="TVOShape") {
            tvShape = new TVOShape(gc);
        }
        else if (shape=="TVLShape") {
            tvShape = new TVLShape(gc);
        }
        else if (shape=="TVZShape") {
            tvShape = new TVZShape(gc);
        }
        else if (shape=="TVJShape") {
            tvShape = new TVJShape(gc);
        }
        else if (shape=="TVSShape") {
            tvShape = new TVSShape(gc);
        }
        else if (shape=="TVTShape") {
            tvShape = new TVTShape(gc);
        }
        else {
            System.out.println("Error: invalid type of shape");
        }
        return tvShape;
    }
}

如果您不知道gc是什么,它只是Slick 2D库的一部分,并且用于完整的游戏环境。 无论如何,我创建了一些其他方法来随机生成游戏的形状(这样主游戏循环每次都会收到一个随机的形状,但我觉得RNG没有削减它,我想让它变得更难。我注意到有一个名为Bastet俄罗斯方块的着名俄罗斯方块算法,但它对我没有意义。你们有什么建议制作一个HARD俄罗斯方块形状生成算法?这是我简单的RNG算法:

public TVShape getRandomShape() {

    TVShape[] shapes = new TVShape[7];
    shapes[0] = createShape("TVIShape");
    shapes[1] = createShape("TVOShape");
    shapes[2] = createShape("TVLShape");
    shapes[3] = createShape("TVZShape");
    shapes[4] = createShape("TVJShape");
    shapes[5] = createShape("TVSShape");
    shapes[6] = createShape("TVTShape");

    int index = new Random().nextInt(shapes.length);
    return shapes[index];
}

2 个答案:

答案 0 :(得分:1)

而不是" =="使用.equals()函数来比较字符串。 ==用于检查两个字符串是否具有相同的引用。 而.equals()方法用于检查两个字符串是否具有相同的值。 而不是

(shape=="TVIShape")

使用

(shape.equals("TVIShape")

答案 1 :(得分:1)

  

你们有什么建议制作HARD俄罗斯方块形状生成算法?

为了让它变得更难,你需要一种方法来评估玩家最需要的形状和最不需要的形状,然后将随机数生成偏向于给予他们不需要的形状。

在基本级别,2x2方形和长4x1形状是“最简单的”,因为您通常可以更容易地堆叠它们。因此,你可以制作一个随机形状生成器,将其返回的频率是其他形状的一半:

public TVShape getRandomShape() {

    TVShape[] shapes = new TVShape[12];
    shapes[0] = createShape("TVIShape");
    shapes[1] = createShape("TVOShape");
    shapes[2] = createShape("TVLShape");
    shapes[3] = createShape("TVLShape");
    shapes[4] = createShape("TVZShape");
    shapes[5] = createShape("TVZShape");
    shapes[6] = createShape("TVJShape");
    shapes[7] = createShape("TVJShape");
    shapes[8] = createShape("TVSShape");
    shapes[9] = createShape("TVSShape");
    shapes[10] = createShape("TVTShape");
    shapes[11] = createShape("TVTShape");

    int index = new Random().nextInt(shapes.length);
    return shapes[index];
}

但是如果你想让它变得非常困难,你可以在每一步评估哪种形状对于给定当前游戏状态的玩家最有帮助且最不有帮助:

对于每个形状,迭代可以放置它的所有有效位置,以及所有可能的旋转(每个形状的1,2或4个),并根据几个标准对每个可能的位置进行评分:

  • 放置后最高点的堆叠高度。每次增加身高的负分。
  • 展示位置是否会导致任何行完全填充。每个完成的行都是正分。
  • 堆栈中有多少个孔(列中最高占用方块下方的空方块)。每个洞都是负分。
  • 你能想到的任何其他事情

形状的最佳位置分数是形状的分数。然后根据他们的分数对这些片段进行排名,并生成一个随机数。这样做有可能获得最差的形状,获得第二个最差形状的可能性稍小等。

因此,例如你可以生成0到27之间的数字,然后根据它选择:

  • 0-6最差形状
  • 7-12秒最差形状
  • 13-17第三差的形状
  • 18-21第四差形
  • 22-24第三好的形状
  • 25-26秒最佳状态
  • 27最佳形状

您可以根据您想要的难度来改变分布。

相关问题