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

C语言俄罗斯方块游戏

[复制链接]
gaosmile 发布时间:2021-1-14 14:11

最近在看俄罗斯方块的游戏,看到一个大神写的俄罗斯方块代码,非常非常优秀,拿出来解析给大家看看,也希望大家自己尝试运行试试,从中能得到一些启发。

#先了解下俄罗斯方块的几个形状

一共分成 7 形状,有的形状有 4种状态,有的形状有1种状态。

不管是多少种状态,一个方块需要一个2个字节来存储,也就是16bit来保存一个方块的信息。
' f! L& ]# E" P) R- b5 f

微信图片_20210114140654.png

基于上面的理论,我们可以使用4x4的数组来保存方块的信息。

注意,下面代码中的 "■" 占用的是2个字节。

微信图片_20210114140658.png #写代码来显示这个方块

方块数据,这两个数组其实是两种游戏模式的方块信息,我们只需要分析一种就可以了。

int TGM[7][4]={{0x159D,0x89AB,0x159D,0x89AB},{0x126A,0x4856,0x159A,0x4526},{0x926A,0x456A,0x1592,0x0456},{0x4859,0x4859,0x4859,0x4859},{0x5926,0x0156,0x5926,0x0156},{0x4159,0x4596,0x1596,0x4156},{0x156A,0x4152,0x156A,0x4152}};- x7 z$ ^! x6 S  t9 P
int SRS[7][4]={{0x159D,0x89AB,0x26AE,0x4567},{0x0159,0x4856,0x159A,0x4526},{0x8159,0x456A,0x1592,0x0456},{0x4859,0x4859,0x4859,0x4859},{0x4815,0x459A,0x5926,0x0156},{0x4159,0x4596,0x1596,0x4156},{0x0459,0x8596,0x156A,0x4152}};
  D- `9 g" f" q- B, m* _, I" Y
. h7 H& n/ p7 E0 ^( R! N

我们分析这段代码

/***********擦除显示*************/6 r/ n. w4 S3 N4 [9 a8 v/ o
int Display(int x, int y, int CAC, int Mode)1 @5 e* u4 o8 N  B  I# l
{+ U( L: ]% B/ e$ I4 T0 c  K  o. B
    for(j=0;j<=3;j++){& P+ r' z* L* c' P0 P0 f
        P[j]=CAC&0xF, CAC>>=4;
3 K$ K+ F4 ]( R2 G        if     (Mode==1){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf("■");}
# F- i5 L3 }  s' W5 w        else if(Mode==0){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf(" ");}
# D+ U( R/ M7 w3 s0 Y' u2 b# F    }
  i9 O# \8 D# D2 @    return 0;' g! a% E9 S( R: z2 V0 Q
}
& h( \7 j3 A: c4 M: ?

P[j]=CAC&0xF 取到的是 4个bit,然后通过判断这 4个bit决定输出方块的位置。

我们拿 0这个方块的数据0x4859 对应的二进制 0B0100100001011001来做个例子。

0100  ----> 对应坐标(1,0)
8 @" }: A8 _7 q7 s' {3 H2 k: O1000  ----> 对应坐标(2,0)
8 C  r" v3 O& I0101  ----> 对应坐标(1,1)! k# c: M  t8 X; M; n: R
1001  ----> 对应坐标(2,1)
! U# D: `9 T# K# P

通过这个坐标,我们会输出这样一个方块

微信图片_20210114140702.png

再举个例子

我们拿 Z这个方块的数据0x0156 对应的二进制 0B0000000101010110来做个例子。

0000  ----> 对应坐标(0,0)
" j* [! h5 L" h9 E- O/ I& g9 e5 B0001  ----> 对应坐标(0,1)* c' D1 \  Q: E1 D: M9 H  {
0101  ----> 对应坐标(1,1)& j2 L9 ^9 Y" U) X  A& y
0110  ----> 对应坐标(1,2)
% K7 C$ f7 H+ B

微信图片_20210114140705.png

显示方块没有问题了


$ |( n6 g- x7 D2 O8 Q" o

上面的代码中,如果mode等于0的话,也就是把某个方块从显示中擦除掉。7 x. q: U' O' ^9 P9 }1 x% V


, ?0 ]' ?; g3 h* S) s/ k  o

我们用devc++写的程序,需要知道几个细节。

#构建固定行列的窗口

正常情况,我们显示cmd是一个默认值的黑框「如下图」。

