ラングトンアリの問題は単純です。アリが白と黒の四角形のボードを歩きます。
- 白い四角で、右に 90 度回転し、四角の色を反転し、1 単位前に進みます
- 黒い四角で、左に 90 度回転し、四角の色を反転し、1 単位前に進みます
「ゲーム」が始まると盤面は真っ白。
私はシミュレーションを実装しましたが、改善の助けが必要な歩行と回転の非常に醜い解決策があります。現在の歩き方は以下の通りです。
if (dir == "NORTH") {
// Walk up
} else if (dir == "EAST") {
// Walk right
} else if (dir == "SOUTH") {
// Walk down
} else if (dir == "WEST") {
// Walk left
}
そして、方向を変える関数:
private void turn(String leftOrRight){
if(dir == "NORTH" && lor == "RIGHT" ){
dir = "EAST";
} else if (dir == "NORTH" && leftOrRight == "LEFT" ){
dir = "WEST";
} else if (dir == "EAST" && leftOrRight == "RIGHT" ){
dir = "SOUTH";
} else if (dir == "EAST" && leftOrRight == "LEFT" ){
dir = "NORTH";
} else if (dir == "SOUTH" && leftOrRight == "RIGHT" ){
dir = "WEST";
} else if (dir == "SOUTH" && leftOrRight == "LEFT" ){
dir = "EAST";
} else if (dir == "WEST" && leftOrRight == "RIGHT" ){
dir = "NORTH";
} else if (dir == "WEST" && leftOrRight == "LEFT" ){
dir = "SOUTH";
}
}
文字列の代わりに int を使用することを考えましたが、どのようにすればよいかよくわかりません。ヘルプやヒントをいただければ幸いです。
編集:今、私はいくつかを変更しました。変数を持つ Ant クラスを作成しました
int x, int y, Direction dir
そして、次の方法で実行します。
private void runAnt(Ant ant) {
int x = ant.getX();
int y = ant.getY();
// Check rule 1
if (matrix[x][y] == true) {
matrix[x][y] = false;
w.setDot(x, y, Color.WHITE);
ant.setDirection(ant.getDirection().right());
// Check rule 2
} else if (matrix[x][y] == false) {
matrix[x][y] = true;
w.setDot(x, y, Color.BLACK);
ant.setDirection(ant.getDirection().left());
}
// Moves one unit forward according to direction.
if (ant.getDirection().equals(Direction.N)) {
ant.setY((ant.getY() - 1 + wSize) % wSize);
} else if (ant.getDirection().equals(Direction.E)) {
ant.setX((ant.getX() + 1) % wSize);
} else if (ant.getDirection().equals(Direction.S)) {
ant.setY((ant.getY() + 1) % wSize);
} else if (ant.getDirection().equals(Direction.W)) {
ant.setX((ant.getX() - 1 + wSize) % wSize);
}
}
そして私の最初の列挙型:
public static enum Direction {
N, E, S, W;
private static Direction[] vals = values();
public Direction right() {
return vals[(this.ordinal() + 1) % vals.length];
}
public Direction left() {
return vals[(this.ordinal() + vals.length - 1) % vals.length];
}
}