|
- /*****推箱子游戏*****/
7 g7 S+ u: W) ?; v' `% J+ S) T
2 @6 r1 n! S r9 Z/ j9 M3 g2 v3 A( l( F- #include <stdio.h>
" A2 E# U7 P% z. Q0 ^ - #include <stdlib.h>
2 s, u+ A) t" d8 T7 c# n3 X' X - #include <conio.h>+ J1 p/ v/ x+ V6 ~( A
- #include <windows.h>
: x' M( j! x0 D2 b( i) o% @4 t3 r - #define KEY_UP 72
8 V8 S+ W3 P) U* m - #define KEY_DOWN 80
; ^0 f: T5 a* g" @ - #define KEY_LEFT 753 Q0 K3 w- v9 p) O B; U4 a7 G( m) Y, R
- #define KEY_RIGHT 77+ F0 v6 W3 c7 [) F6 I
- . E4 Y: H2 e8 C
- #define KEY_RETURN 2
R7 H; E6 B) F: ?( i4 E - #define KEY_NEXT 4
' h$ y' p# z: a1 Y* @% @$ e
1 p- Y) w4 x0 }$ ~- #define SPACE_OUT 0
U$ D u4 @. M, \+ ^) s* P8 ` - #define WALL 1) P7 v3 ^' e; Q' V+ q7 |9 k8 t# s
- #define SPACE 2
S2 Q4 K4 d. L" b& F. `' D' t2 M6 T - #define TARGET 3
+ o c1 y2 }4 h) _1 l - #define BOX 4" N! x7 z! ?. d
- #define TARGET_IN 5
9 ?) T, D( K2 T4 T" m, r - #define PERSON 6
3 t. y3 D* r% ^2 p# O! m
4 e5 g# I, D9 r+ }4 s: P
6 i0 [- ~( F$ U1 F- /*函数声明*/
. t5 X, y' ?" k1 ^ - void SelectColor(int iColor);
/ s% b0 }6 H F+ T2 u# l - void DesignUI();0 L+ X! @( l+ W7 j j$ F& `
- int WelcomePage();/*初始界面,每次通关后跳回*/: X2 C( l0 k- b, \9 L
- void GetLevel1();
+ ~0 t4 V3 H" {1 Y# A - void GetLevel2();
$ h7 I/ G* O+ r3 {0 d - void GetLevel3();
( j, c* `* a4 U" |" i' f/ I& Y - void GetLevel4();
5 _6 q, \9 m; i/ f0 h* |3 z - int PlayGame(int aiMap[][16], int aiMap2[][16], int iSum, int iImp);
}0 i7 M. h' e; c: k - int PrintMap(int aiMap[][16], int iImp);, W8 Z$ x! B4 f7 u
- void MoveBox(int aiMap[][16], int iPlayerX, int iPlayerY, int iSelect, int aiMap2[][16]);
1 Q/ n/ ^$ Z$ ^" w& c: Z - # l) ]$ \$ Z' F5 K4 H- Q. R
- /*主函数*/
4 X: p# V& J, E - int main() {* X0 i, D4 y- J, C
- while (1)4 g3 x' ?: l* ~$ G* m1 w
- DesignUI();
4 G# c' H7 N0 v - }
. F% o) |$ N- B1 T9 A" H - , S1 G6 T v- o: b
- /*文字颜色函数*/: |+ I2 r3 R: f& j* b s9 Y( q
- void SelectColor(int iColor) //颜色函数! u8 \" e0 x( R) \
- {- U- H1 `+ I: A# r( i
- HANDLE hConsole =
' u, C8 ~- l5 Y, M7 Z$ D - GetStdHandle((STD_OUTPUT_HANDLE));//得到控制台输出设备的句柄
: B8 Y2 D' Q& S3 E1 m, Q, A - SetConsoleTextAttribute(hConsole, iColor);//设置控制台设备的属性
$ l( W5 j/ H( q$ a - }8 m' \# o- I6 y3 |
5 S2 G- i6 v$ ~" ?- /*主界面函数*/
: i, I% v* a4 R e! [ - void DesignUI()
, I, Z+ D6 b3 {) j - {( N( ~9 |0 w6 H3 g2 l
- int iCh;
+ M- i4 e5 l" P - char cNum;
9 o+ F, X, D& J D - iCh = WelcomePage();' f0 i2 m6 y( }: p
- if (iCh == 49)/*键盘输入1,开始第一关游戏*/* s. J5 {3 g: O% D. |% O( t& O; e# [6 Z
- GetLevel1();' a" d9 ]% ]; Y h% K' O1 O, p/ l- K
- else if (iCh == 50){/*键盘输入2,选择1到4关的游戏*/- g$ C. A: K( y2 x4 y
- printf("\n\t\t Please input level!(From 1 to 4):");
9 B; r* B q. ]/ ^4 P3 a - getchar();8 S+ @0 l% T) s h/ l/ i
- cNum = getchar();
, J; `9 g* v3 v$ ?( d& e - switch (cNum){: G: l, p( f% C& g; g' f& j
- case '1':( H9 T) @1 H6 |6 e
- GetLevel1();% n5 e3 K) d6 E8 n% {6 O
- break;
% T6 o9 q! r5 n: ]7 S3 E$ u. e - case '2':
/ J% q2 ~4 z5 ^* f - GetLevel2();3 @: ]4 y2 e U
- break;
' t* G0 F8 h2 y0 A, X# l1 P - case '3':+ W4 }, G. \# N9 n2 l. F
- GetLevel3();: U9 o- n" A6 e/ c! u
- break;
' e" q: P0 N8 I. F0 l - case '4':
* h) }0 D1 M8 T5 u9 L2 G - GetLevel4();( K: ^7 U; w2 T: U- t) F
- break;
& t; k$ Z9 i/ {! c7 k - default:
* g" k f3 N' E - printf("Enter error!\n");3 r, u ~& ]3 [ x* p0 Y6 P; x: w. ^
- Sleep(1000);
, f7 P+ _' }1 L; e) r - exit(0);
% ?+ B- f/ ^* y1 X' K q - break;
; M, w: M8 B! e) A- o) a - }
6 S0 s* b5 v; N! ~" j2 d( G# W" h - }+ R4 X3 P( _9 j1 D' r
- else if (iCh == 51){/*键盘输入3,退出游戏*/# U4 X; h8 e6 L
- system("cls");! i( @( G3 s3 I4 f, `, `
- exit(0);2 g4 `% ~% E7 r0 z
- }/ P+ w, [# c4 }; N+ T9 @
- }
: _) ]' p1 B5 `4 H$ I# `
5 ?' b) L& y" N# J/ s. w% t- /*初始欢迎界面*/
2 j, u% a) y( U' }5 b. T - int WelcomePage()
# n$ v8 |5 t0 A, G - {- |- Z9 z8 h" R( E" s+ n7 {8 D$ `
- int i = 0;
# w0 u" e" C; j: F6 c3 W' h - system("cls");/*清屏*/
4 W/ L4 R: U$ x - system("color 0E");/*设置颜色*/
; N' O& G' O$ D- X$ s. g( j - printf("\n\n\t\t Welcome to play box!\n\n");
& l& R1 |3 k1 g& F8 \* ]& D - printf("\t\t Person:♀ Wall:▓ Box: ● Target:○ Reach target:☆\n");
/ t4 B* h5 w8 h: V* H4 S - printf("\t\t Up:↑\n\t\t Down:↓\n\t\t Left:← \n\t\t Right:→\n\n");( K: H8 X+ i5 x. L+ L3 [& p
- printf("\t\t Press number 1 to start new game\n\t\t\n");+ _3 B) C. j( }, L8 a& O
- printf("\t\t Press number 2 to choose level\n\t\t\n");
4 V0 z$ H: \6 L6 y: _2 R - printf("\t\t Press number 3 to quit from game\n\t\t\n");
/ o3 A* F6 h6 u. ~ - printf("\t\t Press right number to continue:");8 K5 F9 Z- z& `, d
- while (1)/ e8 y4 a0 F( Z
- {1 L5 n1 C. U( Y2 z
- i = getchar();, r R3 ~. G" }# s" n, z2 w' H0 O
- if (i >= 49 && i <= 51)! e; A2 k: U# u
- return i;
9 `3 I- ?# h7 m2 l3 {- |9 K; x z - }% v! G3 P' }. i7 X# R! F3 Y) o
- }
H( J I" ]* \0 @! `3 a% w/ B1 [. P
/ H$ g/ C: ]7 O3 L5 d, L; T! r- /*打印地图函数*/8 }+ S9 L- N* e6 @/ _) N5 B
- int PrintMap(int aiMap[][16], int iImp) {/*参数iImp代表游戏关卡*/" a) l8 {0 i9 ?3 R' \4 X
- int i, j;0 ^5 `( |0 o9 l& q
- int iCount = 0;! C1 G2 @6 M; ]
- for (i = 0; i<14; i++){
) w& ?2 `; {* t1 n5 g' b- b. F2 D l - for (j = 0; j<16; j++)
1 Z# P% \* }5 y9 {( O/ l - {
% Z- f* w) Z5 s# n - switch (aiMap[i][j])" [; }4 D" |8 ^& M
- {4 {' m u5 H9 z6 S& i
- case 0: /*空地*/
2 u) K b+ Q9 @ - printf(" ");! G* W# B- n2 v+ G) k
- break;
; M' K# Q. c; `" q - case 1:/ ~7 ^: ]. N% ?: d& R7 S
- SelectColor(14); /*墙*/5 [9 d) L) _9 g, k
- printf("▓");
6 W% A7 z8 C! `: q" D, ^7 T - break;+ O. X# D% k5 s' @8 v3 d- _
- case 2: /*内部空地*/
6 P- a! o$ K" A. A, V. b' x - printf(" ");
4 x7 ^5 t9 ]9 \% l$ K/ b - break;
3 c5 N: T9 w$ R q* k5 M6 b - case 3:6 Z1 k7 h, V2 @7 @) V
- SelectColor(11); /*目的地*/* v2 f/ F. W* U1 B/ T7 H
- printf("○");
7 O) }# M6 ~* ]0 i; t3 b- m - break;/ C- ^+ @) _" n4 X1 ~! L" ?
- case 4: /*箱子*/
7 V9 f( h" @8 O- G# N; R1 k, k0 J9 m - SelectColor(11);. S' u' S4 O$ p$ x3 g
- printf("●");
2 l* V, M7 l. z0 S( ?1 S - break;- U1 J# W G0 r7 W! B
- case 5: /*箱子推到目的地后显示*/& g# m2 h1 g8 Y6 R; b, d
- iCount++;
p2 V9 F( t7 l# E ]! D, ~ - SelectColor(9);7 d, P$ W1 g2 t" ]3 n6 z
- printf("☆");
) J1 a3 F8 \) B& p - break;# ?6 A& S9 w j8 H- _# P! f$ W3 j
- case 6: /*小人*/
4 t2 H L& m3 n0 h* f8 {' L5 F - SelectColor(10);1 I( @0 F! r1 Q5 v
- printf("♀");
% D: a" `# E! @' A6 ^3 V - break;: Y( U- @8 z4 P/ u/ Q
- }4 _% j( ?" E. `1 i" U
- }
) g& J ^5 p8 N" h5 t+ s - printf("\n");* D4 _' r7 K4 H
- }
! g _* y8 q6 C" l) W- |- l3 a; Z - SelectColor(14);
5 \/ D8 y# v; Q9 |8 W n* d& y4 [ - printf("\n");
8 k; ~$ `, P" A2 n4 g' I, t - printf("\tYou are in Level %d!\t\t\n", iImp);- `3 h0 z# V. V; Z/ l
- printf("\tPress arrow keys to play the game!\t\n"); Q( Z" `' z8 F5 m7 Q
- printf("\tpress N to the next level!\t\n");0 y+ x* c* {+ q& U1 N5 n
- printf("\tpress Q to return the home page!\t\n");3 g) M6 G( m! C) ^( n N! m5 d3 Z
- return iCount; /*返回值表示以正确放入的箱子数*/5 p! C3 G0 q G& p f' K3 t, g: w
- }
$ [# A" r, d$ B+ U5 J1 e9 R
* t& B3 X3 x( x- /*第一关*// q/ P6 M( Y3 k4 B( ^% a
- void GetLevel1() {
0 E/ p) w3 ]7 r; I4 [ - int aiMap2[14][16];/*表示原始地图*/$ G8 p. u2 r4 ^7 y1 K" M. @
- int i, j, iSum = 0; /*iSum表示箱子的数量*/
' o( z$ p; q- I! V6 { D' A
0 A" r4 ?2 _6 }; g/ _# y/ j$ H- /*地图形状
, E K6 j# W& n8 K! y- T5 ? - 1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
5 Q: z; k9 C# J5 X- l - */9 b" y* ]/ x5 Z' M
- int aiMap[14][16] = {
* y& E. X2 f+ C# T( M5 {" x - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },2 o3 g3 m- C* S0 X j- H V
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },2 T2 i; L" I4 K
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },* G# @1 M/ Y* I1 G9 k" @8 e
- { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },! k' B9 }( n8 r! j( L5 h9 r5 S W
- { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0 },4 t* F6 E4 Q0 n+ R
- { 0, 0, 0, 1, 1, 3, 4, 2, 1, 1, 2, 1, 1, 0, 0, 0 },/ B/ x8 X# |% b/ y% W
- { 0, 0, 0, 1, 2, 3, 4, 6, 4, 2, 2, 3, 1, 0, 0, 0 },1 e' X% K% B( ~ T6 o; s
- { 0, 0, 0, 1, 2, 3, 2, 4, 2, 4, 3, 1, 1, 0, 0, 0 },( ?& T7 d j' }# ]% S+ A
- { 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 1, 0, 0, 0, 0 },; I3 f A4 d9 b! K3 D& w# y/ M$ F
- { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
7 U: ] m" d; r$ b% R - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }," E+ V5 X; k$ q$ Z7 P' _* o! g
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },# T x: X/ o5 r9 m6 U% f" v( n: C
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },: z4 v% }/ {' T1 @ j
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
9 H7 n4 o+ {* s) i. a) ], F - };
! p7 Y6 x l6 b1 B, X( x6 y - for (i = 0; i<14; i++)
0 U4 @- k( k$ C/ r5 f$ M5 d - for (j = 0; j<16; j++){
$ j0 |; W. F. L- r. P' a - aiMap2[i][j] = aiMap[i][j];
0 B( b. x! `/ O" y! k2 b - if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/
1 c3 p( b) X; N2 B - iSum++;
. P* _) G0 S& f' Q, ^0 L9 | - }
/ X* I1 V: K- A8 x - - `# I" z) x4 `/ i" W4 W
- /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,
2 ?+ z) I5 A, q1 U8 u - 其他情况(过关,进入下一关)执行GetLevel2函数,进入第二关2 i7 H, M8 c# O! S
- */- I/ H/ J7 U7 [! O; L3 }
- if (PlayGame(aiMap, aiMap2, iSum, 1) != KEY_RETURN)
# E" @& K# }+ e$ h - GetLevel2();
- V" [5 U L3 n* ]# F" b* q - }
% P4 L& A% Q1 x0 L+ c! \0 Z1 s
3 E- z& |$ w8 Q) D [/ i, a- /*第二关*/4 j. Z4 q% Y# u' p
- void GetLevel2() {1 w& l; l* L6 [2 r
- int aiMap2[14][16];/*表示原始地图*/5 y" Y2 Z' E$ p- c* A0 `* u5 Q
- int i, j, iSum = 0; /*iSum表示箱子的数量*/
0 d: H5 `* w; n7 U% q- P5 V
. J( Y0 \; f! {* _' G% }- /*地图形状
: m% d0 L5 x- D4 Y* ? - 1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
# a) q# C- T# L' _+ `, X - */6 b, |" r. e* z& g( |& E& ]
- int aiMap[14][16] = {" w& [6 v! J9 u0 w+ \, a7 b$ [' I8 w
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
% j% H5 C- w; g8 d - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, z! M- }$ Q2 Y5 }7 C
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
0 T1 z- T; {- @ - { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },3 ^- R3 D, z6 P k% O+ Y1 ?
- { 0, 0, 0, 1, 2, 2, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0 },6 O, e% h e, C- V7 o2 w
- { 0, 0, 0, 1, 2, 2, 2, 4, 2, 2, 2, 1, 0, 0, 0, 0 },
3 l! g& ]* g1 G" ?" b! a$ w - { 0, 0, 0, 1, 2, 2, 1, 1, 1, 2, 4, 1, 0, 0, 0, 0 },
* D# |% f% h, o: _7 y - { 0, 0, 0, 1, 2, 1, 3, 3, 3, 1, 2, 1, 0, 0, 0, 0 },
0 ~" W9 p, \' L# I% [ - { 0, 0, 1, 1, 2, 1, 3, 3, 1, 1, 2, 1, 1, 0, 0, 0 },& z* v0 U5 {7 ~8 C/ f3 H# ]
- { 0, 0, 1, 2, 4, 2, 2, 4, 2, 2, 4, 2, 1, 0, 0, 0 },
' [$ O* {- C q% k) i2 g - { 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 6, 2, 1, 0, 0, 0 },
+ c& V! L! Y# p8 B5 b6 j - { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },& w' z9 h/ I% q2 k" [+ _# G
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
5 m5 Z; p: }* `4 L$ S' m - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
$ \- m/ g( v; v) B( _8 b - };
, N! A- w& C" G1 O$ P, \; r
/ v, R/ s5 f& r o& g5 x- for (i = 0; i<14; i++)0 a! ]+ L7 n! v( R" `9 @
- for (j = 0; j<16; j++){
0 V: D' I; o$ V4 D$ B$ M( c - aiMap2[i][j] = aiMap[i][j];; r! x; M( k$ c
- if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/3 |$ W6 ]& J; u
- iSum++;
% Z( C' R7 r6 F4 i9 f" z W7 E - }" x3 [7 g- ], X: Y5 n1 C7 |, d
. Q6 U' u$ q. ^1 c5 U- /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,# f- w' R I Y# m8 D
- 其他情况(过关,进入下一关)执行GetLevel3函数,进入第三关$ @+ \. D& u' h# O1 ~- M! M. S, b
- */8 V( k9 P: k, Q1 v; G8 b
- if (PlayGame(aiMap, aiMap2, iSum, 2) != KEY_RETURN)
( K: b. ?' d8 b) N/ h1 l' c+ q/ g - GetLevel3();
% C# E& F2 j% p9 K' q4 M/ g5 C8 y( t4 Q - }
3 n. y7 [2 f; x
2 H% V& i0 J& a0 k% u" G- /*第三关*/
$ f# q( K( s2 V+ ` - void GetLevel3() {
# m) J; e" ~9 O) V- R - int aiMap2[14][16];/*表示原始地图*/2 O3 j/ Q3 R/ e% A
- int i, j, iSum = 0;/*iSum表示箱子的数量*/0 W- A3 |; q) {) }" R7 F; b! ?
- / E8 Y, a: a& @ ?! r! J
- /*地图形状
8 p7 Y0 Z9 A; S [ - 1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
' Z: g/ D4 S! i - */( O3 a4 r. V, U5 O2 F
- int aiMap[14][16] = {. E+ u- e* N" U+ O
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
. ^ B) F, I2 n( x3 q, k - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },; s6 \' s) T: W0 V( V" F/ l s
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },& G, F: R/ L8 B# K4 z
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },0 ?% d+ g u8 r0 X
- { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0 },
' Y# | `5 v6 {$ q2 z! W - { 0, 0, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 0, 0 },2 `/ _# v/ ~3 E3 T1 ^
- { 0, 0, 1, 2, 4, 2, 1, 1, 1, 1, 4, 2, 2, 1, 0, 0 },
5 I5 [* s& c6 v; c o1 k6 ^9 ]' J$ Q# s - { 0, 0, 1, 2, 2, 4, 3, 3, 3, 3, 2, 4, 2, 1, 0, 0 },
; d% F; z: Z* e' Z2 L - { 0, 0, 1, 1, 2, 2, 2, 2, 1, 2, 6, 2, 1, 1, 0, 0 },. q9 `6 T9 L5 L8 h+ s) w. S+ h' x
- { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
3 c( Y! {% o& N - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
! L# Z- p* Y. v) m5 p% `1 ?5 J: j - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },! P( U4 u# J: P+ V! e/ o
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |- d, l3 U3 {0 z9 ]5 M7 C
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },# i: v1 i3 ]: f+ z7 J
- };
3 v3 p/ t: m% t( K# s/ G
4 p: H2 |' r; T7 L' U8 {* a- for (i = 0; i<14; i++)
! h7 l5 h3 b0 l - for (j = 0; j<16; j++){
( W0 `1 s( L& f( S# P7 t( F - aiMap2[i][j] = aiMap[i][j];
5 F1 E+ W& V# u* u4 J - if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/4 i+ ?# P3 }6 {: n4 {" u
- iSum++;
& T, b! P: p+ `1 Z) J# F2 S% t8 K# E - }4 v" ?) _" ]( k
0 M5 H1 P5 r" o v- /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,
5 F! k, ]' I- q) A7 [ - 其他情况(过关,进入下一关)执行GetLevel5函数,进入第五关- V& g/ T& s* i9 ]: ~
- */
7 r- v% G! O. C) B1 Z - if (PlayGame(aiMap, aiMap2, iSum, 3) != KEY_RETURN)/ |& ?* B6 N) a L' w' Q- ~6 H1 D
- GetLevel4();2 E6 ?2 Z S: f; B
- }
* @ ~0 {( J& L0 d+ t4 d+ r' N
: `7 j( L7 s7 s3 n- /*第四关*/
& S, X2 I% H5 { ?9 f8 } - void GetLevel4() {
3 [! ^6 q7 n$ Y& e! B$ h - int aiMap2[14][16];/*表示原始地图*/
/ l& W! d& N0 G) ^6 T( m - int i, j, iSum = 0;/*iSum表示箱子的数量*/' {+ d P( y2 x9 q
- 8 K7 @# e- u. z$ p1 x R( C% u
- /*地图形状+ y$ }9 M# [+ L9 H; Z; X; B+ x2 S
- 1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
9 B2 C \4 \6 I: W - */
2 F& p. y; H3 { - int aiMap[14][16] = {
; ^, G) f4 ~2 P1 ^+ y - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },, \7 g3 I' z2 w
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },# s, H$ t) y; g9 a7 n
- { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
0 U! w! ^# }9 N0 G# z" C4 n - { 0, 0, 0, 0, 0, 1, 2, 2, 2, 1, 3, 2, 1, 0, 0, 0 },
' B0 k! l8 J4 M# s1 u, B* |/ M - { 0, 0, 0, 0, 1, 1, 2, 2, 4, 3, 3, 3, 1, 0, 0, 0 },6 @5 b/ E7 a" L
- { 0, 0, 0, 0, 1, 2, 2, 4, 2, 1, 5, 3, 1, 0, 0, 0 },
: d: `& f! } K) E' \ - { 0, 0, 0, 1, 1, 2, 1, 1, 4, 1, 2, 1, 1, 0, 0, 0 },
% Z' L0 Q1 |. [8 m( S9 Z - { 0, 0, 0, 1, 2, 2, 2, 4, 2, 2, 4, 2, 1, 0, 0, 0 },
6 U7 u0 p0 r6 f - { 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 0, 0, 0 },7 ~3 x: M7 A1 d* ]/ N. K! D
- { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 0, 0, 0 },
$ g/ o0 k4 j7 z5 G `$ l# g" W# v - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },' Q6 \# n: ^5 M1 _2 q' N, S
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
- C* |% x p D: ^# S; l4 m - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },$ F/ r2 d7 c6 s8 f
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
- M. l( `2 v( Y; C, |7 N3 {2 K, a4 W - };% S N5 N" I6 I( i+ q7 _
- for (i = 0; i<14; i++)! c# y/ N7 L7 S3 g) u3 y
- for (j = 0; j<16; j++){
1 e4 I6 U- H2 Y" @ - aiMap2[i][j] = aiMap[i][j];. I% X, B# |" W9 H9 _8 e4 ]3 R% Z
- if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/6 a6 A# y/ {! u+ c- B/ N
- iSum++;/ K2 [* U( g! F E4 f7 m) _
- }7 z: i- E0 H( G. Q+ I7 @9 d1 H
- /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,' k6 D( s( ^, M- @$ V4 z% J& c
- 其他情况(过关,进入下一关)执行GetLevel7函数,进入第七关6 g/ q* W) ?- J4 Y$ `
- */
2 v7 ^" }# }1 c7 s, i - PlayGame(aiMap, aiMap2, iSum, 4);3 K1 k$ x7 e0 O4 _) \3 ?- O( k
- }9 w2 [0 [8 g }: `: G+ Y2 _
- : Y$ D4 Y) t- O" S3 ?, z
- /*游戏操作函数*/& n7 U; ^( y" t9 |7 j! V
- int PlayGame(int aiMap[][16], int aiMap2[][16], int iSum, int iImp)/*iSum代表箱子个数*/3 g: e& n' \, ]5 _" Q
- {
, H! C7 y; z4 }7 F" r - int i, j;) p# q+ o/ ?% @% R3 T
- int iPlayerX, iPlayerY; /*人的位置x,y坐标*/; R" _1 ?9 P( J2 N
- char cOp; /*所按下的方向键*/
, W! d7 s0 f* Y1 {; ~ - int iNum = 0; /*箱子推到目的地的个数*/8 S T( U E5 @) z% Q
- , i5 t/ A1 C9 {( O8 X% s9 X
- while (1)
- { k/ O/ I3 ]; @ - {! D3 b3 K3 e8 A* D
- for (i = 0; i < 14; i++)' O% W+ m. g8 p& e
- {
" Q+ `, t1 n. T# |' i8 a. _8 K; c - for (j = 0; j < 16; j++) /*循环遍历寻找人的位置*/
! g# p5 [% x* R+ D8 E p# x5 r - {
7 n+ @: v: E3 ]2 r% x' a; v - if (aiMap[i][j] == PERSON) /*6代表人的位置*/
* c8 J7 D: T: n - break;
+ a9 r) `& o& G - }8 h6 A- U4 Q' x/ @
- if (j < 16)
- Q7 ]& ]( A% @: u7 ]6 t3 g - break;! w2 P' I/ v9 A# a% j8 l0 v H
- }
8 w v) {6 b$ n6 |/ i0 r( u$ u
; X& i. I- ~% L) P4 {- iPlayerX = i; /*将二维数组中的人的x,y坐标赋值给iPlayerX和iPlayerY*/! f* A4 I& m! t1 R; |
- iPlayerY = j;
, \8 O: c- q0 H8 \: k q - system("cls");
2 V5 `5 O9 k1 D, }% n! ] - iNum = PrintMap(aiMap, iImp);
/ ^: y* i4 s! Y- }" W - if (iNum == iSum)5 i( G2 P+ ^6 S1 o/ I: r% W
- { /*将所有箱子都推到目的地*/$ l, T7 K+ e5 X. i' C; N' [5 H
- printf(" Congratulations!\n");
' r1 o. k" D; K% ]; \3 M - Sleep(3000);: Q. [* a$ ]# ]: ~( c
- return 0;: Q- L0 G) c) s {: ~& G2 q
- }
. m! C+ o/ Y" y# Z3 L - else. D K H- ~: _6 A$ m
- { /*还有箱子没有推到目的地*/9 M% V- Z, ?' U+ @2 C6 }
- cOp = getch(); /*捕获用户键盘输入*/ Q- W: n% Z' j! r6 X, L& `! H
- if ((cOp == 'n') || (cOp == 'N'))/*输入N进入下一关*/7 s& r: l/ R! x, m6 m+ m
- return KEY_NEXT;
& I. ?; R6 S/ r7 t( y9 b; s - else if ((cOp == 'q') || (cOp == 'Q'))/*输入Q返回主界面*/
; a* @+ Z" P( E, K6 o- a - return KEY_RETURN;: Q R2 u$ E% w& q' i
- }, Y4 F+ _% M9 ]4 X% k+ K% V0 {
- switch (cOp)
" |* d8 S3 R! A& v* O8 S- B - { /*用户输入方向键*/
0 y7 H$ G; o d$ W' k- \ - case KEY_UP: /*上箭头*/
9 e1 ?0 S" t6 H+ X- i9 p$ b - MoveBox(aiMap, iPlayerX, iPlayerY, 1, aiMap2);
! H, a& H# \4 N* d* ^1 Q) _& }$ c - break;) j# p9 t0 P5 z3 \% G
- case KEY_LEFT: /*左箭头*/* e7 i0 D* C, _
- MoveBox(aiMap, iPlayerX, iPlayerY, 2, aiMap2);
2 V1 ]# S s1 ^$ m# P8 k2 u - break;" {6 X7 T! S. t
- case KEY_RIGHT: /*右箭头*/9 f* H- a) f5 y/ d
- MoveBox(aiMap, iPlayerX, iPlayerY, 3, aiMap2);) C- t" [: e: e' a0 u$ A4 x: m* V: N
- break;
6 x7 V. |- _2 `5 v5 D5 ]7 g' [ - case KEY_DOWN: /*下箭头*/
' ]) [/ y: ^9 E - MoveBox(aiMap, iPlayerX, iPlayerY, 4, aiMap2); n" H! b o( ~# @
- break;
u1 j- X Z6 } - default:
) t# s. [: l" F - break;6 _% I5 v* \* `/ s; I! t
- }
/ {. \. u' S7 X+ A+ ^0 [ - }, w0 S2 v. T5 X4 S W. i7 y' ?
- }
) w8 }) F1 {+ B8 ^# U9 T8 Z
2 p0 ]8 z4 ?9 u- G& {- /*方向移动函数*/
5 m* R3 b* A! a$ e8 B3 {$ X! w( q - void MoveBox(int aiMap[][16], int iPlayerX, int iPlayerY, int iSelect, int aiMap2[][16]) {
4 F3 `( U$ k3 |0 l - int iPlayerX1, iPlayerY1; /*小人下一个要走的位置坐标*/0 I# ]8 v8 |" U& i+ A, p; i1 Y+ s; w
- int iPlayerX2, iPlayerY2; /*小人下下一个要走的位置坐标*/1 g& S h3 E$ Q: ]; `% I( S
- switch (iSelect) {; j6 N8 l% G# i: B6 }
- case 1: /*向上移动*/
# z# w( O; u, _2 q - iPlayerX1 = iPlayerX - 1;* K' c+ J7 w3 w* P4 t& i* _$ c
- iPlayerY1 = iPlayerY;
2 V+ y7 d/ a+ c- b. \ [ - iPlayerX2 = iPlayerX - 2;0 G0 ~( ~: S8 V! t
- iPlayerY2 = iPlayerY;
6 }" v) R. [7 g6 a6 X7 b( T; w - break;
; [/ I: P Z, g% D - case 2: /*向左移动*/% W. S; M% d. V0 a% v, i
- iPlayerX1 = iPlayerX;, |3 c1 e' m# S0 l! L+ F0 S+ W1 Y
- iPlayerY1 = iPlayerY - 1;
5 ~4 ^5 p- k3 Q( g/ U# m- K - iPlayerX2 = iPlayerX;
2 F% m; q+ ^$ ~ - iPlayerY2 = iPlayerY - 2;
7 g% y( J9 W& B1 R- W# L - break;5 y, B7 S j/ Y5 F' D
- # V: @4 C" \) M; R2 x
- case 3: /*向右移动*/
! a0 z; l" b$ h; }1 Q* ?6 x - iPlayerX1 = iPlayerX;
* Y' O; D) M: X$ W - iPlayerY1 = iPlayerY + 1;2 X$ W- p/ f; p& n, T6 z3 D
- iPlayerX2 = iPlayerX;
+ i: O4 B) e) P: I - iPlayerY2 = iPlayerY + 2;6 y; X: _& N/ T3 @3 z/ [# o
- break;, a: |" k5 [3 H
- 2 a) f/ |$ a% M4 Y5 Z+ ]
- case 4: /*向下移动*/
3 j7 a. w& {# R( H& u0 F+ \0 o* Q6 r - iPlayerX1 = iPlayerX + 1;& `6 j( g, e; Y- r, Y
- iPlayerY1 = iPlayerY;
8 j3 ?. L' O1 [7 | - iPlayerX2 = iPlayerX + 2;6 M/ [6 k7 z9 m6 B5 u3 A* o
- iPlayerY2 = iPlayerY;: A# y5 h# q6 q; R+ b) b. @. O
- break;
3 B4 G4 W* v- N9 D: l - default:+ M; ~- I. G6 n' j u+ |5 ?9 Z
- break;8 N8 W$ v1 F6 m
- }
3 ?. e: d( k, z7 r4 @7 _ - ! N1 m8 S; t4 p) p. J7 J1 K
- /*对地图的操作*/) y3 e3 x+ R# U0 C. F7 n
- switch (aiMap[iPlayerX1][iPlayerY1])/*判断小人下一步要走的位置*/* j& z& t) T, A$ j% Z, l2 p. Q+ f
- {" v. i, g5 A6 u1 e) q; B6 ~
- case WALL: /*下一位置是墙,不能移动*/5 M6 p1 M2 k% L
- break;
. q4 E* ^2 j) G" B: b& f; R9 v7 S - case SPACE: /*下一位置为墙内空地和下一位置为空目的地的情况相同处理*/
* L1 u0 J8 ]6 {; {9 R0 Y - case TARGET: % Q5 ?5 c f- H, z" j& x
- aiMap[iPlayerX1][iPlayerY1] = PERSON;/*小人移动到下一位置*/# ^, l: j! b/ I7 g7 N
- if (aiMap2[iPlayerX][iPlayerY] == TARGET || aiMap2[iPlayerX][iPlayerY] == TARGET_IN)8 l1 Z0 [4 S1 H% S
- /*小人所在位置初始为空目的地或满目的地,小人移动后此处恢复为空目的地*/
' a0 [9 d4 ]* P' y - aiMap[iPlayerX][iPlayerY] = TARGET;
. Y' u3 d9 s- N" t - else( F2 Z% g# z4 {5 c V
- /*小人所在位置初始为墙内空地、箱子或者小人,小人移动后此处恢复为墙内空地*/
# ?0 ]% N2 t" j* j V' ` - aiMap[iPlayerX][iPlayerY] = SPACE;
6 W5 B2 F, x- ^ - break;
! f1 @( ?* {# h5 U - case BOX: /*下一位置是箱子和下一位置是已放箱子目的地的情况相同处理*/
' ?6 N& I* z* P - case TARGET_IN:* U; N7 j/ [/ m- {2 X
- if (aiMap[iPlayerX2][iPlayerY2] == TARGET)$ x) e& o! U3 J! e% q9 |# C: o
- {. |' u0 E" _% W2 V) a
- /*下下位置为空目的地,箱子和小人一起移动,箱子落入目的地*/! x: e; a: T* e1 P
- aiMap[iPlayerX2][iPlayerY2] = TARGET_IN;/ {. i, O4 ^- O+ A" F
- aiMap[iPlayerX1][iPlayerY1] = PERSON;
& p( I$ x+ r! r& L( w; i9 G* } - }8 h, t8 t$ i. n$ k$ `
- else if (aiMap[iPlayerX2][iPlayerY2] == SPACE); a9 o& T# e. f, B
- {% I* Q3 @+ G# V7 \, c. H
- /*下下位置为空地,箱子和小人一起移动,箱子落入空地*// F8 |) z! U& L: C$ D+ U$ F3 I6 x) w8 D
- aiMap[iPlayerX2][iPlayerY2] = BOX;; [- f0 p& u+ E. u1 C
- aiMap[iPlayerX1][iPlayerY1] = PERSON;7 B' e' w) p& j6 Q
- }
( h& F# {' O2 [" i3 q - else/*下下位置为墙、箱子或者满目的地,不能移动,直接退出*/5 _' `8 I( M2 d& R: C4 w
- break;5 l9 l8 Q* @0 ^4 d* c& m! ^+ F
- if (aiMap2[iPlayerX][iPlayerY] == TARGET || aiMap2[iPlayerX][iPlayerY] == TARGET_IN)9 E+ x3 y- K3 d" ~, W) S' `
- /*小人所在位置初始为空目的地或满目的地,小人移动后此处恢复为空目的地*/ x* ~+ j8 s4 V1 X
- aiMap[iPlayerX][iPlayerY] = TARGET;: o* z7 ], q; ^& t$ T6 f: L
- else/*小人所在位置初始为墙内空地、箱子或者小人,小人移动后此处恢复为墙内空地*/
; f6 o3 z4 x! K/ S/ a: n - aiMap[iPlayerX][iPlayerY] = SPACE;+ v) o8 n$ J V+ U
- break;
9 m2 |! H9 h4 S( Z" z& r7 F' y7 l - } v3 H3 l5 L! O$ Q6 d
- }
复制代码 |
|