Pętla pomija niektóre obiekty

0

Witam. Jestem w trakcie pisania aplikacji i napotkałem pewien problem. Aplikacja jest symulatorem życie 4 organizmów(bakterii,pelzaczy,pelzaczofagów i teleportatorów). Problemem jest funkcja odpowiadająca za zjadanie bakterii przez pelzacze o nazwie
zjedz(Lista lista)[linijka 125 klasa Pelzacz],która jest wywoływana przez funkcje ruch()[linijka 81 klasa pełzacz] która jest wywolywana w linijce 49 klasy NowySwiat. Funkcja ruch(Lista lista) korzysta z funkcji czyJestBakteria(int pozycjaX, int pozycjaY)[linijka 82 klasa Lista] i usunBakterie(int pozycjaX, int pozycjaY) [linijka 107 klasa Lista]. Przechodząc do sedna problem polega na tym, że w zależności od tego ile bakterii zje pełzacz tyle pełzaczy jest pomijanych w kolejce. Bardzo proszę o pomoc, siedzę już nad tym parenaście godzin i nie mogę nic wymyślić. Poniżej wklejam kody powyższych klas.

KLASA NowySwiat(Główna):

package nowyswiat;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class NowySwiat {

    public static int wczytajInt() {
        Scanner wczytaj = new Scanner(System.in);
        return wczytaj.nextInt();
    }

    public static int losuj(int zakres) {
        Random r = new Random();
        return r.nextInt(zakres);
    }

    public static void main(String[] args) {
        int N = wczytajInt();
        int M = wczytajInt();

        Lista kolejka = new Lista();
        
        for (int indeks = 0; indeks < N * M * 20; indeks++) {
            Bakteria bakteria = new Bakteria(losuj(N), losuj(M));
            bakteria.indeks = indeks;
            kolejka.dodaj(bakteria);
        }
        for (int indeks = 0; indeks < N * M * 6; indeks++) {
            Pelzacz pelzacz = new Pelzacz(losuj(N), losuj(M));
            pelzacz.indeks = indeks;
            kolejka.dodaj(pelzacz);
        }
        for (int indeks = 0; indeks < N * M * 1; indeks++) {
            Pelzaczofag pelzaczofag = new Pelzaczofag(losuj(N), losuj(M));
            kolejka.dodaj(pelzaczofag);
        }
        for (int indeks = 0; indeks < N * M * 1; indeks++) {
            Teleportator teleportator = new Teleportator(losuj(N), losuj(M));
            kolejka.dodaj(teleportator);
        }
        
        do{
            kolejka.rozmiar=kolejka.zyjatka.size();
        for(int indeks = 0;indeks<kolejka.rozmiar;indeks++){
            Zyjatko zyjatko = kolejka.daj(indeks);
            zyjatko.ruch(M, N, kolejka);
        }
        }while(false);
        
    }

}

KLASA Lista:

package nowyswiat;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;


public class Lista {

    List<Zyjatko> zyjatka = new  LinkedList<Zyjatko>();
    private List<Bakteria> bakterie = new LinkedList<Bakteria>();
    private List<Pelzacz> pelzacze = new LinkedList<Pelzacz>();
    int rozmiar;
    

    public void dodaj(Zyjatko zyjatko) {
        this.zyjatka.add(zyjatko);
        if(zyjatko instanceof Bakteria){
            Bakteria bakteria = (Bakteria) zyjatko;
            this.bakterie.add(bakteria);
            System.out.println("Dodałem do bakterii");
        }else if(zyjatko instanceof Pelzacz){
            Pelzacz pelzacz = (Pelzacz) zyjatko;
            this.pelzacze.add(pelzacz);
        }
    }
    
    public Zyjatko daj(int indeks) {
        return this.zyjatka.get(indeks);
    }

    public void usunWedlugIndeksu(int indeks) {
        Zyjatko zyjatko =this.daj(indeks);
        this.zyjatka.remove(zyjatko);
        if(zyjatko instanceof Bakteria){
           this.bakterie.remove(zyjatko); 
        }else if(zyjatko instanceof Pelzacz){
        this.pelzacze.remove(zyjatko);
        }
        this.rozmiar--;
    }
    
    public void usunWedlugObiektu(Zyjatko zyjatko){
        this.zyjatka.remove(zyjatko);
        if(zyjatko instanceof Bakteria){
           this.bakterie.remove(zyjatko); 
        }else if(zyjatko instanceof Pelzacz){
        this.pelzacze.remove(zyjatko);
        }
        this.rozmiar--;
    }
    
