我正在使用一些软件设计模式用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 tetris,但它对我来说没有意义。你们对俄罗斯方块形状生成算法有什么建议吗?下面是我的简单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];
}发布于 2015-04-10 09:30:39
使用.equals()函数来比较字符串,而不是"==“符号。==用于检查两个字符串是否具有相同的引用。而.equals()方法用于检查两个字符串是否具有相同的值。而不是
(shape=="TVIShape")使用
(shape.equals("TVIShape")发布于 2015-04-10 09:50:15
你们对俄罗斯方块形状生成算法有什么建议吗?
为了更难,你需要一种方法来评估玩家最需要的形状和他们最不需要的形状,然后让你的随机数生成偏向于给他们不需要的形状。
在基本级别上,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之间的数字,然后根据该数字进行选择:
<代码>H12222-24第三最佳形状
你可以根据你想做的困难程度来改变它的分布。
https://stackoverflow.com/questions/29551450
复制相似问题