C语言俄罗斯方块

Cplusplus
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

C语言俄罗斯方块

帖子 #1 happy886rr » 2016年10月06日 21:10

编译环境mingw、C-free、TCC、DEV-C、Visual C++2008等编译器均可通过。
直接点击运行,无需传参。建议使用DEV-C编译,优化效果最佳。
Code: [全选] [展开/收缩] [Download] (Untitled.c)
  1. #include   <conio.h>
  2. #include   <stdio.h>
  3. #include  <stdlib.h>
  4. #include    <time.h>
  5. #include <Windows.h>
  6.  
  7. /**********初始化参数************/
  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_Y_MAX,  LEVEL=1,SCORE=0,  P[4],  POINT_V[12][22],  MARK[21],  FLAG[5]={0,0,0,1,0};
  9. 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}};
  10. 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}};
  11.  
  12. /**********光标位置函数**********/
  13. void Pos(int x,int y)
  14. {
  15.         COORD pos;
  16.         HANDLE hOutput;
  17.         pos.X=2*x;
  18.         pos.Y=y;
  19.         hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  20.         SetConsoleCursorPosition(hOutput,pos);
  21. }
  22.  
  23. void HideCursor()
  24. {
  25.         CONSOLE_CURSOR_INFO cursor_info={1,0};
  26.         SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
  27. }
  28.  
  29. /**********初始化界面************/
  30. void CreatUI()
  31. {
  32.         int i,j,BOUNDARY;
  33.         printf("┏━━━━━━━━━━┓\n");
  34.         for(j=1;j<=20;j++) {
  35.                 if     (j==3){printf("┃          ┃LEVEL:1\n");}
  36.                 else if(j==5){printf("┃          ┃SCORE:0\n");}
  37.                 else if(j==7){printf("┃          ┃NEXT   \n");}
  38.                 else         {printf("┃          ┃\n");}
  39.         }
  40.         printf("┗━━━━━━━━━━┛\n");
  41.         printf(" CopyRight@2016~2018 BY HAPPY\n");
  42.         for(j=1;j<=21;j++){
  43.                 for(i=0;i<=11;i++){
  44.                         BOUNDARY=i*(i-11)*(j-21);
  45.                         if(BOUNDARY==0){
  46.                                 POINT_V[i][j]=1;
  47.                         }else{
  48.                                 POINT_V[i][j]=0;
  49.                         }                
  50.                 }
  51.         }
  52. }
  53.  
  54. /**********按键获取**************/
  55. int Getkey(int N,int T)
  56. {
  57.         int start=clock();
  58.         if(KEY_V==115){return 115;}
  59.          do{
  60.                  if(kbhit()){
  61.                          KEY_V=(int)(getch());
  62.                          if(KEY_V<97){KEY_V+=32;}
  63.                          return KEY_V;
  64.                  }
  65.                 for(i=0;i<=N;i++);
  66.         }while((clock()-start)<T);
  67.         dy=1;
  68.         return -1;
  69. }
  70.  
  71. /***********块体转置*************/
  72. int Rote(int S, int I)
  73. {
  74.         return (F==0)?TGM[S][(I+4)%4]:SRS[S][(I+4)%4];
  75. }
  76.  
  77. /***********擦除显示*************/
  78. int Display(int x, int y, int CAC, int Mode)
  79. {
  80.         for(j=0;j<=3;j++){
  81.                 P[j]=CAC&0xF, CAC>>=4;
  82.                 if     (Mode==1){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf("■");}
  83.                 else if(Mode==0){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf(" ");}
  84.         }
  85.         return 0;
  86. }
  87.  
  88. /***********固化块体*************/
  89. int DoBlocks()
  90. {
  91.         //~~~游戏结束
  92.         if(Y<2){
  93.                 Pos(1,22);printf("GAME OVER!");
  94.                 exit(0);
  95.         }
  96.         //~~~固化块体
  97.         POS_Y_MAX=0, FLAG[3]=1;
  98.         for(j=0;j<=3;j++){
  99.                 P_X=(P[j]>>2)+X,P_Y=(P[j]&0x3)+Y;
  100.                 if(POS_Y_MAX<P_Y){POS_Y_MAX=P_Y;}
  101.                 POINT_V[P_X][P_Y]=1;
  102.         }
  103.         //~~~关卡得分
  104.         for(j=Y;j<=POS_Y_MAX;j++){
  105.                 FLAG[2]=1;
  106.                 for(i=1;i<=10;i++){
  107.                         if(POINT_V[i][j]==0){FLAG[2]=0;}
  108.                 }
  109.                 if(FLAG[2]){
  110.                         SCORE+=10,MARK[j]=1;
  111.                         if(SCORE==400){
  112.                                 SCORE=0,LEVEL+=1,T-=100;
  113.                                 FLAG[4]=1;        
  114.                         }
  115.                 }
  116.         }
  117.         //~~~极品消行
  118.         for(j=20;j>=5;j--){
  119.                 if(FLAG[4]){
  120.                         for(i=1;i<=10;i++){
  121.                                 POINT_V[i][j]=0;
  122.                                 Pos(i,j);printf(" ");
  123.                         }
  124.                 }
  125.                 else if(MARK[j])
  126.                 {
  127.                         MARK[j]=0,J=j-1;
  128.                         for(N=1;N<=3;N++){
  129.                                 if(MARK[J]){J--;}
  130.                         }
  131.                         MARK[J]=1;
  132.                         for(i=1;i<=10;i++){
  133.                                 Pos(i,j);
  134.                                 if(POINT_V[i][j]=POINT_V[i][J]){
  135.                                         printf("■");
  136.                                 }else{
  137.                                         printf(" ");
  138.                                 }
  139.                         }
  140.                 }
  141.         }
  142.         FLAG[4]=0;
  143.         return 0;
  144. }
  145.  
  146. /***********碰撞检测*************/
  147. int CheckCollision()
  148. {                                
  149.         for(j=0;j<=3;j++){
  150.                 P_X=(P[j]>>2)+X+dx,P_Y=(P[j]&0x3)+Y+dy;
  151.                 if(POINT_V[P_X][P_Y]){
  152.                         if(dx!=0){return 1;}
  153.                         if(dy){
  154.                                 DoBlocks();
  155.                                 Pos(12,3);printf("LEVEL:%-3d",LEVEL);
  156.                                 Pos(12,5);printf("SCORE:%-3d",SCORE);
  157.                                 return 2;
  158.                         }
  159.                         if(KEY_V==119){FLAG[0]=1;}
  160.                 }
  161.         }
  162.         return 0;
  163. }
  164.  
  165. /***********循环核心*************/
  166. int GameCycle(int N, int T, int F)
  167. {
  168.         srand((unsigned)time(NULL));RU=rand()%7,RI=(rand()%4);
  169.         while(1){
  170.                 if(FLAG[3]){
  171.                         Display(12,8,Rote(RU,RI),0);
  172.                         X=4,Y=1, NU=RU,NI=RI, RU=rand()%7,RI=(rand()%4), FLAG[3]=0,KEY_V=0;
  173.                         Display(12,8,Rote(RU,RI),1);
  174.                         Display(X, Y,Rote(NU,NI),1);
  175.                 }
  176.                 dx=0,dy=0;        
  177.                 KEY_V=Getkey(N,T);
  178.                   if(KEY_V==119){
  179.                           NI++;
  180.                          Display(X,Y,Rote(NU,NI),2);
  181.                 }//旋W
  182.                 else if(KEY_V==115){dy= 1;}//下S
  183.                 else if(KEY_V==97 ){dx=-1;}//左A
  184.                 else if(KEY_V==100){dx= 1;}//右D
  185.                 else if(KEY_V==112){getch(); }//暂停P
  186.                 else if(KEY_V==113){return 0;}//退出Q
  187.                 if(dx!=0 || dy!=0 || KEY_V==119){
  188.                         if(!CheckCollision()){
  189.                                 if(FLAG[0]){
  190.                                         NI--,FLAG[0]=0;
  191.                                         Display(X,Y,Rote(NU,NI),0);
  192.                                 }
  193.                                 else if(KEY_V==119){
  194.                                         Display(X,Y,Rote(NU,NI-1),0);
  195.                                 }else{
  196.                                         Display(X,Y,Rote(NU,NI),0);
  197.                                 }
  198.                                 Display(X+dx,Y+dy,Rote(NU,NI),1);
  199.                                 X+=dx,Y+=dy;
  200.                         }
  201.                 }
  202.         }
  203.         return 0;
  204. }
  205.  
  206. /**********Main主函数***********/
  207. int main()
  208. {
  209.         system("color F0&mode con cols=35 lines=25");
  210.         HideCursor();
  211.         CreatUI();
  212.         GameCycle(10,800,1);
  213.         return 0;
  214. }


