Advertisement
patryk

Citizen

Nov 22nd, 2014
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.19 KB | None | 0 0
  1. package worldsimulation.map.characters;
  2.  
  3. import java.util.Random;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6. import worldsimulation.map.roads.Road;
  7. import worldsimulation.Simulation;
  8. import worldsimulation.map.cities.City;
  9. import worldsimulation.map.cities.CityEntrance;
  10. import worldsimulation.map.cities.CityExit;
  11. import worldsimulation.map.roads.CrossRoad;
  12.  
  13. public class Citizen extends Character implements Runnable {
  14.  
  15.     private static final int MOVEMENT_SPEED = 1;
  16.     private String surname;
  17.     private String hometown;
  18.     private int movingDir = 1;
  19.     private boolean modifyingList = true;
  20.     private boolean halt = false;
  21.     private boolean wait = false;
  22.     private boolean inCity = false;
  23.     private String cityName;
  24.     private String nextCity;
  25.  
  26.     public int flagmovement = 1;
  27.  
  28.     /**
  29.      *
  30.      * @param positionX Set start position X.
  31.      * @param positionY Set start position Y.
  32.      * @param forename Set forename of the Citizen.
  33.      * @param surname Set surname of the Citizen.
  34.      * @param hometown Set hometown of the Citizen.
  35.      */
  36.     public Citizen(int positionX, int positionY, String forename, String surname, String hometown) {
  37.         super(positionX, positionY, forename);
  38.         this.surname = surname;
  39.         this.hometown = hometown;
  40.         goHometown();
  41.         new Thread(this).start();
  42.     }
  43.  
  44.     @Override
  45.     public void move() {
  46.  
  47.         for (Citizen citizen : Simulation.citizenList) {
  48.             switch (this.movingDir) {
  49.                 case 1:
  50.                     wait = this.positionX == citizen.getPositionX() && this.positionY - 32 == citizen.getPositionY();
  51.                     break;
  52.                 case 2:
  53.                     wait = this.positionX - 32 == citizen.getPositionX() && this.positionY == citizen.getPositionY();
  54.                     break;
  55.                 case 3:
  56.                     wait = this.positionX + 32 == citizen.getPositionX() && this.positionY == citizen.getPositionY();
  57.                     break;
  58.                 case 4:
  59.                     wait = this.positionX == citizen.getPositionX() && this.positionY + 32 == citizen.getPositionY();
  60.                     break;
  61.             }
  62.             if (wait) {
  63.                 break;
  64.             }
  65.         }
  66.  
  67.         for (Road road : Simulation.roadList) {
  68.             if (positionX == road.getPositionX() && positionY == road.getPositionY()) {
  69.                 this.movingDir = road.getMovingDir();
  70.                 break;
  71.             }
  72.         }
  73.  
  74.         for (CrossRoad crossRoad : Simulation.crossRoadList) {
  75.             switch (this.movingDir) {
  76.  
  77.                 case 1:
  78.                     if (this.positionX == crossRoad.getPositionX() && this.positionY - 32 == crossRoad.getPositionY()) {
  79.                         try {
  80.                             crossRoad.sem.acquire();
  81.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  82.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  83.                                     restCrossRoad.sem.acquire();
  84.                                 }
  85.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  86.                                     restCrossRoad.sem.acquire();
  87.                                 }
  88.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  89.                                     restCrossRoad.sem.acquire();
  90.                                 }
  91.                             }
  92.                         } catch (InterruptedException ex) {
  93.                             Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  94.                         }
  95.                         try {
  96.                             moveThroughCrossRoad();
  97.                         } finally {
  98.                             crossRoad.sem.release();
  99.  
  100.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  101.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  102.                                     restCrossRoad.sem.release();
  103.                                 }
  104.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  105.                                     restCrossRoad.sem.release();
  106.                                 }
  107.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  108.                                     restCrossRoad.sem.release();
  109.                                 }
  110.                             }
  111.                         }
  112.                     }
  113.                     break;
  114.  
  115.                 case 2:
  116.                     if (this.positionX - 32 == crossRoad.getPositionX() && this.positionY == crossRoad.getPositionY()) {
  117.                         try {
  118.                             crossRoad.sem.acquire();
  119.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  120.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  121.                                     restCrossRoad.sem.acquire();
  122.                                 }
  123.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  124.                                     restCrossRoad.sem.acquire();
  125.                                 }
  126.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  127.                                     restCrossRoad.sem.acquire();
  128.                                 }
  129.                             }
  130.                         } catch (InterruptedException ex) {
  131.                             Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  132.                         }
  133.  
  134.                         try {
  135.                             moveThroughCrossRoad();
  136.                         } finally {
  137.                             crossRoad.sem.release();
  138.  
  139.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  140.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  141.                                     restCrossRoad.sem.release();
  142.                                 }
  143.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() - 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  144.                                     restCrossRoad.sem.release();
  145.                                 }
  146.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  147.                                     restCrossRoad.sem.release();
  148.                                 }
  149.                             }
  150.                         }
  151.                     }
  152.                     break;
  153.  
  154.                 case 3:
  155.                     if (this.positionX + 32 == crossRoad.getPositionX() && this.positionY == crossRoad.getPositionY()) {
  156.                         try {
  157.                             crossRoad.sem.acquire();
  158.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  159.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  160.                                     restCrossRoad.sem.acquire();
  161.                                 }
  162.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  163.                                     restCrossRoad.sem.acquire();
  164.                                 }
  165.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  166.                                     restCrossRoad.sem.acquire();
  167.                                 }
  168.                             }
  169.                         } catch (InterruptedException ex) {
  170.                             Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  171.                         }
  172.                         try {
  173.                             moveThroughCrossRoad();
  174.                         } finally {
  175.                             crossRoad.sem.release();
  176.  
  177.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  178.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  179.                                     restCrossRoad.sem.release();
  180.                                 }
  181.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  182.                                     restCrossRoad.sem.release();
  183.                                 }
  184.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() - 32) {
  185.                                     restCrossRoad.sem.release();
  186.                                 }
  187.                             }
  188.                         }
  189.                     }
  190.                     break;
  191.  
  192.                 case 4:
  193.                     if (this.positionX == crossRoad.getPositionX() && this.positionY + 32 == crossRoad.getPositionY()) {
  194.                         try {
  195.                             crossRoad.sem.acquire();
  196.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  197.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  198.                                     restCrossRoad.sem.acquire();
  199.                                 }
  200.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  201.                                     restCrossRoad.sem.acquire();
  202.                                 }
  203.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  204.                                     restCrossRoad.sem.acquire();
  205.                                 }
  206.                             }
  207.                         } catch (InterruptedException ex) {
  208.                             Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  209.                         }
  210.                         try {
  211.                             moveThroughCrossRoad();
  212.                         } finally {
  213.                             crossRoad.sem.release();
  214.  
  215.                             for (CrossRoad restCrossRoad : Simulation.crossRoadList) {
  216.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  217.                                     restCrossRoad.sem.release();
  218.                                 }
  219.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY() + 32) {
  220.                                     restCrossRoad.sem.release();
  221.                                 }
  222.                                 if (restCrossRoad.getPositionX() == crossRoad.getPositionX() + 32 && restCrossRoad.getPositionY() == crossRoad.getPositionY()) {
  223.                                     restCrossRoad.sem.release();
  224.                                 }
  225.                             }
  226.                         }
  227.                     }
  228.                     break;
  229.             }
  230.         }
  231.  
  232.         for (CityEntrance cityEntrance : Simulation.citiesEntranceList) {
  233.             if (positionX == cityEntrance.getPositionX() && positionY == cityEntrance.getPositionY()) {
  234.                 this.inCity = true;
  235.                 this.cityName = cityEntrance.getCityName();
  236.                 for (City city : Simulation.citiesList) {
  237.                     if (this.cityName == city.getName()) {
  238.                         city.setResidentsNumber(city.getResidentsNumber() + 1);
  239.                         System.out.println("#" + city.getName() + " POPULATION INCREASE: " + city.getResidentsNumber());
  240.                     }
  241.                 }
  242.             }
  243.  
  244.         }
  245.  
  246.         if (!wait) {
  247.             switch (this.movingDir) {
  248.                 case 1:
  249.                     this.setNewPosition(positionX, positionY - MOVEMENT_SPEED);
  250.                     break;
  251.                 case 2:
  252.                     this.setNewPosition(positionX - MOVEMENT_SPEED, positionY);
  253.                     break;
  254.                 case 3:
  255.                     this.setNewPosition(positionX + MOVEMENT_SPEED, positionY);
  256.                     break;
  257.                 case 4:
  258.                     this.setNewPosition(positionX, positionY + MOVEMENT_SPEED);
  259.                     break;
  260.             }
  261.         }
  262.     }
  263.  
  264.     public void moveThroughCrossRoad() {
  265.         boolean ready = false;
  266.         while (!ready) {
  267.             for (CrossRoad cross : Simulation.crossRoadList) {
  268.                 if (positionX == cross.getPositionX() && positionY == cross.getPositionY()) {
  269.                     String[] citiesList = cross.getCitiesList();
  270.  
  271.                     for (int i = 0; i < citiesList.length; i++) {
  272.                         if (this.nextCity == citiesList[i]) {
  273.                             this.movingDir = cross.getMovingDir();
  274.                             ready = true;
  275.                             break;
  276.                         } else {
  277.                             this.movingDir = cross.getNextCrossRoad();
  278.                         }
  279.                     }
  280.                     break;
  281.                 }
  282.             }
  283.  
  284.             switch (this.movingDir) {
  285.                 case 1:
  286.                     this.setNewPosition(positionX, positionY - MOVEMENT_SPEED);
  287.                     break;
  288.                 case 2:
  289.                     this.setNewPosition(positionX - MOVEMENT_SPEED, positionY);
  290.                     break;
  291.                 case 3:
  292.                     this.setNewPosition(positionX + MOVEMENT_SPEED, positionY);
  293.                     break;
  294.                 case 4:
  295.                     this.setNewPosition(positionX, positionY + MOVEMENT_SPEED);
  296.                     break;
  297.             }
  298.             try {
  299.                 Thread.sleep(10);
  300.             } catch (InterruptedException ex) {
  301.                 Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  302.             }
  303.         }
  304.     }
  305.  
  306.     private void inCity() {
  307.         positionX = -32;
  308.         positionY = -32;
  309.  
  310.         try {
  311.             Random randomNumber = new Random();
  312.             int randomTravelTime = randomNumber.nextInt(9) + 1;
  313.             Thread.sleep(6000 * randomTravelTime);
  314.         } catch (InterruptedException ex) {
  315.             Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  316.         }
  317.  
  318.         for (CityExit cityExit : Simulation.citiesExitList) {
  319.             if (this.cityName == cityExit.getCityName()) {
  320.                 this.inCity = false;
  321.                 for (City city : Simulation.citiesList) {
  322.                     if (this.cityName == city.getName()) {
  323.                         city.setResidentsNumber(city.getResidentsNumber() - 1);
  324.                         System.out.println("#" + city.getName() + " POPULATION DECREASE: " + city.getResidentsNumber());
  325.                     }
  326.                 }
  327.                 this.setNewPosition(cityExit.getPositionX(), cityExit.getPositionY());
  328.                 this.movingDir = cityExit.getMovingDir();
  329.  
  330.                 if (this.cityName == this.hometown) {
  331.                     do {
  332.                         this.nextCity = randomCity();
  333.                     } while (this.cityName == this.nextCity);
  334.                     System.out.println("BOHATER: " + surname + " WYBIERA SIĘ NA WYCIECZKĘ DO: " + nextCity);
  335.                 } else {
  336.                     goHometown();
  337.                     System.out.println("BOHATER: " + surname + " IDZIE DO HOMETOWN!");
  338.                 }
  339.                 break;
  340.             }
  341.         }
  342.     }
  343.  
  344.     public void changeHometown() {
  345.         this.hometown = randomCity();
  346.     }
  347.  
  348.     public static String randomCity() {
  349.         Random randomNumber = new Random();
  350.         int randomCityNumber = randomNumber.nextInt(9);
  351.         int i = 0;
  352.         String randomCityName = null;
  353.  
  354.         for (City city : Simulation.citiesList) {
  355.             if (i == randomCityNumber) {
  356.                 if (!city.isCityDestroyed()) {
  357.                     randomCityName = city.getName();
  358.                     break;
  359.                 }
  360.             }
  361.             i++;
  362.         }
  363.         return randomCityName;
  364.     }
  365.  
  366.     public void goHometown() {
  367.         this.nextCity = this.hometown;
  368.     }
  369.  
  370.     public void setModifyingList(boolean modifyingList) {
  371.         this.modifyingList = modifyingList;
  372.     }
  373.  
  374.     public void run() {
  375.         while (true) {
  376.             synchronized (this) {
  377.                 if (modifyingList) {
  378.  
  379.                 } else if (inCity) {
  380.                     inCity();
  381.                 } else if (!halt) {
  382.                     move();
  383.                 }
  384.                 try {
  385.                     Thread.sleep(10);
  386.                 } catch (InterruptedException ex) {
  387.                     Logger.getLogger(Citizen.class.getName()).log(Level.SEVERE, null, ex);
  388.                 }
  389.             }
  390.         }
  391.     }
  392. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement