| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
上一次些的贪吃蛇  http://bbs.fishc.com/thread-68229-1-1.html 
这段时间学习指针和结构,确实很难,但也啃下来啦     
在做这个俄罗斯方块的时候,方块结构没有设计好,导致后面改的一塌糊涂,心都弄累了  ;所以后面写的有点潦草了 
- #include <stdio.h>
 
 - #include <time.h>
 
 - #include <stdlib.h>
 
 - #include <conio.h>
 
 - #include <windows.h>
 
  
- #define kd 14   //宽度 
 
 - #define gd 23        //高度 
 
  
- //----------功能键设置------------ 
 
 - #define zuoyi 'a' //左移动 
 
 - #define youyi 'd'//右移动 
 
 - #define xiayi 's'//下移动 (加速) 
 
 - #define bx '-' //变形 
 
 - #define zt '+' //暂停 
 
  
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
  
- //---------------定义结构---------------------- 
 
 - typedef struct{//坐标结构 
 
 -         int x;
 
 -         int y;
 
 - }zb;
 
  
- typedef struct{//方块结构 
 
 -         int lx;   //他的类型  0是田  1是T 2是F,3是N,4是条 
 
 -         int x1;//3初始 
 
 -         int y1;//2初始 
 
 -         zb zb;                //他的坐标,中心点 
 
 -         const char *p[6];//指向一个形状地址; 
 
 - }xz;
 
  
 
- //----------------定义函数---------------------
 
 - void gotoxy( int x, int y ); 
 
  
- void chushi();//初始一些数据
 
 - void printf_dy();//打印地图数据 
 
 - void bianxing(xz*dqxz);//变形 (方块指针,旋转几次)
 
 - char jieshou();//接受字符输入,直到接受到字符才返回;
 
 - int get_c();//缓冲区获取一个功能键状态,如果获取失败,返回字符-1   (马上返回 )  -1失败  0左移 1下移动 2右移动 3变型 4暂停 
 
 - int jiance(int n);//下左右移动检测   OK返回1,失败返回0 
 
 - void zanting();//暂停
 
 - int yidong(int n);//根据方向移动, 到底部,返回-1 
 
 - int jiaru();//将当前不能下降的方块加入到障碍物数组里面;并消行,返回有多少行消了 
 
 - void xiaohang(int h);//消行(行坐标)
 
 - void shenchan();//生产方块  
 
 - int naozhong();//闹钟,间隔多久 
 
  
 
- //-------------定义全局变量------------------- 
 
  
- const char *ditu[kd][gd];//地图
 
 - const char *zhangaiwu[kd][gd] ;//障碍物 
 
 - clock_t jg;
 
 - int nd;//设置难度,就是方块下降的速度 间隔时间,微妙
 
 - int sfch;//是否重行绘制  1绘制  0不绘制 
 
 - int jifen;//当前玩了多少分 
 
 - xz dqxz; //当前形状 ------
 
 - xz xgxz;//下一个形状--------------
 
 - xz lsxz; //临时形状---- 
 
 - const char *leixing[5][6]={                                                                                                //这里的指针都是指向常量区的,大家可以添加跟多的方块类型 
 
 -                                                 {"■","■","■","■","  ","  "},//方块田比较特殊,旋转就不用旋转 
 
 -                                                 {"■","  ","■","■","■","  "}, //T块 
 
 -                                                 {"■","■","■","  ","■","  "}, //F块        
 
 -                                                 {"  ","■","■","■","■","  "}, //N块 
 
 -                                                 {"■","  ","■","  ","■","  "}, //条块                                        
 
 -                                                 };
 
  
- int fx[6]={-1,0,1,0,1,0};//方向坐标 
 
  
- //-----------------------函数-------------------------------
 
  
- int naozhong(){
 
 -         clock_t njg=clock();
 
 -         if(njg-jg>=nd){
 
 -                 jg=njg;
 
 -                 return 1;
 
 -         }else{
 
 -                 return 0;
 
 -         }
 
 - }
 
 -  
 
 - void shenchan(){
 
 -         
 
 -         dqxz.zb =xgxz.zb ;
 
 -         dqxz.x1 =xgxz.x1;
 
 -         dqxz.y1 =xgxz.y1;
 
 -         dqxz.lx =xgxz.lx;
 
 -         int n;
 
 -         for(n=0;n<6;n++){
 
 -                 dqxz.p[n] =xgxz.p[n];
 
 -         }
 
 -         
 
 -         //生产一个下一个方块数据 
 
 -         xgxz.lx=rand()%5;
 
 -         xgxz.x1=3;
 
 -         xgxz.y1=2;
 
 -         xgxz.zb .x=(kd-2)/2;
 
 -         xgxz.zb.y =-1;
 
 -         for(n=0;n<6;n++){
 
 -                 xgxz.p[n]=        leixing[xgxz.lx][n];
 
 -         }
 
 -         for(n=0;n<rand()%5;n++){
 
 -                 bianxing(&xgxz);
 
 -         }
 
 -         
 
 - } 
 
  
