Skip to content

Instantly share code, notes, and snippets.

@fermopili
Created May 26, 2017 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fermopili/3db8a9872e037d38c90d18828b521df6 to your computer and use it in GitHub Desktop.
Save fermopili/3db8a9872e037d38c90d18828b521df6 to your computer and use it in GitHub Desktop.
com.javarush.task.task34.task3410 SOKOBAN
package com.javarush.task.task34.task3410.controller;
import com.javarush.task.task34.task3410.model.Direction;
import com.javarush.task.task34.task3410.model.GameObjects;
import com.javarush.task.task34.task3410.model.Model;
import com.javarush.task.task34.task3410.view.View;
import java.io.IOException;
/**
* Created by Administrator on 26.05.2017.
*/
public class Controller implements EventListener
{
private View view;
private Model model;
public Controller()
{
this.view = new View ( this );
this.model = new Model ( );
view.init ( );
view.setEventListener ( this );
model.restart ( );
model.setEventListener ( this );
}
public static void main(String args[])
{
Controller controller = new Controller ( );
}
@Override
public void move(Direction direction)
{
model.move ( direction );
view.update ( );
}
@Override
public void restart()
{
model.restart ( );
view.update ( );
}
@Override
public void startNextLevel()
{
model.startNextLevel ( );
view.update ( );
}
@Override
public void levelCompleted(int level)
{
view.completed ( level );
}
public GameObjects getGameObjects()
{
return model.getGameObjects ( );
}
}
package com.javarush.task.task34.task3410.controller;
import com.javarush.task.task34.task3410.model.Direction;
/**
* Created by Administrator on 26.05.2017.
*/
public interface EventListener
{
void move(Direction direction);
void restart();
void startNextLevel();
void levelCompleted(int level);
}
package com.javarush.task.task34.task3410.model;
import java.awt.*;
/**
* Created by Administrator on 26.05.2017.
*/
public class Box extends CollisionObject implements Movable
{
public Box(int x, int y)
{
super ( x, y );
}
@Override
public void draw(Graphics graphics)
{
graphics.setColor(Color.ORANGE);
int leftUpperCornerX = getX() - getWidth() / 2;
int leftUpperCornerY = getY() - getHeight() / 2;
graphics.drawRect(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight());
graphics.fillRect(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight()); }
@Override
public void move(int x, int y)
{
this.setX ( this.getX ( ) + x );
this.setY ( this.getY ( ) + y );
}
}
package com.javarush.task.task34.task3410.model;
/**
* Created by Administrator on 26.05.2017.
*/
public abstract class CollisionObject extends GameObject
{
public CollisionObject(int x, int y)
{
super ( x, y );
}
public boolean isCollision(GameObject gameObject, Direction direction)
{
switch (direction) {
case LEFT: {
return (getX() - Model.FIELD_CELL_SIZE == gameObject.getX() && gameObject.getY() == this.getY()) ? true : false;
}
case RIGHT: {
return (getX() + Model.FIELD_CELL_SIZE == gameObject.getX() && gameObject.getY() == this.getY()) ? true : false;
}
case DOWN: {
return (gameObject.getX() == this.getX() && getY() + Model.FIELD_CELL_SIZE == gameObject.getY()) ? true : false;
}
case UP: {
return (gameObject.getX() == this.getX() && getY() - Model.FIELD_CELL_SIZE == gameObject.getY()) ? true : false;
}
default:
return false;
}
}
}
package com.javarush.task.task34.task3410.model;
/**
* Created by Administrator on 26.05.2017.
*/
public enum Direction
{
LEFT,
RIGHT,
UP,
DOWN
}
package com.javarush.task.task34.task3410.model;
import java.awt.*;
/**
* Created by Administrator on 26.05.2017.
*/
public abstract class GameObject
{
int x;
int y;
int width;
int height;
public GameObject(int x, int y, int width, int height)
{
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public GameObject(int x, int y)
{
this.x = x;
this.y = y;
this.width = Model.FIELD_CELL_SIZE;
this.height = Model.FIELD_CELL_SIZE;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
public int getWidth()
{
return width;
}
public void setWidth(int width)
{
this.width = width;
}
public int getHeight()
{
return height;
}
public void setHeight(int height)
{
this.height = height;
}
abstract public void draw(Graphics graphics);
}
package com.javarush.task.task34.task3410.model;
import java.util.HashSet;
import java.util.Set;
/**
* Created by Administrator on 26.05.2017.
*/
public class GameObjects
{
private Set<Wall> walls;
private Set<Box> boxes;
private Set<Home> homes;
private Player player;
public GameObjects(Set<Wall> walls, Set<Box> boxes, Set<Home> homes, Player player)
{
this.walls = walls;
this.boxes = boxes;
this.homes = homes;
this.player = player;
}
public Set<Wall> getWalls()
{
return walls;
}
public Set<Box> getBoxes()
{
return boxes;
}
public Set<Home> getHomes()
{
return homes;
}
public Player getPlayer()
{
return player;
}
public Set<GameObject> getAll()
{Set<GameObject> all=new HashSet<> ( );
all.addAll ( walls );
all.addAll ( boxes );
all.addAll ( homes );
all.add (player );
return all;
}
}
package com.javarush.task.task34.task3410.model;
import java.awt.*;
/**
* Created by Administrator on 26.05.2017.
*/
public class Home extends GameObject
{
public Home(int x, int y)
{
super ( x, y, 2, 2 );
}
@Override
public void draw(Graphics graphics)
{
graphics.setColor ( Color.RED );
graphics.drawArc ( x-1,y-1,2 ,2 ,0,360);
}
}
package com.javarush.task.task34.task3410.model;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.Set;
/**
* Created by Administrator on 26.05.2017.
*/
public class LevelLoader
{
private Path levels;
public LevelLoader(Path levels)
{
this.levels = levels;
}
public GameObjects getLevel(int level)
{
Set<Wall> walls = new HashSet<> ( );
Set<Box> boxes = new HashSet<> ( );
Set<Home> homes = new HashSet<> ( );
Player player = null;
int loopLevel;
if (level > 60)
{
loopLevel = level % 60;
}
else
{
loopLevel = level;
}
try (BufferedReader reader = new BufferedReader ( new FileReader ( levels.toFile ( ) ) ))
{
int readLevel = 0;
int x;
int y = Model.FIELD_CELL_SIZE / 2;
boolean isLevelMap = false;
String line;
while ((line = reader.readLine ( )) != null)
{
if (line.contains ( "Maze:" ))
{
readLevel = Integer.valueOf ( line.split ( " " )[1] );
continue;
}
if (readLevel == loopLevel)
{
if (line.length ( ) == 0)
{
boolean isEnd = isLevelMap;
isLevelMap = !isLevelMap;
if (isEnd && !isLevelMap)
{
break;
}
else
{
continue;
}
}
if (isLevelMap)
{
x = Model.FIELD_CELL_SIZE / 2;
char[] chars = line.toCharArray ( );
for (char c : chars)
{
switch (c)
{
case 'X':
walls.add ( new Wall ( x, y ) );
break;
case '*':
boxes.add ( new Box ( x, y ) );
break;
case '.':
homes.add ( new Home ( x, y ) );
break;
case '&':
boxes.add ( new Box ( x, y ) );
homes.add ( new Home ( x, y ) );
break;
case '@':
player = new Player ( x, y );
}
x += Model.FIELD_CELL_SIZE;
}
y += Model.FIELD_CELL_SIZE;
}
}
}
}
catch (IOException e)
{
e.printStackTrace ( );
}
return new GameObjects ( walls, boxes, homes, player );
}
}
package com.javarush.task.task34.task3410.model;
import com.javarush.task.task34.task3410.controller.EventListener;
import java.nio.file.Paths;
/**
* Created by Administrator on 26.05.2017.
*/
public class Model
{
public static final int FIELD_CELL_SIZE = 20;
public static final int HEIGHT_WINDOW = 500;
public static final int WIDTH_WINDOW = 500;
private EventListener eventListener;
private GameObjects gameObjects;
private int currentLevel = 1;
private LevelLoader levelLoader = new LevelLoader ( Paths.get ( "c:\\tmp\\levels.txt" ) );
public void setEventListener(EventListener eventListener)
{
this.eventListener = eventListener;
}
public GameObjects getGameObjects()
{
return gameObjects;
}
public void restartLevel(int level)
{
this.gameObjects = levelLoader.getLevel ( level );
}
public void restart()
{
restartLevel ( currentLevel );
}
public void startNextLevel()
{
currentLevel++;
restartLevel ( currentLevel );
}
public void move(Direction direction)
{
Player player = gameObjects.getPlayer ( );
if (checkWallCollision ( player, direction ))
{
return;
}
if (checkBoxCollisionAndMoveIfAvaliable ( direction ))
{
return;
}
switch (direction)
{
case LEFT:
player.move ( -FIELD_CELL_SIZE, 0 );
break;
case RIGHT:
player.move ( FIELD_CELL_SIZE, 0 );
break;
case UP:
player.move ( 0, -FIELD_CELL_SIZE );
break;
case DOWN:
player.move ( 0, FIELD_CELL_SIZE );
}
checkCompletion ( );
}
public boolean checkWallCollision(CollisionObject gameObject, Direction direction)
{
for (Wall wall : gameObjects.getWalls ( ))
{
if (gameObject.isCollision ( wall, direction ))
return true;
}
return false;
}
public boolean checkBoxCollisionAndMoveIfAvaliable(Direction direction)
{
Player player = gameObjects.getPlayer ( );
GameObject stoped = null;
for (GameObject gameObject : gameObjects.getAll ( ))
{
if (!(gameObject instanceof Player) && !(gameObject instanceof Home) && player.isCollision ( gameObject, direction ))
{
stoped = gameObject;
}
}
if ((stoped == null))
{
return false;
}
if (stoped instanceof Box)
{
Box stopedBox = (Box) stoped;
if (checkWallCollision ( stopedBox, direction ))
{
return true;
}
for (Box box : gameObjects.getBoxes ( ))
{
if (stopedBox.isCollision ( box, direction ))
{
return true;
}
}
switch (direction)
{
case LEFT:
stopedBox.move ( -FIELD_CELL_SIZE, 0 );
break;
case RIGHT:
stopedBox.move ( FIELD_CELL_SIZE, 0 );
break;
case UP:
stopedBox.move ( 0, -FIELD_CELL_SIZE );
break;
case DOWN:
stopedBox.move ( 0, FIELD_CELL_SIZE );
}
}
return false;
}
public void checkCompletion()
{
boolean isLevelCompleted = true;
for (Home home : gameObjects.getHomes ( ))
{
boolean chk = false;
for (Box box : gameObjects.getBoxes ( ))
{
if ((box.getX ( ) == home.getX ( )) && (box.getY ( ) == home.getY ( )))
chk = true;
}
if (!chk) isLevelCompleted = false;
}
if (isLevelCompleted)
eventListener.levelCompleted ( currentLevel );
}
}
package com.javarush.task.task34.task3410.model;
/**
* Created by Administrator on 26.05.2017.
*/
public interface Movable
{
void move(int x, int y);
}
package com.javarush.task.task34.task3410.model;
import java.awt.*;
/**
* Created by Administrator on 26.05.2017.
*/
public class Player extends CollisionObject implements Movable
{
public Player(int x, int y)
{
super ( x, y );
}
@Override
public void draw(Graphics graphics)
{graphics.setColor(Color.YELLOW);
int leftUpperCornerX = getX() - getWidth() / 2;
int leftUpperCornerY = getY() - getHeight() / 2;
graphics.drawOval(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight());
graphics.fillOval(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight());}
@Override
public void move(int x, int y)
{
this.setX(this.getX() + x);
this.setY(this.getY() + y);
}
}
package com.javarush.task.task34.task3410.model;
import java.awt.*;
/**
* Created by Administrator on 26.05.2017.
*/
public class Wall extends CollisionObject
{
public Wall(int x, int y)
{
super ( x, y );
}
@Override
public void draw(Graphics graphics)
{
graphics.setColor(Color.DARK_GRAY);
int leftUpperCornerX = getX() - getWidth() / 2;
int leftUpperCornerY = getY() - getHeight() / 2;
graphics.drawRect(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight());
graphics.fillRect(leftUpperCornerX, leftUpperCornerY, getWidth(), getHeight());
}
}
*************************************
Maze: 1
File offset: 148C, DS:00FC, table offset: 0000
Size X: 22
Size Y: 11
End: 14BD
Length: 50
XXXXX
X X
X* X
XXX *XXX
X * * X
XXX X XXX X XXXXXX
X X XXX XXXXXXX ..X
X * * ..X
XXXXX XXXX X@XXXX ..X
X XXX XXXXXX
XXXXXXXX
*************************************
Maze: 2
File offset: 14BE, DS:012E, table offset: 0032
Size X: 14
Size Y: 10
End: 14E8
Length: 43
XXXXXXXXXXXX
X.. X XXX
X.. X * * X
X.. X*XXXX X
X.. @ XX X
X.. X X * XX
XXXXXX XX* * X
X * * * * X
X X X
XXXXXXXXXXXX
*************************************
Maze: 3
File offset: 14E9, DS:0159, table offset: 005D
Size X: 17
Size Y: 10
End: 150D
Length: 37
XXXXXXXX
X @X
X *X* XX
X * *X
XX* * X
XXXXXXXXX * X XXX
X.... XX * * X
XX... * * X
X.... XXXXXXXXXX
XXXXXXXX
*************************************
Maze: 4
File offset: 150E, DS:017E, table offset: 0082
Size X: 22
Size Y: 13
End: 154D
Length: 64
XXXXXXXX
X ....X
XXXXXXXXXXXX ....X
X X * * ....X
X ***X* * X ....X
X * * X ....X
X ** X* * *XXXXXXXX
XXXX * X X
X X XXXXXXXXX
X * XX
X **X** @X
X X XX
XXXXXXXXX
*************************************
Maze: 5
File offset: 154E, DS:01BE, table offset: 00C2
Size X: 17
Size Y: 13
End: 1580
Length: 51
XXXXX
X XXXXX
X X*XX X
X * X
XXXXXXXXX XXX X
X.... XX * *XXX
X.... * ** XX
X.... XX* * @X
XXXXXXXXX * XX
X * * X
XXX XX X
X X
XXXXXX
*************************************
Maze: 6
File offset: 1581, DS:01F1, table offset: 00F5
Size X: 12
Size Y: 11
End: 15AC
Length: 44
XXXXXX XXX
X.. X XX@XX
X.. XXX X
X.. ** X
X.. X X * X
X..XXX X * X
XXXX * X* X
X *X * X
X * * X
X XX X
XXXXXXXXX
*************************************
Maze: 7
File offset: 15AD, DS:021D, table offset: 0121
Size X: 13
Size Y: 12
End: 15D8
Length: 44
XXXXX
XXXXXXX XX
XX X @XX ** X
X * X
X * XXX X
XXX XXXXX*XXX
X * XXX ..X
X * * * ...X
X XXX...X
X ** X X...X
X XXX XXXXX
XXXX
*************************************
Maze: 8
File offset: 15D9, DS:0249, table offset: 014D
Size X: 16
Size Y: 17
End: 161A
Length: 66
XXXX
X XXXXXXXXXXX
X * * * X
X *X * X * X
X * * X X
XXX *X X XXXX X
X@X* * * XX X
X * X*X X X
XX * * * * X
XXXX XXXXXXXXX
XXX XXX
X X
X X
X......X
X......X
X......X
XXXXXXXX
*************************************
Maze: 9
File offset: 161B, DS:028B, table offset: 018F
Size X: 17
Size Y: 18
End: 165D
Length: 67
XXXXXXX
X ...X
XXXXX ...X
X ...X
X XX ...X
XX XX ...X
XXX XXXXXXXX
X *** XX
XXXXX * * XXXXX
XX X* * X X
X@ * * * * X
XXXXXX ** * XXXXX
X * X
XXXX XXX
X X
X X
X X
XXXX
*************************************
Maze: 10
File offset: 165E, DS:02CE, table offset: 01D2
Size X: 21
Size Y: 20
End: 16BE
Length: 97
XXXX
XXXXXX X
X X
X XXXX XXX
XXX XXXXX XXX X
XX@XXXX *** X X
X ** ** * X....XX
X ***X * X.....X
X * X ** ** X.....X
XXX X * X.....X
X X * * * X.....X
X XXXXXXX XXX.....X
X X * * X.....X
XXX X ** * *XXXXXXX
X X * X
X X *** *** X
X X X X
X XXXXXXXXX X
X X
XXXXXXXXXXXXX
*************************************
Maze: 11
File offset: 16BF, DS:032F, table offset: 0233
Size X: 19
Size Y: 15
End: 16FF
Length: 65
XXXX
XXXX X X
XXX XXX* X
XX @ * X
XX * **XX XX
X X*XX X
X X * ** X XXX
X * X X * XXXXX
XXXX X ** X X
XXXX XX * X
X. XXX XXXXXXXX
X.. ..X XXXX
X...X.X
X.....X
XXXXXXX
*************************************
Maze: 12
File offset: 1700, DS:0370, table offset: 0274
Size X: 13
Size Y: 16
End: 1741
Length: 66
XXXXXXXXX
X&.&X&.&X
X.&.&.&.X
X&.&.&.&X
X.&.&.&.X
X&.&.&.&X
XXX XXX
X X
XXXXXX XXXXXX
X X
X * * * * * X
XX * * * * XX
X* * * * *X
X *@* X
X XXXXX X
XXXX XXXX
*************************************
Maze: 13
File offset: 1742, DS:03B2, table offset: 02B6
Size X: 20
Size Y: 13
End: 178D
Length: 76
XXXXXXXXX
XXX XX XXXXX
XXX X X XXXX
X ** X* X X ... X
X X *X@*XX X X.X. X
X XX X* X ... X
X *X * X X X.X. X
X XX XX* * ... X
X * XX X X*X.X. X
XX ** * * *... X
X* XXXXXX XX X
X X XXXXXXXXXX
XXXXX
*************************************
Maze: 14
File offset: 178E, DS:03FE, table offset: 0302
Size X: 17
Size Y: 13
End: 17C7
Length: 58
XXXXXXXXXXXXXXXX
X X
X X XXXXXX X
X X * * * *X X
X X *@* XX XX
X X X* * *XXX...X
X X * * XX...X
X XXX*** * XX...X
X X XX XX...X
XXXXX XX XX...X
XXXXX XXX
X X
XXXXXXX
*************************************
Maze: 15
File offset: 17C8, DS:0438, table offset: 033C
Size X: 17
Size Y: 17
End: 180F
Length: 72
XXXX
XXXX X
XX X X
X * * X
XXX X* XXXX
X * XX* X
X X @ * X *X
X X * XXXX
XX XXXX*XX X
X *X.....X X X
X *...&. *X XXX
XX X.....X X
X XXX XXXXXXX
X ** X X
X X X
XXXXXX X
XXXXX
*************************************
Maze: 16
File offset: 1810, DS:0480, table offset: 0384
Size X: 14
Size Y: 15
End: 184E
Length: 63
XXXXX
X XX
X X XXXX
X * XXXX X
X ** * *X
XXX@ X* XX
X XX * * XX
X * XX XX .X
X X*XX* X.X
XXX *..XX.X
X X.&...X
X ** X.....X
X XXXXXXXXX
X X
XXXX
*************************************
Maze: 17
File offset: 184F, DS:04BF, table offset: 03C3
Size X: 18
Size Y: 16
End: 1895
Length: 71
XXXXXXX
XXXXXXX X
X X *@* X
X** X XXXXXXXXX
X XXX......XX X
X *......XX X X
X XXX...... X
XX XXXX XXX X*XX
X X* X * X X
X * *** X *XX X
X * * XXX** X X
XXXXX * X X
XXX XXX X X
X X X
XXXXXXXX X
XXXX
*************************************
Maze: 18
File offset: 1896, DS:0506, table offset: 040A
Size X: 22
Size Y: 13
End: 18DC
Length: 71
XXXXXXXXXXXX
X . XX X
X X. @ X
XXXXXX XX...X XXXX
XX XX...XXXX XXXX
X * XX... * X * X
X .. XX X XX XX X
XXXX*XXX*X * X X XX
XXX X XX* ** X X
X ** X X * X *XX X
X X
XXXXXXXXXXXXXXXXX X
XXXX
*************************************
Maze: 19
File offset: 18DD, DS:054D, table offset: 0451
Size X: 28
Size Y: 20
End: 1951
Length: 117
XXXXXX
X @XXXX
XXXXX * X
X XX XXXX
X *XX XX X
X X XXXXX X
X X** * X X
X * * XXX X X
X X * X X X
X X X*X X X
XX XXXX X X X
X * XXXXX X X XXXX
XX * * XXX XXXX
XXXXX XXX * *X * X .....X
X XX X XX X.....X
X **** XXXXXX*XX X.XX.X
XX XX X....X
XX XXXXXXXXXXXXXXX ....X
X X XXXXX XX
XXXX XXXX
*************************************
Maze: 20
File offset: 1952, DS:05C2, table offset: 04C6
Size X: 20
Size Y: 20
End: 19B7
Length: 102
XXXXXXXXXXXX
X..........X
XXX.X.X.X.X..X
X .........X
X@ * * * &.&.X
XXXXXXX XXXXXXX
XXXX X XX X
XX * X X * XX
X X*X XXX XXX* XX
X * * * X * * * X
X X * XX X* X
X *XXXX*XXXX*XX X
XXXX XX X X X
X* XX X X ** X
X X * X * X
XXX X ** X * XXX
X X X * XX
X XXXXXXXX X
X X
XXXXXXXXXXXX
*************************************
Maze: 21
File offset: 19B8, DS:0628, table offset: 052C
Size X: 16
Size Y: 14
End: 19F1
Length: 58
XXXXXXXXXX
X.. X X
X.. X
X.. X XXXX
XXXXXXX X XX
X X
X X XX X X
XXXX XX XXXX XX
X * XXXXX X X
X X * * X * X
X @* * X XX
XXXX XX XXXXXXX
X X
XXXXXX
*************************************
Maze: 22
File offset: 19F2, DS:0662, table offset: 0566
Size X: 22
Size Y: 20
End: 1A66
Length: 117
XXXX
XXXXXXXXXXXX XXXXX
X X X * X XX
X * * * * X * * X
XX* * X @X * * X
XXX XXXXXXXXXXXX XX
X * *X X......X *X
X X X X......XX X
X XX XX X .....X X
X X *...... * X
X X * XX X......X X
X * *X X......X *X
X * X XX*XXXXX X
X * * XXXX * * * *X
XX X * * * * XXX
X XXXXXX * * X
X X XXXXXXX X
XXXXXXX X* X
X XXXXXXXXXXX
XXXXX
*************************************
Maze: 23
File offset: 1A67, DS:06D7, table offset: 05DB
Size X: 25
Size Y: 14
End: 1AB7
Length: 81
XXXXXXX
X X XXXX
X *X* X XX
XXXXXXXX X X XXXXXXXX
X.... X *X* X *X X X
X....X X X* X X
X..X. *X X * X* X
X... @XX X* X* X X X
X.... XX *X *XXXXXXXX
XXXXXXXX X**X* X
X *X X *X
X X X X
XXXX XXXXX
XXXX
*************************************
Maze: 24
File offset: 1AB8, DS:0728, table offset: 062C
Size X: 21
Size Y: 19
End: 1B1F
Length: 104
XXXXXXXXXX
X........XXXX
X.X.X....X X
X........** X
X .XXX XXXX
XXXXXXXXX * X X
X * * * * X
X X X * *X X
XX XXXXX X X X
X * X XXXX X
XX *X X XX X X
X XX*XXX X XX
X * * X X X X
XXXXX X XX X XX XX
X*X X * * * X
X@X *X*** X X
XXX * XXXXX
XX X X X
XXXXXXXXXX
*************************************
Maze: 25
File offset: 1B20, DS:0790, table offset: 0694
Size X: 23
Size Y: 17
End: 1B7C
Length: 93
XXXX
XXXXXX XXXXX
XXXXXXX X X
X * * XX X X X
X XXXX * X .X
X * X X XX.X.X
XX*XXXX* * * XX.X.X
X X XXXX.XXX
X * XXXXXX X.X.X
XXXXXX***XX @X.X.X
X X X*X*XXX. .X
X XXXX X***** X ...X
X X * X X ...X
X X XX XX XXX...X
X XXXXXX*XXXXXX XXXXXX
X X X X
XXXXXXXXXX XXXX
*************************************
Maze: 26
File offset: 1B7D, DS:07ED, table offset: 06F1
Size X: 15
Size Y: 15
End: 1BBB
Length: 63
XXXXXXXXX
X X
X XXXX
XX XXXX X X
XX X@XX X
X *** * **X
X X XX * X
X X XX * XXXX
XXXX *** *X X
X XX ....X
X X X X.. .X
X X X XX...X
XXXXX * X...X
XX XXXXX
XXXXX
*************************************
Maze: 27
File offset: 1BBC, DS:082C, table offset: 0730
Size X: 23
Size Y: 13
End: 1C0B
Length: 80
XXXXXXXXXXXXXXXXX
X... X X XXX
XX..... *XX X X * X
X......X * X * X
X......X X X X X XX
XXXXXXXXX * * X X XXX
X X*XX* XX XX X
XX * X * * X X
X XX XXX X XXXXX*X X
X * ** * * X
X * *XX* XXXXXXXX X
XXXXXXX @ XX XXX
XXXXXX
*************************************
Maze: 28
File offset: 1C0C, DS:087C, table offset: 0780
Size X: 15
Size Y: 17
End: 1C54
Length: 73
XXXXXXX
X@ X X
X * X
XXX XX X
XXXX * X XX
X X XX
X * *XXXX * X
X ** X X *X
X* * X* X
XX **X ** XX
X ** X X * X
X XXXX * X
X X*XX..XX X
XXX .X....XXXXX
X .......XX
X.... ..X
XXXXXXXXXXX
*************************************
Maze: 29
File offset: 1C55, DS:08C5, table offset: 07C9
Size X: 24
Size Y: 11
End: 1C96
Length: 66
XXXXX
XXXXXX XXX XXXX
XXXXX XXX * * * X
XXXX XX X* * * X X
X.... ** * * * X*XX
X.. X XX X XXX*XX X X
X.... X XXX X X
X.... X XX * XXX* X
X..XXXXXX * X XXXX XX
XXXX X XXX @ X
XXXXXXXXXXXXXXX
*************************************
Maze: 30
File offset: 1C97, DS:0907, table offset: 080B
Size X: 14
Size Y: 20
End: 1CE3
Length: 77
XXXXX
X XXXXXXX
X * XXX X
X * ** X
XX XXXX X
XXX X X XXX
X X X@XX
X ** * X
X X X * XXXX
XXXXX X X X
X *XXXX X
X * * X
XX XXXXX XX
XXXXXXXXXX X
XX....X * * X
X.....X **X X
X.. ..X * * X
X.....* X X
XX XXXXXXXXXX
XXXX
*************************************
Maze: 31
File offset: 1CE4, DS:0954, table offset: 0858
Size X: 15
Size Y: 12
End: 1D16
Length: 51
XXXXXXX
X X XXXXX
XX X X...XXX
X *X X... X
X * X** ... X
X *X X... .X
X X *XXXXXXXX
XX* * * X
XX X ** X X
XXXXXX XX**@X
X XX
XXXXXXXX
*************************************
Maze: 32
File offset: 1D17, DS:0987, table offset: 088B
Size X: 18
Size Y: 16
End: 1D60
Length: 74
XXXX
X XXXXXXXXX
XX XX @X X
X *X * * XXXX
X* * X * *X XX
XX *XX X* * X
X X X X *** X
X * * *XX XXXX
X * * X*X X X
XX XXX XXX* X
X X.... X
XXXX......XXXX
X....XXXX
X...XX
X...X
XXXXX
*************************************
Maze: 33
File offset: 1D61, DS:09D1, table offset: 08D5
Size X: 13
Size Y: 15
End: 1D97
Length: 55
XXXX
XXXXX X
XX *X
XX * XX XXX
X@* * X * X
XXXX XX *X
X....X* * X
X....X *X
X.... ** XX
X... X * X
XXXXXX* * X
X XXX
X* XXX
X X
XXXX
*************************************
Maze: 34
File offset: 1D98, DS:0A08, table offset: 090C
Size X: 12
Size Y: 15
End: 1DCB
Length: 52
XXXXXXXXXXXX
XX XX X
XX * * X
XXXX XX ** X
X * X X
X *** X XXXX
X X X * XX
X X X * X
X *X *X X
X ..X XXXX
XXXX.. * X@X
X.....X *X X
XX....X * X
XXX..XX X
XXXXXXXXXXXX
*************************************
Maze: 35
File offset: 1DCC, DS:0A3C, table offset: 0940
Size X: 20
Size Y: 16
End: 1E20
Length: 85
XXXXXXXXXXXX XXXXXX
X X X@XXXX....X
X **X .....X
X X XXX XX ....X
XX XX XXX X ....X
X * * X XX XXXX
X * *XX X X
XXXX X XXXX XX XX X
X X X* XX XX X
X * * X XX XXXXXXX
X X * * X X
X * XX XX X X
X ** ** X
XX XX XXX * X
X X X X
XXXXXX XXXXXX
*************************************
Maze: 36
File offset: 1E21, DS:0A91, table offset: 0995
Size X: 18
Size Y: 19
End: 1E7E
Length: 94
XXXX
XXX XX
XXXX * X
X * * XXXX
X * X * X XXXX
X X X * X X..X
XX*X* XXXX*XXXX..X
X XXXXX XX ...X
X*X XX@XX XX ..X
X X * ...X
X XXXX XXX ..X
XXX XX X XX ...X
XX* XXXX* XXX..X
X XX X X..X
XX **XX * X XXXX
X **** X
X * XXX X
X X XXXXXX
XXXXX
*************************************
Maze: 37
File offset: 1E7F, DS:0AEF, table offset: 09F3
Size X: 21
Size Y: 15
End: 1ED0
Length: 82
XXXXXXXXXXX
X...... XXXXXXXXX
X...... X XX X
X..XXX * * X
X... * * X XXX X
X...X*XXXXX X X
XXX X X* X *XXX
X ** * * *XX * X
X * X*X XX X
XXX XX X * XXXXXXX
X * * XX XX
X * * X
XX X X X
XXXXX@XXXXX
XXX
*************************************
Maze: 38
File offset: 1ED1, DS:0B41, table offset: 0A45
Size X: 14
Size Y: 15
End: 1F11
Length: 65
XXXXXXXXX
X.... XX
X.X.X * XX
XX....X X @XX
X ....X X XX
X X* XX* X
XX XXX * X
X* * * *X X
X X * * XX X
X XXX XX X
X XX XX XX
X * X * X
XXX* * XXX
X XXXXX
XXXX
*************************************
Maze: 39
File offset: 1F12, DS:0B82, table offset: 0A86
Size X: 23
Size Y: 18
End: 1F73
Length: 98
XXX
XX.XXX
X....X
XXXXXXXXXXXXX....X
XX XX XX....XXXXX
X **XX * @XX.... X
X ** *X ....X X
X * XX ** X X....X XX
X * XX * X XX XXX X
XX XXXXX XXX X
XX * * XXXXX XXX X
X *XXX X XXXXX X XXXX
X * X X
X * X* * *XXX X
X ***X * X XXXX
X X ** X
XXXXXX XXX
XXXXX
*************************************
Maze: 40
File offset: 1F74, DS:0BE4, table offset: 0AE8
Size X: 11
Size Y: 11
End: 1F9A
Length: 39
XXXX
XXXXXXX @X
X * X
X *XX *X
XX*X...X X
X *... X
X X. .X XX
X X X* X
X* * X
X XXXXXXX
XXXX
*************************************
Maze: 41
File offset: 1F9B, DS:0C0B, table offset: 0B0F
Size X: 20
Size Y: 15
End: 1FDE
Length: 68
XXXXX
XX XX
XX X
XX ** X
XX ** * X
X * * X
XXXX X ** XXXXX
X XXXXXXXX XX X
X.. ***@X
X.X XXXXXXX XX XX
X.X XXXXXXX. X* *XXX
X........... X * X
XXXXXXXXXXXXXX * X
XX XXX
XXXX
*************************************
Maze: 42
File offset: 1FDF, DS:0C4F, table offset: 0B53
Size X: 13
Size Y: 18
End: 2022
Length: 68
XXXXXXXX
X@XX XXXX
X * * X
X * * ***X
X **X X X
XX* * X
X * *****XX
X *XXXX X X
X *....X X
X XX....X** X
X XX.... XX
X ....X X
XX X....X**X
X X....X X
X X
XXXX XX*XXX
X X
XXXXXX
*************************************
Maze: 43
File offset: 2023, DS:0C93, table offset: 0B97
Size X: 17
Size Y: 16
End: 206B
Length: 73
XXXXXXXXXXXX
X XX
X X X** * X
X* X*X XX @X
XX XX X * X XX
X * X* X X
X X * X X
XX * * XX X
X X XX * X
X XX **X X
XXXXXX** X X
X....X XXXXXXXX
X.X... XX
X.... X
X.... X
XXXXXXXXX
*************************************
Maze: 44
File offset: 206C, DS:0CDC, table offset: 0BE0
Size X: 25
Size Y: 19
End: 20DD
Length: 114
XXXXXX
XXXXX X
X X X XXXXX
X * X * XXXXXX
XX* XXX XX X
XXX ** * * X XX XXXXX
X * XXXXXX XX X
X XXXXXXXX X@ X X X X
XX XXX XXXX X*X X X
X XXX XXXX XX.. X * XX
X * * X*XX.. X*XX XX
X X X X ..XX XX * X
XXXX X XX X..X * X
XXXXX X..X X X XX
XXXXXX..X X XX
X..XXXXX X
X.. X
XX XXX XX
XXXXXXXXX
*************************************
Maze: 45
File offset: 20DE, DS:0D4E, table offset: 0C52
Size X: 19
Size Y: 11
End: 2114
Length: 55
XXXXXXX
XXXXX X XXXX
X X * X
XXXX X** XX XX X
XX X X XX XXX
X XXX *X* * * X
X... X XX X X
X...X @ X XXX XX
X...X XXX * * X
XXXXXXXX XX X X
XXXXXXXXX
*************************************
Maze: 46
File offset: 2115, DS:0D85, table offset: 0C89
Size X: 22
Size Y: 17
End: 2173
Length: 95
XXXXXXXXX XXXX
X XX XXXX X
X * X * X
X X XX X XXXX
XX * * **X X X
XXXX X X * * X
XXXXX XXXX XXX...X
X X* X X XXXX.....X
X X X X XX.....X
XXXXXX X X* XXX...X
X XX X *X X...X
XX * *X XXXXX
XX ***XX X * X
X X X XXX XXX
X * X* @XXXX
XXXXX X X
XXXXXXXX
*************************************
Maze: 47
File offset: 2174, DS:0DE4, table offset: 0CE8
Size X: 19
Size Y: 15
End: 21B5
Length: 66
XXXXX
X X
X X XXXXXX
X *@XXXXXX
X * XX* XXX X
X XXXX * * X
X XXXXX X X* XXXX
XX XXXX XX* X
X *X * X XX XX X
X X X...X X
XXXXXX XXX ... X
XXXX X X...X X
X XXX X X
X X
XXXXXXXXX
*************************************
Maze: 48
File offset: 21B6, DS:0E26, table offset: 0D2A
Size X: 16
Size Y: 15
End: 21F4
Length: 63
XXXX
X XX
X XX
X ** XX
XXX* * XX
XXXX * X
XXX X XXXXX X
X X X....* X
X X * ....X X
X * X X.&..X X
XXX XXXX XXX X
XXXX @* XX*XX
XXX * X
X XX X
XXXXXXXXX
*************************************
Maze: 49
File offset: 21F5, DS:0E65, table offset: 0D69
Size X: 19
Size Y: 16
End: 224C
Length: 88
XXXXXXXXXXXX
XX.. X X
XX..& * * X
XX..&.X X X* XX
X..&.X X X * X
XXXX...X X X X
X XX X X
X @* * XXX X X XX
X * * X X X
XXX** X X X X X
X * X X XXXXX
X *X XXXXX X
X* X X X X
X XXX XX X
X X X XX
XXXX XXXXXX
*************************************
Maze: 50
File offset: 224D, DS:0EBD, table offset: 0DC1
Size X: 21
Size Y: 16
End: 22A7
Length: 91
XXXXXXXXXXXXX
X XXX X
X * * XXXX
XXXX X * * X
XX * X*XXXX * * X
XXX X X XXX * X
X * * X * X XXXX
X XX*XXXX X*X * XXX
X XX XXX X X X * X
X @* * X * X X
XXXXX X XX X *X X
X... XXXXX* X X X
X.......X ** X* X X
X.......X X
X.......XXXXXXX XX
XXXXXXXXX XXXX
*************************************
Maze: 51
File offset: 22A8, DS:0F18, table offset: 0E1C
Size X: 16
Size Y: 14
End: 22EA
Length: 67
XXXXX XXXX
X...X X XXXX
X...XXX * X
X....XX * *XXX
XX....XX * X
XXX... XX * * X
X XX X * X
X XX X XXX XXXX
X * X X* * X
X * @ * * X
X X * ** * XXX
X XXXXXX XXX
X XX XXXX
XXX
*************************************
Maze: 52
File offset: 22EB, DS:0F5B, table offset: 0E5F
Size X: 21
Size Y: 14
End: 2332
Length: 72
XXXX
XX XXXXX
X X XXXXX
X *XXX XXX X
X..X *X X X X
X..X **X XXX
X.&X X X* * XXXXX
X..X XX XX*X X
X.&* * X XX * X
X..XX * X XXXXXX
X.&XX*XX XXXXX
X.. * XXXXX
X X @ X
XXXXXXXX
*************************************
Maze: 53
File offset: 2333, DS:0FA3, table offset: 0EA7
Size X: 13
Size Y: 19
End: 2382
Length: 80
XXXXXXXXXX
X XXX X
X * * X
X XXXX*XX
XX X X X
XX X.& X
X XX..X X
X @ X.&X XX
X X*X..X* X
X * X..X X
X X X&&X X
X * X..X*XX
X .&X X
XXX X X X
XX XXXX X
X XXXXXXX*XX
X * * X
X XX X X
XXXXXXXXXXXXX
*************************************
Maze: 54
File offset: 2383, DS:0FF3, table offset: 0EF7
Size X: 23
Size Y: 20
End: 23F8
Length: 118
XXXXXXXXXXXXXXXXXXXXX
X XX X X X X
X * * * * XX
XXXXX X X XXX XX*XXX
X X XX*XXXXXX X X
X * X ......X X * X
XX X X ......XXXXX X
XX XXXXXXXXX..X X XXX
X X..X * X
X XX XXX XXX..XX X XXX
X X X XX..XX XXX X
X @ *..X X
X X X XX X XX X
XXXXX XXXXXXXXXXXXXX XX
X X X * X
X * X * * * X X X
X X*XX *X XX XX X X
X * ** XXXX * * X X X
X X X X
XXXXXXXXXXXXXXXXXXXXXXX
*************************************
Maze: 55
File offset: 23F9, DS:1069, table offset: 0F6D
Size X: 22
Size Y: 15
End: 2450
Length: 88
XXXXXXXXXXXXXXXXXXXXX
XX X
X * X XX X X
X XXXXXX XXX X*XX XX
XX*X XX*X.... X X
X X * X....XX X X
X * X X X X....XX X
X * X** X....XX*X X
X X *@*XX*X....XX X
X *** X....X X
X *X X XXXXXX *XXX
XX X XXX** * * X
XX X * * XX X
XXXXX X XXXXXXX
XXXXXXXXX
*************************************
Maze: 56
File offset: 2451, DS:10C1, table offset: 0FC5
Size X: 14
Size Y: 16
End: 248B
Length: 59
XXXXXXXXXX
X XXXX
X XXXXXX X XX
X X * * * * X
X X* X
XXX* **X XXX
X XX X *XX
XX*X * @X
X * * XXX
X X * X
X XX X X
XX XXXXX X
X X
X.......XXX
X.......X
XXXXXXXXX
*************************************
Maze: 57
File offset: 248C, DS:10FC, table offset: 1000
Size X: 18
Size Y: 11
End: 24BD
Length: 50
XXXX
XXXXXXXXX XX
XX * * XXXXX
X XX XX XX...X
X X** * **X*XX...X
X X @ X ...X
X *X XXX** ...X
X * ** * XX....X
XXX* XXXXXXX
X XXXXXXX
XXXX
*************************************
Maze: 58
File offset: 24BE, DS:112E, table offset: 1032
Size X: 27
Size Y: 20
End: 2542
Length: 133
XXXXXX
XXXXX X
X XX X XXXXX
X &.X..X X
XXXXX XXXX *X.X... X
X XXX XX X&....XX XX
X * XX X..X..XX X
XXXXXX X X X&.XXXXX X
X X *X*X X X..XXXXX X
X * * X X&. X X
XX XX * XXX X XX X X
X * * XXX XXXXX XX X
XXX*XXX*XXX XXXX XX X
XXXX X XXX X X
X * X *XXXX XXX**X@XXXXX
X * X X XXXX X*X X
XXXX X *X X X
X * X XX XX XXXXXXXX
XX XXX XXXXXXXX
XXXX
*************************************
Maze: 59
File offset: 2543, DS:11B3, table offset: 10B7
Size X: 29
Size Y: 20
End: 25DA
Length: 152
XXXX
X X
X XXXXXXXX
XXXXXXX X X
X X X X X X XX
X * * XX * X
XXX *X X X X XXXXXXXXX
X * X *X X ** X X X X
XX X X XXX * X X X
X X* X XXX X X **X X X
X *XX * X XX * X X XX
XXXX* * X XX X * ..X
X X XXX X * * XXX XXX.&X
X XX ** @ * XX....X
X XX XX * X*X XX....&.X
XX X * X X *XX XX....&.XXX
XX XX * X * X X....&.XXX
X * XXXX X ....&.XXX
X X X X X ..&.XXX
XXXXXXXX XXXXXXXXXXX
*************************************
Maze: 60
File offset: 25DB, DS:124B, table offset: 114F
Size X: 26
Size Y: 16
End: 2646
Length: 108
XXXXX
X XXXX
X * XXXX XXXX
X X *X XXXX X
XXXXXXXXXXX X * X X
X.. X * XXXX X X X
X..* X * X * X * .XX
X.&X X * * XX XX X.X
X..X* @ X XX ** X.X
X..X * * * * XX XX .X
X.&** X XX * X*X * X.X
X..X XX X X.X
X..XXXXXXX XXX XXXXXX.XX
X ** &.XX
X XXXXXXXXXXXXXXXXXX ..X
XXXX XXXXXX
*************************************
package com.javarush.task.task34.task3410.view;
import com.javarush.task.task34.task3410.controller.EventListener;
import com.javarush.task.task34.task3410.model.Direction;
import com.javarush.task.task34.task3410.model.GameObject;
import com.javarush.task.task34.task3410.model.GameObjects;
import com.javarush.task.task34.task3410.model.Model;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Set;
/**
* Created by Administrator on 26.05.2017.
*/
public class Field extends JPanel
{
private View view;
private EventListener eventListener;
public Field(View view)
{
this.view = view;
this.addKeyListener(new KeyHandler());
this.setFocusable(true);
}
public void setEventListener(EventListener eventListener)
{
this.eventListener = eventListener;
}
public void paint(Graphics g)
{
g.setColor ( Color.BLACK );
g.fillRect ( 0, 0, Model.WIDTH_WINDOW, Model.HEIGHT_WINDOW );
GameObjects gameObjects = view.getGameObjects ( );
Set<GameObject> set = gameObjects.getAll ( );
for (GameObject gameObject : set)
gameObject.draw ( g );
}
public class KeyHandler extends KeyAdapter
{
@Override
public void keyPressed(KeyEvent e)
{
switch (e.getKeyCode ( ))
{
case KeyEvent.VK_LEFT:eventListener.move ( Direction.LEFT);
break;
case KeyEvent.VK_RIGHT:eventListener.move ( Direction.RIGHT);
break;
case KeyEvent.VK_UP:eventListener.move ( Direction.UP);
break;
case KeyEvent.VK_DOWN:eventListener.move ( Direction.DOWN);
break;
case KeyEvent.VK_R:eventListener.restart ();
break;
case KeyEvent.VK_X:System.exit(0);
break;
}
}
}
}
package com.javarush.task.task34.task3410.view;
import com.javarush.task.task34.task3410.controller.Controller;
import com.javarush.task.task34.task3410.controller.EventListener;
import com.javarush.task.task34.task3410.model.GameObjects;
import com.javarush.task.task34.task3410.model.Model;
import javax.swing.*;
public class View extends JFrame
{
private Controller controller;
private Field field;
public View(Controller controller)
{
this.controller = controller;
}
public void init()
{
field = new Field ( this );
add ( field );
setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
setSize ( Model.WIDTH_WINDOW, Model.HEIGHT_WINDOW );
setLocationRelativeTo ( null );
setTitle ( "Сокобан" );
setVisible ( true );
}
public void setEventListener(EventListener eventListener)
{
field.setEventListener ( eventListener );
}
public void update()
{
field.repaint ( );
}
public GameObjects getGameObjects()
{
return controller.getGameObjects ( );
}
public void completed(int level)
{
update ( );
JOptionPane.showMessageDialog ( null, "Level Ok" );
controller.startNextLevel();
/*
update();
JOptionPane.showMessageDialog(null, level + "Completed", "Level", JOptionPane.INFORMATION_MESSAGE);
controller.startNextLevel();
* */
}
}
taskKey="com.javarush.task.task34.task3410.big17"
Sokoban (17)
Ты супергерой! Ты сделал отличную игру, можешь немного отдохнуть и поиграть в нее.
Если она тебе когда-либо надоест, что практически невозможно, можешь заняться ее улучшениями:
17.1. Использовать картинки для отображения объектов.
17.2. Сделать редактор уровней.
17.3. Добавить рейтинги, можешь даже сетевые : )
17.4. Переделать игру под мобильную платформу, опубликовать в магазине и
заработать кучу денег.
Так держать, ты стал еще на один шаг ближе к карьере программиста!
Требования:
1. Еще одна большая задача пройдена!.
Sokoban (16)
Осталось дописать реализацию загрузчика уровней.
16.1. Открой файл levels.txt и внимательно изучи структуру файла. Символ ‘X’ –
означает стену, ‘*’ - ящик, ‘.’ – дом, ‘&’ – ящик который стоит в доме, а ‘@’ - игрока.
Всего в файле 60 уровней.
16.2. Реализуй метод GameObjects getLevel(int level). Он должен:
16.2.1. Вычитывать из файла данные уровня level. Уровни должны повторяться
циклически, если пользователь прошел все 60 уровней и попал на 61 уровень, то
ему нужно вернуть 1, вместо 62 уровня вернуть 2 и т.д.
16.2.2. Создать все игровые объекты, описанные в указанном уровне. Координаты
каждого игрового объекта должны быть рассчитаны согласно следующей логике:
16.2.2.1. Самый верхний левый объект (если такой есть) должен иметь
координаты x = x0 = FIELD_CELL_SIZE / 2 и y = y0 = FIELD_CELL_SIZE / 2.
16.2.2.2. Объект, который находится на одну позицию правее от него должен
иметь координаты x = x0 + FIELD_CELL_SIZE и y = y0.
16.2.2.3. Объект, который находится на одну позицию ниже от самого верхнего
левого должен иметь координаты x = x0 и y = y0 + FIELD_CELL_SIZE.
16.2.2.4. Аналогично должны рассчитываться координаты любого объекта на поле.
16.2.3. Создать новое хранилище объектов GameObjects и поместить в него все объекты.
16.2.4. Вернуть созданное хранилище.
Игра должна быть полностью рабочей. Проверь, если есть какие-то проблемы исправь их.
Sokoban (15)
Пришло время реализовать метод модели, отвечающий за движение move(), но для
начала реализуем вспомогательные методы. Добавь в класс модели методы:
15.1. boolean checkWallCollision(CollisionObject gameObject, Direction direction). Этот
метод проверяет столкновение со стеной. Он должен вернуть true, если при движении
объекта gameObject в направлении direction произойдет столкновение со стеной,
иначе false. Для определения столкновения используй метод isCollision() у игрового
объекта.
15.2. boolean checkBoxCollisionAndMoveIfAvaliable(Direction direction). Этот метод проверяет
столкновение с ящиками. Метод должен:
15.2.1. Вернуть true, если игрок не может быть сдвинут в направлении direction (там
находится: или ящик, за которым стена; или ящик за которым еще один ящик).
15.2.2. Вернуть false, если игрок может быть сдвинут в направлении direction (там
находится: или свободная ячейка; или дом; или ящик, за которым свободная
ячейка или дом). При это, если на пути есть ящик, который может быть сдвинут, то
необходимо переместить этот ящик на новые координаты. Обрати внимание, что
все объекты перемещаются на фиксированное значение FIELD_CELL_SIZE, не
зависящее от размеров объекта, которые используются для его отрисовки.
Подсказка: для определения столкновений используй методы isCollision() игровых
объектов и метод checkWallCollision() модели.
15.3. void checkCompletion(). Этот метод должен проверить пройден ли уровень (на
всех ли домах стоят ящики, их координаты должны совпадать). Если условие
выполнено, то проинформировать слушателя событий, что текущий уровень завершен.
15.4. void move(Direction direction). Метод должен:
15.4.1. Проверить столкновение со стеной (метод checkWallCollision()), если есть
столкновение – выйти из метода.
15.4.2. Проверить столкновение с ящиками (метод checkBoxCollisionAndMoveIfAvaliable()), если есть
столкновение – выйти из метода.
15.4.3. Передвинуть игрока в направлении direction.
15.4.4. Проверить завершен ли уровень.
Запусти программу и проверь, что игрока можно перемещать, он может перемещать
ящики, стены преграждают движение, а при перемещении всех ящиков в дома выводится
сообщение о прохождении уровня.
Sokoban (14)
Добавим немного интерактивности в нашу игру (перемещение игрока с помощью
клавиатуры). Начнем с обработки нажатия клавиш клавиатуры.
14.1. Добавь в класс Field вложенный класс KeyHandler унаследованный от
KeyAdapter.
14.2. Перегрузи у него метод keyPressed(). Если была нажата клавиша с кодом
VK_LEFT, то пошли eventListener-у событие move с параметром Direction.LEFT.
Аналогичным образом обработай нажатия клавиш с кодом VK_RIGHT, VK_UP и
VK_DOWN. Если пользователь нажал клавишу R с кодом VK_R, то вызови у слушателя
событий метод restart().
14.3. В конструкторе класса Field:
14.3.1. Создай объект класса KeyHandler.
14.3.2. Добавь его слушателем с помощью метода addKeyListener().
14.3.3. Установи focusable в true (метод setFocusable()).
Sokoban (13)
Наполним контроллер функционалом.
13.1. Добавь в конструктор класса Controller к тому, что уже есть еще и установку
слушателя событий у модели и представления. Слушателем должен быть сам контроллер.
13.2. Реализуй методы контроллера:
13.2.1. move(Direction direction) – должен вызывать move(Direction direction) у модели
и update() у представления. Метода move() у модели еще нет, добавь для него
заглушку, мы его реализуем позже.
13.2.2. restart() – должен перезапускать модель и обновлять представление.
13.2.3. startNextLevel() – должен запускать у модели новый уровень и обновлять
представление.
13.3. Добавь в представление метод completed(int level), который будет сообщать
пользователю, что уровень level пройден. Метод должен:
13.3.1. Обновлять представление.
13.3.2. Показывать диалоговое окно с информацией о том, что пользователь прошел
какой-то уровень. Подсказка: используй JOptionPane.showMessageDialog.
13.3.3. Просить контроллер запустить следующий уровень.
13.4. Реализуй в контроллере метод levelCompleted(int level), он должен вызвать
метод completed() у представления.
Sokoban (12)
Попробуем организовать взаимодействие представления и модели.
12.1. Добавь в класс View метод update(), он должен вызывать у игрового поля field
метод repaint(). Другими словами, метод update() будет обновлять представление
(перерисовывать поле).
12.2. Добавь в класс контроллера метод GameObjects getGameObjects(), он должен
запросить игровые объекты у модели и вернуть их. Добавь такой же метод и в класс
представления, он должен получать объекты у контроллера.
12.3. Правильно реализуй в классе Field метод paint(Graphics g). Он должен:
12.3.1. Залить все поле каким-то цветом, например, черным (вызови методы setColor и
fillRect).
12.3.2. Получить у представления все игровые объекты.
12.3.3. Отрисовать все игровые объекты.
12.4. Контроллер в своем конструкторе должен перезапускать модель.
Запусти программу и проверь, что все игровые объекты рисуются правильно.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment