您的位置:首页 > 编程语言 > C语言/C++

俄罗斯方块 C++ 源代码实现

2013-11-25 10:31 302 查看
第一个Cpp

#include <conio.h>

#include <stdlib.h>

#include<stdio.h>

#include <windows.h>

#include <mmsystem.h>

#pragmacomment(lib,"winmm.lib")        //播放背景音乐的头文件

#include "colorConsole.h"

#include<time.h>

#define SQUARE_COLORBACKGROUD_BLUE|BACKGROUD_RED| BACKGROUD_INTENSITY      //背景颜色

#define SQUARE_COLORFOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY  //方块的颜色

#define up      72

#define down    80

#define left    75

#define right   77

#define esc     27

#define MAPW    15    //地图的宽度

#define MAPH    25    //地图的高度

 

void initiate1();

int * build();                                    //创建方块                                                            //初始化工作  

BOOL isavailable(int a[],int x,int y,intw,int h); //判定是否能放下

void drawblocks(int a[],int w,int h,intx,int y,WORD wColors[],int nColors);

void delete_cache();                                 //清除键盘缓冲区

void revolve(int a[][4],int w,int h,int*x,int y);    //转动方块

void pro();

void end();

void delete_blocks(int *a,int w,int h,intx,int y);

void gameover();

void deletefull_line(int m[][MAPW],introw,int w,int h); //消除一行

 

int dx=30,dy=5;             //屏幕上的偏移量

int score=0,level=0;

int map[MAPH][MAPW];

int a1[4][4]={{1},{1,1,1}};

int a2[4][4]={{0,1},{1,1,1}};

int a3[4][4]={{1,1},{0,1,1}};

int a4[4][4]={{0,0,1},{1,1,1}};

int a5[4][4]={{0,1,1},{1,1}};

int a6[4][4]={{1,1,1,1}};

int a7[4][4]={{1,1},{1,1}};

int a[4][4];

 

int main()

{

       HANDLEhandle;

       handle=initiate();

       WORDwColors[1]={FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY };

       while(1)

       {

                 sndPlaySound("Resource\\Just Dance.wav",SND_LOOP|SND_ASYNC);//用异步方式播放音乐,PlaySound函数在开始播放后立即返回

                 system("CLS");

                     intn=0;

                     printf("目录\n1.开始游戏\n2.退出游戏\n\n\n");

                     scanf("%d",&n);

                     switch(n)

                     {

                     case1:

                            system("CLS");

                            textout(handle,22,6,wColors+2,1,"请选择游戏等级:");

                            textout(handle,32,8,wColors+2,1,"1.初级");

                            textout(handle,32,10,wColors+2,1,"2.中级");

                            textout(handle,32,12,wColors+2,1,"3.高级");

                            while(1)

                            {

                                   charchoice;

                                   choice=_getch();

                                   if(choice=='1')

                                   {

                                          textout(handle,22,6,wColors+2,1,"开始游戏,初级");

                                          textout(handle,32,8,wColors+2,1,"                ");

                                          textout(handle,32,10,wColors+2,1,"                ");

                                          textout(handle,32,12,wColors+2,1,"                ");

                                          level=0,score=0;

                                          Sleep(2000);

                                          textout(handle,22,6,wColors+2,1,"                ");

                                          break;

                                   }

                                   elseif(choice=='2')

                                   {

                                          textout(handle,22,6,wColors+2,1,"开始游戏,中级");

                                          textout(handle,32,8,wColors+2,1,"                ");

                                          textout(handle,32,10,wColors+2,1,"                ");

                                          textout(handle,32,12,wColors+2,1,"                ");

                                          level=2,score=20;

                                          Sleep(2000);

                                          textout(handle,22,6,wColors+2,1,"                ");

                                          break;

                                   }

                                   elseif(choice=='3')

                                   {

                                          textout(handle,22,6,wColors+2,1,"开始游戏,高级");

                                          textout(handle,32,8,wColors+2,1,"                ");

                                          textout(handle,32,10,wColors+2,1,"                ");

                                          textout(handle,32,12,wColors+2,1,"                ");

                                          level=4,score=40;

                                          Sleep(2000);

                                          textout(handle,22,6,wColors+2,1,"                ");

                                          break;

                                   }

                                   elseif(choice!='1'&&choice!='2'&&choice!='3')

                                          continue;

                            }

                            pro();

                            break;

                     case2:

                            return 0;

                     default:

                            printf("错误,按键继续");

                            while(!_kbhit());

                     }

       }

}

 

 

void pro()                            //游戏主题