    public Zyjatko dajlosowy(){
        Random los = new Random();
        return zyjatka.get(los.nextInt(zyjatka.size()));
    }
    
    public void liczPunktyTurowe(Zyjatko zyjatko,int indeks){
        Random los = new Random();
        int szczescie = los.nextInt(23);
        if(zyjatko instanceof Bakteria){
            Bakteria bakteria = (Bakteria) zyjatko;
            bakteria.setPunktyTurowe(indeks+szczescie);
            
        }else if(zyjatko instanceof Pelzacz){
            Pelzacz pelzacz = (Pelzacz) zyjatko;
            pelzacz.setPunktyTurowe(szczescie+indeks+(10-pelzacz.getWaga()));
        }else if(zyjatko instanceof Pelzaczofag){
            Pelzaczofag pelzaczofag = (Pelzaczofag) zyjatko;
            pelzaczofag.setPunktyTurowe(szczescie+indeks+(8-pelzaczofag.getIQ()));
        }else if(zyjatko instanceof Teleportator){
            Teleportator teleportator = (Teleportator) zyjatko;
            teleportator.setPunktyTurowe(szczescie+indeks);
        }
    }

    public boolean czyJestBakteria(int pozycjaX, int pozycjaY) {//funkcja sprawdzająca czy na danym polu jest bakteria
        for (Bakteria bakteria : bakterie) {
            int i=0;
            i++;
            if (bakteria.getPozycjaX() == pozycjaX && bakteria.getPozycjaY() == pozycjaY) {
                
                return true;
            }
            
        }
        return false;
    }

    public boolean czyJestPelzacz(int pozycjaX, int pozycjaY) {
        for (Pelzacz pelzacz : pelzacze) {
            if (pelzacz.getPozycjaX() == pozycjaX && pelzacz.getPozycjaY() == pozycjaY) {
                
                return true;
            }
        }
        return false;
    }

    
    
    public void usunBakterie(int pozycjaX, int pozycjaY){//funkcja usuwajaca bakterie
        for (int indeks = 0; indeks < bakterie.size(); indeks++) {
            Zyjatko zyjatko =this.daj(indeks);
            if (zyjatko.getPozycjaX() == pozycjaX && zyjatko.getPozycjaY() == pozycjaY && zyjatko instanceof Bakteria) {
                
                this.usunWedlugObiektu(zyjatko);
                break;
            }
        }
        
    }
    
    public void usunPelzacza(int pozycjaX, int pozycjaY){
        for (int indeks = 0; indeks < pelzacze.size(); indeks++) {
            Zyjatko zyjatko =this.daj(indeks);
            if (zyjatko.getPozycjaX() == pozycjaX && zyjatko.getPozycjaY() == pozycjaY && zyjatko instanceof Pelzacz) {
                
                this.usunWedlugObiektu(zyjatko);
            }
        }
        
    }
}

KLASA Pelzacz:

package nowyswiat;

import java.util.Random;


public class Pelzacz implements Zyjatko {

    int pozycjaX;
    int pozycjaY;
    int waga;
    int punktyTurowe;
    int indeks;

    Pelzacz(int x, int y) {
        this.pozycjaX = x;
        this.pozycjaY = y;
        Random r = new Random();
        this.waga = r.nextInt(11);
        this.punktyTurowe = 0;
    }

    Pelzacz(int x, int y, int waga) {
        this.pozycjaX = x;
        this.pozycjaY = y;
        this.waga = waga;
        this.punktyTurowe = 0;

    }

    Pelzacz() {

    }

    @Override
    public int getPozycjaX() {
        return pozycjaX;
    }

    @Override
    public int getPozycjaY() {
        return pozycjaY;
    }

    public int getWaga() {
        return waga;
    }

    @Override
    public int getPunktyTurowe() {
        return punktyTurowe;
    }

    @Override
    public void setPozycjaX(int pozycjaX) {
        this.pozycjaX = pozycjaX;
    }

    @Override
    public void setPozycjaY(int pozycjaY) {
        this.pozycjaY = pozycjaY;
    }

    public void setWaga(int waga) {
        this.waga = waga;
    }

    @Override
    public void setPunktyTurowe(int punktyTurowe) {
        this.punktyTurowe = punktyTurowe;
    }

