Morgen zusammen,
ich habe eine Frage zum Konzept bezüglich der Bewegung der Monster in Pacman. Da diese selber durch die Gänge laufen sollen, muss die Klasse Monster ja wissen, wo eine Mauer ist und wo nicht.
Das habe ich im Moment so gelöst, dass bei der Aufforderung, ein Feld zu gehen, in der move()-Methode vorher das Feld vor, hinter, rechts und links vom Monster auf den boolean isWall geprüft wird. Wenn das nördliche Feld eine Mauer ist, wird ein
um 3 erhöht, wenn das östliche Feld eine Mauer ist, um 5 erhöht, beim südlichen Feld wird um 7 erhöht und beim westlichen um 11.
Somit ergeben sich verschiedene Summen dieser Zahlen anhand derer entschieden werden kann, wo man überall hinkann.
Zum Beispiel würde die Summe 12 ergeben, dass im östlichen und im südlichen Feld eine Mauer ist und das Monster somit nur nach Norden oder Westen gehen kann.
Nun erscheint mir das recht umständlich und vielleicht auch nicht so effizient, weil dann folgender Code entsteht:
[JAVA=533] public void move() {
int wallFlag = scanWalls();
int i;
Random r;
oldX = posX;
oldY = posY;
switch (wallFlag) {
case 3: moveUp();
break;
case 5: moveRight();
break;
case 7: moveDown();
break;
case 11: moveLeft();
break;
case 8: if (dir.equals("W")) {
moveUp();
} else {
moveRight();
}
break;
case 10: if (dir.equals("N")) {
moveUp();
} else {
moveDown();
}
break;
case 12: if (dir.equals("W")) {
moveDown();
} else {
moveRight();
}
break;
case 14: if (dir.equals("E")) {
moveUp();
} else {
moveLeft();
};
break;
case 16: if (dir.equals("E")) {
moveRight();
} else {
moveLeft();
}
break;
case 18: if (dir.equals("E")) {
posY++;
} else {
posX--;
}
break;
case 13: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveRight();
} else {
moveLeft();
}
break;
case 19: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveRight();
} else {
moveLeft();
}
break;
case 21: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveDown();
} else {
moveLeft();
}
break;
case 23: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveRight();
} else if (i < 66) {
moveDown();
} else {
moveLeft();
}
break;
}
}
public void moveUp() {
posY--;
dir = "N";
}
public void moveDown() {
posY++;
dir = "S";
}
public void moveLeft() {
posX--;
dir = "W";
}
public void moveRight() {
posX++;
dir = "E";
}
public int scanWalls() {
int w = 0;
if (posY == 0) {
w += 0;
} else if (!(g.gameField.field[posX][posY - 1].getWall())) {
w += 3;
}
if (posX == 12) {
w += 0;
} else if (!(g.gameField.field[posX + 1][posY].getWall())) {
w += 5;
}
if (posY == 12) {
w += 0;
} else if (!(g.gameField.field[posX][posY + 1].getWall())) {
w += 7;
}
if (posX == 0) {
w += 0;
} else if (!(g.gameField.field[posX - 1][posY].getWall())) {
w += 11;
}
return w;
}[/code]
Gibt ein keine bessere, kürzere und/oder schönere Lösung, die Bewegung der Monster zu bestimmen? Trotzdem soll sie ja nicht komplett zufällig sein, also nicht auf einmal mitten im Gang umdrehen oder versuchen in eine Wand zu laufen.
ich habe eine Frage zum Konzept bezüglich der Bewegung der Monster in Pacman. Da diese selber durch die Gänge laufen sollen, muss die Klasse Monster ja wissen, wo eine Mauer ist und wo nicht.
Das habe ich im Moment so gelöst, dass bei der Aufforderung, ein Feld zu gehen, in der move()-Methode vorher das Feld vor, hinter, rechts und links vom Monster auf den boolean isWall geprüft wird. Wenn das nördliche Feld eine Mauer ist, wird ein
Code:
int wallFlag
Somit ergeben sich verschiedene Summen dieser Zahlen anhand derer entschieden werden kann, wo man überall hinkann.
Zum Beispiel würde die Summe 12 ergeben, dass im östlichen und im südlichen Feld eine Mauer ist und das Monster somit nur nach Norden oder Westen gehen kann.
Nun erscheint mir das recht umständlich und vielleicht auch nicht so effizient, weil dann folgender Code entsteht:
[JAVA=533] public void move() {
int wallFlag = scanWalls();
int i;
Random r;
oldX = posX;
oldY = posY;
switch (wallFlag) {
case 3: moveUp();
break;
case 5: moveRight();
break;
case 7: moveDown();
break;
case 11: moveLeft();
break;
case 8: if (dir.equals("W")) {
moveUp();
} else {
moveRight();
}
break;
case 10: if (dir.equals("N")) {
moveUp();
} else {
moveDown();
}
break;
case 12: if (dir.equals("W")) {
moveDown();
} else {
moveRight();
}
break;
case 14: if (dir.equals("E")) {
moveUp();
} else {
moveLeft();
};
break;
case 16: if (dir.equals("E")) {
moveRight();
} else {
moveLeft();
}
break;
case 18: if (dir.equals("E")) {
posY++;
} else {
posX--;
}
break;
case 13: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveRight();
} else {
moveLeft();
}
break;
case 19: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveRight();
} else {
moveLeft();
}
break;
case 21: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveUp();
} else if (i < 66) {
moveDown();
} else {
moveLeft();
}
break;
case 23: r = new Random();
i = r.nextInt(100);
if (i < 33) {
moveRight();
} else if (i < 66) {
moveDown();
} else {
moveLeft();
}
break;
}
}
public void moveUp() {
posY--;
dir = "N";
}
public void moveDown() {
posY++;
dir = "S";
}
public void moveLeft() {
posX--;
dir = "W";
}
public void moveRight() {
posX++;
dir = "E";
}
public int scanWalls() {
int w = 0;
if (posY == 0) {
w += 0;
} else if (!(g.gameField.field[posX][posY - 1].getWall())) {
w += 3;
}
if (posX == 12) {
w += 0;
} else if (!(g.gameField.field[posX + 1][posY].getWall())) {
w += 5;
}
if (posY == 12) {
w += 0;
} else if (!(g.gameField.field[posX][posY + 1].getWall())) {
w += 7;
}
if (posX == 0) {
w += 0;
} else if (!(g.gameField.field[posX - 1][posY].getWall())) {
w += 11;
}
return w;
}[/code]
Gibt ein keine bessere, kürzere und/oder schönere Lösung, die Bewegung der Monster zu bestimmen? Trotzdem soll sie ja nicht komplett zufällig sein, also nicht auf einmal mitten im Gang umdrehen oder versuchen in eine Wand zu laufen.