VC++ 6.0 C语言实现俄罗斯方块详细教程

2020-01-06 19:35:36王振洲


# include <stdio.h> 
# include <graphics.h> 
# include <conio.h> 
 void main() 
 { 
   int key; 
   while(1) 
   { 
     if(kbhit()) 
     { 
       key=getch(); 
       if(key==224) 
         key=getch(); 
       printf("%d",key); 
     } 
     else 
       printf("*"); 
     Sleep(500); 
   } 
 } 

14.输出:outtextxy(x,y,s);在坐标为(x,y)的地方输出字符串s。

15.数字转字符串:sprintf(s,"%d",a);将数字a,转化为字符串s,头文件是stdio.h。

16.设置字体:setfont(x,y,"字体");其中x表示你你要输出的字的大小,y会改变形状一般都是设为0,"字体"为你想要输出的字体,比如:setfont(40,0,"楷体");


# include <graphics.h> 
# include <conio.h> 
# include <stdio.h> 
 void main() 
 { 
   char s[10]; 
   initgraph(640,480); 
   setfont(42,0,"隶体"); 
   outtextxy(200,200,"俄罗斯方块"); 
   sprintf(s,"%d",2015); 
   outtextxy(250,250,s); 
   getch(); 
   closegraph(); 
 } 

上面这些都学会了的话,差不多就能够自己完成编写一个俄罗斯方块了,下面分享一下我写的代码。

 