为了正确地显示字符,代码应保存为GBK编码格式
上次由 523066680 在 2016年10月06日 21:19,总共编辑 1 次。
原因: 备注

头像
vicyang
版主
版主
帖子: 47
注册时间: 2016年07月21日 20:35
拥有现金: 锁定
储蓄: 锁定
Has thanked: 7 times
联系:

Re: C语言俄罗斯方块

帖子 #2 vicyang » 2016年10月06日 22:19

强行格式化

Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. #include   <conio.h>
  2. #include   <stdio.h>
  3. #include  <stdlib.h>
  4. #include  <unistd.h>
  5. #include    <time.h>
  6. #include <Windows.h>
  7.  
  8. /**********初始化参数************/
  9. int i, j, N, T, F, J, X, Y, dx, dy;
  10. int KEY_V, Cache1, Cache2, NU, NI, RU, RI, P_X, P_Y, POS_Y_MAX;
  11. int LEVEL=1, SCORE=0, P[4], POINT_V[12][22], MARK[21], FLAG[5]={0, 0, 0, 1, 0};
  12.  
  13. int TGM[7][4] =
  14. {
  15.     {0x159D,0x89AB,0x159D,0x89AB},
  16.     {0x126A,0x4856,0x159A,0x4526},
  17.     {0x926A,0x456A,0x1592,0x0456},
  18.     {0x4859,0x4859,0x4859,0x4859},
  19.     {0x5926,0x0156,0x5926,0x0156},
  20.     {0x4159,0x4596,0x1596,0x4156},
  21.     {0x156A,0x4152,0x156A,0x4152}
  22. };
  23.  
  24. int SRS[7][4] =
  25. {
  26.     {0x159D,0x89AB,0x26AE,0x4567},
  27.     {0x0159,0x4856,0x159A,0x4526},
  28.     {0x8159,0x456A,0x1592,0x0456},
  29.     {0x4859,0x4859,0x4859,0x4859},
  30.     {0x4815,0x459A,0x5926,0x0156},
  31.     {0x4159,0x4596,0x1596,0x4156},
  32.     {0x0459,0x8596,0x156A,0x4152}
  33. };
  34.  
  35. /**********光标位置函数**********/
  36. void Pos(int x,int y)
  37. {
  38.         COORD pos;
  39.         HANDLE hOutput;
  40.         pos.X=2*x;
  41.         pos.Y=y;
  42.         hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  43.         SetConsoleCursorPosition(hOutput,pos);
  44. }
  45.  
  46. void HideCursor()
  47. {
  48.         CONSOLE_CURSOR_INFO cursor_info={1,0};
  49.         SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
  50. }
  51.  
  52. /**********初始化界面************/
  53. void CreatUI()
  54. {
  55.     int i,j,BOUNDARY;
  56.     printf("┏━━━━━━━━━━┓\n");
  57.     for(j=1;j<=20;j++) {
  58.         if     (j==3){printf("┃          ┃LEVEL:1\n");}
  59.         else if(j==5){printf("┃          ┃SCORE:0\n");}
  60.         else if(j==7){printf("┃          ┃NEXT   \n");}
  61.         else         {printf("┃          ┃\n");}
  62.     }
  63.     printf("┗━━━━━━━━━━┛\n");
  64.     printf(" CopyRight@2016~2018 BY HAPPY\n");
  65.     for(j=1;j<=21;j++)
  66.     {
  67.         for(i=0;i<=11;i++)
  68.         {
  69.             BOUNDARY=i*(i-11)*(j-21);
  70.             if(BOUNDARY==0)
  71.             {
  72.                 POINT_V[i][j]=1;
  73.             }
  74.             else
  75.             {
  76.                 POINT_V[i][j]=0;
  77.             }                
  78.         }
  79.     }
  80. }
  81.  
  82. /**********按键获取**************/
  83. int Getkey(int N,int T)
  84. {
  85.     int start=clock();
  86.     if (KEY_V==115)
  87.     {
  88.         return 115;
  89.     }
  90.     do
  91.     {
  92.         if( kbhit() )
  93.         {
  94.             KEY_V=(int)( getch() );
  95.             if(KEY_V<97)
  96.             {
  97.                 KEY_V += 32;
  98.             }
  99.             return KEY_V;
  100.         }
  101.         for( i=0; i<=N; i++);
  102.     }
  103.     while( (clock()-start) < T );
  104.     dy=1;
  105.     return -1;
  106. }
  107.  
  108. /***********块体转置*************/
  109. int Rote(int S, int I)
  110. {
  111.         return (F==0) ? TGM[S][(I+4)%4] : SRS[S][(I+4)%4];
  112. }
  113.  
  114. /***********擦除显示*************/
  115. int Display(int x, int y, int CAC, int Mode)
  116. {
  117.         for (j=0; j<=3; j++)
  118.         {
  119.                 P[j]=CAC&0xF, CAC>>=4;
  120.                 if     (Mode==1){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf("■");}
  121.                 else if(Mode==0){Pos((P[j]>>2)+x,(P[j]&0x3)+y);printf(" ");}
  122.         }
  123.         return 0;
  124. }
  125.  
  126. /***********固化块体*************/
  127. int DoBlocks()
  128. {
  129.     //~~~游戏结束
  130.     if (Y < 2)
  131.     {
  132.         Pos(1, 22);
  133.         printf("GAME OVER!");
  134.         exit(0);
  135.     }
  136.     //~~~固化块体
  137.     POS_Y_MAX = 0, FLAG[3] = 1;
  138.     for (j = 0; j <= 3; j++)
  139.     {
  140.         P_X = (P[j]>>2)+X;
  141.         P_Y = (P[j]&0x3)+Y;
  142.  
  143.         if (POS_Y_MAX<P_Y)
  144.         {
  145.             POS_Y_MAX=P_Y;
  146.         }
  147.         POINT_V[P_X][P_Y]=1;
  148.     }
  149.     //~~~关卡得分
  150.     for(j = Y; j <= POS_Y_MAX; j++)
  151.     {
  152.         FLAG[2]=1;
  153.         for(i=1; i<=10; i++)
  154.         {
  155.             if (POINT_V[i][j] == 0)
  156.             {
  157.                 FLAG[2]=0;
  158.             }
  159.         }
  160.         if(FLAG[2])
  161.         {
  162.             SCORE+=10, MARK[j]=1;
  163.             if(SCORE==400)
  164.             {
  165.                 SCORE=0,LEVEL+=1,T-=100;
  166.                 FLAG[4]=1;        
  167.             }
  168.         }
  169.     }
  170.     //~~~极品消行
  171.     for (j = 20; j >= 5; j--)
  172.     {
  173.         if(FLAG[4])
  174.         {
  175.             for(i=1;i<=10;i++)
  176.             {
  177.                 POINT_V[i][j]=0;
  178.                 Pos(i,j);printf(" ");
  179.             }
  180.         }
  181.         else if(MARK[j])
  182.         {
  183.             MARK[j]=0,J=j-1;
  184.             for (N = 1; N <= 3; N++)
  185.             {
  186.                 if(MARK[J])
  187.                     J--;
  188.             }
  189.             MARK[J]=1;
  190.             for(i=1;i<=10;i++)
  191.             {
  192.                 Pos(i,j);
  193.                 if(POINT_V[i][j]=POINT_V[i][J])
  194.                 {
  195.                     printf("■");
  196.                 }
  197.                 else
  198.                 {
  199.                     printf(" ");
  200.                 }
  201.             }
  202.         }
  203.     }
  204.     FLAG[4]=0;
  205.     return 0;
  206. }
  207.  
  208. /***********碰撞检测*************/
  209. int CheckCollision()
  210. {                                
  211.     for(j=0;j<=3;j++)
  212.     {
  213.         P_X=(P[j]>>2)+X+dx;
  214.         P_Y=(P[j]&0x3)+Y+dy;
  215.         if (POINT_V[P_X][P_Y])
  216.         {
  217.                 if(dx!=0)
  218.                     return 1;
  219.  
  220.                 if(dy)
  221.                 {
  222.                     DoBlocks();
  223.                     Pos(12,3); printf("LEVEL:%-3d",LEVEL);
  224.                     Pos(12,5); printf("SCORE:%-3d",SCORE);
  225.                     return 2;
  226.                 }
  227.  
  228.                 if(KEY_V==119)
  229.                     FLAG[0]=1;
  230.         }
  231.     }
  232.     return 0;
  233. }
  234.  
  235. /***********循环核心*************/
  236. int GameCycle(int N, int T, int F)
  237. {
  238.     srand((unsigned)time(NULL));
  239.     RU=rand()%7;
  240.     RI=(rand()%4);
  241.  
  242.     while(1)
  243.     {
  244.         if ( FLAG[3] )
  245.         {
  246.             Display(12,8,Rote(RU,RI),0);
  247.             X=4,Y=1, NU=RU,NI=RI, RU=rand()%7,RI=(rand()%4), FLAG[3]=0,KEY_V=0;
  248.             Display(12,8,Rote(RU,RI),1);
  249.             Display(X, Y,Rote(NU,NI),1);
  250.         }
  251.  
  252.         dx=0;
  253.         dy=0;
  254.         KEY_V=Getkey(N,T);
  255.  
  256.         switch (KEY_V)
  257.         {
  258.             case 119:
  259.                 NI++;
  260.                 Display(X,Y,Rote(NU,NI),2);
  261.                 break;
  262.             case 115:
  263.                 dy= 1;
  264.                 break;
  265.             case 97:
  266.                 dx=-1;
  267.                 break;
  268.             case 100:
  269.                 dx= 1;
  270.                 break;
  271.             case 112:
  272.                 getch();
  273.                 break;
  274.             case 113:
  275.                 return 0;
  276.                 break;
  277.         }
  278.        
  279.         if (dx!=0 || dy!=0 || KEY_V==119)
  280.         {
  281.             if ( !CheckCollision() )
  282.             {
  283.                 if ( FLAG[0] )
  284.                 {
  285.                         NI--,FLAG[0]=0;
  286.                         Display(X,Y,Rote(NU,NI),0);
  287.                 }
  288.                 else if (KEY_V==119)
  289.                 {
  290.                         Display(X,Y,Rote(NU,NI-1),0);
  291.                 }
  292.                 else
  293.                 {
  294.                         Display(X,Y,Rote(NU,NI),0);
  295.                 }
  296.                 Display(X+dx,Y+dy,Rote(NU,NI),1);
  297.                 X+=dx,Y+=dy;
  298.             }
  299.         }
  300.     }
  301.     return 0;
  302. }
  303.  
  304. /**********Main主函数***********/
  305. int main()
  306. {
  307.         system("color F0&mode con cols=35 lines=25");
  308.         HideCursor();
  309.         CreatUI();
  310.         GameCycle(10,800,1);
  311.         return 0;
  312. }


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 3 访客