俄罗斯方块C语言修改版  - …

来源:互联网 发布:古代服装图案知乎 编辑:程序博客网 时间:2024/05/19 03:29
原文地址: 暑假集训">俄罗斯方块C语言修改版  暑假集训作者:奔跑的乌龟
[转载]俄罗斯方块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 28

intcur_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;
}
原创粉丝点击