Advertisement
Khadija_Assem

Untitled

Dec 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.73 KB | None | 0 0
  1. package eg.edu.alexu.csd.oop.game.sample;
  2.  
  3. import eg.edu.alexu.csd.oop.game.GameObject;
  4. import eg.edu.alexu.csd.oop.game.World;
  5. import eg.edu.alexu.csd.oop.game.sample.Command.BackwardCommand;
  6. import eg.edu.alexu.csd.oop.game.sample.Command.Command;
  7. import eg.edu.alexu.csd.oop.game.sample.GUI.MainLoader;
  8. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Clown;
  9. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Composite.Gate;
  10. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Composite.GateDirector;
  11. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Composite.ShelfDirector;
  12. import eg.edu.alexu.csd.oop.game.sample.GameObjects.ImageObject;
  13. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Plates;
  14. import eg.edu.alexu.csd.oop.game.sample.GameObjects.Composite.Shelf;
  15. import eg.edu.alexu.csd.oop.game.sample.Logger.LoggerObject;
  16. import eg.edu.alexu.csd.oop.game.sample.Memento.Caretaker;
  17. import eg.edu.alexu.csd.oop.game.sample.Memento.Originator;
  18. import eg.edu.alexu.csd.oop.game.sample.Observer.Change;
  19. import eg.edu.alexu.csd.oop.game.sample.Observer.Subject;
  20. import eg.edu.alexu.csd.oop.game.sample.ShapeFactory.ShapeFactory;
  21. import eg.edu.alexu.csd.oop.game.sample.State.*;
  22. import eg.edu.alexu.csd.oop.game.sample.GUI.StartUpTest;
  23. import javafx.fxml.FXMLLoader;
  24. import javafx.scene.Parent;
  25. import javafx.scene.Scene;
  26. import javafx.stage.Stage;
  27. import org.apache.log4j.Logger;
  28.  
  29. import java.awt.*;
  30. import java.awt.event.KeyEvent;
  31. import java.awt.event.KeyListener;
  32. import java.sql.SQLException;
  33. import java.util.*;
  34. import java.util.List;
  35. import java.util.Timer;
  36. import java.util.concurrent.TimeUnit;
  37.  
  38.  
  39. public class Game implements World {
  40. Logger logger = LoggerObject.getLogger();
  41. private String status;
  42.  
  43. private static int MAX_TIME = 1 * 60 * 1000; // 11 minute
  44. private int score = 0;
  45. private long startTime = System.currentTimeMillis();
  46. private final int width;
  47. private final int height;
  48. private int Freq;
  49. private boolean gameOver = false ;
  50.  
  51. private final List<GameObject> constant = new LinkedList<GameObject>();
  52. private final List<GameObject> moving = new LinkedList<GameObject>();
  53. private final List<GameObject> control = new LinkedList<GameObject>();
  54. private ImageObject LeftHand;
  55. private ImageObject RightHand;
  56. private final Stack<Plates> RightHandStack= new Stack<>();
  57. private final Stack<Plates> LeftHandStack= new Stack<>();
  58. ShapeFactory sF ;
  59. Caretaker careTaker = new Caretaker();
  60. boolean flag = true;
  61.  
  62. private int Speed =0;
  63. private Subject subject = new Subject();
  64. private Object CaughtState = new CaughtState();
  65.  
  66. private boolean intersect(ImageObject o1, ImageObject o2,char Ch){
  67. int ObCentreX = 2*o1.getX()+o1.getWidth();
  68. ObCentreX=ObCentreX/2;
  69. if(o2 instanceof Clown) {
  70. if ((Math.abs(ObCentreX-o2.getX())<o1.getWidth()/3) && (o1.getY() - o2.getY()+o1.getHeight() == 0 && Ch=='L')) {
  71. logger.info("Left hand Clown Intersection/Object Type : "+((Plates)o1).getPath());
  72. //System.exit(0);
  73. return true;
  74. }
  75. else if ((Math.abs(ObCentreX-o2.getX()-(o2.getWidth()))<o1.getWidth()/3) && (o1.getY() - o2.getY()+o1.getHeight() == 0&&Ch=='R')){
  76. logger.info("Right hand Clown Intersection/Object Type : "+((Plates)o1).getPath());
  77. return true;
  78. }
  79. return false;
  80. }
  81. else {
  82. if ((Math.abs(o1.getX()-o2.getX())<o1.getWidth()/2) && (o1.getY() - o2.getY() +o1.getHeight()==0)) {
  83. logger.info("Object intersection of type "+((Plates)o1).getPath());
  84. return true;
  85. }
  86. return false;
  87. }
  88. }
  89. private GameObjectsSave Clone() throws CloneNotSupportedException {
  90. ArrayList<GameObject> Mgame = new ArrayList<>();
  91. for (int i =0;i<moving.size();i++){
  92. // if (moving.get(i) instanceof Plates)
  93. Mgame.add(((Plates)moving.get(i)).clone());
  94. }
  95. ArrayList<GameObject> Congame = new ArrayList<>();
  96. for (int i =0;i<constant.size();i++){
  97. if (constant.get(i) instanceof Plates)
  98. Congame.add(((Plates)constant.get(i)).clone());
  99. else Congame.add(constant.get(i));
  100. }
  101. ArrayList<GameObject> Cgame = new ArrayList<>();
  102. Cgame.add(Clown.getInstance().clone());
  103. for (int i =0;i<control.size();i++){
  104. if (control.get(i) instanceof Plates)
  105. Cgame.add(((Plates)control.get(i)).clone());
  106. else if (control.get(i) instanceof Clown)
  107. Cgame.add (Clown.getInstance().clone());
  108. }
  109. ArrayList<GameObject> LHand = new ArrayList<>(LeftHandStack);
  110. ArrayList<GameObject> Lgame = new ArrayList<>();
  111. for (int i =0;i<LHand.size()&&LeftHandStack.size()!=0;i++){
  112. if (LeftHandStack.get(i) instanceof Plates)
  113. Lgame.add(((Plates)LHand.get(i)).clone());
  114. }
  115. ArrayList<GameObject> RHand = new ArrayList<>(RightHandStack);
  116. ArrayList<GameObject> Rgame = new ArrayList<>();
  117. for (int i =0;i<RHand.size()&&RightHandStack.size()!=0;i++){
  118. if (RightHandStack.get(i) instanceof Plates)
  119. Rgame.add(((Plates)RHand.get(i)).clone());
  120. }
  121. Stack R = new Stack<>();R.addAll(Rgame);
  122. Stack L = new Stack<>();L.addAll(Lgame);
  123. GameObjectsSave gS = new GameObjectsSave(Congame,Mgame,Clown.getInstance().clone(),LeftHand,RightHand,score,Cgame,R,L);
  124. return gS;
  125. }
  126.  
  127. public Game(GameObjectsSave GO){
  128. // this.sF = ShapeFactory.getFactory();
  129. // width = ShapeFactory.getFactory().getWorld().getWidth();
  130. // height = ShapeFactory.getFactory().getWorld().getHeight();
  131. // System.out.println(GO.getControl());
  132. // LeftHand = GO.getLeftHand();
  133. // RightHand = GO.getRightHand();
  134. // this.control.add(GO.getCl());
  135. //// this.moving.addAll(GO.getControl());
  136. // this.constant.addAll(ShapeFactory.getFactory().getWorld().getConstantObjects());
  137. // this.moving.addAll(ShapeFactory.getFactory().getWorld().getMovableObjects());
  138. //
  139. ////// try {
  140. // if(GO.getRightHandStack().size()!=0) {
  141. // for (int i=0;i<GO.getRightHandStack().size();i++){
  142. // moving.remove(GO.getRightHandStack().get(i));
  143. // GO.getRightHandStack().get(i).setX(RightHand.getX());
  144. // }
  145. //// this.RightHandStack.addAll(GO.getRightHandStack());
  146. //// this.control.addAll(GO.getRightHandStack());
  147. // System.out.println("Right hand stack "+this.RightHandStack.size());
  148. // System.out.println("Control Size "+this.control.size());
  149. // }
  150. // if (GO.getLeftHandStack().size()!=0) {
  151. // for (int i=0;i<GO.getLeftHandStack().size();i++){
  152. // moving.remove(GO.getLeftHandStack().get(i));
  153. // GO.getLeftHandStack().get(i).setX(LeftHand.getX());
  154. // }
  155. // System.out.println("Left Hand stack "+(GO.getLeftHandStack()));
  156. //// this.LeftHandStack.addAll(GO.getLeftHandStack());
  157. // System.out.println("Left hand stack " + this.LeftHandStack.size());
  158. //// this.control.addAll(LeftHandStack);
  159. // System.out.println("Control Size "+this.control.size());
  160. // }
  161. // sF.setWorld(this);
  162. this.sF = ShapeFactory.getFactory();
  163. width = ShapeFactory.getFactory().getWorld().getWidth();
  164. height = ShapeFactory.getFactory().getWorld().getHeight();
  165. LeftHand = GO.getLeftHand();
  166. RightHand = GO.getRightHand();
  167. this.control.addAll(GO.getControl());
  168. this.score = GO.getScore();
  169. this.moving.addAll(GO.getMoving());
  170. this.constant.addAll(ShapeFactory.getFactory().getWorld().getConstantObjects());
  171. try {
  172. TimeUnit.MILLISECONDS.sleep(500);
  173. } catch (InterruptedException e) {
  174. e.printStackTrace();
  175. }
  176. this.score = GO.getScore();
  177. this.RightHandStack.addAll(GO.getRightHandStack());
  178. this.LeftHandStack.addAll(GO.getLeftHandStack());
  179. DGameController.getInstance().pause();
  180. // System.out.println("AHO SA&AA");
  181. // DGameController.getInstance().resume();
  182. //// try {
  183. // if(GO.getRightHandStack().size()!=0) {
  184. // for (int i=0;i<GO.getRightHandStack().size();i++){
  185. // moving.remove(GO.getRightHandStack().get(i));
  186. // GO.getRightHandStack().get(i).setX(RightHand.getX());
  187. // }
  188. //// this.RightHandStack.addAll(GO.getRightHandStack());
  189. //// this.control.addAll(GO.getRightHandStack());
  190. // System.out.println("Right hand stack "+this.RightHandStack.size());
  191. // System.out.println("Control Size "+this.control.size());
  192. // }
  193. // if (GO.getLeftHandStack().size()!=0) {
  194. // for (int i=0;i<GO.getLeftHandStack().size();i++){
  195. // moving.remove(GO.getLeftHandStack().get(i));
  196. // GO.getLeftHandStack().get(i).setX(LeftHand.getX());
  197. // }
  198. // System.out.println("Left Hand stack "+(GO.getLeftHandStack()));
  199. //// this.LeftHandStack.addAll(GO.getLeftHandStack());
  200. // System.out.println("Left hand stack " + this.LeftHandStack.size());
  201. //// this.control.addAll(LeftHandStack);
  202. // System.out.println("Control Size "+this.control.size());
  203. // }
  204. }
  205.  
  206. public Game(int screenWidth, int screenHeight) {
  207. //moving.add(new ImageObject((int)(Math.random() * screenWidth), -1 * (int)(Math.random() * screenHeight), "/star.png"));
  208. sF = ShapeFactory.getFactory();
  209. sF.setWorld(this);
  210. width = screenWidth;
  211. height = screenHeight;
  212. control.add(Clown.getInstance());
  213. LeftHand=(ImageObject)control.get(0);
  214. RightHand=(ImageObject)control.get(0);
  215. constant.add(new eg.edu.alexu.csd.oop.game.sample.object.ImageObject((int)(0),(int)(-250),"/kk.png"));
  216. constant.add(new Shelf(10,70,450,true, Color.RED));
  217. constant.add(new Shelf(800,70,500,true, Color.RED));
  218. constant.add(new Shelf(10,70+100,250,true, Color.BLUE));
  219. constant.add(new Shelf(1000,70+100,300,true, Color.BLUE));
  220. for(int i = 1;i<constant.size();i++)
  221. ShelfDirector.getInstance().addShelf((Shelf)constant.get(i));
  222. GateDirector.getInstance().addGate(new Gate(ShelfDirector.getInstance().showShelfeDetails(0).getX(), 0));
  223. // sF.setGate(0);
  224. // moving.add(sF.getShape());
  225. GateDirector.getInstance().addGate(new Gate(ShelfDirector.getInstance().showShelfeDetails(1).getX()+ShelfDirector.getInstance().showShelfeDetails(1).getWidth(), 0));
  226. // sF.setGate(1);
  227. // moving.add(sF.getShape());
  228. GateDirector.getInstance().addGate(new Gate(ShelfDirector.getInstance().showShelfeDetails(2).getX(), 0+100));
  229. // sF.setGate(2);
  230. // moving.add(sF.getShape());
  231. GateDirector.getInstance().addGate(new Gate(ShelfDirector.getInstance().showShelfeDetails(3).getX()+ShelfDirector.getInstance().showShelfeDetails(3).getWidth(), 0+100));
  232. // sF.setGate(3);
  233. // moving.add(sF.getShape());
  234. logger.info("Starting game of Dimensions \n Height : "+this.getHeight()+" And width : "+this.getWidth()+"\n Current Speed : "+this.getSpeed()+" Max Time : "+MAX_TIME/(1000*60) +" Minute And " + MAX_TIME%(1000*60)+" Seconds." );
  235. // 2000 - delay (can set to 0 for immediate execution), 5000 is a frequency
  236. }
  237.  
  238. private static int i =0;
  239. public static boolean undo = false;
  240. @Override
  241. public boolean refresh() {
  242. i++;
  243. if(i%50 == 0){
  244. Originator originator = new Originator();
  245. try {
  246. originator.setState(Clone());
  247. } catch (CloneNotSupportedException e) {
  248. e.printStackTrace();
  249. }
  250. careTaker.addMemento(originator.save());
  251. }
  252. status = "Please Use Arrows To Move | Location = " + control.get(0).getX() + "," + control.get(0).getY() + " | Score=" + score + " | Time=" + Math.max(0, (MAX_TIME - (System.currentTimeMillis()-startTime))/1000);
  253. boolean timeout = System.currentTimeMillis() - startTime > MAX_TIME; // time end and game over
  254. if(flag) {
  255.  
  256. Frame.getFrames()[Frame.getFrames().length-1].getComponent(0).getParent().addKeyListener(new KeyListener() {
  257. @Override
  258. public void keyTyped(KeyEvent e) {
  259. }
  260.  
  261. @Override
  262. public void keyPressed(KeyEvent e) {
  263. }
  264.  
  265. @Override
  266. public void keyReleased(KeyEvent e) {
  267. System.out.println("KKKKKKKKKKKKKKK");
  268. if (e.getKeyChar() == 'f') {
  269. status = "Press 'f' to go forward | Location = " + control.get(0).getX() + "," + control.get(0).getY() + " | Score=" + score + " | Time=" + Math.max(0, (MAX_TIME - (System.currentTimeMillis()-startTime))/1000);
  270. Command cmd = new BackwardCommand();
  271. try {
  272. cmd.execute();
  273. } catch (SQLException ex) {
  274. } catch (Exception ex) {
  275. System.exit(0);
  276. }
  277. }
  278. else if (e.getKeyChar() == ' ') {
  279. try {
  280. status = "PRESS 'p' TO REPLAY AND EXIT OR 'r' TO REPLAY";
  281. if (GUIData.getLaunchedBefore()){
  282. DGameController.getInstance().pause();
  283. ShapeFactory.getFactory().setGameover(true);
  284. Stage stage;
  285. Parent root;
  286. stage = (Stage) GUIData.getPane().getScene().getWindow();
  287. // GUIData.getSt().show();
  288. root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
  289. Scene scene = new Scene(root);
  290. // stage.setScene(GUIData.getScene());
  291. stage.show();
  292. // GUIData.getSt().setScene(scene);
  293. // GUIData.getSt().show();
  294. } else{
  295. GUIData.setLaunchedBefore(true);
  296. undo = true;
  297. ShapeFactory.getFactory().setGameover(true);
  298. DGameController.getInstance().pause();
  299. new Thread() {
  300. @Override
  301. public void run() {
  302. javafx.application.Application.launch(StartUpTest.class);
  303. }
  304. }.start();
  305. StartUpTest startUpTest = StartUpTest.waitForStartUpTest();
  306. startUpTest.printSomething();
  307. }
  308. // }
  309. }
  310. catch (Exception E){}
  311. }else if (e.getKeyChar() == 'r'){
  312. status = "Please Use Arrows To Move | Location = " + control.get(0).getX() + "," + control.get(0).getY() + " | Score=" + score + " | Time=" + Math.max(0, (MAX_TIME - (System.currentTimeMillis()-startTime))/1000);
  313. DGameController.getInstance().resume();
  314. }
  315. else if (e.getKeyChar() == 'p'){
  316. status = "Please Use Arrows To Move | Location = " + control.get(0).getX() + "," + control.get(0).getY() + " | Score=" + score + " | Time=" + Math.max(0, (MAX_TIME - (System.currentTimeMillis()-startTime))/1000);
  317. Command cmd = new BackwardCommand();
  318. try {
  319. cmd.execute();
  320. } catch (Exception ex) {
  321. System.exit(0);
  322. }
  323. }
  324. }
  325. });
  326. flag = false;
  327. }
  328.  
  329. for(int i=0;i<moving.size();i++) {
  330. if (((Plates) moving.get(i)).getState() instanceof ShelfState || ((Plates) moving.get(i)).getState() instanceof FallingState) {
  331. ((Plates) moving.get(i)).getState().doAction(((Plates) moving.get(i)));
  332. // if (moving.get(i).getX() < getWidth()-200 && !((Plates) moving.get(i)).isUsed() && ((((Plates) moving.get(i)).getGate() == 1 ) || (((Plates) moving.get(i)).getGate() == 3 ))) {
  333. // // sF.setGate(((Plates) moving.get(i)).getGate());
  334. // // moving.add(sF.getShape());
  335. // ((Plates) moving.get(i)).setUsed(true);
  336. // }
  337. // else if (moving.get(i).getX() > 200 && !((Plates) moving.get(i)).isUsed() && (((Plates) moving.get(i)).getGate() == 0 || (((Plates) moving.get(i)).getGate() == 2))) {
  338. // //sF.setGate(((Plates) moving.get(i)).getGate());
  339. // // moving.add(sF.getShape());
  340. // ((Plates) moving.get(i)).setUsed(true);
  341. // }
  342. }
  343. else if (((Plates)moving.get(i)).getState() instanceof FloorState)((Plates)moving.get(i)).getState().doAction((Plates) moving.get(i));
  344.  
  345. if (((Plates) moving.get(i)).getState() instanceof FallingState) {
  346. Plates plateTest = (Plates) moving.get(i);
  347. if (intersect((ImageObject) moving.get(i), LeftHand,'L')) {
  348. if(! (LeftHand instanceof Clown))
  349. logger.info("Left hand intersection");
  350. control.add(moving.get(i));
  351. LeftHand = (ImageObject) moving.get(i);
  352. LeftHandStack.push((Plates)LeftHand);
  353. System.out.println("Moving size "+moving.size());
  354. ((Plates) moving.get(i)).setState((State) CaughtState);
  355. moving.remove(i);
  356. System.out.println("Moving size "+moving.size());
  357. plateTest.setState(new CaughtState());
  358. getScoreFrom(LeftHandStack);
  359. if(!LeftHandStack.empty())
  360. LeftHand=(Plates)LeftHandStack.peek();
  361. else
  362. LeftHand=Clown.getInstance();
  363. logger.info("Current Peek of Left Hand : "+LeftHand.getPath());
  364. } else if (intersect((ImageObject) moving.get(i), RightHand,'R')) {
  365. if(! (RightHand instanceof Clown))
  366. logger.info("Right hand intersection");
  367. control.add(moving.get(i));
  368. RightHandStack.push((Plates) moving.get(i));
  369. RightHand = (ImageObject) moving.get(i);
  370. moving.remove(i);
  371. plateTest.setState(new CaughtState());
  372. getScoreFrom(RightHandStack);
  373.  
  374. if(!RightHandStack.empty())
  375. RightHand=(Plates)RightHandStack.peek();
  376. else
  377. RightHand=Clown.getInstance();
  378. logger.info("Current Peek of Right Hand : "+RightHand.getPath());
  379. }
  380. }
  381. }
  382. if(RightHandStack.size() > 1 && LeftHandStack.size() > 1) {
  383. if (RightHandStack.peek().getY() < 80 && LeftHandStack.peek().getY() < 80) {
  384. timeout = true;
  385. DGameController.getInstance().pause();
  386. gameOver = true ;
  387. sF.setGameover(true);
  388. undo=true;
  389. }
  390. }
  391. if (timeout){
  392. try {
  393. DGameController.getInstance().pause();
  394. if (GUIData.getLaunchedBefore()){
  395. Stage stage;
  396. Parent root;
  397. stage = (Stage) GUIData.getPane().getScene().getWindow();
  398. root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
  399. // Scene scene = (GUIData.getScene());
  400. // stage.setScene(scene);
  401. GUIData.getSt().show();
  402. }
  403. else {
  404. GUIData.setLaunchedBefore(true);
  405. new Thread() {
  406. @Override
  407. public void run() {
  408. javafx.application.Application.launch(MainLoader.class);
  409. }
  410. }.start();
  411. MainLoader startUpTest = MainLoader.waitForStartUpTest();
  412. startUpTest.printSomething();
  413. sF.setGameover(true);
  414. undo = true;
  415. }
  416. }
  417. catch (Exception E){}
  418. }
  419. return !timeout;
  420. }
  421.  
  422. @Override
  423. public int getSpeed() {
  424. return Speed;
  425. }
  426. @Override
  427. public int getControlSpeed() {
  428. return 20;
  429. }
  430. @Override
  431. public List<GameObject> getConstantObjects() {
  432. return constant;
  433. }
  434. @Override
  435. public List<GameObject> getMovableObjects() {
  436. return moving;
  437. }
  438. @Override
  439. public List<GameObject> getControlableObjects() {
  440. return control;
  441. }
  442. @Override
  443. public int getWidth() {
  444. return width;
  445. }
  446. @Override
  447. public int getHeight() {
  448. return height;
  449. }
  450. @Override
  451. public String getStatus() {
  452. // return "";
  453.  
  454. return status; // update status
  455. }
  456.  
  457. public void setSpeed(int speed) {
  458. Timer timer = new Timer();
  459. TimerTask task = new MyTask();
  460. Freq = speed*100;
  461. timer.schedule(task,0,Freq);
  462. Speed = speed;
  463. }
  464.  
  465. public int getScore() {
  466. return score;
  467. }
  468.  
  469. public void setScore( int NewScore) {
  470. this.score = NewScore ;
  471. }
  472.  
  473. public void getScoreFrom ( Stack <Plates> HandStack ){
  474. subject.setWorld(this);
  475. new Change(subject , subject.getWorld() , HandStack );
  476. subject.setState(this.getScore());
  477. setScore(subject.getState()) ;
  478. }
  479.  
  480. private static int TurnTaker = 0;
  481. class MyTask extends TimerTask
  482. {
  483. public void run()
  484. {
  485. sF.setGate(TurnTaker);
  486. TurnTaker++;
  487. TurnTaker=TurnTaker%4;
  488. sF.getShape();
  489. }
  490. }
  491. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement