1
2 #ifndef __global_h
3 # include "global.H"
4 #endif
5 #ifndef __board_h
6 # include "board.H"
7 #endif
8 #ifndef __tile_h
9 # include "tile.H"
10 #endif
11
12 #include <stdlib.h>
13
Board(int width,int height)14 Board::Board( int width, int height )
15 {
16 dx = width;
17 dy = height;
18 ntiles = dx * dy;
19 if (ntiles%2) dx++; // make even dimension
20 ntiles = dx * dy;
21 ntiles /= 2;
22
23 Tile::init_used_syms(ntiles);
24 f = new Field[2*ntiles];
25 }
26
~Board()27 Board::~Board() {
28 delete f;
29 }
30
check_swap(int op,int np)31 int Board::check_swap( int op, int np ) {
32 int x1,y1,x2,y2;
33 int j;
34 int help;
35 int dist;
36 #ifndef ABS
37 # define ABS(x) (((x)>0)?(x):-(x))
38 #endif
39
40 help=f[op].tile_id;
41 x1=np%dx;
42 y1=np/dx;
43 for (j=0;j<2*ntiles;j++)
44 if (help==f[j].tile_id&&j!=op) break;
45 x2=j%dx;
46 y2=j/dx;
47 dist=ABS(x1-x2)+ABS(y1-y2);
48 if (dist<3) return 0;
49
50 help=f[np].tile_id;
51 x1=op%dx;
52 y1=op/dx;
53 for (j=0;j<2*ntiles;j++)
54 if (help==f[j].tile_id&&j!=np) break;
55 x2=j%dx;
56 y2=j/dx;
57 dist=ABS(x1-x2)+ABS(y1-y2);
58 if (dist<3) return 0;
59
60 return 1;
61 }
62
reset()63 void Board::reset() {
64 int i,j;
65 Field help;
66
67 for (i=0;i<2*ntiles;i++) f[i].reset(i/2);
68 for (i=0;i<2*ntiles;i++) {
69 do {
70 j = rand()%(2*ntiles);
71 } while (!check_swap(i,j));
72 help = f[i];
73 f[i] = f[j];
74 f[j] = help;
75 }
76 tiles_left=ntiles;
77 finished=0;
78 }
79
color_removed(int id)80 void Board::color_removed( int id ) {
81 int i;
82 int back=0;
83
84 for (i=0;i<2*ntiles;i++) {
85 if (f[i].lock_col>=id) {
86 if (f[i].lock_col==id) {
87 f[i].locked=0;
88 f[i].found =0;
89 f[i].flash =0;
90 if (f[i].gone) {
91 f[i].gone=0;
92 back++;
93 }
94 }
95 f[i].lock_col--;
96 }
97 }
98 tiles_left+=(back/2);
99 if (tiles_left) finished=0;
100 }
101
tile_removed(int)102 int Board::tile_removed(int /* color_id */) {
103 if (--tiles_left) return 0;
104 else {
105 finished = current_time;
106 return 1;
107 }
108 }
109
field(int x,int y)110 Field *Board::field( int x, int y )
111 {
112 if ((x<0)||(x>=dx)||(y<0)||(y>=dy)) return(0);
113 return( &f[x+y*dx] );
114 }
115
field(int fid)116 Field *Board::field( int fid )
117 {
118 return( field( fid%dx, fid/dx ) );
119 }
120
121