2015-12-27 12 views
6

Sono un po 'nuovo in Java. Attualmente sono impegnato con un progetto. L'obiettivo è creare un mondo virtuale in 2D con entità viventi (persone) e entità non viventi (ad esempio vulcanos). Le persone dovrebbero essere in grado di muovere ogni passo temporale (solo per le celle adiacenti) e possono essere uccise o influenzate in altri modi dalle entità non viventi.Aggiungi oggetti persona alla griglia bidimensionale

Ho pensato che fosse una buona idea iniziare con la creazione di una classe di persone e inserirle nella griglia. Queste sono le mie classi finora. Tuttavia, sto lottando con l'archiviazione di persone nella griglia (dovrebbe essere possibile memorizzare più persone in una cella).

Questa è la mia classe person:

public void setName (String name) {//give the person a name 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) {// give the person an age 

     this.age = age; 
    } 

    public String getGender() { 
     return gender; 
    } 
    public void setGender(String gender) { // set gender of the person 
     this.gender = gender; 
    } 
    public String getSexualPreference() { 
     return sexualPreference; 
    } 
    public void setSexualPreference(String sexualPreference) { // set sexual preference of the person 
     this.sexualPreference = sexualPreference; 
    } 
    public String getLifeGoals() { 
     return lifeGoals; 
    } 
    public void setLifeGoals(String lifeGoals) { // set lifegoals of the person 
     this.lifeGoals = lifeGoals; 
    } 
    public boolean isMarried() { 
     return isMarried; 
    } 
    public void setMarried(boolean isMarried) { 
     this.isMarried = isMarried; 
    } 
    public int getAgressionLevel() { 
     return agressionLevel; 
    } 
    public void setAgressionLevel(int agressionLevel) { 
     this.agressionLevel = agressionLevel; 
    } 
    public Terrain get_terrain(){// specify terrain in which the person lives. 
     return (Terrain) get_terrain(); 
    } 
    public Person(boolean randomAge){ //creates a person with a random age and a agression level. 
     if(randomAge==true){ 
      setAge(ThreadLocalRandom.current().nextInt(0,max_age +1));// this gives the person a random age between 0 and the chosen maximum age. 
      setAgressionLevel(ThreadLocalRandom.current().nextInt(0,max_agressionLevel +1));//this gives the person a random agression level, scaled from 0-10. 
     }else{ 
      setAge(0); 
     } 
    } 
    public void act(){ // this method specifies what a person can do all the time 
     increaseAge(); 
     if(isAlive() == true) 
     { 
      int births = reproduce(); 

      for(int b = 0; b < births; b++) 
      { 
       Location place = get_terrain().random_space(getX(), getY()); 
       if(place != null) 
       { 
        Person newpers = new Person(false); 
        get_terrain().addObject(newpers, place.getX(), place.getY()); 
       } 
      } 
     } 
    } 
    private int reproduce(){ 
     int births = 0; 
     if(canReproduce() && isMarried() && Math.random()*100 <= reproducing_prob){ 
      births +=1; 

     } return births; 
    } 
    private void increaseAge(){// increases the person's age, this can result in its dead 
     setAge(getAge() + 1); 
     if(getAge() > max_age) 
     { 
      setDead(); 
     } 
    } 
    private boolean canReproduce(){ 
     return getAge() >= adultAge; 
    } 
    public String toString() 
    { 
     return "Person, age " + getAge(); 

Questa è la mia classe di terreno. Sto cercando di mettere gli elementi in posti casuali.

import java.util.ArrayList; 
import java.util.concurrent.ThreadLocalRandom; 

public class Terrain { 
    private static int width; 
    private static int height; 
    private final static int nrOfPersons = 200; 

    public Terrain() 
    {  
     addPerson(null, null, null); 
    } 
    public static void addPerson(Person p, Location x){ //adds the persons to the terrain 
     ArrayList<Person> listOfPersons = new ArrayList<Person>(); 
     Terrain.addPerson(p, x);  

    } 
    public Location random_space(int x, int y){ 
     int x1 = ThreadLocalRandom.current().nextInt(0, width +1); 
     int y1 = ThreadLocalRandom.current().nextInt(0, height +1); 


     if(x1 < 0 || x1 >= width || y1 < 0 || y1 >= height) //check if the location is within the terrain 
     { 
      System.out.println("Your location is not within the boundaries of the world"); 
     } 
     return random_space(x1, y1); 

    } 

E questa è la mia classe lovation:

public class Location { //corresponds to a place on the terrain 

    private int x; //horizontal coordinate 
    private int y; //vertical coordinate 

    /** 
    * Constructor for objects of class place 
    */ 
    public Location(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public boolean equals(Object obj) 
    { 
     if(obj instanceof Location) 
     { 
      Location other = (Location)obj; 
      return x == other.getX() && y == other.getY(); 
     } 

     else 
     { 
      return false; 
     } 
    } 

    public int getX() //return x coordinate 
    { 
     return x; 
    } 

    public int getY() //return y cordinate 
    { 
     return y; 
    } 
} 
+0

quindi, qual è esattamente il problema, cosa non funziona? –

+0

Non so come aggiungere oggetti persona alla mia griglia – StievieG

+0

cosa è "la griglia"? hai già un terreno, con il vuoto statico pubblico addPerson –

risposta

2

questo è certamente falso:

public static void addPerson(Person p, Location x){ //adds the persons to the terrain 
     ArrayList<Person> listOfPersons = new ArrayList<Person>(); 
     Terrain.addPerson(p, x);  

    } 

Non si dovrebbe ricreare listOfPersons ogni volta: si cancella e distrugge alla fine: poi non tieni nulla.

1 Farlo nel costruttore:

List<Person> listOfPersons = new ArrayList<Person>(); 

public Terrain() 
{ 
// WHAT ? 
// addPerson(null, null, null); 
} 

2 addPerson => addPerson fa un ciclo infinito

Dovete tenere queste informazioni troppo.

Il modo più semplice è una mappa: Posizione => persona

Map<Location,Person> grid=new HashMap<Location,Person>(); 

si mette così:

grid.put(one_location,one_person); 

di provare così:

grid.contains(one_location); => get true/false 

si ottiene così :

grid.get(one_location); => get one_person 

Importante: puoi avere una sola persona in un posto, con una mappa. con quello, la tua vecchia persona sovrascrive.

a proposito, non è necessario più listOfPersons.

Altre strategie per mantenere più persone nella stessa posizione:

ottenere una mappa: Person => posizione. Quando avrai bisogno di persone in qualche posto, devi iterare.

Altro possibiliy: mantenere anche una mappa < Località, Set < Persona >>: per ogni posizione, è avere un set.

+0

Grazie! Ma non c'è un modo per far sì che più persone possano essere nello stesso posto? Ogni volta che passo, le persone dovrebbero essere in grado di interagire l'un l'altro (uccidersi a vicenda, sposarsi, avere figli, ...) quando sono sulla stessa tessera. – StievieG

+0

altre possibilità nella mia risposta. con Collections (Map, Set, ...) puoi fare quasi tutto ciò che puoi immaginare. –

2

Il metodo addPerson deve essere un metodo di istanza sulla classe Terrain piuttosto che un metodo static. Inoltre, dovrebbe agire su un campo della classe piuttosto che su una variabile locale del metodo.

Avrai anche bisogno di un mezzo per connettere una persona a una posizione, che potrebbe essere molte cose, una matrice 2-D che rappresenta l'intera griglia, una mappa dalle coordinate agli oggetti persona o un campo location sulla persona oggetto. Diciamo che si utilizza una mappa, allora sarebbe simile a questa ...

public class Terrain { 
    private static int width; 
    private static int height; 
    private final Map<Location, Person> personAtLocation = new HashMap<>(); 

    public void addPerson(Person p, Location x){ 
     personAtLocation.put(x, p); 
    } 
    ... 
} 

il miglior meccanismo per il collegamento di una persona di una posizione è davvero sarà dipende da ciò che si sta cercando di raggiungere nel resto del tuo programma.

Problemi correlati