Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )
-
Upload
rashidul-islam -
Category
Technology
-
view
204 -
download
0
description
Transcript of Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )
Rashidul Islam
12/1/2013
Rashidul Islam
No Description Page
Task 1
a)
The application that I produce
1
Task 2
a)
Screen shots
25
Task 3
a) Class diagrams
30
Rashidul Islam
Task 1:
The application that I have created: a) Class - SuitableLocation.java:
---------------------------------------------------------------------------
Rashidul Islam
1.) Documentation:
Constructor Summary SuitableLocation(int i, int j)
b) Class - Crate.java:
---------------------------------------------------------------------------
Rashidul Islam
1.) Documentation:
c) Class - PlayerCharacter.java:
---------------------------------------------------------------------------
Constructor Summary Crate(int i, int j)
Rashidul Islam
1.) Documentation:
sokobangame Class PlayerCharacter
java.lang.Object
sokobangame.User
sokobangame.PlayerCharacter
public class PlayerCharacterextends sokobangame.User
Constructor Summary PlayerCharacter(int i, int j)
Rashidul Islam
d) Class - Obstacle.java:
---------------------------------------------------------------------------
1.) Documentation:
Constructor Summary Obstacle(int i, int j)
Rashidul Islam
e) Class - User.java:
Rashidul Islam
Rashidul Islam
---------------------------------------------------------------------------
1.) Documentation:
Constructor Summary User(int x, int y)
----------------------------------------------------------------------------------------------
f) Class - Panel.java:
---------------------------------------------------------------------------
package sokobangame; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; /**import java.awt.event.ActionEvent;*/ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JPanel; /**
*
*
* @author (Md. Rashidul Islam)
* @version ()
*/
Rashidul Islam
public class Panel extends JPanel { /** * */ // instance variables
//Attributes: instance variables of an object
/**
* Constructor for objects of class Panel
*/
private static final long serialVersionUID = 1L; private final int OFFSET = 30; private JButton btn1; /*type: JButton, variable: btn1 */ private JButton btn2; private JButton btn3; private JButton btn4; private JButton btn5; private JButton btn6; private JButton btn7; //private JButton btnQuit; private final int SPACE = 20; private final int LEFT_COLLISION = 1; private final int RIGHT_COLLISION = 2; private final int TOP_COLLISION = 3; private final int BOTTOM_COLLISION = 4; private ArrayList<Obstacle> obs = new ArrayList<Obstacle>(); private ArrayList<Crate> crates = new ArrayList<Crate>();
Rashidul Islam
private ArrayList<SuitableLocation> SuitLo = new ArrayList<SuitableLocation>(); private PlayerCharacter PlayerChar; private int w = 0; private int h = 0; private boolean solved = false; private String stage = " ######\n" + " ## #\n" + " ##$ #\n" + " #### $##\n" + " ## $ $ #\n" + "#### # ## # ######\n" + "## # ## ##### ..#\n" + "## $ $ ..#\n" + "###### ### #@## ..#\n" + " ## #########\n" + " ########\n"; public Panel() { // initialise instance variables addKeyListener(new TAdapter()); setFocusable(true); initWorld(); } /**
*/
public int getBoardWidth() { return this.w; } public int getBoardHeight() { return this.h; }
Rashidul Islam
public final void initWorld() { btn1 = new JButton("Level 1"); btn1.setBounds(10000, 1000, 200, 50); this.add(btn1); Font f = new Font("Courier New", Font.LAYOUT_LEFT_TO_RIGHT,24); btn1.setFont(f); btn2 = new JButton("Level 2"); btn2.setBounds(10000, 1055, 200, 50); this.add(btn2); Font g = new Font("Monospaced", Font.LAYOUT_LEFT_TO_RIGHT,24); btn2.setFont(g); btn3 = new JButton("Level 3"); btn3.setBounds(10000, 1110, 200, 50); this.add(btn3); Font n = new Font("Monospaced", Font.LAYOUT_LEFT_TO_RIGHT,24); btn3.setFont(n); btn4 = new JButton("Level 4"); btn4.setBounds(500, 1165, 200, 50); this.add(btn4); Font m = new Font("Monospaced", Font.LAYOUT_LEFT_TO_RIGHT,24); btn4.setFont(m); btn5 = new JButton("Level 5"); btn5.setBounds(500, 1220, 200, 50); this.add(btn5); Font j = new Font("Monospaced", Font.LAYOUT_LEFT_TO_RIGHT,24); btn5.setFont(j); btn6 = new JButton("Steps");
Rashidul Islam
btn6.setBounds(500, 1275, 200, 50); this.add(btn6); Font k = new Font("Courier New", Font.LAYOUT_LEFT_TO_RIGHT,24); btn6.setFont(k); btn7 = new JButton("Exit"); btn7.setBounds(500, 1330, 200, 50); this.add(btn7); Font l = new Font("Courier New", Font.LAYOUT_LEFT_TO_RIGHT,24); btn7.setFont(l); /**btnQuit = new JButton("Quit"); btnQuit.setBounds(440, 380, 100, 50); btnQuit.setFont(f); btnQuit.addActionListener(this); this.add(btnQuit); this.setVisible(true);*/ /**public void actionPerformed(ActionEvent e) { if (e.getSource() == btnQuit) System.exit(0); }*/ int x = OFFSET; int y = OFFSET; Obstacle wall; Crate b; SuitableLocation a; for (int i = 0; i < stage.length(); i++) { char item = stage.charAt(i); if (item == '\n') {
Rashidul Islam
y += SPACE; if (this.w < x) { this.w = x; } x = OFFSET; } else if (item == '#') { wall = new Obstacle(x, y); obs.add(wall); x += SPACE; } else if (item == '$') { b = new Crate(x, y); crates.add(b); x += SPACE; } else if (item == '.') { a = new SuitableLocation(x, y); SuitLo.add(a); x += SPACE; } else if (item == '@') { PlayerChar = new PlayerCharacter(x, y); x += SPACE; } else if (item == ' ') { x += SPACE; } h = y; } } public void buildWorld(Graphics g) { g.setColor(new Color(0, 108, 209)); g.fillRect(0, 0, this.getWidth(), this.getHeight()); ArrayList<User> world = new ArrayList<User>(); world.addAll(obs); world.addAll(SuitLo); world.addAll(crates); world.add(PlayerChar);
Rashidul Islam
for (int i = 0; i < world.size(); i++) { User item = (User) world.get(i); if ((item instanceof PlayerCharacter) || (item instanceof Crate)) { g.drawImage(item.getImage(), item.x() + 2, item.y() + 2, this); } else { g.drawImage(item.getImage(), item.x(), item.y(), this); } if (solved) { g.setColor(new Color(255,255,255)); g.drawString("The level has been solved!", 25, 20); Font f = new Font("Courier New", Font.BOLD,14); setFont(f); } } } @Override public void paint(Graphics g) { super.paint(g); buildWorld(g); } class TAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { if (solved) { return; } int key = e.getKeyCode();
Rashidul Islam
if (key == KeyEvent.VK_LEFT) { if (checkWallCollision(PlayerChar, LEFT_COLLISION)) { return; } if (checkBagCollision(LEFT_COLLISION)) { return; } PlayerChar.move(-SPACE, 0); } else if (key == KeyEvent.VK_RIGHT) { if (checkWallCollision(PlayerChar, RIGHT_COLLISION)) { return; } if (checkBagCollision(RIGHT_COLLISION)) { return; } PlayerChar.move(SPACE, 0); } else if (key == KeyEvent.VK_UP) { if (checkWallCollision(PlayerChar, TOP_COLLISION)) { return; } if (checkBagCollision(TOP_COLLISION)) { return; } PlayerChar.move(0, -SPACE);
Rashidul Islam
} else if (key == KeyEvent.VK_DOWN) { if (checkWallCollision(PlayerChar, BOTTOM_COLLISION)) { return; } if (checkBagCollision(BOTTOM_COLLISION)) { return; } PlayerChar.move(0, SPACE); } else if (key == KeyEvent.VK_R) { restartStage(); } repaint(); } } private boolean checkWallCollision(User actor, int type) { if (type == LEFT_COLLISION) { for (int i = 0; i < obs.size(); i++) { Obstacle wall = (Obstacle) obs.get(i); if (actor.isLeftCollision(wall)) { return true; } } return false; } else if (type == RIGHT_COLLISION) { for (int i = 0; i < obs.size(); i++) { Obstacle wall = (Obstacle) obs.get(i); if (actor.isRightCollision(wall)) {
Rashidul Islam
return true; } } return false; } else if (type == TOP_COLLISION) { for (int i = 0; i < obs.size(); i++) { Obstacle wall = (Obstacle) obs.get(i); if (actor.isTopCollision(wall)) { return true; } } return false; } else if (type == BOTTOM_COLLISION) { for (int i = 0; i < obs.size(); i++) { Obstacle wall = (Obstacle) obs.get(i); if (actor.isBottomCollision(wall)) { return true; } } return false; } return false; } private boolean checkBagCollision(int type) { if (type == LEFT_COLLISION) { for (int i = 0; i < crates.size(); i++) { Crate bag = (Crate) crates.get(i); if (PlayerChar.isLeftCollision(bag)) { for (int j=0; j < crates.size(); j++) { Crate item = (Crate) crates.get(j);
Rashidul Islam
if (!bag.equals(item)) { if (bag.isLeftCollision(item)) { return true; } } if (checkWallCollision(bag, LEFT_COLLISION)) { return true; } } bag.move(-SPACE, 0); isSolved(); } } return false; } else if (type == RIGHT_COLLISION) { for (int i = 0; i < crates.size(); i++) { Crate bag = (Crate) crates.get(i); if (PlayerChar.isRightCollision(bag)) { for (int j=0; j < crates.size(); j++) { Crate item = (Crate) crates.get(j); if (!bag.equals(item)) { if (bag.isRightCollision(item)) { return true; } } if (checkWallCollision(bag, RIGHT_COLLISION)) { return true; } } bag.move(SPACE, 0); isSolved(); } }
Rashidul Islam
return false; } else if (type == TOP_COLLISION) { for (int i = 0; i < crates.size(); i++) { Crate bag = (Crate) crates.get(i); if (PlayerChar.isTopCollision(bag)) { for (int j = 0; j < crates.size(); j++) { Crate item = (Crate) crates.get(j); if (!bag.equals(item)) { if (bag.isTopCollision(item)) { return true; } } if (checkWallCollision(bag, TOP_COLLISION)) { return true; } } bag.move(0, -SPACE); isSolved(); } } return false; } else if (type == BOTTOM_COLLISION) { for (int i = 0; i < crates.size(); i++) { Crate bag = (Crate) crates.get(i); if (PlayerChar.isBottomCollision(bag)) { for (int j = 0; j < crates.size(); j++) { Crate item = (Crate) crates.get(j); if (!bag.equals(item)) { if (bag.isBottomCollision(item)) {
Rashidul Islam
return true; } } if (checkWallCollision(bag, BOTTOM_COLLISION)) { return true; } } bag.move(0, SPACE); isSolved(); } } } return false; } public void isSolved() { int num = crates.size(); int compl = 0; for (int i = 0; i < num; i++) { Crate bag = (Crate) crates.get(i); for (int j = 0; j < num; j++) { SuitableLocation area = (SuitableLocation) SuitLo.get(j); if (bag.x() == area.x() && bag.y() == area.y()) { compl += 1; } } } if (compl == num) { solved = true; repaint(); } }
Rashidul Islam
public void restartStage() { SuitLo.clear(); crates.clear(); obs.clear(); initWorld(); if (solved) { solved = false; } } }
1.) Documentation:
Constructor Summary Panel()
g) Class - Game.java:
---------------------------------------------------------------------------
Rashidul Islam
Rashidul Islam
---------------------------------------------------------------------------
1.) Documentation:
Constructor Summary Game() private JButton btn1; private JButton btn2; private JButton btn3; private JButton btn4; private JButton btn5; private JButton btn6; private JButton btn7;
---------------------------------------------------------------------------
Task 2:
Screen shots:
a) Level-1:
Fig: starting position
Rashidul Islam
Fig: Level Solved
b) Level-2:
Fig: starting position
Rashidul Islam
Fig: level solved
b) Level-3:
Fig: starting position
Rashidul Islam
Fig: level solved
c) Level-4:
Fig: starting position
Rashidul Islam
Fig: level solved
d) Level-5:
Fig: starting position
Rashidul Islam
Fig: starting position with buttons
---------------------------------------------------------------------------
Task 3:
Class diagrams:
a) Class Diagram: i) Class Diagram or Design In UML Using StarUML:
Fig: Level 1
Rashidul Islam
Fig: Level One
Rashidul Islam
ii) Testing Data By BlueJ:
Fig : Testing Data By BlueJ
Rashidul Islam
Rashidul Islam