首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Java的俄罗斯方块形状生成算法

基于Java的俄罗斯方块形状生成算法
EN

Stack Overflow用户
提问于 2015-04-10 08:40:50
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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 tetris,但它对我来说没有意义。你们对俄罗斯方块形状生成算法有什么建议吗?下面是我的简单RNG算法:

代码语言:javascript
复制
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];
}
EN

回答 2

Stack Overflow用户

发布于 2015-04-10 09:30:39

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

代码语言:javascript
复制
(shape=="TVIShape")

使用

代码语言:javascript
复制
(shape.equals("TVIShape")
票数 1
EN

Stack Overflow用户

发布于 2015-04-10 09:50:15

你们对俄罗斯方块形状生成算法有什么建议吗?

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

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

代码语言:javascript
复制
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个),并根据以下几个标准对每个可能的放置进行评分:

  • 放置堆栈后,堆栈在最高位置的高度。height.
  • Whether每增加一次,位置就会导致所有行被完全填充。每个完成的行都是一个正分数。
  • 堆栈中有多少个洞(一列中最高占用的正方形下面的空格)。每个空洞都是一个负数,否则你就会想到

形状的最佳放置分数是该形状的分数。然后根据分数对棋子进行排序,并生成一个随机数。让它有很高的机会得到最差的形状,略低的机会得到第二最差的形状等。

因此,例如,您可以生成一个介于0和27之间的数字,然后根据该数字进行选择:

  • 0-6最差形状
  • 7-12第二最差形状
  • 13-17第三最差形状
  • 18-21第四最差形状

<代码>H12222-24第三最佳形状

  • 25-26第二最佳形状
  • 27最佳形状

你可以根据你想做的困难程度来改变它的分布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29551450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档