初写博客,格式全不知,探索中——
高手请多指教,新手请多交流。
俄罗斯方块,核心代码源于网络,增加了关卡,分数,最高分数记录等功能。
界面如下图:
核心代码是通过一个三维数组,
int block[7][4][2] { 1,1, 1,2, 1,3, 1,4, 1,1, 1,2, 1,3, 2,3, 2,1, 2,2, 1,3, 2,3, 1,1, 1,2, 2,2, 2,3, 2,1, 2,2, 1,3, 2,3, 1,1, 2,1, 1,2, 2,2, 1,1, 1,2, 1,3, 2,2 };
实现七种方块的拼合与旋转。
主函数代码:
/******************************** 名称:俄罗斯方块 描述:用控制台程序实现俄罗斯方块小游戏 控制台字符小游戏 编译:CodeBlock16.01 vs2010 创建:零千刻 日期:170515 *********************************/ # include <stdio.h> # include <conio.h> # include <string.h> # include <time.h> # include <stdlib.h> # include <windows.h> #define TIMEPAU 350//时间间隔timepause #define REGIONH 25//区域高 #define REGIONW 15//区域宽 //七拼块形状数据 int block[7][4][2] { 1,1, 1,2, 1,3, 1,4, 1,1, 1,2, 1,3, 2,3, 2,1, 2,2, 1,3, 2,3, 1,1, 1,2, 2,2, 2,3, 2,1, 2,2, 1,3, 2,3, 1,1, 2,1, 1,2, 2,2, 1,1, 1,2, 1,3, 2,2 }; //拼块坐标 int blockx[4],blocky[4]; //区域数组 int region[REGIONW+1][REGIONH+3]= {}; bool intoloop=false; int numBk=0; int bkScorce=0; void SetCP(short x,short y); void DrawBlock(); void ClearBlock(); void init(); void ConsoleSize(short x,short y); void HideCursor (); int DropBk(); int MoveBk(int m); void RotateBk(); char key(int Tp); int BlockCount(int h); void BlockClearLine(int h); void checkBk(); void ReStart(); void level(); void FileSave(); /*主程序模块*/ int main() { int i,s; int m,n; char chBk; system("color 0a"); ConsoleSize(50,33); HideCursor(); init(); //bool mark1=true; //bool mark2=true; FileSave(); while(true) { char ch= getch(); //if(ch==13&&mark1){intoloop=true;/*enter键值为13*/mark1=false;} //else if(ch==13&&!mark1&&!mark2){ReStart();}/*enter键值为13,分清赋值=与等值==*/ if(ch==13)intoloop=true; if(ch=='=')ReStart(); //srand((int)time(0)); while(intoloop) { m=rand()%7;//rand()产生一个随机数,然后对7取余,再进行运算 for(i=0; i<4; i++) { blockx[i]=block[m][i][0]+(REGIONW-3)/2;//取组合方块的四个坐标 blocky[i]=block[m][i][1]; } for(i=0; i<4; i++) /* 检查拼块是否能放入区域中,不能放则退出游戏*/ if (region[blockx[i]][blocky[i]]==1) { intoloop=false; FileSave(); break; } DrawBlock(); s=0;// s标志是否按了S,循环初始化的位置很重要! for(;;) { /* 此循环中处理一个拼块的下落过程*/ if(s==0) chBk=key(TIMEPAU); else chBk=key(30); if((chBk>='a')&&(chBk<='z')) chBk=chBk-32; //将小写字母转换为大写 /* 根据按键作相应处理*/ switch (chBk) { case 'S': s=1; break; case 'W': RotateBk(); break; case 'A': MoveBk(-1); break; case 'D': MoveBk(1); break; case ' ': while(kbhit()==0); break;//按了空格键后等待热键输入 //case 'E': exit(0); break; /* 按E,结束游戏,测试用*/ case '=': intoloop=false; break; /*重新开始*/ default : n=DropBk(); /* 没按上面的键,或未按任何键,拼块下落一格*/ } if(n==0) break; /* 拼块落到区域底部或不能再下落退出循环*/ } checkBk(); } } return 0; }
主要功能函数:
//拼块下落一行 int DropBk() { int d,i; d=1; ClearBlock(); for(i=0; i<4; i++) { if(blocky[i]==REGIONH) { d=0; break; }; if(region[blockx[i]][blocky[i]+1]==1) { d=0; break; }; } if(d==1&&intoloop==true) for(i=0; i<4; i++) blocky[i]=blocky[i]+1; else for(i=0; i<4; i++) region[blockx[i]][blocky[i]]=1;//方块占位记号 1为有,0为无 DrawBlock(); return d; }
//拼块移动 int MoveBk(int m) { int i,j; ClearBlock(); i=0; j=1; do { if((blockx[i]==1)&&(m==-1)) { j=0; break; }; if((blockx[i]==REGIONW)&&(m==1)) { j=0; break; }; if (region[blockx[i]+m][blocky[i]]==1) { j=0; break; }; i++; } while (i<4); if(j==1) for(i=0; i<4; i++)blockx[i]=blockx[i]+m; DrawBlock(); }
//拼块旋转 void RotateBk() { int i,j,x,y; int bkx[4],bky[4]; ClearBlock(); x=blockx[1]; y=blocky[1]; for(i=0; i<4; i++) { bkx[i]=x+y-blocky[i]; bky[i]=y-x+blockx[i]; } j=1; for(i=0; i<4; i++) { if((bkx[i]<1)||(bkx[i]>REGIONW)||(bky[i]<1)||(bky[i]>REGIONH)) { j=0; break; }; if (region[bkx[i]][bky[i]]==1) { j=0; break; }; } if(j==1) for(i=0; i<4; i++) { blockx[i]=bkx[i]; blocky[i]=bky[i]; }; DrawBlock(); } /* 计算一行中的方块数*/ int BlockCount(int h) { int i,p=0; for(i=1; i<=REGIONW; i++) p=p+region[i][h]; if(p==REGIONW) Sleep(TIMEPAU); /* 这个函数首字母大写,是Windows中的API函数,不是C中的 */ return p; } /* 区域中方块除去一行,行上面的方块下移一行*/ void BlockClearLine(int h) { int k,j,q; for(k=h; k>0; k--) { q=0; for(j=1; j<=REGIONW; j++) { if(region[j][k]!=region[j][k-1]) { if(region[j][k-1]) { char bk[3]; strcpy(bk,"□");//把从src地址开始且含有\0 NULL结束符的字符串复制到以dest开始的地址空间 SetCP(j*2,k+2); puts(bk); } else { char bk[3]; strcpy(bk," ");//把从src地址开始且含有\0 NULL结束符的字符串复制到以dest开始的地址空间 SetCP(j*2,k+2); puts(bk); } region[j][k]=region[j][k-1]; } q=q+region[j][k]; } if(q==0) break; } } /* 检查有无完成的行,并处理之*/ void checkBk() { int i,n; i=REGIONH; do { n=BlockCount(i); if(n==REGIONW) { BlockClearLine(i); numBk+=15; level(); } else i--; } while((i>0)&&(n>0)); } char key(int Tp)//等待按键并延时 { clock_t t1,t2; char chp; t1=clock(); do t2=clock(); while (((t2-t1)<Tp) && !kbhit()); if (kbhit()) { Sleep(20); //延时为重画 chp=getch(); } else chp=0; return chp; }
更多内容参见资源:
http://download.csdn.net/detail/qq_38329891/9863966