    @Override
    public void ruch(int granicaX, int granicaY, Lista lista) {
        System.out.println("Pełzne " + this.indeks);
        this.przemieszczenie(granicaX, granicaY);
        this.zjedz( lista);
    }

    public void przemieszczenie(int granicaX, int granicaY) {
        System.out.println("Pełzne " + this.indeks);
        System.out.println("Przemieściłem się z: " + this.getPozycjaX() + " x " + this.getPozycjaY());
        Random los = new Random();
        int wyjscie = 0;
        do {
            switch (los.nextInt(4)) {
                case 0:
                    if (this.getPozycjaX() + 1 < granicaX) {
                        this.setPozycjaX(this.getPozycjaX() + 1);
                        wyjscie++;
                    }
                    break;
                case 1:
                    if (this.getPozycjaX() > 0) {
                        this.setPozycjaX(this.getPozycjaX() - 1);
                        wyjscie++;
                    }
                    break;
                case 2:
                    if (this.getPozycjaY() + 1 < granicaY) {
                        this.setPozycjaY(this.getPozycjaY() + 1);
                        wyjscie++;
                    }
                    break;
                case 3:
                    if (this.getPozycjaY() > 0) {
                        this.setPozycjaY(this.getPozycjaY() - 1);
                        wyjscie++;
                    }
                    break;

            }
        } while (wyjscie == 0);
        System.out.println(" na: " + this.getPozycjaX() + " x " + this.getPozycjaY());

    }

    public void zjedz(Lista lista) {// To jest funkcja która sprawia problem
        do {
            
            if (lista.czyJestBakteria(this.getPozycjaX(), this.getPozycjaY())) {
                System.out.println("Zjadłem");
                lista.usunBakterie(this.getPozycjaX(), this.getPozycjaY());
                this.setWaga(this.getWaga() + 1);
            } else {
                break;

            }
        } while (this.getWaga() < 10);

        
    }

        public void rozbijanie(Lista lista) {
        System.out.println("Penkłem");
        this.setWaga(2);

    }

    public void przedstawSie() {

    }

}

Interfejs z którego korzysta Klasa Pełzacz:

package nowyswiat;


public interface Zyjatko {
    
    public  int getPozycjaX();
    public int getPozycjaY();
    public int getPunktyTurowe();
    public void setPozycjaX(int pozycjaX);
    public void setPozycjaY(int pozycjaY);
    public void setPunktyTurowe(int punktyTurowe);
    
    public void ruch(int granicaX,int granicaY,Lista lista);
        
    
}
0

Wszędzie widze if(cośtam instanceof...) więc program do zaorania. Skasuj tą abominacje i napisz od nowa. Tej nie opłaca sie poprawiać bo od samego początku napisałeś ją źle. Lekcja na dziś: wzorzec Strategia i Polimorfizm.

0

Jak mogę zastąpić instanceof, żeby sprawdzić do jakiej klasy należy obiekt?

0

Masz tego w ogóle nie robić po prostu. Obiekt powinien mieć polimorficzne metody i masz je wołać. Masz na przykład:

        int szczescie = los.nextInt(23);
        if(zyjatko instanceof Bakteria){
            Bakteria bakteria = (Bakteria) zyjatko;
            bakteria.setPunktyTurowe(indeks+szczescie);
 
        }else if(zyjatko instanceof Pelzacz){
            Pelzacz pelzacz = (Pelzacz) zyjatko;
            pelzacz.setPunktyTurowe(szczescie+indeks+(10-pelzacz.getWaga()));
        }else if(zyjatko instanceof Pelzaczofag){
            Pelzaczofag pelzaczofag = (Pelzaczofag) zyjatko;
            pelzaczofag.setPunktyTurowe(szczescie+indeks+(8-pelzaczofag.getIQ()));
        }else if(zyjatko instanceof Teleportator){
            Teleportator teleportator = (Teleportator) zyjatko;
            teleportator.setPunktyTurowe(szczescie+indeks);
        }

A co jakbyś tych klas miał 1000? A co jakby ktoś miał to kiedyś rozwijać i dodałby swoje klasy implementujące Zyjatko?
Normalny człowiek, w pełni władz umysłowych napisałby:

int szczescie = los.nextInt(23);
zyjatko.setPunktyTurowe(szczescie, indeks);

A samą logikę zawarł w poszczególnych klasach.

0

Ok dzięki spróbuje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1