Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
zmx0142857
GitHub Repository: zmx0142857/mini-games
Path: blob/master/c/sokoban/0.1/sokoban.c
362 views
1
#include "Sokoban.h"
2
//��ʾ������ʹ������鿴���ļ���
3
4
//����ȫ�ֱ���
5
int Map[MAP_H][MAP_W] ={0};
6
int MapCopy[MAP_H][MAP_W] ={0};
7
int Hero[2] ={0};
8
int Door[2] ={0};
9
int nLevel =0;
10
int nMove =0;
11
int nPush =0;
12
static int GateOpen =0; //�����Ƿ�һ�ȴ�?
13
14
//��ʼ��1: ֻ��յ�ͼ����
15
void InitializeCopy()
16
{
17
int i,j;
18
for(i=0; i<MAP_H; i++)
19
for(j=0; j<MAP_W; j++)
20
MapCopy[i][j] = 0;
21
}
22
23
//��ʼ��2: ����ƶ������������������ŵ�ͼ
24
void InitializeAll()
25
{
26
nMove = 0;
27
nPush = 0;
28
29
int i,j;
30
for(i=0; i<MAP_H; i++)
31
{
32
for(j=0; j<MAP_W; j++)
33
{
34
Map[i][j] = 0;
35
MapCopy[i][j] = 0;
36
}
37
}
38
}
39
40
//������
41
void Welcome()
42
{
43
TextColor(BRIGHT|BLUE);//��ɫ
44
45
printf("\n\n\n\n");
46
printf(" ���� �� �� �� �� �������������� \n");
47
printf(" ���� �� �� ������ �������� �� \n");
48
printf(" �������������������� �� �� �� �� �� \n");
49
printf(" ������������ �� �� ���������� �� \n");
50
printf(" �������������� ������������������ ������������������ \n");
51
printf(" ������������ �� �� ���������� �� \n");
52
printf(" �������� �������� ���������������� �� \n");
53
printf(" ������ �� �� �� �� ���������� �� \n");
54
printf(" ������ ���������� �� ���������� ������ \n");
55
printf(" \n");
56
printf(" ���۾��� - 1.0 -\n\n");
57
58
TextColor(BRIGHT|RED|GREEN|BLUE);//��ɫ
59
60
printf("\t\t\t>>1 ��ʼ��Ϸ\t\t\t\t\n\n");
61
printf("\t\t\t>>2 ѡ��ؿ�\t\t\t\t\n\n");
62
printf("\t\t\t>>3 ��Ϸ����\t\t\t\t\n\n");
63
printf("\t\t\t>>4 �˳���Ϸ\t\t\t\t\n\n");
64
}
65
66
//ͼ�������
67
void Instruction()
68
{
69
char key;
70
71
while(1)
72
{
73
system("cls");
74
75
//����
76
TextColor(BRIGHT|RED|GREEN|BLUE);
77
78
printf("\t\t\t����������������������\n");
79
printf("\t\t\t�� ͼ������� ��\n");
80
printf("\t\t\t�t�������������������s\n\n");
81
82
//��
83
TextColor(BRIGHT|GREEN|BLUE);//��ɫ
84
85
printf(" �� ");
86
87
TextColor(BRIGHT|RED|GREEN|BLUE);
88
89
printf("��������ˡ�\n\n\n");
90
91
//ǽ
92
TextColor(BRIGHT);//��ɫ
93
94
printf(" �� ");
95
96
TextColor(BRIGHT|RED|GREEN|BLUE);
97
98
printf("����ǽ��\n\n\n");
99
100
//����
101
TextColor(BRIGHT);
102
103
printf(" �� ");
104
105
TextColor(BRIGHT|RED|GREEN|BLUE);
106
107
printf("�������ӡ�ע�⣬���޷�ͬʱ�ƶ��������ӡ�\n\n\n");
108
109
//Ŀ��λ��
110
TextColor(BRIGHT|RED|GREEN);
111
112
printf(" �� ");
113
114
TextColor(BRIGHT|RED|GREEN|BLUE);
115
116
printf("���ӵ�Ŀ��λ�á������������Ƶ���Ӧλ���Խ������ڡ�\n\n\n");
117
118
//�Ѿ�λ������
119
TextColor(BRIGHT|RED|GREEN);
120
121
printf(" �� ");
122
123
TextColor(BRIGHT|RED|GREEN|BLUE);
124
125
printf("�Ѿ�����Ŀ��λ�õ����ӡ�\n\n\n");
126
127
//����
128
TextColor(BRIGHT|RED|BLUE);//�Ϻ�
129
130
printf(" �� ");
131
132
TextColor(BRIGHT|RED|GREEN|BLUE);
133
134
printf("���ڡ�\n\n\n");
135
136
//����ָ��
137
printf(" �������� �ƶ���\n\n\n");
138
printf(" R ����������\n\n\n");
139
printf(" Ctrl+C ���������档\n");
140
141
key = getch();
142
if(key == 3)
143
{
144
system("cls");
145
return;
146
}
147
}
148
}
149
150
//ѡ��
151
void SelectLevel()
152
{
153
int level;
154
int GoToMain=0;
155
156
while(1)
157
{
158
system("cls");
159
160
printf("\n\n");
161
printf(" ������ ������ ������ ������ ������ ������\n");
162
printf(" ��01�� ��02�� ��03�� ��04�� ��05�� ��06��\n");
163
printf(" �t���s �t���s �t���s �t���s �t���s �t���s\n\n");
164
printf(" ������ ������ ������ ������ ������ ������\n");
165
printf(" ��07�� ��08�� ��09�� ��10�� ��11�� ��12��\n");
166
printf(" �t���s �t���s �t���s �t���s �t���s �t���s\n\n");
167
printf(" ������ ������ \n");
168
printf(" ��13�� ��14�� \n");
169
printf(" �t���s �t���s \n\n");
170
printf(" ��ѡ��ؿ�: ");
171
fflush(stdin); //��ջ�����
172
scanf("%d",&level);
173
system("cls");
174
for(;level<=MAX_LEVEL; level++)
175
{
176
GoToLevel(level);
177
178
GoToMain = Control();
179
if(GoToMain)
180
{
181
system("cls");
182
return;
183
}
184
}
185
}
186
}
187
188
void GoToLevel(int n)
189
{
190
system("cls");
191
InitializeAll();
192
193
switch(n)
194
{
195
case 1: Lv1(); break;
196
case 2: Lv2(); break;
197
case 3: Lv3(); break;
198
case 4: Lv4(); break;
199
case 5: Lv5(); break;
200
case 6: Lv6(); break;
201
case 7: Lv7(); break;
202
case 8: Lv8(); break;
203
case 9: Lv9(); break;
204
case 10:Lv10(); break;
205
case 11:Lv11(); break;
206
case 12:Lv12(); break;
207
case 13:Lv13(); break;
208
case 14:Lv14(); break;
209
}
210
211
nLevel = n;
212
Map[Hero_x][Hero_y] = HERO;
213
MapCopy[Door_x][Door_y] = DOOR;
214
GateOpen = 0;
215
PrintBoard();
216
}
217
218
//��Ϸ���̿���
219
void Play()
220
{
221
int n;
222
int GoToMain=0;
223
for(n=1; n<=MAX_LEVEL; n++)
224
{
225
GoToLevel(n);
226
227
GoToMain = Control();
228
if(GoToMain)
229
{
230
system("cls");
231
return;
232
}
233
}
234
}
235
236
//���̿���
237
int Control()
238
{
239
int win;
240
int moved; //���Ѿ��ƶ���һ��, moved=1
241
char key;
242
243
while(1)
244
{
245
key = getch();
246
247
if(key == 'U' || key == 'u') // U - ����
248
{
249
}
250
251
if(key == 'R' || key == 'r') // R - ��������
252
{
253
GoToLevel(nLevel);
254
}
255
256
if(key == 3) // Ctrl+C - ����������
257
{
258
return 1;
259
}
260
261
if(key == -32)
262
{
263
moved = 0;
264
key = getch();
265
266
//����
267
if ( !moved
268
&& key == 'H'
269
&& ( Map[Hero_x-1][Hero_y] == NOTHING
270
|| Map[Hero_x-1][Hero_y] == STAR
271
|| Map[Hero_x-1][Hero_y] == DOOR
272
)
273
)
274
{
275
Map[Hero_x][Hero_y] = NOTHING;
276
Map[Hero_x-1][Hero_y] = HERO;
277
Hero_x--;
278
nMove++;
279
moved=1;
280
}
281
282
//��������
283
if ( !moved
284
&& key == 'H'
285
&& ( Map[Hero_x-1][Hero_y] == BOX || Map[Hero_x-1][Hero_y] == BOX_IN_PLACE )
286
&& Map[Hero_x-2][Hero_y] == NOTHING
287
)
288
{
289
Map[Hero_x][Hero_y] = NOTHING;
290
Map[Hero_x-1][Hero_y] = HERO;
291
Map[Hero_x-2][Hero_y] = BOX;
292
Hero_x--;
293
nMove++;
294
nPush++;
295
moved=1;
296
}
297
298
//�������䵽λ
299
if ( !moved
300
&& key == 'H'
301
&& ( Map[Hero_x-1][Hero_y] == BOX || Map[Hero_x-1][Hero_y] == BOX_IN_PLACE )
302
&& Map[Hero_x-2][Hero_y] == STAR
303
)
304
{
305
Map[Hero_x][Hero_y] = NOTHING;
306
Map[Hero_x-1][Hero_y] = HERO;
307
Map[Hero_x-2][Hero_y] = BOX_IN_PLACE;
308
Hero_x--;
309
nMove++;
310
nPush++;
311
moved=1;
312
}
313
314
//����
315
if ( !moved
316
&& key == 'P'
317
&& ( Map[Hero_x+1][Hero_y] == NOTHING
318
|| Map[Hero_x+1][Hero_y] == STAR
319
|| Map[Hero_x+1][Hero_y] == DOOR
320
)
321
)
322
{
323
Map[Hero_x][Hero_y] = NOTHING;
324
Map[Hero_x+1][Hero_y] = HERO;
325
Hero_x++;
326
nMove++;
327
moved=1;
328
}
329
330
//��������
331
if ( !moved
332
&& key == 'P'
333
&& ( Map[Hero_x+1][Hero_y] == BOX || Map[Hero_x+1][Hero_y] == BOX_IN_PLACE )
334
&& Map[Hero_x+2][Hero_y] == NOTHING
335
)
336
{
337
Map[Hero_x][Hero_y] = NOTHING;
338
Map[Hero_x+1][Hero_y] = HERO;
339
Map[Hero_x+2][Hero_y] = BOX;
340
Hero_x++;
341
nMove++;
342
nPush++;
343
moved=1;
344
}
345
346
//�������䵽λ
347
if ( !moved
348
&& key == 'P'
349
&& ( Map[Hero_x+1][Hero_y] == BOX || Map[Hero_x+1][Hero_y] == BOX_IN_PLACE )
350
&& Map[Hero_x+2][Hero_y] == STAR
351
)
352
{
353
Map[Hero_x][Hero_y] = NOTHING;
354
Map[Hero_x+1][Hero_y] = HERO;
355
Map[Hero_x+2][Hero_y] = BOX_IN_PLACE;
356
Hero_x++;
357
nMove++;
358
nPush++;
359
moved=1;
360
}
361
362
//����
363
if ( !moved
364
&& key == 'K'
365
&& ( Map[Hero_x][Hero_y-1] == 0
366
|| Map[Hero_x][Hero_y-1] == STAR
367
|| Map[Hero_x][Hero_y-1] == DOOR
368
)
369
)
370
{
371
Map[Hero_x][Hero_y]=NOTHING;
372
Map[Hero_x][Hero_y-1] = HERO;
373
Hero_y--;
374
nMove++;
375
moved=1;
376
}
377
378
//��������
379
if ( !moved
380
&& key == 'K'
381
&& ( Map[Hero_x][Hero_y-1] == BOX || Map[Hero_x][Hero_y-1] == BOX_IN_PLACE )
382
&& Map[Hero_x][Hero_y-2] == NOTHING
383
)
384
{
385
Map[Hero_x][Hero_y] = NOTHING;
386
Map[Hero_x][Hero_y-1] = HERO;
387
Map[Hero_x][Hero_y-2] = BOX;
388
Hero_y--;
389
nMove++;
390
nPush++;
391
moved=1;
392
}
393
394
//�������䵽λ
395
if ( !moved
396
&& key == 'K'
397
&& ( Map[Hero_x][Hero_y-1] == BOX || Map[Hero_x][Hero_y-1] == BOX_IN_PLACE )
398
&& Map[Hero_x][Hero_y-2] == STAR
399
)
400
{
401
Map[Hero_x][Hero_y] = NOTHING;
402
Map[Hero_x][Hero_y-1] = HERO;
403
Map[Hero_x][Hero_y-2] = BOX_IN_PLACE;
404
Hero_y--;
405
nMove++;
406
nPush++;
407
moved=1;
408
}
409
410
//����
411
if ( !moved
412
&& key == 'M'
413
&& ( Map[Hero_x][Hero_y+1] == NOTHING
414
|| Map[Hero_x][Hero_y+1] == STAR
415
|| Map[Hero_x][Hero_y+1] == DOOR
416
)
417
)
418
{
419
Map[Hero_x][Hero_y+1] = HERO;
420
Map[Hero_x][Hero_y] = NOTHING;
421
Hero_y++;
422
nMove++;
423
moved=1;
424
}
425
426
//��������
427
if ( !moved
428
&& key == 'M'
429
&& ( Map[Hero_x][Hero_y+1] == BOX || Map[Hero_x][Hero_y+1] == BOX_IN_PLACE )
430
&& Map[Hero_x][Hero_y+2] == NOTHING
431
)
432
{
433
Map[Hero_x][Hero_y+1] = HERO;
434
Map[Hero_x][Hero_y] = NOTHING;
435
Map[Hero_x][Hero_y+2] = BOX;
436
Hero_y++;
437
nMove++;
438
nPush++;
439
moved=1;
440
}
441
442
//�������䵽λ
443
if ( !moved
444
&& key == 'M'
445
&& ( Map[Hero_x][Hero_y+1] == BOX || Map[Hero_x][Hero_y+1] == BOX_IN_PLACE )
446
&& Map[Hero_x][Hero_y+2] == STAR
447
)
448
{
449
Map[Hero_x][Hero_y] = NOTHING;
450
Map[Hero_x][Hero_y+1] = HERO;
451
Map[Hero_x][Hero_y+2] = BOX_IN_PLACE;
452
Hero_y++;
453
nMove++;
454
nPush++;
455
moved=1;
456
}
457
}
458
459
win=IsFinish();
460
system("cls");
461
PrintBoard();
462
463
if(win)
464
{
465
Sleep(225); //�ѳ������255ms
466
return 0;
467
}
468
}
469
return 0;
470
}
471
472
//��ӡ
473
void PrintBoard()
474
{
475
int i,j;
476
for(i=0; i<MAP_H; i++)
477
for(j=0; j<MAP_W; j++)
478
if( MapCopy[i][j] == STAR && Map[i][j] == NOTHING )
479
Map[i][j] = STAR; //MapCopy���������⣺�ָ���Ĩȥ�ļǺ�
480
481
for(i=0; i<MAP_H; i++)
482
{
483
for(j=0; j<MAP_W; j++)
484
{
485
switch(Map[i][j])
486
{
487
case HERO:
488
TextColor(BRIGHT|GREEN|BLUE);
489
printf("��");
490
break;
491
492
case WALL:
493
TextColor(BRIGHT);
494
printf("��");
495
break;
496
497
case BOX:
498
TextColor(BRIGHT);
499
printf("��");
500
break;
501
502
case STAR:
503
TextColor(BRIGHT|RED|GREEN);
504
printf("��");
505
break;
506
507
case BOX_IN_PLACE:
508
TextColor(BRIGHT|RED|GREEN);
509
printf("��");
510
break;
511
512
case DOOR:
513
TextColor(BRIGHT|RED|BLUE);
514
printf("��");
515
break;
516
517
default:
518
TextColor(BRIGHT|RED|GREEN|BLUE);
519
printf(" ");
520
}
521
}
522
printf("\n");
523
}
524
525
TextColor(BRIGHT|RED|GREEN|BLUE);
526
printf("\n\n");
527
printf(" �ؿ�%3d �ƶ�%3d ����%3d\n\n",nLevel,nMove,nPush);
528
printf(" R - ��������\n");
529
printf(" Ctrl+C - ��������\n");
530
}
531
532
//���ط�?
533
int IsFinish()
534
{
535
int i,j;
536
537
if(!GateOpen) //����δ��ʱ����
538
{ //ͼ����δ��λ������ - δ��ʤ
539
for(i=0; i<MAP_H; i++)
540
for(j=0; j<MAP_W; j++)
541
if(Map[i][j] == BOX)
542
return 0;
543
//���� - ���Ŵ�
544
Map[Door_x][Door_y] = DOOR;
545
GateOpen=1;
546
}
547
548
if(Map[Door_x][Door_y] != HERO) //�����ѿ�������δ�� - δ��ʤ
549
{
550
return 0;
551
}
552
else
553
{
554
return 1;
555
}
556
}
557
558