From 22d9a5aa05f6f37bcfce0b318ac06e3f24040f7d Mon Sep 17 00:00:00 2001
From: Jean Luo <luoj3@mcmaster.ca>
Date: Mon, 7 Nov 2016 16:44:22 -0500
Subject: [PATCH] eclipse game files

---
 Game_Code/Resources/gameScore.txt             |   1 +
 Game_Code/Resources/tutorial.png              | Bin 0 -> 5036 bytes
 Game_Code/Resources/userData.txt              |   1 +
 Game_Code/src/Game.java                       | 156 --------
 Game_Code/src/Pong_viewAndController.java     |  49 ---
 Game_Code/src/View.java                       | 130 -------
 Game_Code/src/model/Ball.java                 |  86 +++++
 Game_Code/src/model/GameModel.java            | 103 ++++++
 Game_Code/src/model/Paddle.java               |  76 ++++
 Game_Code/src/model/Player.java               |  49 +++
 Game_Code/src/original_code/Game.java         | 155 --------
 Game_Code/src/original_code/Main.java         |  23 --
 Game_Code/src/redevelopedCode/Ball.java       |  22 --
 Game_Code/src/redevelopedCode/Players.java    |  73 ----
 .../src/redevelopedCode/Pong_controller.java  |  71 ----
 Game_Code/src/redevelopedCode/Pong_model.java |  39 --
 Game_Code/src/redevelopedCode/Pong_view.java  | 191 ----------
 Game_Code/src/startGame/GameController.java   | 346 ++++++++++++++++++
 Game_Code/src/startGame/PongGame.java         |  26 ++
 Game_Code/src/view/GameView.java              |  89 +++++
 Game_Code/src/view/Mode.java                  |  64 ++++
 Game_Code/src/view/PongGameDisplay.java       | 118 ++++++
 Game_Code/src/view/Tutorial.java              |  35 ++
 Game_Code/src/view/Welcome.java               |  83 +++++
 24 files changed, 1077 insertions(+), 909 deletions(-)
 create mode 100644 Game_Code/Resources/gameScore.txt
 create mode 100644 Game_Code/Resources/tutorial.png
 create mode 100644 Game_Code/Resources/userData.txt
 delete mode 100644 Game_Code/src/Game.java
 delete mode 100644 Game_Code/src/Pong_viewAndController.java
 delete mode 100644 Game_Code/src/View.java
 create mode 100644 Game_Code/src/model/Ball.java
 create mode 100644 Game_Code/src/model/GameModel.java
 create mode 100644 Game_Code/src/model/Paddle.java
 create mode 100644 Game_Code/src/model/Player.java
 delete mode 100644 Game_Code/src/original_code/Game.java
 delete mode 100644 Game_Code/src/original_code/Main.java
 delete mode 100644 Game_Code/src/redevelopedCode/Ball.java
 delete mode 100644 Game_Code/src/redevelopedCode/Players.java
 delete mode 100644 Game_Code/src/redevelopedCode/Pong_controller.java
 delete mode 100644 Game_Code/src/redevelopedCode/Pong_model.java
 delete mode 100644 Game_Code/src/redevelopedCode/Pong_view.java
 create mode 100644 Game_Code/src/startGame/GameController.java
 create mode 100644 Game_Code/src/startGame/PongGame.java
 create mode 100644 Game_Code/src/view/GameView.java
 create mode 100644 Game_Code/src/view/Mode.java
 create mode 100644 Game_Code/src/view/PongGameDisplay.java
 create mode 100644 Game_Code/src/view/Tutorial.java
 create mode 100644 Game_Code/src/view/Welcome.java

diff --git a/Game_Code/Resources/gameScore.txt b/Game_Code/Resources/gameScore.txt
new file mode 100644
index 0000000..b6fc4c6
--- /dev/null
+++ b/Game_Code/Resources/gameScore.txt
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/Game_Code/Resources/tutorial.png b/Game_Code/Resources/tutorial.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba47a658f7e3d8537670900cd45456cd8996d0a0
GIT binary patch
literal 5036
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

literal 0
HcmV?d00001