实际上,我们可以用代码来固定cmd的框框大小。

默认代码输出

微信图片_20210114140708.png

示例代码:

#include   <conio.h>: `- W% l& I. Z. i
#include   <stdio.h>
6 i% }4 N% E0 {* V#include  <stdlib.h>
0 y1 p# ]# M' P8 L$ R. P2 D" i/ ]! [#include    <time.h>0 s+ ?# |% H* Z$ f$ A% {
#include <Windows.h>( [4 o" ~/ O5 S9 q+ R/ C
2 B: T9 S* i8 G! h3 i
/**********Main主函数***********/
% H) c7 S$ A6 F7 \int main()7 \7 o" A4 f& o2 I8 l% j% ?+ Z) \, L
{5 G% [: g0 O) u8 G+ _
    system("color F1&mode con cols=35 lines=25");
0 d) X; J6 O0 L    getchar();
: u8 w8 K' X9 l  A    return 0;4 \. D3 A6 m5 w1 R
}
3 M1 {( G: W6 m$ c

程序输出:

微信图片_20210114140712.png 4 q* q% e  b9 d8 ^7 E
#延迟函数的设计

跟其他不同的是,这个程序的延迟没有使用usleep,我觉得这也是非常值得称赞的地方,不过空跑cpu,哈哈,是有那么一点调皮。

把延迟放到键值获取的函数中。

/**********按键获取**************/
; a* e$ n! Q$ p( wint Getkey(int N,int T)
6 F1 L; D7 s8 o1 \& m! Z* @2 f7 e' B{0 @! f/ [: n  }" B; d6 a! s
    int start=clock();. y/ t1 L6 r0 z! A1 o
    if(KEY_V==115){return 115;}
  e. i9 E, Q3 r. j7 i% R4 f    do{4 [' v8 t! f, e
        if(kbhit()){
0 e6 y8 [) k  z( k6 V" v/ |                KEY_V=(int)(getch());
" ?: G! D. d% R7 e6 F/ y( ]; {; y                if(KEY_V<97){KEY_V+=32;}
5 ~+ v! f: k3 E+ G' y& V! m5 I  c                return KEY_V;0 J" k4 s& G8 l0 @7 f
        }8 B( s! j1 l; C  o6 H! T# I+ e2 e
        for(i=0;i<=N;i++);
) g# o+ }' m; [( |; m" |    }while((clock()-start)<T);- }8 Q& V' G( e6 Z( j. l- N9 Q
    dy=1;
' n& C" W$ }: g    return -1;
+ q$ D$ H7 y- L6 v( H, g) }" L}& A5 w* W' t: X
就先简单讲解下这些,至于得分机制,碰撞检测,消除的代码,还没有想好怎么讲明白,需要再花时间剖析剖析。
! n, C7 b% g% E/ |, c/ W, r) }" H
#试玩一下
微信图片_20210114140716.gif
#源码
4 d  C- J* Q8 u( T6 @+ K% A+ p#include   <conio.h>
' C) R" G# @4 }#include   <stdio.h>+ g4 u4 Q6 w6 Y  t* b
#include  <stdlib.h>
- ?9 b# @; i7 l1 {$ |9 f/ H#include    <time.h>4 v- g" O  H* N
#include <Windows.h>' ~+ e: u: b( x+ Z  ~1 t8 L+ h

" q4 }2 @* R# |/ C" T/**********初始化参数************/( K% N- c9 [8 [
int i,j,N,T,F,J,X,Y,dx,dy,  KEY_V,  Cache1,Cache2,NU,NI,RU,RI,  P_X,P_Y,POS_H_MAX,  LEVEL=1,SCORE=0,  P[4],  POINT_V[12][22],  MARK[21],  FLAG[5]={0,0,0,1,0};
0 Q* ?7 [/ _& B* x  {* |# R' }int TGM[7][4]={{0x159D,0x89AB,0x159D,0x89AB},{0x126A,0x4856,0x159A,0x4526},{0x926A,0x456A,0x1592,0x0456},{0x4859,0x4859,0x4859,0x4859},{0x5926,0x0156,0x5926,0x0156},{0x4159,0x4596,0x1596,0x4156},{0x156A,0x4152,0x156A,0x4152}};( D& Z9 ?2 I2 G+ i; x( [: z( Q5 P
int SRS[7][4]={{0x159D,0x89AB,0x26AE,0x4567},{0x0159,0x4856,0x159A,0x4526},{0x8159,0x456A,0x1592,0x0456},{0x4859,0x4859,0x4859,0x4859},{0x4815,0x459A,0x5926,0x0156},{0x4159,0x4596,0x1596,0x4156},{0x0459,0x8596,0x156A,0x4152}};
6 U: F% @, q" D* f - M3 R2 S# U2 [
/**********光标位置函数**********/
- ~- D" ~2 y/ b7 M; L% jvoid Pos(int x,int y)
, H) p$ O3 U3 Y* V{4 P5 a! b8 y, @! K6 T) l2 j( u9 F  n
        COORD pos;$ D, D6 d7 m6 |& J% H, Z) |* a
        HANDLE hOutput;
* `  u3 I$ B: w# y2 p/ E        pos.X=2*x;
% O3 U7 ~! F( W7 O" w4 p1 U" X        pos.Y=y;& k1 _' p! J8 J( {! e' n. p
        hOutput=GetStdHandle(STD_OUTPUT_HANDLE);& y. t. M, T0 B, r  N$ P
        SetConsoleCursorPosition(hOutput,pos);3 \* @, O) Y& F
}& J1 U. n( c9 ]6 x

1 q2 C/ ]* i; Bvoid HideCursor()
; Y8 \* G. C1 J& C$ F1 h9 d{
7 ?1 V! C3 P" a        CONSOLE_CURSOR_INFO cursor_info={1,0};
% ?- h% d* ^3 {        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);) W) I7 J% d: m1 h( T1 e
}
( u, J' K# n+ f, ?5 Z% ] * z! p8 u" ?7 B. i9 H7 ]
/**********初始化界面************/
  {. s) L6 W/ f/ U/ e0 Jvoid CreatUI()7 Y, E4 Q4 Z6 ^# M
{. A' u* O$ E8 M8 M
        int i,j,BOUNDARY;
1 [  j, A# [- F) P. h5 G' ]        printf("┏━━━━━━━━━━┓\n");
$ x2 J) H- J9 H' R3 g4 p        for(j=1;j<=20;j++) {
% o. A. |, k6 Y7 N" Z: S                if     (j==3){printf("┃          ┃LEVEL:1\n");}  j7 a  ~4 n; k$ ?: a
                else if(j==5){printf("┃          ┃SCORE:0\n");}
& q# o; k! r5 W5 I9 [1 [                else if(j==7){printf("┃          ┃NEXT   \n");}
7 {# p2 ^3 i4 E% u  T3 o8 o                else         {printf("┃          ┃\n");}
# o3 I2 Q! Z; V, t        }
. K( Q( a" C1 y' I8 Q0 K# ^4 L        printf("┗━━━━━━━━━━┛\n");2 N  E5 I' ^& R& T  B) B
        printf(" CopyRight@2016~2018 BY HAPPY\n");
* n# _3 e5 i5 r/ R5 }- T! H! K        for(j=1;j<=21;j++){# k$ s! r8 z# s6 X! W
                for(i=0;i<=11;i++){9 e8 _2 H5 _! S8 L1 s. v' j
                        BOUNDARY=i*(i-11)*(j-21);
- S+ A0 x* Z  ^" ^  Z9 p6 e5 W# k2 M                        if(BOUNDARY==0){3 z' d# g% O0 E, I. f
                                POINT_V[j]=1;
  M. P6 s2 ^5 x1 @0 h' ]                        }else{& [% }' }  f6 B/ m
                                POINT_V[j]=0;$ z% S2 h( `- i# q) u+ i5 B
                        }               
9 I) X3 r+ ]+ N- X5 B  k& o7 M                }
( F' F! _* m% p( }9 z: J( F        }! B; \# X- V+ L
}
+ U: H* o5 p, O1 k 7 L/ u+ @( w9 E: r4 g% u3 \
/**********按键获取**************/
3 [# E4 z4 J8 h; A* kint Getkey(int N,int T)1 N4 Z/ M& Y' J$ e8 l
{
- K  k# b' O  O% V& z& X$ Z4 C3 f+ ~    int start=clock();) k6 k4 _3 G* o% X
    if(KEY_V==115){return 115;}
! D. w- O: G1 b1 n6 N# T1 ~    do{
9 ~! H( D- L- C, Z4 v        if(kbhit()){3 T0 i8 N% B; r+ l2 n6 X" P
                KEY_V=(int)(getch());& i" b8 C! T; h
                if(KEY_V<97){KEY_V+=32;}
- R2 L% n& G/ E( O) ?                return KEY_V;
  X7 p" A0 e. k( s7 v, b        }. f" [& `: v; a5 T: {( ]% m
        for(i=0;i<=N;i++);
( S; i  y% ?2 B% h$ K# M        printf("%d\n",clock()-start);8 }' d* l& }9 l# }
    }while((clock()-start)<T);
1 B3 j# [1 n! z4 z  A$ f$ Y    dy=1;
2 J) z/ ~. o; |1 `3 q    return -1;
, P" A5 ~2 J/ D$ E. T& I}0 Z6 z) Z, F7 |% ]
7 y3 B2 E  c+ K7 c3 D" A+ {
/***********块体转置*************/( `; e6 j. S8 M  ]& I7 a1 j2 m4 }
int Rote(int S, int I)0 E# p1 `3 i) o
{4 i( ^0 E, a& F. A: x7 _
    return (F==0)?TGM[S][(I+4)%4]:SRS[S][(I+4)%4];
% s: w8 r) M: r' ~+ R" y" y- X}
5 @" o# m5 ?+ n4 N0 U - N* v/ ]5 k3 l$ ^) t
/***********擦除显示*************/
/ E: S3 Y9 |$ F( o) `int Display(int x, int y, int CAC, int Mode)5 Z8 v+ u# u3 w5 {
{. }# f, x, Q3 i4 f
    for(j=0;j<=3;j++){& y# u% y6 b" @- u3 ^& `
        P[j]=CAC&0xF, CAC>>=4;2 r& y, l9 N3 D6 P; X0 f
        if     (Mode==1){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf("■");}
/ u7 R7 b  a/ A6 e& s$ E* G        else if(Mode==0){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf(" ");}
# W! w% l4 ?" E- F1 z) |( `    }
' ]' n, j7 B1 x3 T& S5 K& i    return 0;
/ U& n2 U/ r  x" e! v}
" s3 G# y$ I& R: |; r+ H% V
# E/ P- i; }4 i$ `0 f6 B/***********固化块体*************/( a9 C- Z. w& U9 ^) G
int DoBlocks()
6 M) T* K& ]0 R$ N) f* \$ ]3 m{
) l+ r) v$ v' D4 H        //~~~游戏结束
. T# i% ^5 x/ c. |8 a8 V  L* u  T8 j& t        if(Y<2){& R% z  v0 {8 l, p
                Pos(1,22);printf("GAME OVER!");
7 K0 ]3 ?9 u3 W. l6 J                exit(0);, @% ]# n+ J; B, H1 H5 P% {3 V
        }$ ?) @8 `7 M: U* p  x
        //~~~固化块体. Y1 J' r# I4 k
        POS_H_MAX=0, FLAG[3]=1;
- h3 F: D; H$ L" W& f- o2 q        for(j=0;j<=3;j++){
' C# m' }% W4 s                P_X=(P[j]>>2)+X,P_Y=(P[j]&0x3)+Y;
! ?, o6 P  i+ k/ j) z/ I                if(POS_H_MAX<P_Y){POS_H_MAX=P_Y;}) y6 I6 `. W; K8 @2 E# a
                POINT_V[P_X][P_Y]=1;4 }; i+ M  L# H, {2 A+ ]2 t
        }. X: Y5 w8 o. ~- z" u  `) v8 y
        //~~~关卡得分
