Внутри вложено для цикла, выведите строку "."и заменить его другим символом, если условие выполнено.MOOC Java Неделя 10 'Подземелье' - PullRequest
1 голос
/ 07 марта 2019

Я работаю над этим проектом MOOC Java Week 10 Упражнение 33

Я хочу, чтобы String . был заменен символом игрока / вампира (String @ и v), когда позиции игрока / вампира X и Y равны X и Y таблицы. (Высота и ширина сетки печатаются строкой .). Проблема в классе Dungeon, метод printMap().

Класс игрока

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

}

Класс Вампир

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

}

Класс Dungeon

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

}
}

Класс Main

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

    }
}

Выход был

@ 0 0 (игрок x, y)
v 3 0 (вампир х, у)

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

Строка @ должна была заменить первую ., а v должна заменить третью ..

Ожидаемый результат

@ 0 0 (игрок x, y)
v 3 0 (вампир х, у)

@. V ..
.....
.....
.....
.....

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Есть лучший способ сделать это, например, двумерный массив и hashmap. Но это быстро исправить. Не проверял, но это должно работать.

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

}
}
1 голос
/ 07 марта 2019

Проблема в том, что вы печатаете несколько символов для позиций, занятых player и vampire. Ваш код проверяет, заняты ли данные позиции player, и если это так, печатает @, но затем он все равно будет печатать точку.

Вы должны ограничить это, чтобы в каждой позиции печатался только один символ. Например что-то вроде этого.

if (positions is occupied by player) {
    print player
} else if (position is occupied by a vampire) {
    print vampire
} else {
    else print dot
}
0 голосов
/ 07 марта 2019

Я решил эту проблему, создав логический метод.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...