diff --git a/Game_Code/Resources/userData.txt b/Game_Code/Resources/userData.txt
new file mode 100644
index 0000000..b6fc4c6
--- /dev/null
+++ b/Game_Code/Resources/userData.txt
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/Game_Code/src/Game.java b/Game_Code/src/Game.java
deleted file mode 100644
index 77ea340..0000000
--- a/Game_Code/src/Game.java
+++ /dev/null
@@ -1,156 +0,0 @@
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Game extends JPanel implements KeyListener, ActionListener {
-	
-	private int height, width; 				// the height and width of the screen 
-	private Timer t = new Timer(5, this);   // the 't' variable makes sure that there is a initial delay before the same starts off
-	private boolean first; 					//game state (starting/playing)
-	
-	private HashSet<String> keys = new HashSet<String>();
-	
-	// pad
-	private final int SPEED = 1;			//the speed of the paddles
-	private int padH = 10, padW = 40;		// paddle width/height
-	private int bottomPadX, topPadX;		// these represent the top and the bottom paddles in the game
-	private int inset = 30;					// this helps determine the distance between the paddle 
-											// - and the top and bottom screen boundaries 
-	
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;		//ball position, ball velocity, ball size
-	
-	// score
-	private int scoreTop, scoreBottom;		// keep track of game record
-	
-	public Game() {
-		addKeyListener(this); 			// it helps to read the commands given through the keyboard
-		setFocusable(true);				// keylisterer knows that it needs to look for the movement through keys
-		setFocusTraversalKeysEnabled(false);	// since the argument is set to false, it moves the focus away from tab and shift keys
-		first = true;					// sets the game state to true to start playing
-		t.setInitialDelay(100);			// sets initial delay for the movement of the ball
-		t.start();						// set the delay for every movement of the ball
-	}
-	
-	@Override
-	protected void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
-		height = getHeight();				// get game frame/screen size
-		width = getWidth();
-
-		// initial positioning
-		if (first) {
-			bottomPadX = width / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
-			topPadX = bottomPadX;
-			ballX = width / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
-			ballY = height / 2 - ballSize / 2;
-			first = false;						// setup completed
-		}
-		
-		// bottom pad
-		Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH); // creating the object for bottom paddle
-		g2d.fill(bottomPad);
-		
-		// top pad
-		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
-		g2d.fill(topPad);
-		
-		// ball
-		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);  // creating the ball object for the game
-		g2d.fill(ball);
-		
-		// scores
-		String scoreB = "Bottom: " + new Integer(scoreBottom).toString(); 	// saving the score of the bottom paddle
-		String scoreT = "Top: " + new Integer(scoreTop).toString();			// saving the score of the top paddle 
-		g2d.drawString(scoreB, 10, height / 2);						// printing the score of the bottom paddle in the screen
-		g2d.drawString(scoreT, width - 50, height / 2);			// printing the score of the top paddle in the screen
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		// side walls
-		if (ballX < 0 || ballX > width - ballSize) {	// making sure ball is horizontally within the frame (left&right)
-			velX = -velX;								// reverse the ball position if trying to go out
-		}
-		// top / down walls
-		if (ballY < 0) {								// similarly, for vertical position
-			velY = -velY;								// reverse the ball position vertically 
-			++ scoreBottom;
-		}
-		
-		if (ballY + ballSize > height) {	// similarly, for the vertical position of bottom paddle
-			velY = -velY;
-			++ scoreTop;				// points are incremented if the paddle is missed by opponent
-		}
-		// bottom pad
-		if (ballY + ballSize >= height - padH - inset && velY > 0)	// similar to the previous parts
-			if (ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padW)
-				velY = -velY;
-
-		// top pad
-		if (ballY <= padH + inset && velY < 0)
-			if (ballX + ballSize >= topPadX && ballX <= topPadX + padW)
-				velY = -velY;
-
-		ballX += velX;
-		ballY += velY;
-		
-		// pressed keys
-		if (keys.size() == 1) {
-			if (keys.contains("LEFT")) {							// left key is pressed
-				bottomPadX -= (bottomPadX > 0) ? SPEED : 0;			// move the bottom paddle to the left
-			}
-			else if (keys.contains("RIGHT")) {						// right key is pressed
-				bottomPadX += (bottomPadX < width - padW) ? SPEED : 0;
-			}
-		}
-		
-		// AI
-		double delta = ballX - topPadX;
-		if (delta > 0) {											// move right if ball is to the right of the paddle
-			topPadX += (topPadX < width - padW) ? SPEED : 0;
-		}
-		else if (delta < 0) {										// move left if ball is to the left of the paddle
-			topPadX -= (topPadX > 0) ? SPEED : 0;
-		}
-		
-		repaint();
-	}
-
-	@Override
-	public void keyTyped(KeyEvent e) {}
-
-	@Override
-	public void keyPressed(KeyEvent e) {
-		int code = e.getKeyCode();				// get which key is pressed
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.add("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.add("RIGHT");
-			break;
-		}
-	}
-
-	@Override
-	public void keyReleased(KeyEvent e) {
-		int code = e.getKeyCode();				// get which key is released
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.remove("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.remove("RIGHT");
-			break;
-		}
-	}
-}
diff --git a/Game_Code/src/Pong_viewAndController.java b/Game_Code/src/Pong_viewAndController.java
deleted file mode 100644
index 5e3c128..0000000
--- a/Game_Code/src/Pong_viewAndController.java
+++ /dev/null
@@ -1,49 +0,0 @@
-import java.awt.*;
-import javax.swing.*;
-public class Pong_viewAndController extends JFrame{
-	private JButton suspend = new JButton("Suspend");
-	private JButton resume = new JButton("Resume");
-	private JButton save = new JButton("Save");
-	private JButton exit = new JButton("Exit");
-	public Pong_viewAndController(){
-		super("FaultInOurPong");
-		this.setSize(700,500);
-		this.setResizable(false);
-		
-		JPanel game_interface = new JPanel();
-		game_interface.setLayout(new BoxLayout(game_interface, BoxLayout.X_AXIS));
-		
-		JPanel buttonPanel = new JPanel();
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		suspend.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(suspend);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		resume.setMaximumSize(suspend.getPreferredSize());
-		resume.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(resume);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		save.setMaximumSize(suspend.getPreferredSize());
-		save.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(save);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		exit.setMaximumSize(suspend.getPreferredSize());
-		exit.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(exit);
-		
-		Game game = new Game();
-		
-		game_interface.add(buttonPanel);
-		game_interface.add(game);
-		add(game_interface);
-		setLocationRelativeTo(null);
-		
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setVisible(true);
-	}
-	
-	/*public static void main(String[] args){
-		Pong_viewAndController view_controller = new Pong_viewAndController();
-	}*/
-	
-}
\ No newline at end of file
diff --git a/Game_Code/src/View.java b/Game_Code/src/View.java
deleted file mode 100644
index 09812a7..0000000
--- a/Game_Code/src/View.java
+++ /dev/null
@@ -1,130 +0,0 @@
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-
-public class View extends JFrame{
-
-	private JButton start = new JButton("Start New Game");
-	private JButton load = new JButton("Load Game");
-	private JButton highScores = new JButton("High Scores");
-	private JButton tutorial = new JButton("Tutorial");
-	private JButton exit = new JButton("Exit");
-	
-	private JButton single = new JButton("Single Player Mode");
-	private JButton sObstacle = new JButton("Advanced Single Player Mode");
-	private JButton multi = new JButton("Multiplayer Mode");
-	
-	JPanel buttonPanel = new JPanel();
-	
-	public View(){
-		super("FaultInOurPong");
-		this.setSize(700,500);
-		this.setResizable(false);
-		
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(start);
-		addButton(load);
-		addButton(highScores);
-		addButton(tutorial);
-		addButton(exit);
-		buttonPanel.add(Box.createVerticalGlue());
-		
-		start.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				start();
-			}
-		});
-		
-		load.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				load();
-			}
-		});
-		
-		highScores.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				highScores();
-			}
-		});
-		
-		tutorial.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				tutorial();
-			}
-		});
-		
-		exit.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				System.exit(0);
-			}
-		});
-		
-		add(buttonPanel);
-		
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setLocationRelativeTo(null);
-		this.setVisible(true);
-	}
-	
-	public void addButton(JButton x) {
-		x.setMaximumSize(sObstacle.getPreferredSize());
-		x.setAlignmentY(CENTER_ALIGNMENT);
-		x.setAlignmentX(CENTER_ALIGNMENT);
-		buttonPanel.add(x);
-		buttonPanel.add(Box.createVerticalStrut(20));
-	}
-	
-	public void start() {
-		buttonPanel.removeAll();
-		this.getContentPane().removeAll();
-		this.repaint();
-		
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(single);
-		addButton(sObstacle);
-		buttonPanel.add(Box.createVerticalGlue());
-		
-		add(buttonPanel);
-		this.setVisible(true);
-		
-		single.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				single();
-			}
-		});
-
-	}
-	
-	public void single() {
-		Pong_viewAndController view_controller = new Pong_viewAndController();
-		this.setVisible(false);
-	}
-	
-	public void load() {
-		
-	}
-	
-	public void highScores() {
-		
-	}
-	
-	public void tutorial() {
-		
-	}
-	
-	public static void main(String[] args) {
-		View menuPage = new View();
-	}
-
-}
diff --git a/Game_Code/src/model/Ball.java b/Game_Code/src/model/Ball.java
new file mode 100644
index 0000000..b050283
--- /dev/null
+++ b/Game_Code/src/model/Ball.java
@@ -0,0 +1,86 @@
+package model;
+
+/**
+ * @file Ball.java
+ * @title Ball
+ * @author Pongthusiastics
+ * @date 4/11/2016
+ * @brief This class represents a ball on the pong game
+ * @details This class saves the information of a ball, including its position,
+ *          size and the speed.
+ */
+
+public class Ball {
+
+	/**
+	 * The X position of a ball on the screen
+	 */
+	private int positionX;
+	/**
+	 * The Y position of a ball on the screen
+	 */
+	private int positionY;
+	/**
+	 * The size of a ball
+	 */
+	private final int SIZE = 20;
+
+	// TODO
+	private int speed;
+
+	/**
+	 * @brief Constructor for Ball
+	 * @details Constructor accepts the x and y position of the ball
+	 * @param x
+	 *            is the x-position
+	 * @param y
+	 *            is the y-position
+	 */
+	public Ball(int x, int y) {
+		positionX = x;
+		positionY = y;
+	}
+
+	/**
+	 * @brief sets the x position of the ball
+	 * @param x-position
+	 *            of the ball
+	 */
+	public void setPositionX(int x) {
+		positionX = x;
+	}
+
+	/**
+	 * @brief sets the y position of the ball
+	 * @param y-position
+	 *            of the ball
+	 */
+	public void setPositionY(int y) {
+		positionY = y;
+	}
+
+	/**
+	 * @brief gets the x-position of the ball
+	 * @return positionX
+	 */
+	public int getPositionX() {
+		return positionX;
+	}
+
+	/**
+	 * @brief gets the y-position of the ball
+	 * @return positionY
+	 */
+	public int getPositionY() {
+		return positionY;
+	}
+
+	/**
+	 * @brief gets the size of the ball
+	 * @return SIZE
+	 */
+	public int getSize() {
+		return SIZE;
+	}
+
+}
diff --git a/Game_Code/src/model/GameModel.java b/Game_Code/src/model/GameModel.java
new file mode 100644
index 0000000..4378dec
--- /dev/null
+++ b/Game_Code/src/model/GameModel.java
@@ -0,0 +1,103 @@
+package model;
+
+
+/**
+ * @file GameModel.java
+ * @title GameModel
+ * @author Pongthusiastics
+ * @date 4/11/2016
+ * @brief This class represents a ball on the pong game
+ * @details This class saves the information of a ball, including its position,
+ *          size and the speed.
+ */
+public class GameModel {
+
+	/**
+	 * The ball object for the game
+	 */
+	private Ball b1;
+	/**
+	 * The two paddle in the game, one for the player and the other for the computer
+	 */
+	private Paddle p_player, p_computer;
+	/**
+	 * The two players in the game, one for the user and the other for the computer
+	 */
+	private Player player, computer;
+	
+	private int ballX, ballY;
+	private int playerX, playerY;
+	private int compX, compY;
+	
+	
+	/**
+	 * @brief Constructor for the game Model
+	 * @details Contains all the data and models for the game, including the player, paddle, and the ball.
+	 * @param ballX is the x-position of the ball
+	 * @param ballY is the y-position of the ball
+	 * @param playerX is the x-position of the user's paddle
+	 * @param playerY is the y-position of the user's paddle
+	 * @param compX is the x-position of the user's paddle
+	 * @param compY is the y-position of the user's paddle
+	 */
+	public GameModel(int ballX, int ballY, int playerX, int playerY, int compX, int compY){
+		b1 = new Ball(ballX, ballY);
+		p_player = new Paddle(playerX, playerY);
+		p_computer = new Paddle(compX, compY);
+		
+		//TODO
+		player = new Player();
+		computer = new Player();
+	}
+	
+	/**
+	 * @brief sets the x and y positions of a ball
+	 * @param x is the x position of the ball
+	 * @param y is the y position of the ball
+	 */
+	public void setBall(int x, int y){
+		b1.setPositionX(x);
+		b1.setPositionY(y);
+	}
+	
+	
+	/**
+	 * @brief gets the Ball object
+	 * @return b1
+	 */
+	public Ball getBall(){
+		return b1;
+	}
+	
+	/**
+	 * @brief gets the user paddle object
+	 * @return p_player
+	 */
+	public Paddle getPlayerPaddle(){
+		return p_player;
+	}
+	
+	/**
+	 * @brief gets the computer paddle object
+	 * @return p_computer
+	 */
+	public Paddle getComputerPaddle(){
+		return p_computer;
+	}
+	
+	/**
+	 * @brief gets the player object
+	 * @return player
+	 */
+	public Player getPlayer(){
+		return player;
+	}
+	
+	/**
+	 * @brief gets the computer object
+	 * @return computer
+	 */
+	public Player getComputer(){
+		return computer;
+	}
+}
diff --git a/Game_Code/src/model/Paddle.java b/Game_Code/src/model/Paddle.java
new file mode 100644
index 0000000..660017a
--- /dev/null
+++ b/Game_Code/src/model/Paddle.java
@@ -0,0 +1,76 @@
+package model;
+
+public class Paddle {
+
+	private int positionX;
+	private int positionY;
+	
+	private final int HEIGHT = 10;
+	private final int WIDTH = 40;
+	private final int INSET = 10;
+	
+	//TODO 
+	private int speed;
+	
+	
+	public Paddle(int x, int y){
+		positionX = x;
+		positionY = y;
+	}
+	
+	/**
+	 * @brief sets the x-position of the paddle
+	 * @param x is the x position of the paddle
+	 */
+	public void setPositionX(int x){
+		positionX = x;
+	}
+	
+	/**
+	 * @brief sets the y-position of the paddle
+	 * @param y is the y position of the paddle
+	 */
+	public void setPositionY(int y){
+		positionY = y;
+	}
+
+	/**
+	 * @brief returns the x position of the paddle
+	 * @return positionX
+	 */
+	public int getPositionX(){
+		return positionX;
+	}
+	
+	/**
+	 * @brief returns the y position of the paddle
+	 * @return positionY
+	 */
+	public int getPositionY(){
+		return positionY;
+	}
+	
+	/**
+	 * @brief returns the width of the paddle
+	 * @return WIDTH
+	 */
+	public int getWidth(){
+		return WIDTH;
+	}
+	
+	/**
+	 * @brief returns the height of the paddle
+	 * @return HEIGHT
+	 */
+	public int getHeight(){
+		return HEIGHT;
+	}
+	
+	/**
+	 * @brief returns the inset between the paddle and the screen
+	 * @return INSET
+	 */
+	public int getInset(){
+		return INSET;
+	}
+}
diff --git a/Game_Code/src/model/Player.java b/Game_Code/src/model/Player.java
new file mode 100644
index 0000000..7c79bc8
--- /dev/null
+++ b/Game_Code/src/model/Player.java
@@ -0,0 +1,49 @@
+package model;
+
+public class Player {
+
+	// Constant declaration for number of life
+	private final int LIFE = 3;
+	private final int NOLIFE = 0;
+	
+	// Variable declaration for storing the player score
+	private int score;
+	
+
+	public Player(){
+		score = LIFE;
+		//TODO: POSITION X, POSITION Y
+		
+	}
+	
+	/**
+	 *  @brief decreases number of life of the player
+	 */
+	public void decrementLife(){
+		score--;
+	}
+	
+	/**
+	 *  @brief increases score for a player
+	 */
+	public void incrementScore(){
+		score++;
+	}
+	
+	/**
+	 * @brief gets the score of a player
+	 * @return playerScore - return the score of the player 
+	 */
+	public int getScore(){
+		return score;
+	}
+	
+	/**
+	 * @brief checks whether the player loses the game or not
+	 * @return - boolean indicating losing or not
+	 */
+	public boolean checkLoss(){
+		if(score==NOLIFE){ return true;}
+		else{ return false; }
+	}
+}
diff --git a/Game_Code/src/original_code/Game.java b/Game_Code/src/original_code/Game.java
deleted file mode 100644
index cc3b5b6..0000000
--- a/Game_Code/src/original_code/Game.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package original_code;
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Game extends JPanel implements KeyListener, ActionListener {
-	
-	private int height, width;
-	private Timer t = new Timer(5, this);
-	private boolean first;
-	
-	private HashSet<String> keys = new HashSet<String>();
-	
-	// pad
-	private final int SPEED = 1;
-	private int padH = 10, padW = 40;
-	private int bottomPadX, topPadX;
-	private int inset = 10;
-	
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;
-	
-	// score
-	private int scoreTop, scoreBottom;
-	
-	public Game() {
-		addKeyListener(this);
-		setFocusable(true);
-		setFocusTraversalKeysEnabled(false);
-		first = true;
-		t.setInitialDelay(100);
-		t.start();
-	}
-	
-	@Override
-	protected void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;
-		height = getHeight();
-		width = getWidth();
-
-		// initial positioning
-		if (first) {
-			bottomPadX = width / 2 - padW / 2;
-			topPadX = bottomPadX;
-			ballX = width / 2 - ballSize / 2;
-			ballY = height / 2 - ballSize / 2;
-			first = false;
-		}
-		
-		// bottom pad
-		Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH);
-		g2d.fill(bottomPad);
-		
-		// top pad
-		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH);
-		g2d.fill(topPad);
-		
-		// ball
-		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);
-		g2d.fill(ball);
-		
-		// scores
-		String scoreB = "Bottom: " + new Integer(scoreBottom).toString();
-		String scoreT = "Top: " + new Integer(scoreTop).toString();
-		g2d.drawString(scoreB, 10, height / 2);
-		g2d.drawString(scoreT, width - 50, height / 2);
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		// side walls
-		if (ballX < 0 || ballX > width - ballSize) {
-			velX = -velX;
-		}
-		// top / down walls
-		if (ballY < 0) {
-			velY = -velY;
-			++ scoreBottom;
-		}
-		
-		if (ballY + ballSize > height) {
-			velY = -velY;
-			++ scoreTop;
-		}
-		// bottom pad
-		if (ballY + ballSize >= height - padH - inset && velY > 0)
-			if (ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padW)
-				velY = -velY;
-
-		// top pad
-		if (ballY <= padH + inset && velY < 0)
-			if (ballX + ballSize >= topPadX && ballX <= topPadX + padW)
-				velY = -velY;
-
-		ballX += velX;
-		ballY += velY;
-		
-		// pressed keys
-		if (keys.size() == 1) {
-			if (keys.contains("LEFT")) {
-				bottomPadX -= (bottomPadX > 0) ? SPEED : 0;
-			}
-			else if (keys.contains("RIGHT")) {
-				bottomPadX += (bottomPadX < width - padW) ? SPEED : 0;
-			}
-		}
-		
-		// AI
-		double delta = ballX - topPadX;
-		if (delta > 0) {
-			topPadX += (topPadX < width - padW) ? SPEED : 0;
-		}
-		else if (delta < 0) {
-			topPadX -= (topPadX > 0) ? SPEED : 0;
-		}
-		
-		repaint();
-	}
-
-	@Override
-	public void keyTyped(KeyEvent e) {}
-
-	@Override
-	public void keyPressed(KeyEvent e) {
-		int code = e.getKeyCode();
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.add("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.add("RIGHT");
-			break;
-		}
-	}
-
-	@Override
-	public void keyReleased(KeyEvent e) {
-		int code = e.getKeyCode();
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.remove("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.remove("RIGHT");
-			break;
-		}
-	}
-}
diff --git a/Game_Code/src/original_code/Main.java b/Game_Code/src/original_code/Main.java
deleted file mode 100644
index 5b5ea9c..0000000
--- a/Game_Code/src/original_code/Main.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package original_code;
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-
-public class Main {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		JFrame frm = new JFrame();
-		frm.setTitle("Pong");
-		Game g = new Game();
-		frm.setContentPane(g);
-		frm.setSize(300, 700);
-		frm.setResizable(false);
-		frm.setVisible(true);
-		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	}
-
-}
diff --git a/Game_Code/src/redevelopedCode/Ball.java b/Game_Code/src/redevelopedCode/Ball.java
deleted file mode 100644
index df8598b..0000000
--- a/Game_Code/src/redevelopedCode/Ball.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package redevelopedCode;
-
-public class Ball {
-	
-	private int positionX;
-	private int positionY;
-	
-	public Ball(int x, int y){
-		positionX = x;
-		positionY = y;
-	}
-	
-	public void setPosition(int x, int y){
-		positionX = x;
-		positionY = y;
-	}
-
-	public int[] getPosition(){
-		int[] temp = {positionX,positionY};
-		return temp;
-	}
-}
diff --git a/Game_Code/src/redevelopedCode/Players.java b/Game_Code/src/redevelopedCode/Players.java
deleted file mode 100644
index ab31458..0000000
--- a/Game_Code/src/redevelopedCode/Players.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package redevelopedCode;
-
-public class Players {
-
-	// Constant declaration for number of life
-	private final int LIFE = 3;
-	private final int NOLIFE = 0;
-	
-	// Variable declaration that store the player score
-	private int playerScore;
-	private int paddlePositionX;
-	private int paddlePositionY;
-	
-	/**
-	 *  Constructor for the player - set the score to be 0 initially
-	 */
-	public Players(){
-		playerScore = LIFE;
-		//TODO: POSITION X, POSITION Y
-		
-	}
-	
-	/**
-	 *  Decrease number of life of the player
-	 */
-	public void decrementLife(){
-		playerScore--;
-	}
-	
-	/**
-	 *  Increase score for a player
-	 */
-	public void incrementScore(){
-		playerScore++;
-	}
-	
-	/**
-	 * Get the score of a player
-	 * @return playerScore - return the score of the player 
-	 */
-	public int getScore(){
-		return playerScore;
-	}
-	
-	/**
-	 * Save the paddle positions
-	 * @param x - horizontal position of the paddle
-	 * @param y - vertical position of the paddle
-	 */
-	public void setPosition(int x, int y){
-		paddlePositionX = x;
-		paddlePositionY = y;
-	}
-	
-	/**
-	 * Get the paddle positions
-	 * @return - horizontal and vertical positions in an array
-	 */
-	public int[] getPosition(){
-		int[] temp = {paddlePositionX,paddlePositionY};
-		return temp;
-	}
-	
-	/**
-	 * Check whether the player loses the game or not
-	 * @return - boolean indicating losing or not
-	 */
-	public boolean checkLoss(){
-		if(playerScore==NOLIFE){ return true;}
-		else{ return false; }
-	}
-	
-}
diff --git a/Game_Code/src/redevelopedCode/Pong_controller.java b/Game_Code/src/redevelopedCode/Pong_controller.java
deleted file mode 100644
index 3d9d2de..0000000
--- a/Game_Code/src/redevelopedCode/Pong_controller.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package redevelopedCode;
-
-import java.io.*;
-
-public class Pong_controller {
-
-	public Pong_model model;
-	public static Pong_view viewer;
-	
-	public Pong_controller(){
-		model = new Pong_model();
-		
-	}
-	
-	public static void main(String[] args){
-		Pong_controller controller = new Pong_controller();
-		viewer = new Pong_view(controller);
-	}
-	
-	
-	public void loadGame(){
-		
-		try{
-		FileReader fr = new FileReader("savedScore.txt");
-		BufferedReader br = new BufferedReader(fr);
-		
-		int score1 = Integer.parseInt(br.readLine());
-		int score2 = Integer.parseInt(br.readLine());
-		
-		
-		
-		// TODO
-		
-		br.close();
-		} catch(Exception e){
-			e.printStackTrace();
-		}
-		
-	}
-
-	public void saveGame(){
-		
-		try{
-			FileWriter fw = new FileWriter("savedScore.txt");
-			BufferedWriter bw = new BufferedWriter(fw);
-			
-			bw.write(model.player1.getScore());
-			bw.write(model.player2.getScore());
-			
-			// TODO
-			
-			bw.close();
-			} catch(Exception e){
-				e.printStackTrace();
-			}
-		
-	}
-	
-	public int gameOver(){
-		if(model.player1.getScore()==0){
-			return 1;
-		}
-		else if(model.player2.getScore()==0){
-			return 2;
-		}
-		else{
-			return -1;
-		}
-	}
-	
-}
diff --git a/Game_Code/src/redevelopedCode/Pong_model.java b/Game_Code/src/redevelopedCode/Pong_model.java
deleted file mode 100644
index 0455df8..0000000
--- a/Game_Code/src/redevelopedCode/Pong_model.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package redevelopedCode;
-
-public class Pong_model{
-	
-
-	
-	private int score1;
-	private int score2;
-	public Players player1;
-	public Players player2;
-	
-	public Pong_model(){
-		
-		player1 = new Players();
-		player2 = new Players();
-		score1 = player1.getScore();
-		score2 = player2.getScore();
-		
-	}
-	
-	public void changeSpeed(int newSpeed){
-		
-	}
-
-	public String readTutorial(){
-		String content = "";
-		
-		return content;
-	}
-
-	public boolean createObstacle(boolean gameMode){
-		if(gameMode==true){ return true;}
-		else{ return false; }
-	}
-
-
-	
-	
-}
\ No newline at end of file
diff --git a/Game_Code/src/redevelopedCode/Pong_view.java b/Game_Code/src/redevelopedCode/Pong_view.java
deleted file mode 100644
index 55d73ed..0000000
--- a/Game_Code/src/redevelopedCode/Pong_view.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package redevelopedCode;
-
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Pong_view extends JFrame{
-
-	private Pong_controller controller;
-	private JButton start = new JButton("Start New Game");
-	private JButton load = new JButton("Load Game");
-	private JButton highScores = new JButton("High Scores");
-	private JButton tutorial = new JButton("Tutorial");
-	private JButton exit = new JButton("Exit");
-	private JButton single = new JButton("Single Player Mode");
-	private JButton sObstacle = new JButton("Advanced Single Player Mode");
-	private JButton multi = new JButton("Multiplayer Mode");
-
-	private JPanel buttonPanel = new JPanel();
-
-	public Pong_view(Pong_controller c){
-		super("FaultInOurPong");
-		controller = c;
-		initializeFrame();
-	}
-
-	private void initializeFrame(){
-
-		this.setSize(700,500);
-		this.setResizable(false);
-
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(start);
-		addButton(load);
-		addButton(highScores);
-		addButton(tutorial);
-		addButton(exit);
-		buttonPanel.add(Box.createVerticalGlue());
-
-		start.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				start();
-			}
-		});
-
-		load.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//load();
-
-			}
-		});
-
-		highScores.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//highScores();
-			}
-		});
-
-		tutorial.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//tutorial();
-			}
-		});
-
-		exit.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				System.exit(0);
-			}
-		});
-
-		add(buttonPanel);
-
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setLocationRelativeTo(null);
-		this.setVisible(true);
-	}
-
-	public void addButton(JButton x) {
-		x.setMaximumSize(sObstacle.getPreferredSize());
-		x.setAlignmentY(CENTER_ALIGNMENT);
-		x.setAlignmentX(CENTER_ALIGNMENT);
-		buttonPanel.add(x);
-		buttonPanel.add(Box.createVerticalStrut(20));
-	}
-
-	public void start() {
-		buttonPanel.removeAll();
-		this.getContentPane().removeAll();
-		this.repaint();
-
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(single);
-		addButton(sObstacle);
-		buttonPanel.add(Box.createVerticalGlue());
-
-		add(buttonPanel);
-		this.setVisible(true);
-
-		single.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				single();
-			}
-		});
-
-	}
-
-
-	private int height, width; 				// the height and width of the screen 
-	//private Timer t = new Timer(1, this);   // the 't' variable makes sure that there is a initial delay before the same starts off
-	private boolean first=true; 					//game state (starting/playing)
-	private HashSet<String> keys = new HashSet<String>();
-	// pad
-	private final int SPEED = 1;			//the speed of the paddles
-	private int padH = 10, padW = 40;		// paddle width/height
-	private int bottomPadX, topPadX;		// these represent the top and the bottom paddles in the game
-	private int inset = 10;					// this helps determine the distance between the paddle 
-	// - and the top and bottom screen boundaries 
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;		//ball position, ball velocity, ball size
-	// score
-	private int scoreTop, scoreBottom;		// keep track of game record
-
-	public void single(){
-		buttonPanel.removeAll();
-		this.remove(buttonPanel);
-
-		JPanel game_panel = new JPanel(){
-			protected void paintComponent(Graphics g) {
-				super.paintComponent(g);
-				Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
-				
-				height = getHeight();				// get game frame/screen size
-				width = getWidth();
-
-				// initial positioning
-				if (first) {
-					bottomPadX = width / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
-					topPadX = bottomPadX;
-					ballX = width / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
-					ballY = height / 2 - ballSize / 2;
-					first = false;						// setup completed
-				}
-
-				// bottom pad
-				Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH); // creating the object for bottom paddle
-				g2d.fill(bottomPad);
-
-				// top pad
-				Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
-				g2d.fill(topPad);
-
-				// ball
-				Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);  // creating the ball object for the game
-				g2d.fill(ball);
-
-				// scores
-				String scoreB = "Bottom: " + new Integer(scoreBottom).toString(); 	// saving the score of the bottom paddle
-				String scoreT = "Top: " + new Integer(scoreTop).toString();			// saving the score of the top paddle 
-				g2d.drawString(scoreB, 10, height / 2);						// printing the score of the bottom paddle in the screen
-				g2d.drawString(scoreT, width - 50, height / 2);			// printing the score of the top paddle in the screen
-			
-			
-			}
-		};
-
-		this.add(game_panel);
-		this.revalidate();
-		this.repaint();
-		
-		
-	}
-
-
-
-}
diff --git a/Game_Code/src/startGame/GameController.java b/Game_Code/src/startGame/GameController.java
new file mode 100644
index 0000000..44c4eaf
--- /dev/null
+++ b/Game_Code/src/startGame/GameController.java
@@ -0,0 +1,346 @@
+package startGame;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.HashSet;
+
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+import javax.swing.Timer;
+
+import model.*;
+import view.*;
+
+public class GameController{
+	
+	private GameView v;
+	private GameModel m;
+	private Welcome w;
+	private Mode mode;
+	private Tutorial tut;
+	
+	private HashSet<String> keys = new HashSet<String>();
+
+	private JFrame gameFrame;
+	private int frameWidth, frameHeight;
+	private PongGameDisplay gameDisplay;
+	
+	private int velX=1, velY=1;
+	private int padWidth = 80, padHeight = 10;
+	private int bottomPadX, bottomPadY, topPadX, topPadY;
+	private int ballX, ballY, ballSize=20;
+	private int scoreTop, scoreBottom;
+	private int inset;
+
+	private Timer t;
+	
+	public GameController(GameView v, GameModel m){
+		this.v = v;
+		this.m = m;
+		
+		/*
+		 * Setups for the View
+		 */
+		w = this.v.getWelcome();
+		w.addListener(new WelcomepageListener());
+		
+		mode = this.v.getmode();
+		mode.addListener(new ModeListener());
+		
+		ImageIcon image = new ImageIcon("./Resources/tutorial.png");
+		v.tutorialPage(image);
+		tut = v.getTutorial();
+		tut.addListener(new TutorialListener());
+		
+		gameFrame = this.v.getGameFrame();
+		gameDisplay = this.v.getGame();
+		gameDisplay.addKeyListener(new GameListener());
+		gameDisplay.setFocusable(true);
+		gameDisplay.setFocusTraversalKeysEnabled(false);
+		
+		/*
+		 * Setups for the Model
+		 */
+		frameWidth = v.getFrameWidth();
+		frameHeight = v.getFrameHeight();
+		
+		
+		
+		
+	}
+	
+	/*
+	 * Actionlistener for the welcome page
+	 */
+	class WelcomepageListener implements ActionListener{
+
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			// If clicked the start button
+			if(source==w.getStart()){
+				mode.setVisible(true);
+				w.setVisible(false);
+				
+			}else if(source==w.load()){
+			// If clicked the load button
+				//TODO
+				try{
+					FileReader fr = new FileReader("./Resources/userData.txt");
+					BufferedReader br = new BufferedReader(fr);
+					
+					System.out.println("can load data");
+					
+					br.close();
+				}catch(Exception exp){
+					v.cannotLoadMessage();
+				}
+			}else if(source==w.highScores()){
+			// If clicked the high score button
+				//TODO
+				try{
+					FileReader fr = new FileReader("./Resources/gameScore.txt");
+					BufferedReader br = new BufferedReader(fr);
+					
+					System.out.println("can display high score");
+					
+					br.close();
+				}catch(Exception exp){
+					v.noFileAvailMessage();
+				}
+			}else if(source==w.tutorial()){
+			// If clicked the tutorial button
+				//TODO
+				
+				w.setVisible(false);
+				tut.setVisible(true);
+				
+			}else if(source==w.exit()){
+			// If clicked the exit button
+				System.exit(0);
+			}
+			
+		}
+		
+	}
+	
+	/*
+	 * Actionlistener for the Single-Mode page
+	 */
+	class ModeListener implements ActionListener{
+		
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			if(source == mode.getSingle()){
+			// If clicked the basic single mode button
+				mode.setVisible(false);
+				gameFrame.setVisible(true);
+				t.start();
+				
+			} 
+		}
+	}
+	
+	/*
+	 * Actionlistener for the tutorial page
+	 */
+	class TutorialListener implements ActionListener{
+
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			if(source == tut.getBack()){
+			// If clicked the back button
+				tut.setVisible(false);
+				w.setVisible(true);
+			}
+		}
+		
+	}
+	
+	class GameListener implements ActionListener, KeyListener{
+
+		GameListener(){
+			
+			
+			ballX = gameDisplay.getBallX();
+			ballY = gameDisplay.getBallY();
+			
+			t = new Timer(5,this);  
+			t.setInitialDelay(1000);			// sets initial delay for the movement of the ball
+
+			bottomPadX = gameDisplay.getBottomX();
+			bottomPadY = gameDisplay.getBottomY();
+
+			//TODO: MODEL FOR THE PADDLE
+
+		}
+		
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			
+			// X-direction
+			if(ballX< 0 || ballX > frameWidth-1.5*ballSize){
+				/*
+				 * If the ball is trying to go beyond the left/right border of the frame, 
+				 * reverse the direction.
+				 */
+				velX = -velX;			
+			}
+			
+			// Y-direction
+			if(ballY < 0){
+				/*
+				 * If the ball is trying to go up above the frame, 
+				 * - reverse the direction
+				 * - user gets points because the ball hits the border of the computer side
+				 */
+				velY = -velY;
+				++scoreBottom;
+				gameDisplay.setBottomScore(scoreBottom);
+			} else if(ballY+2.5*ballSize>frameHeight){
+				/*
+				 * If the ball is trying to go down beyond the frame
+				 * - reverse the direction
+				 * - the computer gets points
+				 */
+				velY = -velY;
+				++scoreTop;
+				gameDisplay.setTopScore(scoreTop);
+			} else if(ballY+2.5*ballSize>frameHeight-inset-2*padHeight && velY > 0 && ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padWidth){
+				/*
+				 * If the ball is touching the bottom paddle
+				 * - reverse the direction
+				 */
+				velY = -velY;
+			} else if(ballY<=inset+2*padHeight && velY < 0 && ballX + ballSize >= topPadX && ballX <= topPadX + padWidth){
+				/*
+				 * If the ball is touching the top paddle
+				 * - reverse the direction
+				 */
+				velY = -velY;
+			}
+			
+			/*
+			 * Update the ball position by velocity 
+			 */
+			ballX += velX;
+			ballY += velY;
+			
+			gameDisplay.setBall(ballX,ballY);
+			
+			/*
+			 * Detect the key pressed by the user on the keyboard
+			 */
+			if (keys.size() == 1) {
+				if (keys.contains("LEFT")) {						
+					/*
+					 * If the user presses LEFT
+					 * - update the position of the user paddle
+					 * - display the change on the screen
+					 */
+					if(bottomPadX>0) {
+						//TODO: SPEED
+						bottomPadX-=3;
+						gameDisplay.setBottom(bottomPadX);
+					}
+				}
+				else if (keys.contains("RIGHT")) {	
+					if(bottomPadX < frameWidth - padWidth){
+						/*
+						 * If the user presses RIGHT
+						 * - update the position of the user paddle
+						 * - display the change on the screen
+						 */
+						//TODO: SPEED
+						bottomPadX+=3;
+						gameDisplay.setBottom(bottomPadX);
+					} 
+				}
+			}
+			
+			/*
+			 * Create actions for the AI paddles
+			 */
+			double delta = ballX - topPadX;
+			if (delta > 0) {		
+				
+				if(topPadX < frameWidth - padWidth){
+					/*
+					 * If the AI paddle is trying to reach the right wall
+					 * - move the paddle to the right
+					 * - display the movement on the screen
+					 */
+					topPadX +=1;
+					gameDisplay.setTop(topPadX);
+				}
+			}
+			else if (delta < 0) {			
+				
+				if(topPadX>0){
+					/*
+					 * If the AI paddle is trying to reach the left wall
+					 * - move the paddle to the left
+					 * - display the movement on the screen
+					 */
+					topPadX -=1;
+					gameDisplay.setTop(topPadX);
+				}
+			}
+		
+			gameDisplay.repaint();
+		}
+
+		@Override
+		public void keyPressed(KeyEvent e) {
+
+			// TODO Auto-generated method stub
+			int code = e.getKeyCode();				// get which key is pressed
+			switch (code) {
+			case KeyEvent.VK_LEFT:
+				keys.add("LEFT");
+				break;
+				
+			case KeyEvent.VK_RIGHT:
+				keys.add("RIGHT");
+				break;
+			}
+		}
+
+		@Override
+		public void keyReleased(KeyEvent e) {
+
+			// TODO Auto-generated method stub
+			int code = e.getKeyCode();				// get which key is released
+			switch (code) {
+			case KeyEvent.VK_LEFT:
+				keys.remove("LEFT");
+				break;
+			case KeyEvent.VK_RIGHT:
+				keys.remove("RIGHT");
+				break;
+			}
+		}
+
+		@Override
+		public void keyTyped(KeyEvent e) {}
+		
+	}
+	
+	
+	public void display(){
+		v.display();
+	}
+	
+}
diff --git a/Game_Code/src/startGame/PongGame.java b/Game_Code/src/startGame/PongGame.java
new file mode 100644
index 0000000..84f064f
--- /dev/null
+++ b/Game_Code/src/startGame/PongGame.java
@@ -0,0 +1,26 @@
+package startGame;
+import model.*;
+import view.*;
+
+public class PongGame {
+
+	public PongGame(){
+		
+		
+	}	
+	public static void main(String[] args){
+	
+		/*
+		 * Initialize the model, view, and controller for the game
+		 */
+		GameView view = new GameView();
+		GameModel model = new GameModel(1,1,2,2,2,2);
+		GameController controller = new GameController(view, model);
+		
+		/*
+		 * Invoke the game display from the controller
+		 */
+		controller.display();
+
+	}
+}
diff --git a/Game_Code/src/view/GameView.java b/Game_Code/src/view/GameView.java
new file mode 100644
index 0000000..dc84e01
--- /dev/null
+++ b/Game_Code/src/view/GameView.java
@@ -0,0 +1,89 @@
+package view;
+
+import javax.swing.*;
+
+public class GameView{
+	
+	private Welcome welcome;
+	private Mode mode;
+	private PongGameDisplay ponggame;
+	private Tutorial tutorial;
+	
+	private final int FRAMEWIDTH = 700;
+	private final int FRAMEHEIGHT = 500;
+	
+	private JFrame gameFrame;
+	
+	
+	public GameView(){
+		/*
+		 * Pass in different windows to this view interface
+		 * - will wait for further invocation
+		 */
+		welcome = new Welcome();
+		mode = new Mode();
+		ponggame = new PongGameDisplay();
+		
+		createGame();
+	}
+	
+	public void display(){
+		welcome.setVisible(true);
+	}
+	
+	
+	public Welcome getWelcome(){
+		return welcome;
+	}
+	
+	public Mode getmode(){
+		return mode;
+	}
+	
+	public PongGameDisplay getGame(){
+		return ponggame;
+	}
+	
+	public Tutorial getTutorial(){
+		return tutorial;
+	}
+	
+	
+	//TODO: ADD PANEL FOR OPTIONS IN THE GAME	
+	public void createGame(){
+		gameFrame = new JFrame("FaultInOurPong");
+		gameFrame.setContentPane(ponggame);	
+		gameFrame.setSize(FRAMEWIDTH,FRAMEHEIGHT);
+		gameFrame.setResizable(false);
+		gameFrame.setLocationRelativeTo(null);
+		gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	}
+	
+	public JFrame getGameFrame(){
+		return gameFrame;
+	}
+	
+	// TODO: display a dialogue after successfully saving game records (high score)
+	
+	public void noFileAvailMessage(){
+		JFrame errorFrame = new JFrame("Error");
+		JOptionPane.showMessageDialog(errorFrame, "No record available!");
+	}
+	
+	public void cannotLoadMessage(){
+		JFrame errorFrame = new JFrame("Error");
+		JOptionPane.showMessageDialog(errorFrame, "The record is either damaged or not available, please start a new game!");
+	}
+	
+	public void tutorialPage(ImageIcon img){
+		tutorial = new Tutorial(img);
+	}
+	
+	public int getFrameWidth(){
+		return FRAMEWIDTH;
+	}
+	
+	public int getFrameHeight(){
+		return FRAMEHEIGHT;
+	}
+}
\ No newline at end of file
diff --git a/Game_Code/src/view/Mode.java b/Game_Code/src/view/Mode.java
new file mode 100644
index 0000000..45bf202
--- /dev/null
+++ b/Game_Code/src/view/Mode.java
@@ -0,0 +1,64 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import model.*;
+import view.*;
+
+public class Mode extends JFrame{
+
+	private JButton single = new JButton("Single Player Mode");
+	private JButton sObstacle = new JButton("Advanced Single Player Mode");
+	
+	private JPanel buttonPanel;
+	
+	public Mode(){
+		/*
+		 * - Set the header of the window
+		 * - Set the size of the window
+		 */
+		super("FaultInOurPong");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		 
+		/*
+		 * Add buttons on the window 
+		 */
+		buttonPanel = new JPanel();
+		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
+		
+		buttonPanel.add(Box.createVerticalGlue());
+		addButton(single);
+		addButton(sObstacle);
+		buttonPanel.add(Box.createVerticalGlue());
+
+
+		add(buttonPanel);
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+	}
+	
+	public void addButton(JButton x) {
+		x.setMaximumSize(sObstacle.getPreferredSize());
+		x.setAlignmentY(CENTER_ALIGNMENT);
+		x.setAlignmentX(CENTER_ALIGNMENT);
+		buttonPanel.add(x);
+		buttonPanel.add(Box.createVerticalStrut(20));
+	}
+	
+	public void addListener(ActionListener buttonListener){
+		single.addActionListener(buttonListener);
+		sObstacle.addActionListener(buttonListener);
+	}
+	
+	public JButton getSingle(){
+		return single;
+	}
+	
+}
diff --git a/Game_Code/src/view/PongGameDisplay.java b/Game_Code/src/view/PongGameDisplay.java
new file mode 100644
index 0000000..0711c49
--- /dev/null
+++ b/Game_Code/src/view/PongGameDisplay.java
@@ -0,0 +1,118 @@
+package view;
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyListener;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.Timer;
+
+public class PongGameDisplay extends JPanel{
+
+	//private JFrame gameFrame;
+	private int frameWidth;
+	private int frameHeight;
+	
+	private int scoreTop, scoreBottom;
+	
+	private int ballX, ballY;
+	private int bottomPadX, bottomPadY;
+	private int topPadX, topPadY;
+	private boolean first;
+	private int ballSize;
+	private int padW, padH;
+	private int inset;
+	
+
+	
+	public PongGameDisplay(){
+		first = true;
+		ballSize = 20;
+		padW = 80;
+		padH = 10;
+		inset = 10;
+		
+		scoreTop=0;
+		scoreBottom=0;
+		
+	
+		
+	}
+	
+	@Override
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(g);
+		Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
+		frameHeight = getHeight();				// get game frame/screen size
+		frameWidth = getWidth();
+
+		// initial positioning
+		if (first) {
+			bottomPadX = frameWidth / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
+			topPadX = bottomPadX;
+			ballX = frameWidth / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
+			ballY = frameHeight / 2 - ballSize / 2;
+			first = false;						// setup completed
+		}
+		
+		// bottom pad
+		Rectangle2D bottomPad = new Rectangle(bottomPadX, frameHeight - padH - inset, padW, padH); // creating the object for bottom paddle
+		g2d.fill(bottomPad);
+		
+		// top pad
+		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
+		g2d.fill(topPad);
+		
+		// ball
+		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, 20, 20);  // creating the ball object for the game
+		g2d.fill(ball);
+		
+		// scores
+		String scoreB = "Bottom: " + scoreBottom; 	// saving the score of the bottom paddle
+		String scoreT = "Top: " + scoreTop;			// saving the score of the top paddle 
+		g2d.drawString(scoreB, 10, frameHeight / 2);						// printing the score of the bottom paddle in the screen
+		g2d.drawString(scoreT, frameWidth - 50, frameHeight / 2);			// printing the score of the top paddle in the screen
+	}
+		
+	public void setBall(int x, int y){
+		ballX = x;
+		ballY = y;
+	}
+	
+	public void setBottom(int x){
+		bottomPadX = x;
+	}
+	
+	public void setTop(int x){
+		topPadX = x;
+	}
+	
+	public int getBottomX(){
+		return bottomPadX;
+	}
+	
+	public int getBottomY(){
+		return bottomPadY;
+	}
+	
+	public void setTopScore(int s){
+		scoreTop=s;
+	}
+	
+	public void setBottomScore(int s){
+		scoreBottom = s;
+	}
+	
+	public int getBallX(){
+		return ballX;
+	}
+	
+	public int getBallY(){
+		return ballY;
+	}
+}
diff --git a/Game_Code/src/view/Tutorial.java b/Game_Code/src/view/Tutorial.java
new file mode 100644
index 0000000..1712434
--- /dev/null
+++ b/Game_Code/src/view/Tutorial.java
@@ -0,0 +1,35 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+
+public class Tutorial extends JFrame{
+
+	private JButton back;
+	
+	public Tutorial(ImageIcon img){
+		super("FaultInOurPong - Tutorial");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		
+		this.add(new JLabel(img));
+		
+		back = new JButton("Back");
+		//this.add(back);
+		
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+	}
+	
+	public JButton getBack(){
+		return back;
+	}
+	
+	public void addListener(ActionListener listener){
+		back.addActionListener(listener);
+	}
+}
diff --git a/Game_Code/src/view/Welcome.java b/Game_Code/src/view/Welcome.java
new file mode 100644
index 0000000..76a1cbe
--- /dev/null
+++ b/Game_Code/src/view/Welcome.java
@@ -0,0 +1,83 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.*;
+
+public class Welcome extends JFrame {
+
+	private JButton start = new JButton("Start New Game");
+	private JButton load = new JButton("Load Game");
+	private JButton highScores = new JButton("High Scores");
+	private JButton tutorial = new JButton("Tutorial");
+	private JButton exit = new JButton("Exit");
+	
+	private JPanel buttonPanel;
+	
+	public Welcome(){
+		
+		/*
+		 * - Set the header of the window
+		 * - Set the size of the window
+		 */
+		super("FaultInOurPong");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		
+		/*
+		 * Add buttons on the window 
+		 */
+		buttonPanel = new JPanel();
+		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
+		
+		buttonPanel.add(Box.createVerticalGlue());
+		addButton(start);
+		addButton(load);
+		addButton(highScores);
+		addButton(tutorial);
+		addButton(exit);
+		buttonPanel.add(Box.createVerticalGlue());
+
+
+		add(buttonPanel);
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+		
+	}
+	
+	public JButton getStart(){
+		return start;
+	}
+	
+	public JButton load(){
+		return load;
+	}
+	
+	public JButton highScores(){
+		return highScores;
+	}
+	
+	public JButton tutorial(){
+		return tutorial;
+	}
+	
+	public JButton exit(){
+		return exit;
+	}
+	
+	public void addButton(JButton x) {
+		x.setMaximumSize(start.getPreferredSize());
+		x.setAlignmentY(CENTER_ALIGNMENT);
+		x.setAlignmentX(CENTER_ALIGNMENT);
+		buttonPanel.add(x);
+		buttonPanel.add(Box.createVerticalStrut(20));
+	}
+	
+	public void addListener(ActionListener buttonListener){
+		start.addActionListener(buttonListener);
+		load.addActionListener(buttonListener);
+		highScores.addActionListener(buttonListener);
+		tutorial.addActionListener(buttonListener);
+		exit.addActionListener(buttonListener);
+	}
+}
-- 
GitLab