登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 835|回复: 0

[C,C++教程] 【C语言】实现简单的推箱子游戏

[复制链接]

444

主题

509

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051

荣誉管理论坛元老

发表于 2021-6-30 22:57:31 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. /*****推箱子游戏*****/
    7 g7 S+ u: W) ?; v' `% J+ S) T

  2. 2 @6 r1 n! S  r9 Z/ j9 M3 g2 v3 A( l( F
  3. #include        <stdio.h>
    " A2 E# U7 P% z. Q0 ^
  4. #include        <stdlib.h>
    2 s, u+ A) t" d8 T7 c# n3 X' X
  5. #include        <conio.h>+ J1 p/ v/ x+ V6 ~( A
  6. #include        <windows.h>
    : x' M( j! x0 D2 b( i) o% @4 t3 r
  7. #define KEY_UP 72
    8 V8 S+ W3 P) U* m
  8. #define KEY_DOWN 80
    ; ^0 f: T5 a* g" @
  9. #define KEY_LEFT 753 Q0 K3 w- v9 p) O  B; U4 a7 G( m) Y, R
  10. #define KEY_RIGHT 77+ F0 v6 W3 c7 [) F6 I
  11. . E4 Y: H2 e8 C
  12. #define KEY_RETURN 2
      R7 H; E6 B) F: ?( i4 E
  13. #define KEY_NEXT 4
    ' h$ y' p# z: a1 Y* @% @$ e

  14. 1 p- Y) w4 x0 }$ ~
  15. #define SPACE_OUT 0
      U$ D  u4 @. M, \+ ^) s* P8 `
  16. #define WALL 1) P7 v3 ^' e; Q' V+ q7 |9 k8 t# s
  17. #define SPACE 2
      S2 Q4 K4 d. L" b& F. `' D' t2 M6 T
  18. #define TARGET 3
    + o  c1 y2 }4 h) _1 l
  19. #define BOX 4" N! x7 z! ?. d
  20. #define TARGET_IN 5
    9 ?) T, D( K2 T4 T" m, r
  21. #define PERSON 6
    3 t. y3 D* r% ^2 p# O! m

  22. 4 e5 g# I, D9 r+ }4 s: P

  23. 6 i0 [- ~( F$ U1 F
  24. /*函数声明*/
    . t5 X, y' ?" k1 ^
  25. void SelectColor(int iColor);
    / s% b0 }6 H  F+ T2 u# l
  26. void DesignUI();0 L+ X! @( l+ W7 j  j$ F& `
  27. int WelcomePage();/*初始界面,每次通关后跳回*/: X2 C( l0 k- b, \9 L
  28. void GetLevel1();
    + ~0 t4 V3 H" {1 Y# A
  29. void GetLevel2();
    $ h7 I/ G* O+ r3 {0 d
  30. void GetLevel3();
    ( j, c* `* a4 U" |" i' f/ I& Y
  31. void GetLevel4();
    5 _6 q, \9 m; i/ f0 h* |3 z
  32. int PlayGame(int aiMap[][16], int aiMap2[][16], int iSum, int iImp);
      }0 i7 M. h' e; c: k
  33. int PrintMap(int aiMap[][16], int iImp);, W8 Z$ x! B4 f7 u
  34. void MoveBox(int aiMap[][16], int iPlayerX, int iPlayerY, int iSelect, int aiMap2[][16]);
    1 Q/ n/ ^$ Z$ ^" w& c: Z
  35. # l) ]$ \$ Z' F5 K4 H- Q. R
  36. /*主函数*/
    4 X: p# V& J, E
  37. int main() {* X0 i, D4 y- J, C
  38.         while (1)4 g3 x' ?: l* ~$ G* m1 w
  39.                 DesignUI();
    4 G# c' H7 N0 v
  40. }
    . F% o) |$ N- B1 T9 A" H
  41. , S1 G6 T  v- o: b
  42. /*文字颜色函数*/: |+ I2 r3 R: f& j* b  s9 Y( q
  43. void  SelectColor(int iColor)                  //颜色函数! u8 \" e0 x( R) \
  44. {- U- H1 `+ I: A# r( i
  45.         HANDLE  hConsole =
    ' u, C8 ~- l5 Y, M7 Z$ D
  46.                 GetStdHandle((STD_OUTPUT_HANDLE));//得到控制台输出设备的句柄
    : B8 Y2 D' Q& S3 E1 m, Q, A
  47.         SetConsoleTextAttribute(hConsole, iColor);//设置控制台设备的属性
    $ l( W5 j/ H( q$ a
  48. }8 m' \# o- I6 y3 |

  49. 5 S2 G- i6 v$ ~" ?
  50. /*主界面函数*/
    : i, I% v* a4 R  e! [
  51. void DesignUI()
    , I, Z+ D6 b3 {) j
  52. {( N( ~9 |0 w6 H3 g2 l
  53.         int iCh;
    + M- i4 e5 l" P
  54.         char cNum;
    9 o+ F, X, D& J  D
  55.         iCh = WelcomePage();' f0 i2 m6 y( }: p
  56.         if (iCh == 49)/*键盘输入1,开始第一关游戏*/* s. J5 {3 g: O% D. |% O( t& O; e# [6 Z
  57.                 GetLevel1();' a" d9 ]% ]; Y  h% K' O1 O, p/ l- K
  58.         else if (iCh == 50){/*键盘输入2,选择1到4关的游戏*/- g$ C. A: K( y2 x4 y
  59.                 printf("\n\t\t Please input level!(From 1 to 4):");
    9 B; r* B  q. ]/ ^4 P3 a
  60.                 getchar();8 S+ @0 l% T) s  h/ l/ i
  61.                 cNum = getchar();
    , J; `9 g* v3 v$ ?( d& e
  62.                 switch (cNum){: G: l, p( f% C& g; g' f& j
  63.                 case '1':( H9 T) @1 H6 |6 e
  64.                         GetLevel1();% n5 e3 K) d6 E8 n% {6 O
  65.                         break;
    % T6 o9 q! r5 n: ]7 S3 E$ u. e
  66.                 case '2':
    / J% q2 ~4 z5 ^* f
  67.                         GetLevel2();3 @: ]4 y2 e  U
  68.                         break;
    ' t* G0 F8 h2 y0 A, X# l1 P
  69.                 case '3':+ W4 }, G. \# N9 n2 l. F
  70.                         GetLevel3();: U9 o- n" A6 e/ c! u
  71.                         break;
    ' e" q: P0 N8 I. F0 l
  72.                 case '4':
    * h) }0 D1 M8 T5 u9 L2 G
  73.                         GetLevel4();( K: ^7 U; w2 T: U- t) F
  74.                         break;
    & t; k$ Z9 i/ {! c7 k
  75.                 default:
    * g" k  f3 N' E
  76.                         printf("Enter error!\n");3 r, u  ~& ]3 [  x* p0 Y6 P; x: w. ^
  77.                         Sleep(1000);
    , f7 P+ _' }1 L; e) r
  78.                         exit(0);
    % ?+ B- f/ ^* y1 X' K  q
  79.                         break;
    ; M, w: M8 B! e) A- o) a
  80.                 }
    6 S0 s* b5 v; N! ~" j2 d( G# W" h
  81.         }+ R4 X3 P( _9 j1 D' r
  82.         else if (iCh == 51){/*键盘输入3,退出游戏*/# U4 X; h8 e6 L
  83.                 system("cls");! i( @( G3 s3 I4 f, `, `
  84.                 exit(0);2 g4 `% ~% E7 r0 z
  85.         }/ P+ w, [# c4 }; N+ T9 @
  86. }
    : _) ]' p1 B5 `4 H$ I# `

  87. 5 ?' b) L& y" N# J/ s. w% t
  88. /*初始欢迎界面*/
    2 j, u% a) y( U' }5 b. T
  89. int WelcomePage()
    # n$ v8 |5 t0 A, G
  90. {- |- Z9 z8 h" R( E" s+ n7 {8 D$ `
  91.         int i = 0;
    # w0 u" e" C; j: F6 c3 W' h
  92.         system("cls");/*清屏*/
    4 W/ L4 R: U$ x
  93.         system("color 0E");/*设置颜色*/
    ; N' O& G' O$ D- X$ s. g( j
  94.         printf("\n\n\t\t Welcome to play box!\n\n");
    & l& R1 |3 k1 g& F8 \* ]& D
  95.         printf("\t\t Person:♀  Wall:▓ Box: ●  Target:○  Reach target:☆\n");
    / t4 B* h5 w8 h: V* H4 S
  96.         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
  97.         printf("\t\t Press number 1 to start new game\n\t\t\n");+ _3 B) C. j( }, L8 a& O
  98.         printf("\t\t Press number 2 to choose level\n\t\t\n");
    4 V0 z$ H: \6 L6 y: _2 R
  99.         printf("\t\t Press number 3 to quit from game\n\t\t\n");
    / o3 A* F6 h6 u. ~
  100.         printf("\t\t Press right number to continue:");8 K5 F9 Z- z& `, d
  101.         while (1)/ e8 y4 a0 F( Z
  102.         {1 L5 n1 C. U( Y2 z
  103.                 i = getchar();, r  R3 ~. G" }# s" n, z2 w' H0 O
  104.                 if (i >= 49 && i <= 51)! e; A2 k: U# u
  105.                         return i;
    9 `3 I- ?# h7 m2 l3 {- |9 K; x  z
  106.         }% v! G3 P' }. i7 X# R! F3 Y) o
  107. }
      H( J  I" ]* \0 @! `3 a% w/ B1 [. P

  108. / H$ g/ C: ]7 O3 L5 d, L; T! r
  109. /*打印地图函数*/8 }+ S9 L- N* e6 @/ _) N5 B
  110. int PrintMap(int aiMap[][16], int iImp) {/*参数iImp代表游戏关卡*/" a) l8 {0 i9 ?3 R' \4 X
  111.         int i, j;0 ^5 `( |0 o9 l& q
  112.         int iCount = 0;! C1 G2 @6 M; ]
  113.         for (i = 0; i<14; i++){
    ) w& ?2 `; {* t1 n5 g' b- b. F2 D  l
  114.                 for (j = 0; j<16; j++)
    1 Z# P% \* }5 y9 {( O/ l
  115.                 {
    % Z- f* w) Z5 s# n
  116.                         switch (aiMap[i][j])" [; }4 D" |8 ^& M
  117.                         {4 {' m  u5 H9 z6 S& i
  118.                         case 0:                /*空地*/
    2 u) K  b+ Q9 @
  119.                                 printf("  ");! G* W# B- n2 v+ G) k
  120.                                 break;
    ; M' K# Q. c; `" q
  121.                         case 1:/ ~7 ^: ]. N% ?: d& R7 S
  122.                                 SelectColor(14);    /*墙*/5 [9 d) L) _9 g, k
  123.                                 printf("▓");
    6 W% A7 z8 C! `: q" D, ^7 T
  124.                                 break;+ O. X# D% k5 s' @8 v3 d- _
  125.                         case 2:                /*内部空地*/
    6 P- a! o$ K" A. A, V. b' x
  126.                                 printf("  ");
    4 x7 ^5 t9 ]9 \% l$ K/ b
  127.                                 break;
    3 c5 N: T9 w$ R  q* k5 M6 b
  128.                         case 3:6 Z1 k7 h, V2 @7 @) V
  129.                                 SelectColor(11);    /*目的地*/* v2 f/ F. W* U1 B/ T7 H
  130.                                 printf("○");
    7 O) }# M6 ~* ]0 i; t3 b- m
  131.                                 break;/ C- ^+ @) _" n4 X1 ~! L" ?
  132.                         case 4:                /*箱子*/
    7 V9 f( h" @8 O- G# N; R1 k, k0 J9 m
  133.                                 SelectColor(11);. S' u' S4 O$ p$ x3 g
  134.                                 printf("●");
    2 l* V, M7 l. z0 S( ?1 S
  135.                                 break;- U1 J# W  G0 r7 W! B
  136.                         case 5:                /*箱子推到目的地后显示*/& g# m2 h1 g8 Y6 R; b, d
  137.                                 iCount++;
      p2 V9 F( t7 l# E  ]! D, ~
  138.                                 SelectColor(9);7 d, P$ W1 g2 t" ]3 n6 z
  139.                                 printf("☆");
    ) J1 a3 F8 \) B& p
  140.                                 break;# ?6 A& S9 w  j8 H- _# P! f$ W3 j
  141.                         case 6:                /*小人*/
    4 t2 H  L& m3 n0 h* f8 {' L5 F
  142.                                 SelectColor(10);1 I( @0 F! r1 Q5 v
  143.                                 printf("♀");
    % D: a" `# E! @' A6 ^3 V
  144.                                 break;: Y( U- @8 z4 P/ u/ Q
  145.                         }4 _% j( ?" E. `1 i" U
  146.                 }
    ) g& J  ^5 p8 N" h5 t+ s
  147.                 printf("\n");* D4 _' r7 K4 H
  148.         }
    ! g  _* y8 q6 C" l) W- |- l3 a; Z
  149.         SelectColor(14);
    5 \/ D8 y# v; Q9 |8 W  n* d& y4 [
  150.         printf("\n");
    8 k; ~$ `, P" A2 n4 g' I, t
  151.         printf("\tYou are in Level %d!\t\t\n", iImp);- `3 h0 z# V. V; Z/ l
  152.         printf("\tPress arrow keys to play the game!\t\n");  Q( Z" `' z8 F5 m7 Q
  153.         printf("\tpress N to the next level!\t\n");0 y+ x* c* {+ q& U1 N5 n
  154.         printf("\tpress Q to return the home page!\t\n");3 g) M6 G( m! C) ^( n  N! m5 d3 Z
  155.         return iCount; /*返回值表示以正确放入的箱子数*/5 p! C3 G0 q  G& p  f' K3 t, g: w
  156. }
    $ [# A" r, d$ B+ U5 J1 e9 R

  157. * t& B3 X3 x( x
  158. /*第一关*// q/ P6 M( Y3 k4 B( ^% a
  159. void  GetLevel1()  {
    0 E/ p) w3 ]7 r; I4 [
  160.         int  aiMap2[14][16];/*表示原始地图*/$ G8 p. u2 r4 ^7 y1 K" M. @
  161.         int  i, j, iSum = 0; /*iSum表示箱子的数量*/
    ' o( z$ p; q- I! V6 {  D' A

  162. 0 A" r4 ?2 _6 }; g/ _# y/ j$ H
  163.         /*地图形状
    , E  K6 j# W& n8 K! y- T5 ?
  164.         1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
    5 Q: z; k9 C# J5 X- l
  165.         */9 b" y* ]/ x5 Z' M
  166.         int aiMap[14][16] = {
    * y& E. X2 f+ C# T( M5 {" x
  167.                 { 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
  168.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },2 T2 i; L" I4 K
  169.                 { 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
  170.                 { 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
  171.                 { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0 },4 t* F6 E4 Q0 n+ R
  172.                 { 0, 0, 0, 1, 1, 3, 4, 2, 1, 1, 2, 1, 1, 0, 0, 0 },/ B/ x8 X# |% b/ y% W
  173.                 { 0, 0, 0, 1, 2, 3, 4, 6, 4, 2, 2, 3, 1, 0, 0, 0 },1 e' X% K% B( ~  T6 o; s
  174.                 { 0, 0, 0, 1, 2, 3, 2, 4, 2, 4, 3, 1, 1, 0, 0, 0 },( ?& T7 d  j' }# ]% S+ A
  175.                 { 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
  176.                 { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
    7 U: ]  m" d; r$ b% R
  177.                 { 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
  178.                 { 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
  179.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },: z4 v% }/ {' T1 @  j
  180.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    9 H7 n4 o+ {* s) i. a) ], F
  181.         };
    ! p7 Y6 x  l6 b1 B, X( x6 y
  182.         for (i = 0; i<14; i++)
    0 U4 @- k( k$ C/ r5 f$ M5 d
  183.         for (j = 0; j<16; j++){
    $ j0 |; W. F. L- r. P' a
  184.                 aiMap2[i][j] = aiMap[i][j];
    0 B( b. x! `/ O" y! k2 b
  185.                 if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/
    1 c3 p( b) X; N2 B
  186.                         iSum++;
    . P* _) G0 S& f' Q, ^0 L9 |
  187.         }
    / X* I1 V: K- A8 x
  188. - `# I" z) x4 `/ i" W4 W
  189.         /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,
    2 ?+ z) I5 A, q1 U8 u
  190.         其他情况(过关,进入下一关)执行GetLevel2函数,进入第二关2 i7 H, M8 c# O! S
  191.         */- I/ H/ J7 U7 [! O; L3 }
  192.         if (PlayGame(aiMap, aiMap2, iSum, 1) != KEY_RETURN)
    # E" @& K# }+ e$ h
  193.                 GetLevel2();
    - V" [5 U  L3 n* ]# F" b* q
  194. }
    % P4 L& A% Q1 x0 L+ c! \0 Z1 s

  195. 3 E- z& |$ w8 Q) D  [/ i, a
  196. /*第二关*/4 j. Z4 q% Y# u' p
  197. void  GetLevel2()  {1 w& l; l* L6 [2 r
  198.         int  aiMap2[14][16];/*表示原始地图*/5 y" Y2 Z' E$ p- c* A0 `* u5 Q
  199.         int  i, j, iSum = 0; /*iSum表示箱子的数量*/
    0 d: H5 `* w; n7 U% q- P5 V

  200. . J( Y0 \; f! {* _' G% }
  201.         /*地图形状
    : m% d0 L5 x- D4 Y* ?
  202.         1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
    # a) q# C- T# L' _+ `, X
  203.         */6 b, |" r. e* z& g( |& E& ]
  204.         int aiMap[14][16] = {" w& [6 v! J9 u0 w+ \, a7 b$ [' I8 w
  205.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    % j% H5 C- w; g8 d
  206.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  z! M- }$ Q2 Y5 }7 C
  207.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    0 T1 z- T; {- @
  208.                 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },3 ^- R3 D, z6 P  k% O+ Y1 ?
  209.                 { 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
  210.                 { 0, 0, 0, 1, 2, 2, 2, 4, 2, 2, 2, 1, 0, 0, 0, 0 },
    3 l! g& ]* g1 G" ?" b! a$ w
  211.                 { 0, 0, 0, 1, 2, 2, 1, 1, 1, 2, 4, 1, 0, 0, 0, 0 },
    * D# |% f% h, o: _7 y
  212.                 { 0, 0, 0, 1, 2, 1, 3, 3, 3, 1, 2, 1, 0, 0, 0, 0 },
    0 ~" W9 p, \' L# I% [
  213.                 { 0, 0, 1, 1, 2, 1, 3, 3, 1, 1, 2, 1, 1, 0, 0, 0 },& z* v0 U5 {7 ~8 C/ f3 H# ]
  214.                 { 0, 0, 1, 2, 4, 2, 2, 4, 2, 2, 4, 2, 1, 0, 0, 0 },
    ' [$ O* {- C  q% k) i2 g
  215.                 { 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 6, 2, 1, 0, 0, 0 },
    + c& V! L! Y# p8 B5 b6 j
  216.                 { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },& w' z9 h/ I% q2 k" [+ _# G
  217.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    5 m5 Z; p: }* `4 L$ S' m
  218.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    $ \- m/ g( v; v) B( _8 b
  219.         };
    , N! A- w& C" G1 O$ P, \; r

  220. / v, R/ s5 f& r  o& g5 x
  221.         for (i = 0; i<14; i++)0 a! ]+ L7 n! v( R" `9 @
  222.         for (j = 0; j<16; j++){
    0 V: D' I; o$ V4 D$ B$ M( c
  223.                 aiMap2[i][j] = aiMap[i][j];; r! x; M( k$ c
  224.                 if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/3 |$ W6 ]& J; u
  225.                         iSum++;
    % Z( C' R7 r6 F4 i9 f" z  W7 E
  226.         }" x3 [7 g- ], X: Y5 n1 C7 |, d

  227. . Q6 U' u$ q. ^1 c5 U
  228.         /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,# f- w' R  I  Y# m8 D
  229.         其他情况(过关,进入下一关)执行GetLevel3函数,进入第三关$ @+ \. D& u' h# O1 ~- M! M. S, b
  230.         */8 V( k9 P: k, Q1 v; G8 b
  231.         if (PlayGame(aiMap, aiMap2, iSum, 2) != KEY_RETURN)
    ( K: b. ?' d8 b) N/ h1 l' c+ q/ g
  232.                 GetLevel3();
    % C# E& F2 j% p9 K' q4 M/ g5 C8 y( t4 Q
  233. }
    3 n. y7 [2 f; x

  234. 2 H% V& i0 J& a0 k% u" G
  235. /*第三关*/
    $ f# q( K( s2 V+ `
  236. void  GetLevel3()  {
    # m) J; e" ~9 O) V- R
  237.         int  aiMap2[14][16];/*表示原始地图*/2 O3 j/ Q3 R/ e% A
  238.         int  i, j, iSum = 0;/*iSum表示箱子的数量*/0 W- A3 |; q) {) }" R7 F; b! ?
  239. / E8 Y, a: a& @  ?! r! J
  240.         /*地图形状
    8 p7 Y0 Z9 A; S  [
  241.         1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
    ' Z: g/ D4 S! i
  242.         */( O3 a4 r. V, U5 O2 F
  243.         int aiMap[14][16] = {. E+ u- e* N" U+ O
  244.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    . ^  B) F, I2 n( x3 q, k
  245.                 { 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
  246.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },& G, F: R/ L8 B# K4 z
  247.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },0 ?% d+ g  u8 r0 X
  248.                 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0 },
    ' Y# |  `5 v6 {$ q2 z! W
  249.                 { 0, 0, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 0, 0 },2 `/ _# v/ ~3 E3 T1 ^
  250.                 { 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
  251.                 { 0, 0, 1, 2, 2, 4, 3, 3, 3, 3, 2, 4, 2, 1, 0, 0 },
    ; d% F; z: Z* e' Z2 L
  252.                 { 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
  253.                 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
    3 c( Y! {% o& N
  254.                 { 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
  255.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },! P( U4 u# J: P+ V! e/ o
  256.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  |- d, l3 U3 {0 z9 ]5 M7 C
  257.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },# i: v1 i3 ]: f+ z7 J
  258.         };
    3 v3 p/ t: m% t( K# s/ G

  259. 4 p: H2 |' r; T7 L' U8 {* a
  260.         for (i = 0; i<14; i++)
    ! h7 l5 h3 b0 l
  261.         for (j = 0; j<16; j++){
    ( W0 `1 s( L& f( S# P7 t( F
  262.                 aiMap2[i][j] = aiMap[i][j];
    5 F1 E+ W& V# u* u4 J
  263.                 if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/4 i+ ?# P3 }6 {: n4 {" u
  264.                         iSum++;
    & T, b! P: p+ `1 Z) J# F2 S% t8 K# E
  265.         }4 v" ?) _" ]( k

  266. 0 M5 H1 P5 r" o  v
  267.         /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,
    5 F! k, ]' I- q) A7 [
  268.         其他情况(过关,进入下一关)执行GetLevel5函数,进入第五关- V& g/ T& s* i9 ]: ~
  269.         */
    7 r- v% G! O. C) B1 Z
  270.         if (PlayGame(aiMap, aiMap2, iSum, 3) != KEY_RETURN)/ |& ?* B6 N) a  L' w' Q- ~6 H1 D
  271.                 GetLevel4();2 E6 ?2 Z  S: f; B
  272. }
    * @  ~0 {( J& L0 d+ t4 d+ r' N

  273. : `7 j( L7 s7 s3 n
  274. /*第四关*/
    & S, X2 I% H5 {  ?9 f8 }
  275. void  GetLevel4()  {
    3 [! ^6 q7 n$ Y& e! B$ h
  276.         int  aiMap2[14][16];/*表示原始地图*/
    / l& W! d& N0 G) ^6 T( m
  277.         int  i, j, iSum = 0;/*iSum表示箱子的数量*/' {+ d  P( y2 x9 q
  278. 8 K7 @# e- u. z$ p1 x  R( C% u
  279.         /*地图形状+ y$ }9 M# [+ L9 H; Z; X; B+ x2 S
  280.         1代表墙,2代表空地,3代表未放箱子的目标,4代表箱子,5代表以放箱子的目标,6代表小人
    9 B2 C  \4 \6 I: W
  281.         */
    2 F& p. y; H3 {
  282.         int aiMap[14][16] = {
    ; ^, G) f4 ~2 P1 ^+ y
  283.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },, \7 g3 I' z2 w
  284.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },# s, H$ t) y; g9 a7 n
  285.                 { 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
  286.                 { 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
  287.                 { 0, 0, 0, 0, 1, 1, 2, 2, 4, 3, 3, 3, 1, 0, 0, 0 },6 @5 b/ E7 a" L
  288.                 { 0, 0, 0, 0, 1, 2, 2, 4, 2, 1, 5, 3, 1, 0, 0, 0 },
    : d: `& f! }  K) E' \
  289.                 { 0, 0, 0, 1, 1, 2, 1, 1, 4, 1, 2, 1, 1, 0, 0, 0 },
    % Z' L0 Q1 |. [8 m( S9 Z
  290.                 { 0, 0, 0, 1, 2, 2, 2, 4, 2, 2, 4, 2, 1, 0, 0, 0 },
    6 U7 u0 p0 r6 f
  291.                 { 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
  292.                 { 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
  293.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },' Q6 \# n: ^5 M1 _2 q' N, S
  294.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    - C* |% x  p  D: ^# S; l4 m
  295.                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },$ F/ r2 d7 c6 s8 f
  296.                 { 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
  297.         };% S  N5 N" I6 I( i+ q7 _
  298.         for (i = 0; i<14; i++)! c# y/ N7 L7 S3 g) u3 y
  299.         for (j = 0; j<16; j++){
    1 e4 I6 U- H2 Y" @
  300.                 aiMap2[i][j] = aiMap[i][j];. I% X, B# |" W9 H9 _8 e4 ]3 R% Z
  301.                 if (aiMap[i][j] == TARGET || aiMap[i][j] == TARGET_IN)/*记录箱子个数*/6 a6 A# y/ {! u+ c- B/ N
  302.                         iSum++;/ K2 [* U( g! F  E4 f7 m) _
  303.         }7 z: i- E0 H( G. Q+ I7 @9 d1 H
  304.         /*PlayGame函数返回值为4的情况代表键盘输入Q返回到主界面,' k6 D( s( ^, M- @$ V4 z% J& c
  305.         其他情况(过关,进入下一关)执行GetLevel7函数,进入第七关6 g/ q* W) ?- J4 Y$ `
  306.         */
    2 v7 ^" }# }1 c7 s, i
  307.         PlayGame(aiMap, aiMap2, iSum, 4);3 K1 k$ x7 e0 O4 _) \3 ?- O( k
  308. }9 w2 [0 [8 g  }: `: G+ Y2 _
  309. : Y$ D4 Y) t- O" S3 ?, z
  310. /*游戏操作函数*/& n7 U; ^( y" t9 |7 j! V
  311. int PlayGame(int aiMap[][16], int aiMap2[][16], int iSum, int iImp)/*iSum代表箱子个数*/3 g: e& n' \, ]5 _" Q
  312. {
    , H! C7 y; z4 }7 F" r
  313.         int i, j;) p# q+ o/ ?% @% R3 T
  314.         int iPlayerX, iPlayerY;        /*人的位置x,y坐标*/; R" _1 ?9 P( J2 N
  315.         char cOp;                    /*所按下的方向键*/
    , W! d7 s0 f* Y1 {; ~
  316.         int iNum = 0;               /*箱子推到目的地的个数*/8 S  T( U  E5 @) z% Q
  317. , i5 t/ A1 C9 {( O8 X% s9 X
  318.         while (1)
    - {  k/ O/ I3 ]; @
  319.         {! D3 b3 K3 e8 A* D
  320.                 for (i = 0; i < 14; i++)' O% W+ m. g8 p& e
  321.                 {
    " Q+ `, t1 n. T# |' i8 a. _8 K; c
  322.                         for (j = 0; j < 16; j++) /*循环遍历寻找人的位置*/
    ! g# p5 [% x* R+ D8 E  p# x5 r
  323.                         {
    7 n+ @: v: E3 ]2 r% x' a; v
  324.                                 if (aiMap[i][j] == PERSON)    /*6代表人的位置*/
    * c8 J7 D: T: n
  325.                                         break;
    + a9 r) `& o& G
  326.                         }8 h6 A- U4 Q' x/ @
  327.                         if (j < 16)
    - Q7 ]& ]( A% @: u7 ]6 t3 g
  328.                                 break;! w2 P' I/ v9 A# a% j8 l0 v  H
  329.                 }
    8 w  v) {6 b$ n6 |/ i0 r( u$ u

  330. ; X& i. I- ~% L) P4 {
  331.                 iPlayerX = i;           /*将二维数组中的人的x,y坐标赋值给iPlayerX和iPlayerY*/! f* A4 I& m! t1 R; |
  332.                 iPlayerY = j;
    , \8 O: c- q0 H8 \: k  q
  333.                 system("cls");
    2 V5 `5 O9 k1 D, }% n! ]
  334.                 iNum = PrintMap(aiMap, iImp);
    / ^: y* i4 s! Y- }" W
  335.                 if (iNum == iSum)5 i( G2 P+ ^6 S1 o/ I: r% W
  336.                 {           /*将所有箱子都推到目的地*/$ l, T7 K+ e5 X. i' C; N' [5 H
  337.                         printf(" Congratulations!\n");
    ' r1 o. k" D; K% ]; \3 M
  338.                         Sleep(3000);: Q. [* a$ ]# ]: ~( c
  339.                         return 0;: Q- L0 G) c) s  {: ~& G2 q
  340.                 }
    . m! C+ o/ Y" y# Z3 L
  341.                 else. D  K  H- ~: _6 A$ m
  342.                 {                       /*还有箱子没有推到目的地*/9 M% V- Z, ?' U+ @2 C6 }
  343.                         cOp = getch();          /*捕获用户键盘输入*/  Q- W: n% Z' j! r6 X, L& `! H
  344.                         if ((cOp == 'n') || (cOp == 'N'))/*输入N进入下一关*/7 s& r: l/ R! x, m6 m+ m
  345.                                 return KEY_NEXT;
    & I. ?; R6 S/ r7 t( y9 b; s
  346.                         else if ((cOp == 'q') || (cOp == 'Q'))/*输入Q返回主界面*/
    ; a* @+ Z" P( E, K6 o- a
  347.                                 return KEY_RETURN;: Q  R2 u$ E% w& q' i
  348.                 }, Y4 F+ _% M9 ]4 X% k+ K% V0 {
  349.                 switch (cOp)
    " |* d8 S3 R! A& v* O8 S- B
  350.                 {          /*用户输入方向键*/
    0 y7 H$ G; o  d$ W' k- \
  351.                 case KEY_UP:        /*上箭头*/
    9 e1 ?0 S" t6 H+ X- i9 p$ b
  352.                         MoveBox(aiMap, iPlayerX, iPlayerY, 1, aiMap2);
    ! H, a& H# \4 N* d* ^1 Q) _& }$ c
  353.                         break;) j# p9 t0 P5 z3 \% G
  354.                 case KEY_LEFT:        /*左箭头*/* e7 i0 D* C, _
  355.                         MoveBox(aiMap, iPlayerX, iPlayerY, 2, aiMap2);
    2 V1 ]# S  s1 ^$ m# P8 k2 u
  356.                         break;" {6 X7 T! S. t
  357.                 case KEY_RIGHT:        /*右箭头*/9 f* H- a) f5 y/ d
  358.                         MoveBox(aiMap, iPlayerX, iPlayerY, 3, aiMap2);) C- t" [: e: e' a0 u$ A4 x: m* V: N
  359.                         break;
    6 x7 V. |- _2 `5 v5 D5 ]7 g' [
  360.                 case KEY_DOWN:        /*下箭头*/
    ' ]) [/ y: ^9 E
  361.                         MoveBox(aiMap, iPlayerX, iPlayerY, 4, aiMap2);  n" H! b  o( ~# @
  362.                         break;
      u1 j- X  Z6 }
  363.                 default:
    ) t# s. [: l" F
  364.                         break;6 _% I5 v* \* `/ s; I! t
  365.                 }
    / {. \. u' S7 X+ A+ ^0 [
  366.         }, w0 S2 v. T5 X4 S  W. i7 y' ?
  367. }
    ) w8 }) F1 {+ B8 ^# U9 T8 Z

  368. 2 p0 ]8 z4 ?9 u- G& {
  369. /*方向移动函数*/
    5 m* R3 b* A! a$ e8 B3 {$ X! w( q
  370. void MoveBox(int aiMap[][16], int iPlayerX, int iPlayerY, int iSelect, int aiMap2[][16]) {
    4 F3 `( U$ k3 |0 l
  371.         int iPlayerX1, iPlayerY1;        /*小人下一个要走的位置坐标*/0 I# ]8 v8 |" U& i+ A, p; i1 Y+ s; w
  372.         int iPlayerX2, iPlayerY2;        /*小人下下一个要走的位置坐标*/1 g& S  h3 E$ Q: ]; `% I( S
  373.         switch (iSelect) {; j6 N8 l% G# i: B6 }
  374.         case 1:        /*向上移动*/
    # z# w( O; u, _2 q
  375.                 iPlayerX1 = iPlayerX - 1;* K' c+ J7 w3 w* P4 t& i* _$ c
  376.                 iPlayerY1 = iPlayerY;
    2 V+ y7 d/ a+ c- b. \  [
  377.                 iPlayerX2 = iPlayerX - 2;0 G0 ~( ~: S8 V! t
  378.                 iPlayerY2 = iPlayerY;
    6 }" v) R. [7 g6 a6 X7 b( T; w
  379.                 break;
    ; [/ I: P  Z, g% D
  380.         case 2:        /*向左移动*/% W. S; M% d. V0 a% v, i
  381.                 iPlayerX1 = iPlayerX;, |3 c1 e' m# S0 l! L+ F0 S+ W1 Y
  382.                 iPlayerY1 = iPlayerY - 1;
    5 ~4 ^5 p- k3 Q( g/ U# m- K
  383.                 iPlayerX2 = iPlayerX;
    2 F% m; q+ ^$ ~
  384.                 iPlayerY2 = iPlayerY - 2;
    7 g% y( J9 W& B1 R- W# L
  385.                 break;5 y, B7 S  j/ Y5 F' D
  386. # V: @4 C" \) M; R2 x
  387.         case 3:        /*向右移动*/
    ! a0 z; l" b$ h; }1 Q* ?6 x
  388.                 iPlayerX1 = iPlayerX;
    * Y' O; D) M: X$ W
  389.                 iPlayerY1 = iPlayerY + 1;2 X$ W- p/ f; p& n, T6 z3 D
  390.                 iPlayerX2 = iPlayerX;
    + i: O4 B) e) P: I
  391.                 iPlayerY2 = iPlayerY + 2;6 y; X: _& N/ T3 @3 z/ [# o
  392.                 break;, a: |" k5 [3 H
  393. 2 a) f/ |$ a% M4 Y5 Z+ ]
  394.         case 4:        /*向下移动*/
    3 j7 a. w& {# R( H& u0 F+ \0 o* Q6 r
  395.                 iPlayerX1 = iPlayerX + 1;& `6 j( g, e; Y- r, Y
  396.                 iPlayerY1 = iPlayerY;
    8 j3 ?. L' O1 [7 |
  397.                 iPlayerX2 = iPlayerX + 2;6 M/ [6 k7 z9 m6 B5 u3 A* o
  398.                 iPlayerY2 = iPlayerY;: A# y5 h# q6 q; R+ b) b. @. O
  399.                 break;
    3 B4 G4 W* v- N9 D: l
  400.         default:+ M; ~- I. G6 n' j  u+ |5 ?9 Z
  401.                 break;8 N8 W$ v1 F6 m
  402.         }
    3 ?. e: d( k, z7 r4 @7 _
  403. ! N1 m8 S; t4 p) p. J7 J1 K
  404.         /*对地图的操作*/) y3 e3 x+ R# U0 C. F7 n
  405.         switch (aiMap[iPlayerX1][iPlayerY1])/*判断小人下一步要走的位置*/* j& z& t) T, A$ j% Z, l2 p. Q+ f
  406.         {" v. i, g5 A6 u1 e) q; B6 ~
  407.         case WALL:      /*下一位置是墙,不能移动*/5 M6 p1 M2 k% L
  408.                 break;
    . q4 E* ^2 j) G" B: b& f; R9 v7 S
  409.         case SPACE:     /*下一位置为墙内空地和下一位置为空目的地的情况相同处理*/
    * L1 u0 J8 ]6 {; {9 R0 Y
  410.         case TARGET: % Q5 ?5 c  f- H, z" j& x
  411.                 aiMap[iPlayerX1][iPlayerY1] = PERSON;/*小人移动到下一位置*/# ^, l: j! b/ I7 g7 N
  412.                 if (aiMap2[iPlayerX][iPlayerY] == TARGET || aiMap2[iPlayerX][iPlayerY] == TARGET_IN)8 l1 Z0 [4 S1 H% S
  413.                         /*小人所在位置初始为空目的地或满目的地,小人移动后此处恢复为空目的地*/
    ' a0 [9 d4 ]* P' y
  414.                         aiMap[iPlayerX][iPlayerY] = TARGET;
    . Y' u3 d9 s- N" t
  415.                 else( F2 Z% g# z4 {5 c  V
  416.                         /*小人所在位置初始为墙内空地、箱子或者小人,小人移动后此处恢复为墙内空地*/
    # ?0 ]% N2 t" j* j  V' `
  417.                         aiMap[iPlayerX][iPlayerY] = SPACE;
    6 W5 B2 F, x- ^
  418.                 break;
    ! f1 @( ?* {# h5 U
  419.         case BOX: /*下一位置是箱子和下一位置是已放箱子目的地的情况相同处理*/               
    ' ?6 N& I* z* P
  420.         case TARGET_IN:* U; N7 j/ [/ m- {2 X
  421.                 if (aiMap[iPlayerX2][iPlayerY2] == TARGET)$ x) e& o! U3 J! e% q9 |# C: o
  422.                 {. |' u0 E" _% W2 V) a
  423.                         /*下下位置为空目的地,箱子和小人一起移动,箱子落入目的地*/! x: e; a: T* e1 P
  424.                         aiMap[iPlayerX2][iPlayerY2] = TARGET_IN;/ {. i, O4 ^- O+ A" F
  425.                         aiMap[iPlayerX1][iPlayerY1] = PERSON;
    & p( I$ x+ r! r& L( w; i9 G* }
  426.                 }8 h, t8 t$ i. n$ k$ `
  427.                 else if (aiMap[iPlayerX2][iPlayerY2] == SPACE); a9 o& T# e. f, B
  428.                 {% I* Q3 @+ G# V7 \, c. H
  429.                         /*下下位置为空地,箱子和小人一起移动,箱子落入空地*// F8 |) z! U& L: C$ D+ U$ F3 I6 x) w8 D
  430.                         aiMap[iPlayerX2][iPlayerY2] = BOX;; [- f0 p& u+ E. u1 C
  431.                         aiMap[iPlayerX1][iPlayerY1] = PERSON;7 B' e' w) p& j6 Q
  432.                 }
    ( h& F# {' O2 [" i3 q
  433.                 else/*下下位置为墙、箱子或者满目的地,不能移动,直接退出*/5 _' `8 I( M2 d& R: C4 w
  434.                         break;5 l9 l8 Q* @0 ^4 d* c& m! ^+ F
  435.                 if (aiMap2[iPlayerX][iPlayerY] == TARGET || aiMap2[iPlayerX][iPlayerY] == TARGET_IN)9 E+ x3 y- K3 d" ~, W) S' `
  436.                         /*小人所在位置初始为空目的地或满目的地,小人移动后此处恢复为空目的地*/  x* ~+ j8 s4 V1 X
  437.                         aiMap[iPlayerX][iPlayerY] = TARGET;: o* z7 ], q; ^& t$ T6 f: L
  438.                 else/*小人所在位置初始为墙内空地、箱子或者小人,小人移动后此处恢复为墙内空地*/
    ; f6 o3 z4 x! K/ S/ a: n
  439.                         aiMap[iPlayerX][iPlayerY] = SPACE;+ v) o8 n$ J  V+ U
  440.                 break;
    9 m2 |! H9 h4 S( Z" z& r7 F' y7 l
  441.         }  v3 H3 l5 L! O$ Q6 d
  442. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区 |网站地图

GMT+8, 2024-4-29 01:30 , Processed in 0.055535 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表