【发布时间】:2017-02-20 16:53:37
【问题描述】:
为了学校,我必须制作一个已经存在的游戏。 这是游戏的链接:Game link
一个简短的解释:您收到的每个级别(在屏幕右侧)一组箭头,您可以将其放置在屏幕上,当您按下“开始”按钮时,奶牛开始移动。当他在箭头上移动时,他会朝着那个箭头的方向改变方向。所以你必须用箭头引导奶牛到达他的最终目的地(一个奖杯),不要碰到任何障碍物(比如一堵墙或一棵树......)。
我们必须实现 Model-View-Presenter 设计模式。 所以我从我的模型开始,因为那是我的游戏逻辑。
我的问题: 每个级别都应该用一个简单的 .txt 文件读取 这里以我的 1 级为例:
26,6
xxxxxxxxxxxxxxxxxxxxxxxxxx
xGRGGBGxGGRGGGGGGGGGGBGGTx
xGGGGRGGGGFGxGGGGGGGGGGGGx
xGFGGLGGGGGGGLGGGGGGGGGGGG
xGGGGSGGGxGGGGGGxGGGGGGGGx
xxxxxxxxxxxxxxxxxxxxxxxxxx
x=obstacle
G=grass
T=trophy
S= Start position of the cow
L= Fixed left arrow
R= Fixed right arrow
F= fixed front arrow
B= fixed back arrow
我读取文件并使用 case 语句将每个字符放在一行中(每个字符代表一个对象)在 2D 数组中。
我的问题是:你有 2 组箭头:一个 FixedArrow(它已经在场上,你不能改变它的位置)和一个 VariableArrow(屏幕右侧的箭头,用户可以将它们放置在该字段上,如果该字段是空闲的,或者换句话说,如果它在一个草对象上。 但我该怎么做呢?我如何创建一个单独的屏幕,我可以在其中放置用户可以放在字段上的箭头?
我知道我的解释含糊不清,所以我希望你们打开我在上面发布的链接并玩 1 级,以便您更好地理解我的意思。
我将在下面发布我的部分代码和类图。 path= 是我在上面解释的 .txt 文件的路径。
public class Board {
private Tile[][] tiles;
public Board(Path path) {
try {
int yRow = 0;
Scanner scanner = new Scanner(path);
String[] split = scanner.nextLine().split(",");
tiles = new Tile[Integer.parseInt(split[1])][Integer.parseInt(split[0])];
while (scanner.hasNext()) {
String line = scanner.nextLine();
for (int xRow = 0; xRow < line.length(); xRow++) {
char character = line.charAt(xRow);
switch (character) {
case 'x':
tiles[yRow][xRow] = new Tile(new Obstacle());
break;
case 'G':
tiles[yRow][xRow] = new Tile(new Grass());
break;
case 'S':
tiles[yRow][xRow] = new Tile(new Grass());
//cow.setStartPosition(xRow,yRow);
break;
case 'L':
tiles[yRow][xRow] = new Tile(new FixedArrow(Direction.LEFT));
break;
case 'R':
tiles[yRow][xRow] = new Tile(new FixedArrow(Direction.RIGHT));
break;
case 'F':
tiles[yRow][xRow] = new Tile(new FixedArrow(Direction.FRONT));
break;
case 'B':
tiles[yRow][xRow] = new Tile(new FixedArrow(Direction.BACK));
break;
case 'T':
tiles[yRow][xRow] = new Tile(new Trophy());
break;
//How should i read a set of arrows in without placing them in the game field but on the right side of the screen
}
}
++yRow;
}
} catch (IOException e) {
e.getMessage();
}
}
}
【问题讨论】:
-
这是一个宽泛的问题,看起来像是一个完整的项目,答案也会很大,请考虑具体。
-
所以如果我具体说明:1)我如何在二维数组上反映网格窗格 ==> 以便二维数组的 1 个元素与网格窗格的 1 个正方形相同? 2)是否可以在网格窗格上制作 2 个不同的窗格?例如,在左侧窗格和右侧窗格中分隔 1 个网格窗格。左侧窗格代表二维数组中的所有项目,右侧窗格中我可以在左侧放置一些用户可以拖放的其他对象?
-
1 -> 是的,这是可能的,您可以将二维数组节点(图块)设置为网格窗格,但每个图块应该是节点的子类(如标签、ImageView、按钮等)。 2 ->(网格窗格上的 2 个窗格)?只需使用 BorderPane 作为父级并将 Gridpane 设置在左侧,将另一个设置在边框窗格的右侧。 3)-> 你必须为拖放瓷砖做艰苦的工作和研究。