- int jiaru(){//加入障碍物 ,返回有多少行可以消 
 
 -         int x1,y1,x,y,m,n=0;
 
 -                 
 
 -         for(y=0;y<dqxz.x1 ;y++){//打印方块 
 
 -                 for(x=0;x<dqxz.y1 ;x++){
 
 -                         if(*(dqxz.p +n)=="■" ){
 
 -                                 x1=dqxz.zb .x+x;
 
 -                                 y1=dqxz.zb .y+y;
 
 -                                 zhangaiwu[x1][y1]="■";                                        
 
 -                         }
 
 -                         n++;
 
 -                 }
 
 -         }
 
 -         m=0; 
 
 -         for(y1=0;y1<dqxz.x1 ;y1++){
 
 -                 n=0;
 
 -                 for(x=0;x<kd;x++){
 
 -                         y=dqxz.zb .y+y1;
 
 -                         if(zhangaiwu[x][y]=="■" && y<gd-1)        {
 
 -                                 n++;
 
 -                         }
 
 -                 }
 
 -                 if(n==kd){
 
 -                         xiaohang(y);        
 
 -                         m++;
 
 -                 }        
 
 -         }
 
 -         return m;
 
 - }
 
  
- void xiaohang(int h){//消行坐标
 
 -         int x,y,y1;
 
 -         for(y1=0;y1<h;y1++){
 
 -                 for(x=1;x<kd-1;x++){
 
 -                         y=h-y1;
 
 -                         if(y>0){
 
 -                                 zhangaiwu[x][y]=zhangaiwu[x][y-1];
 
 -                         }else{
 
 -                                 zhangaiwu[x][y]=". ";
 
 -                         }                
 
 -                 }                
 
 -         }
 
 - }        
 
  
- int yidong(int n){//根据字符控制方块状态,如果到底部,则返回-1 
 
 -         int f=1;
 
 -                 
 
 -         if(jiance(n)==1){
 
  
-                 if(n==1){
 
 -                         while(jiance(n)==1){
 
 -                         dqxz.zb .x=dqxz.zb .x+fx[n];
 
 -                         dqxz.zb .y=dqxz.zb .y+fx[n+3];                
 
 -                         }
 
 -                 }else{                
 
 -                         dqxz.zb .x=dqxz.zb .x+fx[n];
 
 -                         dqxz.zb .y=dqxz.zb .y+fx[n+3];        
 
 -                 }        
 
 -         }
 
 -         if(jiance(1)==0){
 
 -                 f=0;
 
 -         }        
 
 -         return f;                
 
 - } 
 
  
- void gotoxy( int x, int y ){
 
 -         COORD c;
 
 -         c.X = x - 1; c.Y = y - 1;
 
 -         SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), c );
 
 - }
 
  
- void zanting(){//暂停 
 
 -         gotoxy(kd*2+2,gd/2+7);
 
 -         printf("请安“+”加号键继续!!"); 
 
 -         while(jieshou()!='+'){//游戏继续啦 
 
 -         }
 
 -         gotoxy(kd*2+2,gd/2+7);
 
 -         printf(" -变形  +暂停         ");
 
 - } 
 
  
 
- int jiance(int f){//下左右移动检测   OK返回1,失败返回0 
 
 -         xz lsxz;//零时形状
 
  
-         int x,y,n=0,m=1;
 
 -         int x1,y1;
 
 -         
 
 -         lsxz=dqxz;        
 
 -         lsxz.zb .x=lsxz.zb.x +fx[f];
 
 -         lsxz.zb .y=lsxz.zb.y +fx[f+3];
 
 -         
 
 -         for(y=0;y<lsxz.x1 ;y++){//打印方块 
 
 -                 for(x=0;x<lsxz.y1 ;x++){
 
 -                         if(*(dqxz.p +n)=="■" ){
 
 -                                 x1=lsxz.zb .x+x;
 
 -                                 y1=lsxz.zb .y+y;
 
 -                                         if(x1<1 ||x1>kd-2 ||y1<0 ||y1>gd-2){
 
 -                                                 m=0;
 
 -                                                 break;                        
 
 -                                         }else if( zhangaiwu[x1][y1]=="■" && y1>0){                
 
 -                                                 m=0;
 
 -                                                 break;
 
 -                                         }                        
 
 -                         }
 
 -                         n++;
 
 -                 }
 
 -         }        
 
 -         return m;
 
 - }
 
  
 
- int get_c(){//缓冲区获取一个功能键状态,如果获取失败,返回字符-1   (马上返回 )  -1失败  0左移 1下移动 2右移动 3变型 4暂停 
 
 -         char ls;
 
 -         int n=-1;
 
 -         if(kbhit()!=0){
 
 -                 ls=getch();
 
 -                 while(kbhit()){
 
 -                         getch();
 
 -                 }
 
 -         }
 
 -         switch(ls){
 
 -                 case zuoyi:n=0;break;        
 
 -                 case youyi:n=2;break;
 
 -                 case xiayi:n=1;break;
 
 -                 case bx:n=3;break;        
 
 -                 case zt:n=4;break;
 
 -         }
 
 -         return n;        
 
 - }  
 
  
- void bianxing(xz*ybxz){//变形 (方块指针,旋转几次)
 
 -         if(ybxz->lx==0){
 
 -                 return ;
 
 -         }
 
 -         int x,y,n,i;
 
 -         int z[2][6]={{4,2,0,5,3,1},{3,0,4,1,5,2}};
 
 -         int z2[3][2]={{2,3},{3,2},{1,-1}};
 
 -         
 
 -         lsxz.zb=ybxz->zb ;
 
 -                          
 
 -         if(ybxz->x1==2){        
 
 -                 i=1;        
 
 -         }else{
 
 -                 i=0;
 
 -         }        
 
 -         for(n=0;n<6;n++){//旋转
 
 -                 lsxz.p[n]=ybxz->p[z[i][n]];                
 
 -         }
 
 -         lsxz.zb.y=lsxz.zb.y +z2[2][i];//旋转之后的坐标的变换,我这里只简单处理了下,具体的坐标是这么样的没研究出来,考亲们研究啦 
 
 -         lsxz.x1 =z2[0][i];
 
 -         lsxz.y1 =z2[1][i];
 
 - //---------------------------------
 
 -         int x1,y1,m=1;
 
 -         n=0;
 
 -         for(y=0;y<lsxz.x1  ;y++){//遍历 
 
 -                 for(x=0;x<lsxz.y1;x++){
 
 -                         if(lsxz.p[n]=="■" ){
 
 -                                 x1=lsxz.zb .x+x;
 
 -                                 y1=lsxz.zb .y+y;
 
 -                                         if(x1<1 ||x1>kd-2 ||y1>gd-2){
 
 -                                                 m=0;
 
 -                                                 break;                        
 
 -                                         }else if( zhangaiwu[x1][y1]=="■" && y1>0){                
 
 -                                                 m=0;
 
 -                                                 break;
 
 -                                         }                        
 
 -                         }
 
 -                         n++;
 
 -                 }
 
 -         }        
 
  
- //--------------------------------------------        
 
 -         if(m==1){//如果零时方块和障碍物没有重叠,则把零时方块的信息复制个当前方块 
 
 -                 ybxz->zb =lsxz.zb;
 
 -                 ybxz->x1=lsxz.x1 ;
 
 -                 ybxz->y1=lsxz.y1 ;        
 
 -                 for(n=0;n<6;n++){
 
 -                         ybxz->p[n]=lsxz.p [n];        
 
 -                 }
 
 -         }        
 
 - }
 
  
 
- void chushi(){//初始一些数据 
 
 -         jifen=0;//初始化积分 
 
 -         srand((unsigned int)time(NULL));//初始化随机种子 
 
 -         jg=clock();//初始化时间 
 
 -         nd=300;//初始化难度,毫米级别 
 
 - //---------初始化下个形状的数据--------------- 
 
 -         int n;
 
 -         xgxz.lx=rand()%5;
 
 -         xgxz.x1=3;
 
 -         xgxz.y1=2;
 
 -         xgxz.zb .x=(kd-2)/2;
 
 -         xgxz.zb.y =-1;
 
 -         
 
 -         for(n=0;n<6;n++){
 
 -                 xgxz.p[n]=        leixing[xgxz.lx][n];
 
 -         }
 
 -         
 
 -         shenchan(); //产生一个方块
 
 -         int x,y;
 
 -         for(y=0;y<gd;y++){//初始化障碍物 
 
 -                 for(x=0;x<kd;x++){
 
 -                         if(x==0||x==kd-1||y==gd-1){
 
 -                                 zhangaiwu[x][y]="■";
 
 -                         }else{
 
 -                                 zhangaiwu[x][y]=". ";
 
 -                         }
 
 -                 }
 
 -         }                
 
 - }
 
  