{

       initiate1();

       int*b=NULL;

       b=build();   //创建方块

       intsign,blank,x,y;

       while(1)

       {

              for(int i=0;i<4;i++)          //复制方块

                     for(intj=0;j<4;j++)

                            if(a[i][j]=*(b+i*4+j))  blank=i;

           y=1-blank;x=4;

              delete_blocks(&a[0][0],4,4,16,10);

             

              b=build();

              HANDLE handle;

              handle=initiate();

              WORD wColors[1]={FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY };

              drawblocks(b,4,4,16,10,wColors,1);

             

              wColors[0]=SQUARE_COLOR;

              drawblocks(&a[0][0],4,4,x,y,wColors,1);

             

              delete_cache();

 

              char string[5];

              wColors[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;

              textout(handle,dx-10,8+dy,wColors,1,itoa(score,string,10));

              textout(handle,dx-10,14+dy,wColors,1,itoa(level,string,10));

             

              sign=1;

              while(sign)

              {

                     intdelay=0,max_delay=100-10*level; //延迟量

                     while(delay<max_delay)

                     {

                            if(_kbhit())  //用if避免按住键使方块卡住

                            {

                                   intdraw=0;

                                   intkey=_getch();

                                   switch(key)

                                   {

                                   caseup:

                                          delete_blocks(&a[0][0],4,4,x,y);

                                          revolve(a,4,4,&x,y);

                                          draw=1;

                                          break;

                                   casedown:

                                          delay=max_delay;

                                          break;

                                   caseleft:

                                          if(isavailable(&a[0][0],x-1,y,4,4))

                                          {

                                                 delete_blocks(&a[0][0],4,4,x,y);

                                                 x--;

                                                 draw=1;

                                          }    

                                          break;

                                   caseright:

                                          if(isavailable(&a[0][0],x+1,y,4,4))

                                          {

                                                 delete_blocks(&a[0][0],4,4,x,y);

                                                 x++;

                                                 draw=1;

                                          }

                                          break;

                                   case32://32 是空格键的ASCII码,按空格键暂停

                                      while(1)

                                     {

                                           textout(handle,dx,-2+dy,wColors,1,"Press any key tocontinue");

                                           Sleep(200);

                         textout(handle,dx,-2+dy,wColors,1,"                           ");

                          Sleep(200);

                                           if(_kbhit())

                                            {

                                                   draw=1;

                                                   break;

                                            }

                                     }

                      break;

                                   caseesc://按键退出游戏

                                          exit(EXIT_SUCCESS); 

                                   }

                                   if(draw)

                                   {

                                          HANDLE handle;

                                          handle=initiate();

                                          WORD wColors[1]={SQUARE_COLOR};

                                          drawblocks(&a[0][0],4,4,x,y,wColors,1);

                                          draw=0;

                                   }

                            }

                            _sleep(5);delay++;

                     }

                     if(isavailable(&a[0][0],x,y+1,4,4))//是否能下移

                     {

                            delete_blocks(&a[0][0],4,4,x,y);

                            y++;

                            HANDLE handle;

                            handle=initiate();

                            WORD wColors[1]={SQUARE_COLOR};

                            drawblocks(&a[0][0],4,4,x,y,wColors,1);

                     }

                     else

                     {

                            sign=0;   //标记,使跳出while(sign) 循环,产生新方块

                            if(y<=1)

                            {

                                   system("CLS");

                                   HANDLEhandle;

                       handle=initiate();

                       WORDwColors[1]={FOREGROUND_RED| FOREGROUND_GREEN};

                       textout(handle,4+dx,6+dy,wColors,1,"GAMEOVER!!!");

                                   textout(handle,4+dx,8+dy,wColors,1,"分数:");

                                   textout(handle,10+dx,8+dy,wColors,1,itoa(score,string,10));

                                   textout(handle,4+dx,10+dy,wColors,1,"制作者:***");

                                delete_cache();

                       exit(EXIT_SUCCESS);

                            }    //是否结束

                            for(int i=0;i<4;i++)     //放下方块

                                   for(intj=0;j<4;j++)

                                          if(a[i][j]&&((i+y)<MAPH-1)&&((j+x)<MAPW-1))

                                                 map[i+y][j+x]=a[i][j];

                            int full,k=0;

                            for( i=y;i<min(y+4,MAPH-1);i++)

                            {

                                   full=1;

                                   for(intj=1;j<14;j++)

                                          if(!map[i][j]) full=0;

                                   if(full)   //消掉一行

                                   {

                                          deletefull_line(map,i,MAPW,MAPH);

                                          k++;

                                          score=score+k;

                                          level=min(score/10,9);

                                   }

                            }

                     }

              }

 

       }

}

void initiate1()        //初始化

{

       inti;

       for(i=0;i<25;i++)

       {

              map[i][0]=-2;

              map[i][14]=-2;

       }

       for(i=0;i<15;i++)

       {

              map[0][i]=-1;

              map[24][i]=-1;

       }

       map[0][0]=-3;

       map[0][14]=-3;

       map[24][0]=-3;

       map[24][14]=-3;

 

       HANDLEhandle;

       handle=initiate();

       WORDwColors[1]={FOREGROUND_GREEN| FOREGROUND_BLUE|FOREGROUND_INTENSITY};

       textout(handle,dx-10,6+dy,wColors,1,"SCORE");

       textout(handle,dx-10,12+dy,wColors,1,"LEVEL");

       textout(handle,32+dx,8+dy,wColors,1,"NEXT");

       wColors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY;

       drawblocks(&map[0][0],15,25,0,0,wColors,1);

       textout(handle,dx,dy,wColors,1,"◎═════════════◎");

       wColors[0]=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY;

       textout(handle,dx+8,dy+5,wColors,1,"按任意键开始");

       wColors[0]=FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY;

       textout(handle,dx+7,dy-3,wColors,1,"制作者:***");

 

       intx=_getch();

       srand(time(NULL));

       textout(handle,dx+8,dy+5,wColors,1,"            ");

}

 

int * build()            //创建方块

{

       int* a=NULL;

       intc=rand()%7;

       switch(c)

       {

       case0:

              a=&a1[0][0];break;

       case1:

              a=&a2[0][0];break;

       case2:

              a=&a3[0][0];break;

       case3:

              a=&a4[0][0];break;

       case4:

              a=&a5[0][0];break;

       case5:

              a=&a6[0][0];break;

       case6:

              a=&a7[0][0];break;

       }

       returna;

}

 

void drawblocks(int a[],int w,int h,intx,int y,WORD wColors[],int nColors)    //画出方块

{

       HANDLEhandle;

       handle= initiate();

       inttemp;

      

       for(inti=0;i<h;i++)

              for(int j=0;j<w;j++)

                     if((temp=a[i*w+j])&&y+i>0)

                     {

                            if(temp==-3)

                            {

                                   textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◎");

                                   _sleep(30);

                            }

                            else if(temp==-2)

                            {

                                   textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"║");

                                   _sleep(30);

                            }

                           

                            else if(temp==1)

                                   textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◎");

                            else if(temp==-1)

                            {

                                   textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"═");

                                   _sleep(30);

                            }

                     }

}

 

