Created
May 26, 2017 18:37
-
-
Save fermopili/3db8a9872e037d38c90d18828b521df6 to your computer and use it in GitHub Desktop.
com.javarush.task.task34.task3410 SOKOBAN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ( ); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task34.task3410.model; | |
/** | |
* Created by Administrator on 26.05.2017. | |
*/ | |
public enum Direction | |
{ | |
LEFT, | |
RIGHT, | |
UP, | |
DOWN | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task34.task3410.model; | |
/** | |
* Created by Administrator on 26.05.2017. | |
*/ | |
public interface Movable | |
{ | |
void move(int x, int y); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
************************************* | |
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 | |
************************************* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
* */ | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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