你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32实现2048小游戏

[复制链接]
STMCU小助手 发布时间:2022-8-20 17:00
一. 前言; 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
  1. int Map[4] = { 0,8,0,8 };
复制代码
6 e& S2 O+ ?8 g0 \& @
2.通过循环来找到可以合并的两个数,将其合并
* v( ?$ P* c3 c- L
  1. for (j = i + 1; j < 4; j++)+ V) v9 l1 K9 ?
  2. {* K) p3 _( a5 f4 o& M
  3.         //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过9 N/ F- P+ V5 b6 a% ~) ]
  4.         if (Map[j] != Map&& Map[j] != 0)
    . ?; I4 [+ c0 ?: u% c# L/ F( P% p
  5.                 break;
    + I# _* l9 W7 f! C1 u/ E; @" ^6 F- b/ H

  6. 4 X4 O5 X: X& Y9 i8 n) C/ K6 F5 I
  7.         //如果有相等的两个方块,且中没有其余方块,进行融合- i* m6 ?1 V% [( ~
  8.         if (Map[j] == Map)
    , ]: u; }% t5 d' l
  9.         {2 s' m0 x1 a! _6 e/ S" P3 a1 d' k% n
  10.                 Map[j] = 0; //先将这方块消除掉+ n$ z4 X2 H: H* X+ o4 }
  11.                 unsigned char k;
    " G! Q5 C9 O5 v
  12.                 for (k = i + 1; k < 3; k++)- q# C! r7 U2 f9 ?
  13.                 {/ ^/ q. a* S5 z
  14.                         Map[k] = Map[k + 1]; //移动一次方块
    * h& w+ I* c+ h' |6 d6 ^9 w
  15.                 }
    7 y: }8 K) @  [1 A4 Q
  16.                 Map += Map;//更新融合后的方块的值4 C) k4 g7 u$ K
  17.                 Map[3] = 0;- Y4 n0 G3 c0 G  |
  18.                 flag = 1;+ r  d' B8 z" [8 b7 p
  19.                 break;' i: M4 N) j2 H, I! L  w* G
  20.         }
    . {0 N' w* R) t
  21. }
    ( J4 T" u0 t5 V7 ^, T: M' f: N
复制代码
. _9 O! e& R8 q0 T! G) ?
3.移动所有方块,直到所有方块都靠在一起" s4 v, k& ~" ^
  1. while (1)4 ]- I; s3 R- P6 i/ u7 J
  2. {
    7 v2 j' \8 z. Z- S$ l
  3.         int j, flag = 0;
    + C" ?8 }8 |# m' Z
  4.         for (i = 0; i < 3; i++)
    ; r8 M/ U& \' h# C4 d5 w
  5.         {
    5 r) B! c9 r, D0 v
  6.                 if (Map == 0) //有空的方块,说明可以移动
    4 p8 b; k2 V/ F2 g
  7.                 {
    2 `! b! g" o: I! C
  8.                         Map = Map[i + 1];
    2 _* g$ n& F  `7 c( J# w. y
  9.                         Map[i + 1] = 0;
    5 j; W' r. a5 S! x% l/ O
  10.                 }
    ) D0 s) v! R: A3 A6 U* e- f( E
  11.         }
    0 l; J( z- J( z1 N8 ~5 ~5 G9 r0 v
  12.         for (j = 0; j < 3; j++)
    : {0 d8 L9 ^5 G+ k" o
  13.         {0 \$ p: i. Q8 j
  14.                 if (Map[j] == 0)
    & E7 S8 ^5 F$ F# c
  15.                 {
    ; q' x$ ~2 D1 H2 a
  16.                         int k;
    & {: U1 S$ o* }! ^. _. O# R
  17.                         for (k = j + 1; k < 4; k++)
    5 K/ G$ q: s1 w1 ?
  18.                         {4 O" t% D8 c; m4 J
  19.                                 if (Map[k] != 0) //判断是否继续移动6 u, I/ s# X2 t; G& Z1 _2 M
  20.                                 {, h/ I9 s  i, S/ L% V# N5 }7 ~8 `9 A# d
  21.                                         flag = 1;  
    " t2 v- i2 \1 P  l
  22.                                         break;& v) {( M) {) ^; G% c; M! _
  23.                                 }
    % Q( U) V; x: S3 h, j/ g+ Q
  24.                         }8 _# o! J# F/ C" b! O8 n( ~: f
  25.                 }
    % Q" e( W5 E6 D, I2 O+ y' w! v" s
  26.         }  c4 f( P+ f" G, |" w
  27.         if (flag == 0)
    9 O) g! c0 H3 O- o7 ^
  28.                 break;: d, R  c- {1 g, z
  29. }
复制代码

) {+ 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 9cad061d212f444caed06d6622767e14.png 6 q* \1 e  D3 J2 ~6 t4 B0 @
8d7b5600bc62482b922541dd76d91e60.png + l1 Z& k0 B* Z  q7 H8 c6 ~, s( P

) A0 u5 N/ B8 V 8dd60d7867084c48b240887a90cf5531.png
( `. {; d0 ^* ?) N
/ y" l; e: t) T; {% F 18f931e61ce14bf0989fbb4f935d9c4f.png ' 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

  1. ' y8 p( P1 k9 P* E7 z5 |
  2. int main(void)9 Q: P8 E0 p7 k+ \$ B( g) F
  3. {- [% d9 e& u4 h1 A
  4.         int Map[4] = { 0,2,4,8};
    / H7 I+ ~- H& N6 D- J5 m! m
  5.         int i,flag = 0;" p' g& x# w/ o9 Q
  6.         int flags = 0;1 k- N, ?7 F. ~. b  `0 p  @3 I
  7.         for (i = 0; i < 4; i++)
    * m/ p5 H. M$ w3 P& b! G, G
  8.                 printf("%d\t", Map);
    . s" K/ j  a$ x- Y! u" |  D
  9.         printf("\n");) W/ V5 n; n3 h3 K# Z9 H4 z
  10. ) f5 Q% X9 j. Q, f7 n$ U" N: y
  11.         for (i = 0; i < 3; i++)
    ' J' e$ X/ e1 ?# `" d2 k( Z
  12.         {1 ~; K+ K. K0 }4 {& a
  13.                 unsigned char j;6 C+ W/ [) t( a
  14.                 for (j = i + 1; j < 4; j++)
    6 G6 f) V5 R4 v3 z4 c
  15.                 {
    & ]% T/ r* b; N3 J2 T
  16.                         //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过7 P  F: d9 Q+ d+ }3 X
  17.                         if (Map[j] != Map && Map[j] != 0)+ ?$ v0 `! |8 m* o8 D* u
  18.                                 break;% G# n6 |: ^# _/ c
  19. $ t" S) C$ s4 {- O' b% K. l& a
  20.                         //如果有相等的两个方块,且中没有其余方块# r8 ^  v; J/ S$ M
  21.                         if (Map[j] == Map)
    6 o' O. f/ Y* l" x/ ~- `
  22.                         {! D% Q! X, p  B! j  I) e' y( f
  23.                                 Map[j] = 0;0 k* X' G& ~, t
  24.                                 unsigned char k;
    8 Y% u9 k! _% _
  25.                                 for (k = i + 1; k < 3; k++)
    8 [8 ~. _: A1 g3 I6 P
  26.                                 {
    $ j- H3 o$ \+ z( d& @
  27.                                         Map[k] = Map[k + 1];
    - C- n5 U  }0 j7 t. U) \! j. y
  28.                                 }) I/ k& E6 y) m) T7 q3 X* e
  29.                                 Map += Map;
    " `9 p5 r- Z7 f
  30.                                 Map[3] = 0;3 t0 F7 Z5 V8 k0 f3 U+ V/ F
  31.                                 flags = 1;) v1 f8 f  A' P- f& P( [0 ?
  32.                                 break;0 w/ R$ g- I% T' a6 b
  33.                         }2 c3 o+ V  Q3 z3 x( D7 G- m0 y
  34.                 }
    . c2 l' z3 R. p# v" q) A6 t
  35.                
    7 l5 ]1 s- \% ]3 _% {
  36.                         while (1)/ Q9 G: G4 E* x3 F
  37.                         {3 j' f, d$ |! O: T3 H
  38.                                 int j, flag = 0;7 h9 B( Y, N7 d, Q+ G8 X0 O5 A. L
  39.                                 for (i = 0; i < 3; i++)
    4 G6 ~8 e, f1 R* y; U, T' n& [1 n! R
  40.                                 {
    : g, W6 U  S' ^) F! F
  41.                                         if (Map == 0)
    " ~  Y! _, }) n/ U9 S1 D
  42.                                         {
    $ n; Y8 T/ Z( {% x* e* |
  43.                                                 Map = Map[i + 1];" q4 [" B/ A# A1 J/ D) G4 A" }* t  c5 I
  44.                                                 Map[i + 1] = 0;
    $ F% g- x! x0 Z) V: _  B5 J
  45.                                         }9 e* I9 P9 g+ B+ s* H" ?3 O
  46.                                 }
    ! ?  v4 w' c: i- D
  47.                                 for (j = 0; j < 3; j++)* c8 L  R2 w% d1 A
  48.                                 {% |% a( B8 g" M2 p4 l
  49.                                         if (Map[j] == 0)
    " N  _$ c- a5 [, z" r" t0 ]. Y
  50.                                         {
    9 W" b9 \( f; h: s; }: f0 X
  51.                                                 int k;
    $ ?, r2 E  r) X$ U( [# X4 {+ J# K
  52.                                                 for (k = j + 1; k < 4; k++)
    # g$ x. @2 R6 \, F4 c  K( c& |" W
  53.                                                 {
    " m% a& f, Q$ y
  54.                                                         if (Map[k] != 0)
    1 W2 u5 p0 U) s/ {* F7 W( l( S
  55.                                                         {  Q& ^. R: w& ^7 _) A
  56.                                                                 flag = 1;
    / n5 k: ^4 u1 S/ H
  57.                                                                 break;# e/ X! z  z: q8 t4 S
  58.                                                         }
    6 \6 U$ R. y6 a& u) g$ o- \
  59.                                                 }9 O1 l- N8 s/ q* }+ T8 h
  60.                                         }
    / |: O' _* L, `! \' D; |
  61.                                 }1 R- u, N$ _- G$ k3 V
  62.                                 if (flag == 0)
    5 q. ^5 ?0 Z$ [, b4 I; e
  63.                                         break;1 F# J: j/ L% h
  64.                         }
    + g) }+ a+ A4 k
  65.                         for (i = 0; i < 4; i++)3 v: [2 E6 Q: Y
  66.                                 printf("%d\t", Map);
    $ Z; Q4 x- d3 N, t# \* D, a" b0 Y
  67.                         printf("\n");+ z8 K# I1 X" ~$ H, l+ I
  68.                 5 Z, f% |8 Q. q/ c
  69.         }" k) z& x6 j( F# G4 e$ R
  70.         return flags;
    ' o1 A& v" d- ]5 l/ i; n7 U1 V
  71. }
复制代码
; 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
赞 收藏 评论0 发布时间:2022-8-20 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版