俄罗斯方块C语言修改版;暑假集训

来源:互联网 发布:汇川plc编程软件安装 编辑:程序博客网 时间:2024/05/21 15:00
俄罗斯方块C语言修改版 <wbr> <wbr>- <wbr>暑假集训
 
 
俄罗斯方块C语言修改版 <wbr> <wbr>- <wbr>暑假集训

 
俄罗斯方块C语言修改版 <wbr> <wbr>- <wbr>暑假集训

#include<stdio.h>#include<windows.h>#include<stdlib.h>#include<time.h>#include<conio.h>#define CUBE_R20//行#define CUBE_L11//列#define MOD 28intcur_x,cur_y,SPEED=300;intscore,next,cube,cube_color,next_color,map[CUBE_R+10][CUBE_L+10],color_map[CUBE_R+10][CUBE_L+10];intGameSpeed=SPEED,system_color,cheat;intdir[28][4][2]={//七种方块共28种变形,用xy偏移量表示   {0,0,0,1,1,0,1,1}  ,{0,0,0,1,1,0,1,1}   ,{0,0,0,1,1,0,1,1}   ,{0,0,0,1,1,0,1,1}   ,   {0,0,0,-1,0,1,1,1} ,{0,0,-1,0,1,0,1,-1} ,{0,0,0,-1,0,1,-1,-1},{0,0,-1,0,1,0,-1,1} ,   {0,0,0,-1,0,1,1,-1},{0,0,-1,0,-1,-1,1,0},{0,0,0,-1,0,1,-1,1} ,{0,0,-1,0,1,0,1,1}  ,   {0,0,0,-1,0,1,0,2} ,{0,0,-1,0,1,0,2,0}  ,{0,0,0,-1,0,1,0,2}  ,{0,0,-1,0,1,0,2,0}  ,   {0,0,0,-1,1,0,1,1} ,{0,0,-1,0,0,-1,1,-1},{0,0,0,-1,1,0,1,1}  ,{0,0,-1,0,0,-1,1,-1},   {0,0,0,1,1,0,1,-1} ,{0,0,-1,0,0,1,1,1}  ,{0,0,0,1,1,0,1,-1}  ,{0,0,-1,0,0,1,1,1}  ,   {0,0,0,-1,0,1,-1,0},{0,0,0,1,-1,0,1,0}  ,{0,0,0,-1,0,1,1,0}  ,{0,0,-1,0,1,0,0,-1} ,};intcolor[6]={FOREGROUND_RED,FOREGROUND_BLUE,FOREGROUND_GREEN,   FOREGROUND_RED   |FOREGROUND_GREEN, //黄色   FOREGROUND_GREEN | FOREGROUND_BLUE ,  //青色   FOREGROUND_RED   |FOREGROUND_BLUE ,  //深红色};voidset_Color(int a){   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | color[a]);}voidgotoxy(int x,int y)//定位输出的函数,照抄即可{   COORD c;   c.X=x-1;c.Y=y-1;   SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);}voidMove(int x,int y,int id,int state)//移动或者消除方块{   int i;   for(i=0;i<4;i++)   {      x=cur_x+dir[id][i][0];      y=cur_y+dir[id][i][1];      if(x>0 &&y>0 &&x<CUBE_R &&y<CUBE_L)      {         gotoxy(y*2+1,x+1);         if(state)printf("■");         elseprintf("  ");      }   }}voidClear_Show_next(int x,int y,int id,int state)//显示或者消除下一个方块{   int i,a,b;   a=x;b=y;   for(i=0;i<4;i++)   {      x=a+dir[id][i][0];      y=b+dir[id][i][1];      gotoxy(y*2+1,x+1);      if(state)printf("■");      else printf("  ");   }}voidAdd_Cube(int x,int y,int id){   int i;   for(i=0;i<4;i++)   {      x=cur_x+dir[id][i][0];      y=cur_y+dir[id][i][1];      if(x>0 &&y>0 &&x<CUBE_R &&y<CUBE_L)      {         map[x][y]=1;         color_map[x][y]=cube_color;      }   }}intJudge(int x,int y,int id)//判断越界或者冲突{   int i,a,b;   a=x;b=y;   for(i=0;i<4;i++)   {      x=a+dir[id][i][0];      y=b+dir[id][i][1];      if(x>0 &&y>0 &&x<CUBE_R &&y<CUBE_L)      {         if(map[x][y])return0;      }      else if(!(x<=0))return 0;   }   return 1;}voidSHOW_HELP(){   gotoxy(CUBE_L*2+10,14);   printf("*帮助*");   gotoxy(CUBE_L*2+6,16);   printf(" a:左 d:右");   gotoxy(CUBE_L*2+6,17);   printf(" s:下 w:变形");   gotoxy(CUBE_L*2+6,19);   printf(" [:加速 ]:减速");}voidSHOW_SCORE(){   set_Color(system_color);   gotoxy(CUBE_L*2+14,10);   printf("%d  ",score);   set_Color(cube_color);}voidSHOW_SPEED(){   set_Color(system_color);   gotoxy(CUBE_L*2+14,12);   printf("%d  ",SPEED);   set_Color(cube_color);}voidinit(int id){   int i,j;   score=0;cheat=-1;   cur_x=0;cur_y=CUBE_L/2;   memset(map,0,sizeof(map));   memset(color_map,0,sizeof(color_map));   gotoxy(1,1);   for(i=0;i<=CUBE_R;i++)   {      for(j=0;j<=CUBE_L;j++)      {         if(i==0&&j==0)printf("╔");         elseif(i==0 &&j==CUBE_L)printf("╗");         elseif(i==CUBE_R &&j==0)printf("╚");         elseif(i==CUBE_R &&j== CUBE_L)printf("╝");         elseif(i==0 || i==CUBE_R)printf("==");         elseif(j==0 || j==CUBE_L)printf("‖");         elseprintf("  ");      }      if(i==0)printf(" ╔==============╗");      else if(i==CUBE_R)printf(" ╚==============╝");      else if(i==13)printf(" ╠==============╣");      else if(i==1)printf(" ‖  NextCube:");      else if(i==9)printf(" ‖  Score:   ");      else if(i==11)printf(" ‖  Speed:   ");      else printf(" ‖");      if(i>0 &&i<CUBE_R &&i!=13)      {         gotoxy(CUBE_L*2+20,i+1);         printf("‖");      }      printf("\n");   }   SHOW_HELP();   SHOW_SCORE();   SHOW_SPEED();   set_Color(cube_color);   Move(cur_x,cur_y,id,1);   set_Color(next_color);   Clear_Show_next(5,CUBE_L+5,next,1);}intIs_GameOver(){   int i,j,t;   for(i=1;i<CUBE_L;i++)      if(map[1][i]!=0)break;      if(i<CUBE_L)      {         set_Color(system_color);         for(t=1;t<=5;t++)         {             Sleep(100);             for(i=1;i<CUBE_R;i++)                for(j=1;j<CUBE_L;j++)                {                   gotoxy(j*2+1,i+1);                   if(t%2)printf("■");                   elseprintf("  ");                }         }         gotoxy(CUBE_L-4,CUBE_R/2+1);         printf("GAME OVER! ");         gotoxy(1,CUBE_R+2);         return1;      }      return 0;}voidRelode_Score()//消行加分{   int i,j,k,t;   for(i=1;i<CUBE_R;i++)   {      for(j=1;j<CUBE_L;j++)         if(!map[i][j])break;         if(j>=CUBE_L)         {             for(t=1;t<=5;t++)             {                Sleep(100);             gotoxy(3,i+1);             for(j=1;j<CUBE_L;j++)                if(t%2)printf("  ");                else printf("■");             }             score++;             SHOW_SCORE();             for(k=i;k>=1;k--)                for(j=1;j<CUBE_L;j++)                {                   gotoxy(2*j+1,k+1);                   if(map[k-1][j])                   {                       set_Color(color_map[k-1][j]);                       printf("■");                   }                   elseprintf("  ");                   map[k][j]=map[k-1][j];                   color_map[k][j]=color_map[k-1][j];                }         }   }}voidHideCursor()//消除光标闪烁{CONSOLE_CURSOR_INFOcursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}intmain(){   int Ask_Cube=0;   int finish=0;   char form[50];   sprintf(form,"modecon cols=%d lines=%d",CUBE_L*2+22,CUBE_R+4);   char key;   system(form);//宽:CUBE_L*2+23,高:CUBE_R+3   system("color E");   srand(time(NULL));   system_color=rand()%6;   cube=(rand()+MOD)%MOD;   cube_color=rand()%6;   next=(rand()+MOD)%MOD;   next_color=rand()%6;   set_Color(system_color);   init(cube);   set_Color(cube_color);   HideCursor();   while(1)   {RE:      if(Ask_Cube)      {         Ask_Cube=0;         cube=next;//取方块         cube_color=next_color;         next=(rand()+MOD)%MOD;//取下一个方块         next_color=rand()%6;         set_Color(next_color);         Clear_Show_next(5,CUBE_L+5,cube,0);         Clear_Show_next(5,CUBE_L+5,next,1);         set_Color(cube_color);         cur_x=0;cur_y=CUBE_L/2;      }      while(!kbhit())//判断是否有键盘操作,有返回非0,没有返回0      {         Sleep(1);         finish++;         if(finish<SPEED)continue;         elsefinish=0;         if(Is_GameOver())return0;         if(Judge(cur_x+1,cur_y,cube))         {                          Move(cur_x,cur_y,cube,0);//值为0表示清除方块             cur_x++;             Move(cur_x,cur_y,cube,1);//为1表示移动方块         }         else         {             Add_Cube(cur_x,cur_y,cube);             Relode_Score();             Ask_Cube=1;             goto RE;         }      }            key=getch();            if(key=='w' )      {         intid=(cube/4)*4+((cube+1)%4);         if(Judge(cur_x,cur_y,id))         {             Move(cur_x,cur_y,cube,0);             cube=id;             Move(cur_x,cur_y,cube,1);         }      }      else if(key=='s' ){         while(Judge(cur_x+1,cur_y,cube))         {         Move(cur_x,cur_y,cube,0);         cur_x++;         Move(cur_x,cur_y,cube,1);         }      }//下      else if(key=='a' &&Judge(cur_x,cur_y-1,cube)){Move(cur_x,cur_y,cube,0);cur_y--;Move(cur_x,cur_y,cube,1);}//左      else if(key=='d' &&Judge(cur_x,cur_y+1,cube)){Move(cur_x,cur_y,cube,0);cur_y++;Move(cur_x,cur_y,cube,1);}//右      else if(key==27){gotoxy(1,CUBE_R+2);exit(0);}      else if(key>='1' &&key<='7'){         set_Color(next_color);         Clear_Show_next(5,CUBE_L+5,next,0);         next=(key-'1')*4;         Clear_Show_next(5,CUBE_L+5,next,1);         set_Color(system_color);         gotoxy(1,CUBE_R+2);         printf("CheatMode Open!                 ");         set_Color(cube_color);      }      else if(key=='[' &&SPEED>10){SPEED-=10;                   SHOW_SPEED();      }      else if(key==']'){SPEED+=10;                   SHOW_SPEED();      }      else if(key==32)      {         gotoxy(1,CUBE_R+2);         printf("NowPause,Press Blank Key To Continue!    ");         while(1)         {             while(!kbhit());             key=getch();             if(key==32)break;         }         gotoxy(1,CUBE_R+2);         printf("PleaseHave Fun!                       ");      }   }   return 0;}


原创粉丝点击