( k: N+ s4 q$ S" @8 d# `        for(j=Y;j<=POS_H_MAX;j++){
& ?  t% K: {% |7 _                FLAG[2]=1;
: w, Z- }7 J( R1 V5 x) G                for(i=1;i<=10;i++){% V+ y6 D. R5 T% x& U' p! @$ b
                        if(POINT_V[j]==0){FLAG[2]=0;}' u& w! f. I5 `
                }
- N0 i) }# x3 v% b                if(FLAG[2]){/ r% L8 E. B. z6 m
                        SCORE+=10,MARK[j]=1;
5 V2 C1 A3 ~6 P2 m                        if(SCORE==400){
0 v! [; _, q7 l( T/ r) z                                SCORE=0,LEVEL+=1,T-=100;5 r6 B! f7 v6 Z" P' S
                                FLAG[4]=1;        
0 }5 p1 J# I: r5 W. p5 k                        }
8 C7 K* |- B% W% o/ x. d                }
( m5 O- ^! z+ r: T& s9 k! L        }
! W0 M! c9 X% ~3 H8 V, M9 x        //~~~极品消行
0 S2 y6 e$ [- A+ B$ E0 W4 ]        for(j=20;j>=5;j--){
7 }; T9 w" f: N+ g                if(FLAG[4]){1 r3 U+ R  ?/ N9 [# K: `
                        for(i=1;i<=10;i++){5 ~- R& _5 @* x/ F4 ?# S) O/ n
                                POINT_V[j]=0;2 u9 Q: n6 h4 ^. V: f0 @
                                Pos(i,j);printf(" ");
( A! ^: P4 `7 E# y2 ]0 X* {" M                        }
" @* G/ y! f: m6 Y' [) S! {                }$ D4 o, S0 `; G* a1 u
                else if(MARK[j])$ h" e7 d0 l. i/ |
                {
7 t) l! P: ]/ t: {                        MARK[j]=0,J=j-1;7 s* ]: E9 M9 ]0 @$ w6 J
                        for(N=1;N<=3;N++){
: Z9 M) m- t' H                                if(MARK[J]){J--;}
: {& V) V, B# n0 C                        }
- t# ~1 y7 c4 W( U; i                        MARK[J]=1;- \/ d6 y# C0 t$ c8 N! T2 ?2 U
                        for(i=1;i<=10;i++){
" Q8 B7 F0 L+ @                                Pos(i,j);
5 W/ r) s. g: W. s& H- b                                if(POINT_V[j]=POINT_V[J]){+ z  v. q4 L  `, u
                                        printf("■");
* P* _: ~# C) W1 c/ \/ T                                }else{
6 a% i/ ?! V! Y) R! v                                        printf(" ");
% ^# M# [  E, U  p; x' I+ E) [6 ]                                }
- l1 s- x, k) x( a                        }' T4 E( Z9 ~1 O5 T
                }& l* s, Z( P( |
        }8 V7 T6 T9 Z2 @9 ~
        FLAG[4]=0;
5 z  l' u* g  ~# ]8 D5 J4 |        return 0;
- Y8 H* l- t6 x( k, N' q}
& U) `  Q1 C, R5 k 9 Z% E" @( @% {5 Z3 X
/***********碰撞检测*************/
8 w8 a7 q' y) F6 g& bint CheckCollision()
; G- I) f0 k1 v$ b! O{                                
' o# @: L7 @4 h8 g    for(j=0;j<=3;j++){) }- a2 `. N' M
        P_X=(P[j]>>2)+X+dx,P_Y=(P[j]&0x3)+Y+dy;
( N2 A; a5 t; E3 ?& O3 H        if(POINT_V[P_X][P_Y]){0 U) f$ ?. U% G8 }# Y/ ?( ^2 }! L
            if(dx!=0){return 1;}) c) M' j; `5 x' k& R9 q
            if(dy){
3 \2 v2 N* ~! e3 o; ^* E/ \& w                DoBlocks();. P, O2 H- w4 I& \. I$ y
                Pos(12,3);printf("LEVEL:%-3d",LEVEL);2 {' w$ Y" ^: v  J
                Pos(12,5);printf("SCORE:%-3d",SCORE);4 M9 P6 j; d' K5 G: x9 y
                return 2;
# A4 [" n/ Z9 k3 O$ w' l# r" q            }
% |, O: u# X9 a            if(KEY_V==119){FLAG[0]=1;}, D/ l& [0 |: O$ ~5 Q
        }
) @, R( Y- r( i! p    }+ c2 q; K! C3 T" y$ W6 p
    return 0;" @  e. y; H7 N1 o$ ~5 @+ n; S3 B" u
}2 u0 n3 v) f3 O0 R& l4 Y, `; m
unsigned 5 v8 ^( l# V: [  X
/***********循环核心*************/, |/ n7 U$ `$ F1 O$ Q; [! O
int GameCycle(int N, int T, int F)
8 ^( f3 Y8 [/ c6 E{5 h/ s- m# D& Y! a0 r2 X
        srand((unsigned)time(NULL));RU=rand()%7,RI=(rand()%4);
# f" m; {3 Y; ~* ~2 n        while(1){
! B( t: `( w: V) e2 |3 ?+ H                if(FLAG[3]){" C" O) }& j; W+ C- Q& H( S+ R. o* H
                        Display(12,8,Rote(RU,RI),0);  m# S) N  g! u* |
                        X=4,Y=1, NU=RU,NI=RI, RU=rand()%7,RI=(rand()%4), FLAG[3]=0,KEY_V=0;
- k$ G9 f0 |+ z6 b                        Display(12,8,Rote(RU,RI),1);+ R! ]- \, {' _6 z. V" P" J
                        Display(X, Y,Rote(NU,NI),1);' r* X% w- C3 n, _3 a4 E; {
                }
" \4 p- d& w6 s( N6 e# x% C8 i                dx=0,dy=0;        " }& _8 r$ r) D2 j
                KEY_V=Getkey(N,T);& K) j6 k! h# i( y
                if(KEY_V==119){5 P, ]1 c! ?$ r/ h
                    NI++;
# n" L0 S: j/ b9 ?                    Display(X,Y,Rote(NU,NI),2);% [! Q7 ~# F; R- b6 H# ?+ l
                }//旋W! b; w; B' C  B+ j
                else if(KEY_V==115){dy= 1;}//下S7 H" O2 T* f" t' |$ U, f# h
                else if(KEY_V==97 ){dx=-1;}//左A
" L8 e) f* v! n  D' m                else if(KEY_V==100){dx= 1;}//右D7 j2 w9 r0 d" ^; \
                else if(KEY_V==112){getch(); }//暂停P4 w: }0 y: Y0 {! P; Q7 |
                else if(KEY_V==113){return 0;}//退出Q
3 r5 I( y/ D) ^. {                if(dx!=0 || dy!=0 || KEY_V==119){
+ F2 e* H, K* K% I( r& m                    if(!CheckCollision()){
( x2 L7 N! `) W& q                            if(FLAG[0]){
* C. ~4 h' j( @                                    NI--,FLAG[0]=0;$ X% r8 x' S8 u5 J) |
                                    Display(X,Y,Rote(NU,NI),0);
9 M# E4 N; N) ~% f/ G2 M                            }9 l% m" ^! p' {: h6 S' v
                            else if(KEY_V==119){
. Z+ \! g) t" j                                    Display(X,Y,Rote(NU,NI-1),0);6 d0 B$ x4 F5 Z+ y
                            }else{: R1 {" ]0 g# }; V4 C: O- z
                                    Display(X,Y,Rote(NU,NI),0);+ C; F- d5 w/ K6 W* \
                            }, Q! u; X' o2 z7 I
                            Display(X+dx,Y+dy,Rote(NU,NI),1);
' d" h( K4 h. u$ ]3 p- x, s0 ?) L                            X+=dx,Y+=dy;' ?9 M7 K! l7 M2 D
                    }
: F  `5 M, C1 I* f* F) h, }. e7 ~                }
1 q$ ?" Q! D5 I; f) z. c' G7 C        }2 r5 @' c; M4 c# [3 _
        return 0;
2 {) b& |' a* A1 E7 P; W% I}
! H$ N& P. t$ ]+ d4 n0 K7 F
0 @5 p( V) B0 A: {/**********Main主函数***********/
/ x1 V$ H# F% _, }+ p6 cint main()2 ]: }4 E' h# i0 _, ]# n2 R6 W
{3 j" J8 p1 ]  M. n" p9 ?
        system("color F0&mode con cols=35 lines=25");
, N# z+ H! L# X. n        HideCursor();  e' p* Q- L6 Z2 [+ |
        CreatUI();
2 o% I, [; C) y        GameCycle(10,800,1);+ i( s" ^: V, L. C# w& b
        return 0;  X# e& o2 u/ e- K% L
}; O) ?2 x3 t/ P5 j6 {
#后记

里面涉及的很多东西,我都没有完全总结出来,作者的巧妙非常令我佩服,后面应该还会有文章分析。

大家有什么想法或者自己的解读,可以留言,欢迎一起讨论,共同进步,探索代码里面的奥秘和乐趣。

方块消除6 r  t  N$ c# g* e$ E& Y5 s

准备下一个方块

得分机制" x) U. O5 f4 B1 e- w7 c0 R

Game Over 判断

1 ^/ u: y3 z/ C2 d; n* W* i8 d
" \& a3 e' g: b2 p
赞 收藏 评论0 发布时间:2021-1-14 14:11

举报

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