一. 前言; h8 _$ W* A3 d! c4 u/ \
在我们的DIY套件上,终于集成了第三个小游戏----2048。怎么感觉做成了个游戏机呢(#.#)。% w8 I+ n N+ F* x. f: B) s
这款游戏也是非常流行的,玩起来也是非常的轻松,要想过关的话,还是需要一点的技巧。) z$ e+ S9 r2 H; E# Y4 [
- u6 q# n, O" M+ w二. 游戏规则简介
9 l& o$ {" g9 H' g8 w& J# r1.游戏地图为 4 * 4。
" g* d M. v d9 K2.每次移动所以方块都会向指定的方向移动,同时会在地图上随机生成值为2或者4的方块。
5 ]! S% z0 {" I5 F: N; a3.在移动的过程中,如果相邻的两个方块的值一样,那么它们就会融合成一个值为它们之合的方块,每一次移动,只能进行一次融合。# U7 X1 D2 I7 V, y5 [' U9 D
4.如果方块中的值为2048,则游戏胜利。如果整个地图都被方块添满了,则游戏失败。9 {/ n, }; d+ R) h( ]! O: i
三. 核心代码介绍0 p- v( @% K4 A- y
方块的随机生成,和胜利的判断的实现都较为容易。整个游戏的核心部分为第三点,方块的移动和融合,这个部分如果弄懂了的话,整个游戏实现起来会非常容易。( i9 [% o Z! J: V# K* j3 e9 N
先在Visual Studio实现这一过程的准确性,然后在搬运到keil中去,这一方便debug发现问题。
7 k7 F5 p; _* C. h5 {
, _( q- ~9 `9 Q1 o/ R" J这里先合并,后移动
. ?8 x1 E- K. v: z7 K1 L- F& e, {, o! ~, c: P6 c" m
1.通过定义一个长度为4的数组,来模拟一行数据。
/ }: |4 P9 r& k) _7 @: c- int Map[4] = { 0,8,0,8 };
复制代码 6 e& S2 O+ ?8 g0 \& @
2.通过循环来找到可以合并的两个数,将其合并
* v( ?$ P* c3 c- L- for (j = i + 1; j < 4; j++)+ V) v9 l1 K9 ?
- {* K) p3 _( a5 f4 o& M
- //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过9 N/ F- P+ V5 b6 a% ~) ]
- if (Map[j] != Map&& Map[j] != 0)
. ?; I4 [+ c0 ?: u% c# L/ F( P% p - break;
+ I# _* l9 W7 f! C1 u/ E; @" ^6 F- b/ H
4 X4 O5 X: X& Y9 i8 n) C/ K6 F5 I- //如果有相等的两个方块,且中没有其余方块,进行融合- i* m6 ?1 V% [( ~
- if (Map[j] == Map)
, ]: u; }% t5 d' l - {2 s' m0 x1 a! _6 e/ S" P3 a1 d' k% n
- Map[j] = 0; //先将这方块消除掉+ n$ z4 X2 H: H* X+ o4 }
- unsigned char k;
" G! Q5 C9 O5 v - for (k = i + 1; k < 3; k++)- q# C! r7 U2 f9 ?
- {/ ^/ q. a* S5 z
- Map[k] = Map[k + 1]; //移动一次方块
* h& w+ I* c+ h' |6 d6 ^9 w - }
7 y: }8 K) @ [1 A4 Q - Map += Map;//更新融合后的方块的值4 C) k4 g7 u$ K
- Map[3] = 0;- Y4 n0 G3 c0 G |
- flag = 1;+ r d' B8 z" [8 b7 p
- break;' i: M4 N) j2 H, I! L w* G
- }
. {0 N' w* R) t - }
( J4 T" u0 t5 V7 ^, T: M' f: N
复制代码 . _9 O! e& R8 q0 T! G) ?
3.移动所有方块,直到所有方块都靠在一起" s4 v, k& ~" ^
- while (1)4 ]- I; s3 R- P6 i/ u7 J
- {
7 v2 j' \8 z. Z- S$ l - int j, flag = 0;
+ C" ?8 }8 |# m' Z - for (i = 0; i < 3; i++)
; r8 M/ U& \' h# C4 d5 w - {
5 r) B! c9 r, D0 v - if (Map == 0) //有空的方块,说明可以移动
4 p8 b; k2 V/ F2 g - {
2 `! b! g" o: I! C - Map = Map[i + 1];
2 _* g$ n& F `7 c( J# w. y - Map[i + 1] = 0;
5 j; W' r. a5 S! x% l/ O - }
) D0 s) v! R: A3 A6 U* e- f( E - }
0 l; J( z- J( z1 N8 ~5 ~5 G9 r0 v - for (j = 0; j < 3; j++)
: {0 d8 L9 ^5 G+ k" o - {0 \$ p: i. Q8 j
- if (Map[j] == 0)
& E7 S8 ^5 F$ F# c - {
; q' x$ ~2 D1 H2 a - int k;
& {: U1 S$ o* }! ^. _. O# R - for (k = j + 1; k < 4; k++)
5 K/ G$ q: s1 w1 ? - {4 O" t% D8 c; m4 J
- if (Map[k] != 0) //判断是否继续移动6 u, I/ s# X2 t; G& Z1 _2 M
- {, h/ I9 s i, S/ L% V# N5 }7 ~8 `9 A# d
- flag = 1;
" t2 v- i2 \1 P l - break;& v) {( M) {) ^; G% c; M! _
- }
% Q( U) V; x: S3 h, j/ g+ Q - }8 _# o! J# F/ C" b! O8 n( ~: f
- }
% Q" e( W5 E6 D, I2 O+ y' w! v" s - } c4 f( P+ f" G, |" w
- if (flag == 0)
9 O) g! c0 H3 O- o7 ^ - break;: d, R c- {1 g, z
- }
复制代码
) {+ Y$ r3 b; q( I7 z4.测试结果展示+ c ?8 j. H3 n$ @5 N x
3 P) V3 L5 Q. B7 v5 i; I- E" @5 T
6 q* \1 e D3 J2 ~6 t4 B0 @
+ l1 Z& k0 B* Z q7 H8 c6 ~, s( P
) A0 u5 N/ B8 V
( `. {; d0 ^* ?) N
/ y" l; e: t) T; {% F
' I: w3 V% R1 U/ o |9 k
8 [$ _- x$ p! A! j* R9 L5 F8 P完整测试代码
1 L7 B* T# |4 j! i" u1 l0 M6 B% F. K8 i
' y8 p( P1 k9 P* E7 z5 |- int main(void)9 Q: P8 E0 p7 k+ \$ B( g) F
- {- [% d9 e& u4 h1 A
- int Map[4] = { 0,2,4,8};
/ H7 I+ ~- H& N6 D- J5 m! m - int i,flag = 0;" p' g& x# w/ o9 Q
- int flags = 0;1 k- N, ?7 F. ~. b `0 p @3 I
- for (i = 0; i < 4; i++)
* m/ p5 H. M$ w3 P& b! G, G - printf("%d\t", Map);
. s" K/ j a$ x- Y! u" | D - printf("\n");) W/ V5 n; n3 h3 K# Z9 H4 z
- ) f5 Q% X9 j. Q, f7 n$ U" N: y
- for (i = 0; i < 3; i++)
' J' e$ X/ e1 ?# `" d2 k( Z - {1 ~; K+ K. K0 }4 {& a
- unsigned char j;6 C+ W/ [) t( a
- for (j = i + 1; j < 4; j++)
6 G6 f) V5 R4 v3 z4 c - {
& ]% T/ r* b; N3 J2 T - //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过7 P F: d9 Q+ d+ }3 X
- if (Map[j] != Map && Map[j] != 0)+ ?$ v0 `! |8 m* o8 D* u
- break;% G# n6 |: ^# _/ c
- $ t" S) C$ s4 {- O' b% K. l& a
- //如果有相等的两个方块,且中没有其余方块# r8 ^ v; J/ S$ M
- if (Map[j] == Map)
6 o' O. f/ Y* l" x/ ~- ` - {! D% Q! X, p B! j I) e' y( f
- Map[j] = 0;0 k* X' G& ~, t
- unsigned char k;
8 Y% u9 k! _% _ - for (k = i + 1; k < 3; k++)
8 [8 ~. _: A1 g3 I6 P - {
$ j- H3 o$ \+ z( d& @ - Map[k] = Map[k + 1];
- C- n5 U }0 j7 t. U) \! j. y - }) I/ k& E6 y) m) T7 q3 X* e
- Map += Map;
" `9 p5 r- Z7 f - Map[3] = 0;3 t0 F7 Z5 V8 k0 f3 U+ V/ F
- flags = 1;) v1 f8 f A' P- f& P( [0 ?
- break;0 w/ R$ g- I% T' a6 b
- }2 c3 o+ V Q3 z3 x( D7 G- m0 y
- }
. c2 l' z3 R. p# v" q) A6 t -
7 l5 ]1 s- \% ]3 _% { - while (1)/ Q9 G: G4 E* x3 F
- {3 j' f, d$ |! O: T3 H
- int j, flag = 0;7 h9 B( Y, N7 d, Q+ G8 X0 O5 A. L
- for (i = 0; i < 3; i++)
4 G6 ~8 e, f1 R* y; U, T' n& [1 n! R - {
: g, W6 U S' ^) F! F - if (Map == 0)
" ~ Y! _, }) n/ U9 S1 D - {
$ n; Y8 T/ Z( {% x* e* | - Map = Map[i + 1];" q4 [" B/ A# A1 J/ D) G4 A" }* t c5 I
- Map[i + 1] = 0;
$ F% g- x! x0 Z) V: _ B5 J - }9 e* I9 P9 g+ B+ s* H" ?3 O
- }
! ? v4 w' c: i- D - for (j = 0; j < 3; j++)* c8 L R2 w% d1 A
- {% |% a( B8 g" M2 p4 l
- if (Map[j] == 0)
" N _$ c- a5 [, z" r" t0 ]. Y - {
9 W" b9 \( f; h: s; }: f0 X - int k;
$ ?, r2 E r) X$ U( [# X4 {+ J# K - for (k = j + 1; k < 4; k++)
# g$ x. @2 R6 \, F4 c K( c& |" W - {
" m% a& f, Q$ y - if (Map[k] != 0)
1 W2 u5 p0 U) s/ {* F7 W( l( S - { Q& ^. R: w& ^7 _) A
- flag = 1;
/ n5 k: ^4 u1 S/ H - break;# e/ X! z z: q8 t4 S
- }
6 \6 U$ R. y6 a& u) g$ o- \ - }9 O1 l- N8 s/ q* }+ T8 h
- }
/ |: O' _* L, `! \' D; | - }1 R- u, N$ _- G$ k3 V
- if (flag == 0)
5 q. ^5 ?0 Z$ [, b4 I; e - break;1 F# J: j/ L% h
- }
+ g) }+ a+ A4 k - for (i = 0; i < 4; i++)3 v: [2 E6 Q: Y
- printf("%d\t", Map);
$ Z; Q4 x- d3 N, t# \* D, a" b0 Y - printf("\n");+ z8 K# I1 X" ~$ H, l+ I
- 5 Z, f% |8 Q. q/ c
- }" k) z& x6 j( F# G4 e$ R
- return flags;
' o1 A& v" d- ]5 l/ i; n7 U1 V - }
复制代码 ; n( g* W0 d. H
5 s! n0 ^: T ~
7 W9 h% u# C9 N- U
. x$ r4 ]! U v3 u
) q; s+ g4 _& X3 M H |