-1

我正在为俄罗斯方块风格的游戏制定一个带有扭曲的概念。我已经完成了一些基本逻辑的教程,但是按照我们想要这样做的方式,我不确定逻辑是否在我们的时间范围内是可能的。

基本上,我们为俄罗斯方块碎片使用自定义图像。我们为每种可能的旋转提供三种不同的颜色,并为每种可能的旋转提供不同的图像。最重要的是,我们的游戏将尝试将字母配对在一起,以便我们拥有每个可能的旋转和每个可能的字母位置的图像。例如,对于“T”形,我们现在有 92 个图像,每个可能的旋转只有我们想要与我们正在使用的四个字母一起使用的三种颜色中的一种。在过去几天考虑之后,将有数百(甚至可能超过一千)张图像。

然而,这不是问题。我能想到的唯一检查方法是使用 TON(比如超过一千个)IF 语句。例如,如果棋子 1 是一个“T”形,右侧有一个“A”,我们需要检查“B”是否与棋子可能所在的任何其他可能位置相邻。如果棋子上面有“A”的旁边(上面、下面或两边)上面有“B”的一块,很好的匹配被注册。如果在任何时候两个相同的字母彼此相邻,则不匹配的整排棋子将消失,导致其上方的任何棋子掉落。一旦这些棋子再次落地,就需要再次检查每一个棋子,看看它的新位置是否是任何可能的字母对的一部分。

那么,这是需要很长时间的事情(我们只有一个多月),还是除了大量的 IF 语句之外还有其他事情可以做吗?这样的事情甚至可能吗?毕竟,我们谈论的最有可能是 1000 张图像,并且每张图像都需要始终进行检查,如果它:

  1. 已击中另一张图片,需要停止

  2. 检查玩家放置它的位置是否与另一个字母相邻,以及它是否是一个好的字母匹配(这是大问题)

  3. 一旦整块消失,这些块需要再次向下移动并再次进行所有检查。

计划是在 java 中执行此操作,因为它是我唯一能很好理解的语言,但我愿意接受任何和所有建议。如果这是一个失败的原因,请告诉我。如果这是一个失败的事业,我想在我投入大量时间之前提出另一个概念。

编辑:

这是一张快速拼凑在一起的图像,让您了解它的外观:

http://imageshack.us/a/img560/1814/dg80.png

查看这张图片,您会看到棋盘底部已经有 4 个棋子,玩家正在引导直棋子向下。玩家想要将线底部的“A”与“T”形右侧“正方形”中的“A”匹配。一旦棋子落在“T”旁边,代码需要说“哦,嘿,另一个“A”刚刚落在我旁边,所以我是一个很好的匹配,我们都需要消失”。一旦发生这种情况,其他部分将向下移动,并且需要再次进行检查。由于棋子的组合如此之多,并且玩家可以自由支配将棋子放在疯狂的位置,因此检查必须是疯狂的。每件作品都需要与所有其他作品进行核对,以确保永远不会错过有效的组合。

这是一个片段的外观示例:

http://imageshack.us/a/img23/6632/1g3q.png

4

1 回答 1

0

您可能想要做的是将您的 Gamefield 视为具有一组单元的二维数组。每行有 N 个单元格宽,有 M 行。现在,每当一块棋子掉到任何地方时,您就可以在游戏字段数组中注册该棋子中的字母。

让我们假设您的作品如下所示:

public class GamePience {
  public Character letter;
  public Color color;
}

这给你

GamePience[][] gamefield = new GamePience [M][N]; // null is empty, otherwise gilled

当一块被丢弃时,你将它的字母复制到数组中(为简单起见,我假设块也是二维数组,因为它很好用)

gamefield[0][2] = piece[0][0];

现在,在放置一个字母并将其复制到该字段后,您可以简单地检查该字段

boolean destroyedLine = false;
do {
 for (int x = 0; x < gamefield.length; x++) {
  for (int y = 0; y < gamefield[x].length; y++) {
     GamePiece cur = gamefield[x][y];
     if (cur != null && x < MAX_FIELD_WIDTH && gamefield[x+1][y] != null) {
        // there are gamepieces in both!
        GamePiece neighbour = gamefield[x+1][y];
        if (cur.letter == neighbour.letter) {
           destroyLine(x); // this method should null out the line and shift everything down, you'll probably want to loop trough the whole line first and check if there are pieces in every cell
           destroyedLine = true;
           break;
        }
     }
  }
 }
} while(destroyedLine);

您还可以在放下棋子以检查单元格是否已填满时轻松检查游戏场。现在,您需要做的就是填写该逻辑并编写一些代码来绘制游戏字段,然后您就可以设置了;)(您可能需要考虑为游戏字段使用 LinkedList,因为这使得删除行变得微不足道)

于 2013-10-07T08:15:04.177 回答