1
votes

À l'intérieur de la boucle for imbriquée, affiche la chaîne "." et remplacez-le par un autre caractère si la condition est remplie. MOOC Java Week 10 'Dungeon'

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;
}

}

La sortie était

@ 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 . .

Résultat attendu

@ 0 0 (player x, y)
v 3 0 (vampire x, y)

@ .v ..
.....
.....
.....
.....


0 commentaires

3 Réponses :


1
votes

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
}


0 commentaires

1
votes

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();
    }

}
}


0 commentaires

0
votes

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;
}


0 commentaires