Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

34
Rashidul Islam 12/1/2013

description

Sokoban Game Development using Java | Rashidul Islam Tools Used: BlueJ, StarUML, JCreator, Eclipse, Netbeans, DrJava, GreenFoot etc.

Transcript of Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Page 1: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

12/1/2013

Page 2: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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

Page 3: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Task 1:

The application that I have created: a) Class - SuitableLocation.java:

---------------------------------------------------------------------------

Page 4: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

1.) Documentation:

Constructor Summary SuitableLocation(int i, int j)

b) Class - Crate.java:

---------------------------------------------------------------------------

Page 5: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

1.) Documentation:

c) Class - PlayerCharacter.java:

---------------------------------------------------------------------------

Constructor Summary Crate(int i, int j)

Page 6: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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)

Page 7: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

d) Class - Obstacle.java:

---------------------------------------------------------------------------

1.) Documentation:

Constructor Summary Obstacle(int i, int j)

Page 8: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

e) Class - User.java:

Page 9: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Page 10: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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 ()

*/

Page 11: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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>();

Page 12: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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; }

Page 13: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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");

Page 14: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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') {

Page 15: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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);

Page 16: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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();

Page 17: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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);

Page 18: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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)) {

Page 19: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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);

Page 20: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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(); } }

Page 21: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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)) {

Page 22: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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(); } }

Page 23: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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:

---------------------------------------------------------------------------

Page 24: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Page 25: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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

Page 26: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Fig: Level Solved

b) Level-2:

Fig: starting position

Page 27: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Fig: level solved

b) Level-3:

Fig: starting position

Page 28: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Fig: level solved

c) Level-4:

Fig: starting position

Page 29: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Fig: level solved

d) Level-5:

Fig: starting position

Page 30: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

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

Page 31: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Fig: Level One

Page 32: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

ii) Testing Data By BlueJ:

Fig : Testing Data By BlueJ

Page 33: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam

Page 34: Sokoban Game Development Using Java ( Updated using Screenshots & Class Diagrams )

Rashidul Islam