1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/*
* ksokoban - a Sokoban game for KDE
* Copyright (C) 1998 Anders Widell <d95-awi@nada.kth.se>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MAP_H
#define MAP_H
#include <assert.h>
#define MAX_X 49
#define MAX_Y 49
#define WALL 1
#define GOAL 2
#define OBJECT 4
#define FLOOR 8
class Map {
friend class MapDelta;
friend class LevelCollection;
public:
Map();
bool completed () const { return objectsLeft_ <= 0; }
bool step (int _x, int _y);
bool push (int _x, int _y);
bool unstep (int _x, int _y);
bool unpush (int _x, int _y);
static bool badCoords (int _x, int _y) {
return _x<0 || _y<0 || _x>MAX_X || _y>MAX_Y;
}
static bool badDelta (int _xd, int _yd) {
return (_xd!=0 && _yd!=0) || (_xd==0 && _yd==0);
}
int xpos () const { return xpos_; }
int ypos () const { return ypos_; }
bool empty (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+1] & (WALL|OBJECT)) == 0;
}
bool wall (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+1] & WALL) != 0;
}
bool goal (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+1] & GOAL) != 0;
}
bool object (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+1] & OBJECT) != 0;
}
bool floor (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+1] & FLOOR) != 0;
}
bool wallUp (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y ][x+1] & WALL) != 0;
}
bool wallDown (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+2][x+1] & WALL) != 0;
}
bool wallLeft (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x ] & WALL) != 0;
}
bool wallRight (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return (currentMap_[y+1][x+2] & WALL) != 0;
}
void printMap ();
int width() const { return width_; }
int height() const { return height_; }
protected:
int map (int x, int y) {
assert (x>=0 && x<=MAX_X && y>=0 && y<=MAX_Y);
return currentMap_[y+1][x+1];
}
void map (int x, int y, int val);
void setMap (int x, int y, int bits);
void clearMap (int x, int y, int bits);
void clearMap ();
bool fillFloor (int x, int y);
int objectsLeft () const { return objectsLeft_; }
int xpos_, ypos_;
private:
char currentMap_[MAX_Y+3][MAX_X+3];
int width_, height_;
int objectsLeft_;
};
#endif /* MAP_H */
|