Develop and Download Open Source Software

Browse Subversion Repository

Contents of /meijiro/KMaze.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (show annotations) (download) (as text)
Thu Aug 4 21:57:23 2011 UTC (12 years, 9 months ago) by kaityo
File MIME type: text/x-c++src
File size: 13701 byte(s)
Change dir tree
1 //---------------------------------------------------------------------------
2 // –Ŕ˜HƒNƒ‰ƒX
3 // $Id: KMaze.cpp 352 2006-08-12 16:42:46Z kaityo $
4 //---------------------------------------------------------------------------
5 #include <vcl.h>
6 #include <iostream>
7 #pragma hdrstop
8 #include <fstream>
9
10 using namespace std;
11
12 #include "KMaze.h"
13
14 TColor KMaze::BGColor = clLtGray;
15 TColor KMaze::FGColor = clWhite;
16 TColor KMaze::LineColor = clGray;
17 TColor KMaze::TransparentColor = clYellow;
18
19 TColor KMaze::GridColor = clGray;
20
21 const int KMaze::GridSizeMin = 3;
22 const int KMaze::GridSizeMax = 20;
23
24 //---------------------------------------------------------------------------
25 #pragma package(smart_init)
26
27 inline double
28 myrand(void) {
29 return (double)rand()/(double)RAND_MAX;
30 }
31 //---------------------------------------------------------------------------
32 inline bool
33 myrand_bool(void) {
34 if(myrand()<0.5)
35 return true;
36 else
37 return false;
38 }
39 //---------------------------------------------------------------------------
40 inline bool
41 myrand_bool(double Rate) {
42 if(myrand()<Rate)
43 return true;
44 else
45 return false;
46 }
47 //---------------------------------------------------------------------------
48 /**
49 * ƒRƒ“ƒXƒgƒ‰ƒNƒ^
50 */
51 KMaze::KMaze(void) {
52 bond_h = NULL;
53 bond_v = NULL;
54 ansbond_h = NULL;
55 ansbond_v = NULL;
56 Point = NULL;
57 bOccupiedGrid = NULL;
58
59 bDrawAnswer = true;
60 GridSize = 10;
61 TransparentMode = false;
62 TopMargin = GridSize;
63 LeftMargin = GridSize;
64
65 StartPointColor = clRed;
66 EndPointColor = clBlue;
67 SX = 0;
68 SY = 0;
69 EX = 0;
70 EY = 0;
71 SetSize(40,40);
72 Init();
73 InitAnswer();
74 }
75 //---------------------------------------------------------------------------
76 /**
77 * ƒfƒXƒgƒ‰ƒNƒ^
78 \ */
79 KMaze::~KMaze(void) {
80 if(bond_h!=NULL){
81 delete bond_h;
82 }
83 if(bond_v!=NULL){
84 delete bond_v;
85 }
86 if(ansbond_h!=NULL){
87 delete ansbond_h;
88 }
89 if(ansbond_v!=NULL){
90 delete ansbond_v;
91 }
92 if(Point!=NULL){
93 delete Point;
94 }
95 if(bOccupiedGrid !=NULL){
96 delete bOccupiedGrid;
97 }
98 }
99 //---------------------------------------------------------------------------
100 /**
101 * ‰đ“š‰Šú‰ť
102 */
103 void
104 KMaze::InitAnswer(void) {
105 //‰đ“š‚̏‰Šú‰ť
106 for(int i=0;i<(LX+1)*LY;i++) {
107 ansbond_h[i] = false;
108 }
109 for(int i=0;i<LX*(LY+1);i++) {
110 ansbond_v[i] = false;
111 }
112 for(int i=0;i<LX*LY;i++){
113 bOccupiedGrid[i] = false;
114 }
115 EX = SX;
116 EY = SY;
117 bDrawAnswer = true;
118 }
119 //---------------------------------------------------------------------------
120 /**
121 * ‰Šú‰ť
122 */
123 void
124 KMaze::Init(void) {
125 for(int i=0;i<(LX+1)*LY;i++) {
126 bond_h[i] = false;
127 }
128 for(int i=0;i<LX*(LY+1);i++) {
129 bond_v[i] = false;
130 }
131 for(int i=0;i<LX*LY;i++) {
132 Point[i] = i;
133 }
134 //‰đ“š‚ĚƒRƒs[
135 for(int i=0;i<(LX+1)*LY;i++) {
136 bond_h[i] = ansbond_h[i];
137 }
138 for(int i=0;i<LX*(LY+1);i++) {
139 bond_v[i] = ansbond_v[i];
140 }
141 }
142 //---------------------------------------------------------------------------
143 /**
144 * ƒTƒCƒY•ύX
145 */
146 void
147 KMaze::SetSize(int _LX, int _LY) {
148 LX = _LX;
149 LY = _LY;
150 SX = -1;
151 SY = 0;
152 EX = SX;
153 EY = SY;
154
155 if(bond_h!=NULL){
156 delete bond_h;
157 }
158 if(bond_v!=NULL){
159 delete bond_v;
160 }
161 if(ansbond_h!=NULL){
162 delete ansbond_h;
163 }
164 if(ansbond_v!=NULL){
165 delete ansbond_v;
166 }
167 if(Point!=NULL){
168 delete Point;
169 }
170 if(bOccupiedGrid !=NULL){
171 delete bOccupiedGrid;
172 }
173
174 bond_h = new bool[(LX+1)*LY];
175 bond_v = new bool[LX*(LY+1)];
176 ansbond_h = new bool[(LX+1)*LY];
177 ansbond_v = new bool[LX*(LY+1)];
178
179 Point = new int[LX*LY*2];
180 bOccupiedGrid = new bool[LX*LY];
181
182 InitAnswer();
183 Init();
184 }
185 //---------------------------------------------------------------------------
186 void
187 KMaze::GetDrawSize(int &Width, int &Height) {
188 Width = LX*GridSize + LeftMargin*2;
189 Height = LY*GridSize + TopMargin*2;
190 }
191 //---------------------------------------------------------------------------
192 void
193 KMaze::DrawPoint(TCanvas *Canvas) {
194
195 Clastering();
196 static TColor Colors[] = {clAqua,clBlue,clFuchsia,clGray,clGreen,clLime,clMaroon};
197 int ColorNum = sizeof(Colors)/sizeof(TColor);
198 for(int ix=0;ix<LX;ix++) {
199 for(int iy = 0;iy < LY; iy++) {
200 int x1 = ix*GridSize+2 + LeftMargin;
201 int y1 = iy*GridSize+2 + TopMargin;
202 int x2 = x1 + GridSize-3;
203 int y2 = y1 + GridSize-3;
204 int index = GetClasterIndex(ix,iy);
205 Canvas->Brush->Color = Colors[index % ColorNum];
206 Canvas->FillRect(Rect(x1,y1,x2,y2));
207 }
208 }
209 }
210 //---------------------------------------------------------------------------
211 /**
212 *
213 */
214 void
215 KMaze::Draw(TCanvas *Canvas) {
216 int w = GridSize * LX+LeftMargin*2;
217 int h = GridSize * LY+TopMargin*2;
218
219 Canvas->Brush->Color = BGColor;
220 Canvas->FillRect(Rect(0,0,w,h));
221
222 Canvas->Brush->Color = FGColor;
223 Canvas->FillRect(Rect(LeftMargin,TopMargin,GridSize * LX + LeftMargin,GridSize * LY + LeftMargin));
224
225
226 if(bDrawAnswer) {
227 DrawAnswerBold(Canvas);
228 }
229
230
231 Canvas->Pen->Color = LineColor;
232 for(int ix=0;ix<LX+1;ix++) {
233 for(int iy = 0;iy < LY; iy++) {
234 if(Bond_h[ix][iy]==true)
235 continue;
236 int x = ix*GridSize+LeftMargin;
237 int y = iy*GridSize+TopMargin;
238 Canvas->MoveTo(x,y);
239 Canvas->LineTo(x,y+GridSize);
240 }
241 }
242 for(int ix=0;ix<LX;ix++) {
243 for(int iy = 0;iy < LY+1; iy++) {
244 if(Bond_v[ix][iy]==true)
245 continue;
246 int x = ix*GridSize+LeftMargin;
247 int y = iy*GridSize+TopMargin;
248 Canvas->MoveTo(x,y);
249 Canvas->LineTo(x+GridSize,y);
250 }
251 }
252 //DrawPoint(Canvas);
253 }
254 //---------------------------------------------------------------------------
255 /**
256 * ‰đ“š‚đ•`‚­
257 */
258 void
259 KMaze::DrawAnswerBold(TCanvas *Canvas) {
260
261 Canvas->Pen->Color = clRed;
262 Canvas->Brush->Color = clRed;
263 for(int ix=0;ix<LX+1;ix++) {
264 for(int iy = 0;iy < LY; iy++) {
265 if(!AnswerBond_h[ix][iy])
266 continue;
267 int x = (ix-1)*GridSize+LeftMargin;
268 int y = iy*GridSize+TopMargin;
269 Canvas->FillRect(Rect(x,y,x+GridSize*2,y+GridSize));
270 }
271 }
272 for(int ix=0;ix<LX;ix++) {
273 for(int iy = 0;iy < LY+1; iy++) {
274 if(!AnswerBond_v[ix][iy])
275 continue;
276 int x = ix*GridSize+LeftMargin;
277 int y = (iy-1)*GridSize+TopMargin;
278 Canvas->FillRect(Rect(x,y,x+GridSize,y+GridSize*2));
279 }
280 }
281 }
282 //---------------------------------------------------------------------------
283 /**
284 * ‰đ“š‚đ•`‚­
285 */
286 void
287 KMaze::DrawAnswer(TCanvas *Canvas) {
288
289 Canvas->Pen->Color = clRed;
290 for(int ix=0;ix<LX+1;ix++) {
291 for(int iy = 0;iy < LY; iy++) {
292 if(!AnswerBond_h[ix][iy])
293 continue;
294 int x = ix*GridSize+LeftMargin-GridSize/2;
295 int y = iy*GridSize+TopMargin+GridSize/2;
296 Canvas->MoveTo(x,y);
297 Canvas->LineTo(x+GridSize,y);
298 }
299 }
300 for(int ix=0;ix<LX;ix++) {
301 for(int iy = 0;iy < LY+1; iy++) {
302 if(!AnswerBond_v[ix][iy])
303 continue;
304 int x = ix*GridSize+LeftMargin+GridSize/2;
305 int y = iy*GridSize+TopMargin-GridSize/2;
306 Canvas->MoveTo(x,y);
307 Canvas->LineTo(x,y+GridSize);
308 }
309 }
310 //ƒXƒ^[ƒg’n“_AƒS[ƒ‹’n“_
311 int x = SX*GridSize+LeftMargin;
312 int y = SY*GridSize+TopMargin;
313 Canvas->Pen->Color = StartPointColor;
314 Canvas->Brush->Color = StartPointColor;
315 Canvas->Ellipse(x,y,x+GridSize,y+GridSize);
316
317 x = EX*GridSize+LeftMargin;
318 y = EY*GridSize+TopMargin;
319 Canvas->Pen->Color = EndPointColor;
320 Canvas->Brush->Color = EndPointColor;
321 Canvas->Ellipse(x,y,x+GridSize,y+GridSize);
322 }
323 //---------------------------------------------------------------------------
324 /**
325 * OccupiedGrid‚̉Ž‹‰ť (ƒfƒoƒbƒO—p)
326 */
327 void
328 KMaze::DrawOccupiedGrid(TCanvas *Canvas) {
329 for(int ix=0;ix<LX;ix++) {
330 for(int iy = 0;iy < LY; iy++) {
331 if(!OccupiedGrid[ix][iy]){
332 continue;
333 }
334 int x1 = ix*GridSize+2 + LeftMargin;
335 int y1 = iy*GridSize+2 + TopMargin;
336 int x2 = x1 + GridSize-3;
337 int y2 = y1 + GridSize-3;
338 Canvas->Brush->Color = clGray;
339 Canvas->FillRect(Rect(x1,y1,x2,y2));
340 }
341 }
342 }
343 //---------------------------------------------------------------------------
344 /**
345 *
346 */
347 void
348 KMaze::DrawGrid(TCanvas *Canvas) {
349 int w = GridSize * LX+LeftMargin*2;
350 int h = GridSize * LY+TopMargin*2;
351
352 Canvas->Brush->Color = BGColor;
353 Canvas->FillRect(Rect(0,0,w,h));
354
355 if(TransparentMode) {
356 Canvas->Brush->Color = TransparentColor;
357 } else {
358 Canvas->Brush->Color = FGColor;
359 }
360 Canvas->FillRect(Rect(LeftMargin,TopMargin,GridSize * LX + LeftMargin,GridSize * LY + LeftMargin));
361
362
363 Canvas->Pen->Color = GridColor;
364 for(int ix=0;ix<=LX;ix++) {
365 int x1 = ix*GridSize + LeftMargin;
366 int y1 = TopMargin;
367 int x2 = x1;
368 int y2 = y1 + LY*GridSize;
369 Canvas->MoveTo(x1,y1);
370 Canvas->LineTo(x2,y2);
371 }
372 for(int iy=0;iy<=LX;iy++) {
373 int x1 = TopMargin;
374 int y1 = iy*GridSize + TopMargin;
375 int x2 = x1 + LX*GridSize;
376 int y2 = y1;
377 Canvas->MoveTo(x1,y1);
378 Canvas->LineTo(x2,y2);
379 }
380 }
381 //---------------------------------------------------------------------------
382 // –Ŕ˜HěŹ
383 //---------------------------------------------------------------------------
384 void
385 KMaze::Connect(int ix1, int iy1, int ix2, int iy2) {
386 int i1 = GetClasterIndex(ix1,iy1);
387 int i2 = GetClasterIndex(ix2,iy2);
388 if(i1<i2)
389 Point[i2] = i1;
390 else
391 Point[i1] = i2;
392 }
393 //---------------------------------------------------------------------------
394 void
395 KMaze::MakeMazeSub(void) {
396 const double Rate = 0.2;
397
398 for(int ix=0;ix<LX-1;ix++) {
399 for(int iy=0;iy<LY;iy++) {
400 if(GetClasterIndex(ix,iy)!=GetClasterIndex(ix+1,iy) && myrand_bool(Rate)) {
401 Bond_h[ix+1][iy] = true;
402 Connect(ix,iy,ix+1,iy);
403 }
404 }
405 }
406 for(int ix=0;ix<LX;ix++) {
407 for(int iy=0;iy<LY-1;iy++) {
408 if(GetClasterIndex(ix,iy)!=GetClasterIndex(ix,iy+1) && myrand_bool(Rate)) {
409 Connect(ix,iy,ix,iy+1);
410 Bond_v[ix][iy+1] = true;
411 }
412 }
413 }
414
415 }
416 //---------------------------------------------------------------------------
417 void
418 KMaze::MakeMazeFinal(void) {
419 for(int ix=0;ix<LX-1;ix++) {
420 for(int iy=0;iy<LY-1;iy++) {
421 if(GetClasterIndex(ix,iy)!=GetClasterIndex(ix+1,iy)) {
422 Connect(ix,iy,ix+1,iy);
423 Bond_h[ix+1][iy] = true;
424 }
425 }
426 }
427 }
428 //---------------------------------------------------------------------------
429 void
430 KMaze::MakeMaze(void) {
431 Init();
432 Clastering();
433 const int LOOP = 10;
434 for(int i=0;i<LOOP;i++) {
435 MakeMazeSub();
436 }
437 MakeMazeFinal();
438 }
439 //---------------------------------------------------------------------------
440 // ƒNƒ‰ƒXƒ^ƒŠƒ“ƒOŠÖŒW
441 //---------------------------------------------------------------------------
442 int
443 KMaze::GetClasterIndex(int x, int y) {
444 if(x>=LX) {
445 ShowMessage("Error LX");
446 exit(1);
447 }
448 if(y>=LY) {
449 ShowMessage("Error LY");
450 exit(1);
451 }
452 int index = LX*y+x;
453 while(index !=Point[index]) {
454 index = Point[index];
455 }
456 return index;
457 }
458 //---------------------------------------------------------------------------
459 void
460 KMaze::Clastering(void) {
461 for(int i=0;i<LX*LY;i++) {
462 Point[i] = i;
463 }
464 for(int ix=0;ix<LX;ix++) {
465 for(int iy=0;iy<LY;iy++) {
466 if(ix!=LX-1 && Bond_h[ix+1][iy]) {
467 Connect(ix,iy,ix+1,iy);
468 }
469 if(iy!=LY-1 && Bond_v[ix][iy+1]) {
470 Connect(ix,iy,ix,iy+1);
471 }
472 }
473 }
474 }
475 //---------------------------------------------------------------------------
476 // File I/O
477 //---------------------------------------------------------------------------
478 void
479 KMaze::SaveToFile(char *filename) {
480 ofstream fout;
481 fout.open(filename, ios::out|ios::binary);
482 char *text = "MAZE";
483 fout.write(text,sizeof(text));
484 fout.write((char *)&LX,sizeof(LX));
485 fout.write((char *)&LY,sizeof(LY));
486 fout.write((char *)&SX,sizeof(SX));
487 fout.write((char *)&SY,sizeof(SY));
488 fout.write((char *)&EX,sizeof(EX));
489 fout.write((char *)&EY,sizeof(EY));
490 fout.write((char *)&SizeofGrid,sizeof(SizeofGrid));
491 fout.write((char *)bond_h,sizeof(bool)*(LX+1)*LY);
492 fout.write((char *)bond_v,sizeof(bool)*LX*(LY+1));
493 fout.write((char *)ansbond_h,sizeof(bool)*(LX+1)*LY);
494 fout.write((char *)ansbond_v,sizeof(bool)*LX*(LY+1));
495 fout.close();
496 }
497 //---------------------------------------------------------------------------
498 bool
499 KMaze::LoadFromFile(char *filename) {
500 ifstream fin;
501 fin.open(filename, ios::in|ios::binary);
502 char sHead[5];
503 fin.read(sHead,sizeof(char)*4);
504 sHead[4] = NULL;
505 AnsiString Head = sHead;
506 if(Head != "MAZE") {
507 return false;
508 }
509 fin.read((char *)&LX,sizeof(LX));
510 fin.read((char *)&LY,sizeof(LY));
511 fin.read((char *)&SX,sizeof(SX));
512 fin.read((char *)&SY,sizeof(SY));
513 fin.read((char *)&EX,sizeof(EX));
514 fin.read((char *)&EY,sizeof(EY));
515 fin.read((char *)&SizeofGrid,sizeof(SizeofGrid));
516 SetSize(LX,LY);
517 fin.read((char *)bond_h,sizeof(bool)*(LX+1)*LY);
518 if(fin.bad()) {
519 return false;
520 }
521 fin.read((char *)bond_v,sizeof(bool)*LX*(LY+1));
522 if(fin.bad()) {
523 return false;
524 }
525 fin.read((char *)ansbond_h,sizeof(bool)*(LX+1)*LY);
526 if(fin.bad()) {
527 return false;
528 }
529 fin.read((char *)ansbond_v,sizeof(bool)*LX*(LY+1));
530 if(fin.bad()) {
531 return false;
532 }
533 fin.close();
534 TopMargin = GridSize;
535 LeftMargin = GridSize;
536
537 return true;
538 }
539 //---------------------------------------------------------------------------
540

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26