# include <stdio.h> 
# include <time.h> 
# include <conio.h> 
# include <graphics.h> 
 int a,visit[30][15],Color[30][15],minX=30,minY=30,maxX=310,maxY=610,speed=500,score=0,rank=0; 
 int color[]={GREEN,CYAN,MAGENTA,BROWN,LIGHTGRAY,LIGHTBLUE,LIGHTGREEN,LIGHTRED,YELLOW}; 
 int block[36][5][5]= 
 { 
   {0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0}, 
   {0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0}, 
   {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0}, 
   {0,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0,0}, 
   {0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 
   {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0} 
 }; 
 void Interface();//界面的设计 
 void nextblock();//生成下一个方块 
 void newblock();//将下一个放到主方框中 
 void move(int x,int y,int A);//移动方块 
 int couldmove(int x0,int y0,int A,char dir,int next);//判断能否移动 
 int couldrotate(int x0,int y0,int A,int next);//判断能否旋转 
 void mark(int x0,int y0,int A,int next);//标记方块固定后的位置 
 void full();//判断有没有能够消行的 
 void down(int x);//有消行的将上面的方块下移一行 
 int gameover();//判断游戏是否结束 
 int main() 
 { 
   int i,j; 
   Interface(); 
   nextblock(); 
   Sleep(500); 
   memset(visit,0,sizeof(visit)); 
   while(1) 
   { 
   newblock(); 
   full(); 
   if(gameover()) 
     break; 
   } 
   getch(); 
   closegraph(); 
   return 0; 
 } 
 void Interface() 
 { 
   int i,j; 
   char str[10]; 
   initgraph(550, 660); 
   HWND hwnd = GetHWnd(); 
   SetWindowText(hwnd, "NEW俄罗斯方块         制作:丶阿明"); 
   Sleep(2000); 
   setfont(40,0,"隶体"); 
   setcolor(RED); 
   outtextxy(145,200,"NEW"); 
   setfont(40,0,"楷体"); 
   for(i=0;i<=255;i++) 
     for(j=0;j<=255;j++) 
     { 
       setcolor(RGB((i+j+128)%255,i,j)); 
       outtextxy(205,200,"俄罗斯方块!"); 
     } 
     Sleep(2000); 
     setcolor(YELLOW); 
     setfont(22,0,"隶体"); 
     outtextxy(310,300,"←_←"); 
     setfont(22,0,"楷体"); 
     outtextxy(180,300,"这逼装的可以"); 
     setcolor(LIGHTMAGENTA); 
     Sleep(2500); 
     outtextxy(175,300,"请按任意键开始游戏!"); 
     getch(); 
     cleardevice(); 
     setcolor(WHITE); 
     rectangle(29,29,334,633); 
     rectangle(28,28,335,634); 
     rectangle(370,50,515,195); 
     setfont(24,0, "楷体"); 
     setcolor(LIGHTGRAY); 
     outtextxy(405,215,"下一个:"); 
     setcolor(RED); 
     outtextxy(405,280,"分数:"); 
     sprintf(str,"%d",score); 
     outtextxy(415,310,str); 
     outtextxy(405,375,"等级:"); 
     sprintf(str,"%d",rank); 
     outtextxy(425,405,str); 
     setfont(22,0, "楷体"); 
     setcolor(LIGHTBLUE); 
     outtextxy(390,475,"操作说明:"); 
     outtextxy(390,500,"↑: 旋转"); 
     outtextxy(390,525,"↓: 下降"); 
     outtextxy(390,550,"←: 左移"); 
     outtextxy(390,575,"→: 右移"); 
     outtextxy(390,600,"空格: 暂停"); 
 } 
 void nextblock() 
 { 
   int i,j,x=391,y=71; 
   setfont(23,0,"楷体"); 
   setcolor(BLACK); 
   for(i=0;i<5;i++) 
     for(j=0;j<5;j++) 
       outtextxy(x+20*j,y+20*i,"■"); 
     srand(time(NULL)); 
     a=rand()%9; 
     setcolor(color[a]); 
     for(i=0;i<5;i++) 
       for(j=0;j<5;j++) 
         if(block[4*a][i][j]==1) 
           outtextxy(x+20*j,y+20*i,"■"); 
 } 
 void newblock() 
 { 
   int i,j,x=130,y=30,A=a; 
   if(A==0||A==1||A==6) 
     y-=60; 
   else if(A==2||A==3||A==5||A==7||A==8) 
     y-=40; 
   else 
     y-=80; 
   setfont(23,0,"楷体"); 
   setcolor(color[A]); 
   for(i=0;i<5;i++) 
     for(j=0;j<5;j++) 
       if(block[4*A][i][j]==1&&y+20*i>=30) 
         outtextxy(x+20*j,y+20*i,"■"); 
       Sleep(100); 
       nextblock(); 
       move(x,y,A); 
 } 
 void move(int x,int y,int A) 
 { 
   int i,j,f,k=0,next=0,Speed=speed,key,nex; 
   while(1) 
   { 
     f=couldmove(x,y+k,A,'x',next); 
     if(f==0) 
     { 
       mark(x,y+k,A,next); 
       break; 
     } 
     if(kbhit()) 
     { 
       key=getch(); 
       if(key==32) 
         getch(); 
     } 
     setcolor(BLACK); 
     for(i=0;i<5;i++) 
       for(j=0;j<5;j++) 
         if(block[4*A+next][i][j]==1&&y+20*i+k>=30) 
           outtextxy(x+20*j,y+20*i+k,"■"); 
         if(kbhit()) 
         { 
           key=getch(); 
           if(key==72) 
           { 
             nex=(next+1)%4; 
             if(couldrotate(x,y+k,A,nex)) 
               next=nex; 
           } 
           else if(key==80) 
             Speed=50; 
           else if(key==75&&couldmove(x,y+k+20,A,'z',next)) 
             x-=20; 
           else if(key==77&&couldmove(x,y+k+20,A,'y',next)) 
             x+=20; 
         } 
         setcolor(color[A]); 
         for(i=0;i<5;i++) 
           for(j=0;j<5;j++) 
             if(block[4*A+next][i][j]==1&&y+20*i+k+20>=30) 
               outtextxy(x+20*j,y+20*i+k+20,"■"); 
             Sleep(Speed); 
             k+=20; 
       } 
 } 
 int couldmove(int x0,int y0,int A,char dir,int next) 
 { 
   int i,j,x,y,f=1; 
   x=(y0-minY)/20; 
   y=(x0-minX)/20; 
   if(dir=='x') 
   { 
     for(i=0;i<5;i++) 
       for(j=0;j<5;j++) 
       if(block[4*A+next][i][j]==1&&(x+i+1==30||(x+i+1>=0&&x+i+1<30&&y+j>=0&&y+j<15&&visit[x+i+1][y+j]==1))) 
         f=0; 
   } 
   else if(dir=='z') 
   { 
     for(i=0;i<5;i++) 
       for(j=0;j<5;j++) 
         if(block[4*A+next][i][j]==1&&(y+j==0||(x+i>=0&&x+i<30&&y+j-1>=0&&y+j-1<15&&visit[x+i][y+j-1]==1))) 
           f=0; 
   } 
   else if(dir=='y') 
   { 
     for(i=0;i<5;i++) 
       for(j=0;j<5;j++) 
         if(block[4*A+next][i][j]==1&&(y+j+1==15||(x+i>=0&&x+i<30&&y+j+1>=0&&y+j+1<15&&visit[x+i][y+j+1]==1))) 
           f=0; 
   } 
   return f; 
 } 
 int couldrotate(int x0,int y0,int A,int next) 
 { 
   int i,j,x,y,f=1; 
   x=(y0-minY)/20; 
   y=(x0-minX)/20; 
   if(!couldmove(x0,y0,A,'x',next)) 
     f=0; 
   for(i=0;i<5;i++) 
     for(j=0;j<5;j++) 
       if(block[4*A+next][i][j]==1&&(y+j==-1||y+j==15||(x+i>=0&&x+i<30&&y+j>=0&&y+j<15&&visit[x+i][y+j]==1))) 
         f=0; 
       return f; 
 } 
 void mark(int x0,int y0,int A,int next) 
 { 
   int i,j,x,y; 
   x=(y0-minY)/20; 
   y=(x0-minX)/20; 
   for(i=0;i<5;i++) 
     for(j=0;j<5;j++) 
       if(block[4*A+next][i][j]==1) 
       { 
         visit[x+i][y+j]=1; 
         Color[x+i][y+j]=color[A]; 
       } 
 } 
 void full() 
 { 
   int i,j,k=0; 
   char str[10]; 
   for(i=29;i>=0;i--) 
   { 
     for(j=0;j<15;j++) 
       if(visit[i][j]==0) 
         break; 
       if(j==15) 
       { 
         k++; 
         down(i); 
         i++; 
       } 
   } 
   setcolor(RED); 
   score+=10*k; 
   sprintf(str,"%d",score); 
   outtextxy(415,310,str); 
   rank=(score/50); 
   sprintf(str,"%d",rank); 
   outtextxy(425,405,str); 
   speed=500-100*rank; 
   if(speed==0) 
     speed=100; 
   if(score>=300) 
     speed=75; 
 } 
 void down(int x) 
 { 
   int i,j; 
   for(i=x;i>0;i--) 
     for(j=0;j<15;j++) 
       if(visit[i-1][j]==1) 
       { 
         visit[i][j]=visit[i-1][j]; 
         Color[i][j]=Color[i-1][j]; 
         setcolor(Color[i-1][j]); 
         outtextxy(minX+20*j,minY+20*i,"■"); 
       } 
       else 
       { 
         visit[i][j]=visit[i-1][j]; 
         setcolor(BLACK); 
         outtextxy(minX+20*j,minY+20*i,"■"); 
       } 
       setcolor(BLACK); 
       for(j=0;j<15;j++) 
       { 
         visit[0][j]=0; 
         outtextxy(minX+20*j,minY,"■"); 
       } 
 } 
 int gameover() 
 { 
   int i,j; 
   for(i=0;i<15;i++) 
     if(visit[0][i]==1) 
     { 
       for(i=0;i<=7;i++) 
       { 
         setcolor(RGB(35*i,255-35*i,255)); 
         for(j=i;j<30-i;j++,Sleep(20)) 
           outtextxy(30+20*i,30+20*j,"■"); 
         for(j=i;j<15-i;j++,Sleep(20)) 
           outtextxy(30+20*j,30+20*(29-i),"■"); 
         for(j=30-1-i;j>=i;j--,Sleep(20)) 
           outtextxy(30+20*(14-i),30+20*j,"■"); 
         for(j=15-1-i;j>=i;j--,Sleep(20)) 
           outtextxy(30+20*j,30+20*i,"■"); 
       } 
       setcolor(WHITE); 
       setfont(45,0,"隶体"); 
       outtextxy(75,300,"GAME OVER!"); 
       Sleep(5000); 
       return 1; 
     } 
     return 0; 
 }