- void printf_dy(){//打印地图数据 
 
 -         int x,y,n=0;
 
 -         
 
 -         for(y=0;y<gd;y++){//初始化地图 
 
 -                 for(x=0;x<kd;x++){
 
 -                         if(x==0||x==kd-1||y==0||y==gd-1){
 
 -                                 ditu[x][y]="●";
 
 -                         }else{
 
 -                                 ditu[x][y]=zhangaiwu[x][y];
 
 -                         }
 
 -                 }
 
 -         }
 
 - //        system("cls");        
 
 -         for(y=0;y<dqxz.x1 ;y++){//打印方块 
 
 -                 for(x=0;x<dqxz.y1 ;x++){
 
 -                         int x1=dqxz.zb .x+x;
 
 -                         int y1=dqxz.zb .y+y;
 
 -                         if(dqxz.p[n]=="■" && x1>0 &&x<kd-1 && y1>0 && y<gd-1){
 
 -                                 ditu[x1][y1]=dqxz.p[n];        
 
 -                         }
 
 -                         n++;
 
 -                 }
 
 -         }        
 
 -         gotoxy(1,1);//将光标移到最上面        
 
 -         for(y=0;y<gd;y++){//打印地图 
 
 -                 for(x=0;x<kd;x++){
 
 -                         printf("%s",ditu[x][y]);
 
 -                 }
 
 -                 printf("\n");
 
 -         }
 
 -         gotoxy(kd*2+2,gd/2-4);
 
 -         printf("---下个方块---");
 
 -         n=0;
 
 -         for(x=0;x<3;x++){
 
 -                 gotoxy(kd*2+6,gd/2-2+x);
 
 -                 for(y=0;y<3 ;y++){
 
 -                         if(x<xgxz.x1 && y<xgxz.y1 ){
 
 -                                 printf("%s",xgxz.p[n]);
 
 -                                 n++;
 
 -                         }else{
 
 -                                 printf("   ");
 
 -                         }
 
 -                 }        
 
 -         }
 
 -         gotoxy(kd*2+2,gd/2+2);
 
 -         printf("---游戏积分---");
 
 -         gotoxy(kd*2+2,gd/2+3);
 
 -         printf("      %d",jifen*10);
 
 -         gotoxy(kd*2+2,gd/2+5);
 
 -         printf("---控制按钮---");
 
 -         gotoxy(kd*2+2,gd/2+6);
 
 -         printf(" A下 S下 D右 ");
 
 -         gotoxy(kd*2+2,gd/2+7);
 
 -         printf(" -变形  +暂停 ");
 
 - }
 
  
- char jieshou(){//接受字符输入,直到接受到字符才返回; 
 
 -         while( !kbhit() ){
 
 -                 Sleep(20);        
 
 -         }
 
 -         char ls=getch();
 
 -         
 
 -         while(kbhit()){
 
 -                         getch();
 
 -                 }
 
 -         return ls;        
 
 - } 
 
  
- int main(int argc, char *argv[]) {
 
 -         chushi();
 
 -         int jc,n;
 
 -         
 
 -         while(1){
 
 -                 if(sfch=1){//检测是否重行绘制 
 
 -                         printf_dy();
 
 -                         sfch=0;
 
 -                 }
 
 -                 jc=jiance(1);
 
 -                 if(jc==1){//这里检测是否能往下移动 
 
 -                         if(sfch=naozhong()){
 
 -                                 dqxz.zb .y=dqxz.zb .y+1;
 
 -                         }
 
 -                 }else if(jc==0 && dqxz.zb .y<0){//检测是否到顶部了,到顶部了就结束游戏 
 
 -                         system("cls");
 
 -                         printf("游戏失败");//放假了心静不下来,不想搞了,简单处理 
 
 -                         break; 
 
 -                 }else{        //不能移动了,就说明到底部了,把当前方块加入到障碍物里面 
 
 -                         jifen=jiaru()+jifen; 
 
 -                         nd=nd*19/20;//放假了心静不下来,不想搞了,简单处理 
 
 -                         shenchan(); 
 
 -                 }        
 
 -                 n=get_c();//从键盘区获取一个功能键状态  -1失败  0左移 1下移动 2右移动 3变型 4暂停
 
 -                 switch(n){
 
 -                         case -1:;break;//非法移动 
 
 -                         case 4://暂停
 
 -                                 zanting();
 
 -                                 break;        
 
 -                         case 3:
 
 -                                 bianxing(&dqxz);
 
 -                                 sfch=1;
 
 -                                 break;//变型 
 
 -                         
 
 -                         default: //移动 
 
 -                                 yidong(n);
 
 -                                 sfch=1;
 
 -                                 break;        
 
 -                 } 
 
 -         }
 
  
-         return 0;
 
 - }
 
  复制代码 |   
 
 
 
 |