Je travaille sur ce projet MOOC Java Week 10 Exercice 33
Je veux que la chaîne . soit remplacée par le symbole joueur / vampire (chaîne @ et v ), lorsque les positions X et Y du joueur / vampire sont égales à X et Y de la grille. (La hauteur et la largeur de la grille sont imprimées par la chaîne . ). Le problème se situe dans la classe Dungeon , méthode printMap().
Classe Player
package dungeon;
public class Main {
public static void main(String[] args) {
Dungeon d = new Dungeon(5, 5, 1, 14, true); // width of grid, height of grid (grid printed by string "."), vampires, moveRemaining, canVampireMove
d.printCoordinate();
d.printMap();
}
}
Classe Vampire
package dungeon;
import java.util.ArrayList;
import java.util.List;
public class Dungeon {
private Player player;
private List<Vampire> vampires = new ArrayList<Vampire>();
private int width;
private int height;
private int BP; // lamp battery point
private boolean canVampireMove;
public Dungeon(int width, int height, int vampires, int moves, boolean vampiresMove) {
this.player = new Player("@", width, height);
this.width = width;
this.height = height;
this.BP = moves;
this.canVampireMove = vampiresMove;
for (int i = 0; i < vampires; i++) {
this.vampires.add(new Vampire("v", width, height));
}
}
public void printCoordinate() {
System.out.println(BP);
System.out.println("\n" + player);
for (Vampire each : vampires) {
System.out.println(each);
}
}
public void printMap() {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (player.getPos().equals(x + " " + y)) {
System.out.print(player.getSymbol()); // print "@"
}
for (int v = 0; v < vampires.size(); v++) {
if (vampires.get(v).getPos().equals(x + " " + y)) {
System.out.print(vampires.get(v).getSymbol()); // print "v"
}
}
System.out.print(".");
}
System.out.println();
}
}
}
Donjon de classe
package dungeon;
import java.util.Random;
public class Vampire {
private String symbol;
private int posX, posY, width, height;
private final Random rand = new Random();
public Vampire(String symbol, int width, int height) {
this.symbol = symbol;
this.posX = rand.nextInt(width);
this.posY = rand.nextInt(height);
this.width = width - 1;
this.height = height - 1;
}
public String getSymbol() {
return symbol;
}
public int getPosX() {
return posX;
}
public int getPosY() {
return posY;
}
public String getPos() {
return posX + " " + posY;
}
public void setPosX(int x) {
posX = x;
}
public void setPosY(int y) {
posY = y;
}
public void resetPos() {
posX = rand.nextInt(width);
posY = rand.nextInt(height);
checkStartPos();
}
public void checkStartPos() {
while (posX == 0 || posY == 0) {
if (posX == 0) {
posX = rand.nextInt(width);
} else if (posY == 0) {
posY = rand.nextInt(height);
}
}
}
public void move() {
boolean y = posY > 0;
boolean h = posY < height;
boolean x = posX > 0;
boolean w = posX < width;
int direction = rand.nextInt(4);
switch (direction) {
case 0:
if (y) {
posY--;
break;
}
case 1:
if (h) {
posY++;
break;
}
case 2:
if (x) {
posX--;
break;
}
case 3:
if (w) {
posX++;
break;
}
}
}
@Override
public String toString() {
return symbol + " " + posX + " " + posY;
}
}
Classe principale
public class Player {
private final String symbol;
private int posX, posY, width, height;
public Player(String symbol, int width, int height) {
this.symbol = symbol;
this.posX = 0;
this.posY = 0;
this.width = width - 1;
this.height = height - 1;
}
public String getSymbol() {
return symbol;
}
public int getPosX() {
return posX;
}
public int getPosY() {
return posY;
}
public void setPosX(int x) {
posY = x;
}
public void setPosY(int y) {
posY = y;
}
public String getPos() {
return posX + " " + posY;
}
public void keyMap(String keyPressed) {
boolean y = posY > 0;
boolean h = posY < height;
boolean x = posX > 0;
boolean w = posX < width;
if (keyPressed.equalsIgnoreCase("w")) {
if (y) {
posY--;
}
} else if (keyPressed.equalsIgnoreCase("s")) {
if (h) {
posY++;
}
} else if (keyPressed.equalsIgnoreCase("a")) {
if (x) {
posX--;
}
} else if (keyPressed.equalsIgnoreCase("d")) {
if (w) {
posX++;
}
}
}
@Override
public String toString() {
return symbol + " " + posX + " " + posY;
}
}
@ 0 0 (player x, y)
v 3 0 (vampire x, y)
@ ... v ..
.....
.....
.....
.....
La chaîne @ aurait dû remplacer le premier . , et v aurait dû remplacer le troisième . .
@ 0 0 (player x, y)
v 3 0 (vampire x, y)
@ .v ..
.....
.....
.....
.....
3 Réponses :
Le problème est que vous imprimez plusieurs caractères pour les positions occupées par joueur et vampire . Votre code vérifie si les positions données sont occupées par player et si c'est le cas, imprime @ , mais il imprimera quand même le point.
Vous devez restreindre cela afin un seul caractère est imprimé par position. Par exemple, quelque chose comme ça.
if (positions is occupied by player) {
print player
} else if (position is occupied by a vampire) {
print vampire
} else {
else print dot
}
Il y a une meilleure façon de faire cela comme un tableau à deux dimensions et une table de hachage. Mais c'est une solution rapide. Je ne l'ai pas testé mais cela devrait fonctionner.
public void printMap () {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (player.getPos().equals(x + " " + y)) {
System.out.print(player.getSymbol()); // print "@"
} else if {
for (int v = 0; v < vampires.size(); v++) {
if (vampires.get(v).getPos().equals(x + " " + y)) {
System.out.print(vampires.get(v).getSymbol()); // print "v"
}
}
} else {
System.out.print(".");
}
System.out.println();
}
}
}
J'ai résolu ce problème en créant une méthode booléenne.
public void printMap() {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (player.getPos().equals(x + " " + y)) {
System.out.print(player.getSymbol());
} else if (getVampires(x, y)) {
System.out.print("v");
} else {
System.out.print(".");
}
}
System.out.println();
}
}
public boolean getVampires(int x, int y) {
for (int v = 0; v < vampires.size(); v++) {
if (vampires.get(v).getPos().equals(x + " " + y)) {
return true;
}
}
return false;
}