void delete_cache()       //清除缓冲区

{

       while(_kbhit())

       {

              _getch();

       }

}

 

void delete_blocks(int *a,int w,int h,intx,int y)        //覆盖方块

{

       HANDLEhandle;

       handle=initiate();

       WORDwColors[1]={SQUARE_COLOR};

       for(inti=0;i<h;i++)

              for(int j=0;j<w;j++)

                     if(a[i*w+j]&&i+y>0)

                            textout(handle,2*(x+j)+dx,y+i+dy,wColors,1,"  ");

}

 

 

void revolve(int a[][4],int w,int h,int*x,int y)                       //转动方块

{

       intb[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

       intsign=0,line=0;

       for(inti=h-1;i>=0;i--)

       {

              for(int j=0;j<w;j++)

                     if(a[i][j])

                     {

                            b[j][line]=a[i][j];

                            sign=1;

                     }

              if(sign)

              {

                     line++;

                     sign=0;

              }

       }

       for(i=0;i<4;i++)

              if(isavailable(&b[0][0],*x-i,y,w,h))

              {

                     *x-=i;

                     for(intk=0;k<h;k++)

                            for(int j=0;j<w;j++)

                            a[k][j]=b[k][j];

                     break;

              }

}

 

void deletefull_line(int m[][MAPW],introw,int w,int h)                   //消除满行的方块

{

       HANDLEhandle;

       handle=initiate();

       WORDwColors[1]={SQUARE_COLOR};

       textout(handle,2+dx,row+dy,wColors,1,"﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌");

       _sleep(100);

 

       inti;

       for(i=row;i>1;i--)

       {

              delete_blocks(&m[i][1],MAPW-2,1,1,i);

              for(int j=1;j<MAPW-1;j++)

                     m[i][j]=m[i-1][j];

              drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1);

       }

       for(i=1;i<MAPW-1;i++)

              m[1][i]=0;

}

 

BOOL isavailable(int a[],int x,int y,intw,int h)                      

{

       for(inti=max(y,1);i<y+h;i++)

              for(int j=x;j<x+w;j++)

                     if(map[i][j]&&a[w*(i-y)+j-x])

                            return 0;

       return1;

}

 

第二个cpp:

#include "colorConsole.h"

 

 

HANDLE initiate()

{

       HANDLEhOutput;

       hOutput= GetStdHandle(STD_OUTPUT_HANDLE);

       returnhOutput;

}

BOOL textout(HANDLE hOutput,int x,inty,WORD wColors[],int nColors,LPTSTR lpszString)

{

   DWORD cWritten;

   BOOL fSuccess;

   COORD coord;

  

       coord.X= x;              // start at first cell

   coord.Y = y;              //   of first row     

   fSuccess = WriteConsoleOutputCharacter(

       hOutput,              // screenbuffer handle

       lpszString,           // pointerto source string

        lstrlen(lpszString),  // length of string

       coord,                // firstcell to write to

       &cWritten);           //actual number written

   if (! fSuccess)

       cout<<"error:WriteConsoleOutputCharacter"<<endl;

   

          

       for(;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors)

    {

       fSuccess = WriteConsoleOutputAttribute(

           hOutput,          // screen bufferhandle

           wColors,          // pointer tosource string

           nColors,                // lengthof string

           coord,            // first cell towrite to

           &cWritten);       // actualnumber written

    }

   if (! fSuccess)

           cout<<"error:WriteConsoleOutputAttribute"<<endl;

 

       return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: