方块游戏

主要思路

1.先初始化界面,用一个30*20矩阵来保存界面的每一个位置,包括颜色跟数值,数值0,1,2用来区分是空格还是方块还是墙。

2.再初始化方块,用4*4矩阵保存,初始7个方块,再利用矩阵旋转,得到剩下的21个方块。

3.先判断再运行,保证不会越过墙。每一步如果4*4的方块矩阵下一格是方块就落在上面。

4.一旦一个方块落到底便判断是否构成消除条件,满一行则减掉,未满则生成下一个方块。

5.判断游戏结束:即判断最顶上一行是否有方块

重要代码

1.初始化界面

void inter_face()//构造游戏界面
{   int i,j;
    for(i=0;i<FACE_X;i++)
    {   for(j=0;j<FACE_Y+10;j++)
        {   if(j==0 || j==FACE_Y-1 || j==FACE_Y+9||i==FACE_X-1)
            {   face.data[i][j]=Wall;
                gotoxy(i,2*j);
                printf("■");
            }
            else
            face.data[i][j]=0;
        }
    }
    gotoxy(FACE_X-18,2*FACE_Y+2);
    printf("左移:←");

    gotoxy(FACE_X-16,2*FACE_Y+2);
    printf("右移:→");

	gotoxy(FACE_X-14,2*FACE_Y+2);
    printf("加速:持续按↓");

    gotoxy(FACE_X-12,2*FACE_Y+2);
    printf("旋转:空格");

    gotoxy(FACE_X-10,2*FACE_Y+2);
    printf("暂停: S");

    gotoxy(FACE_X-8,2*FACE_Y+2);
    printf("退出: ESC");

    gotoxy(FACE_X-6,2*FACE_Y+2);
    printf("重新开始:R");

    gotoxy(FACE_X-4,2*FACE_Y+2);
    printf("分数:%d",grade);
	

}

2.初始化方块

void init_dia()   //构造不同种的方块
{
    int i,j,k,z;
    int tmp[4][4];
    for(i=0;i<3;i++)
        dia[0][0].space[1][i]=1;
        dia[0][0].space[2][1]=1;     //┬形

    for(i=1;i<4;i++)
        dia[1][0].space[i][1]=1;
        dia[1][0].space[1][2]=1;    //┌形

    for(i=1;i<4;i++)
        dia[2][0].space[i][2]=1;
        dia[2][0].space[1][1]=1;    //┐形

    for(i=0;i<2;i++)
    {   dia[3][0].space[1][i]=1;
        dia[3][0].space[2][i+1]=1; //Z形--1

        dia[4][0].space[1][i+1]=1;
        dia[4][0].space[2][i]=1;//Z形--2(反)

        dia[5][0].space[1][i+1]=1;
        dia[5][0].space[2][i+1]=1;//田字形
    }
    for(i=0;i<4;i++)
        dia[6][0].space[i][2]=1;//1形 
   //基础7个形状
    for(i=0;i<7;i++)//
    {
        for(z=0;z<3;z++)//
        {
            for(j=0;j<4;j++)
            {
                for(k=0;k<4;k++)
                {
                  tmp[j][k]=dia[i][z].space[j][k];
                }   
            }
            for(j=0;j<4;j++)
            {
                for(k=0;k<4;k++)
                {
                  dia[i][z+1].space[j][k]=tmp[4-k-1][j];
                }   
            }
        }
    }
    //旋转后的21个形状
}

3. 运行阶段

void start_game()
{   int n,ch,t=0,x=0,y=FACE_Y/2-2,i,j;
    int space_c=0;//旋转次数
    draw_kong(nn,space_c,4,FACE_Y+3);
    n=nn;   
    nn=rand()%7;    //随机生成下一块
    color(nn);
    draw_dia(nn,space_c,4,FACE_Y+3);
    while(1)
    {   
        color(n);
        draw_dia(n,space_c,x,y);//画出图形
        if(t==0)
            t=15000;
        while(--t)
        {   if(kbhit()!=0)//有输入就跳出
                break;  
        }
        if(t==0)
        {
            if(pd(n,space_c,x+1,y)==1)
            {   draw_kong(n,space_c,x,y);
                x++;            //向下降落
            }
            else
            {
                for(i=0;i<4;i++)
                {
                    for(j=0;j<4;j++)
                    { 
                        if(dia[n][space_c].space[i][j]==1)
                        {   
                            face.data[x+i][y+j]=Box;
                            face.color[x+i][y+j]=n;
                            while(xc());
                        }
                    }
                }
                return;
            }
        }
        else
        {
            ch=getch();
            switch(ch)     //移动
            {
            case LEFT: if(pd(n,space_c,x,y-1)==1)   //判断是否可以移动
                       {   draw_kong(n,space_c,x,y);
                           y--;
                       }
                       break;
            case RIGHT: if(pd(n,space_c,x,y+1)==1)
                        {   draw_kong(n,space_c,x,y);
                            y++;
                        }
                        break;
            case DOWN: if(pd(n,space_c,x+1,y)==1)
                        {   draw_kong(n,space_c,x,y);
                            x++;
                        }
                        break;
            case SPACE: if(pd(n,(space_c+1)%4,x+1,y)==1)
                        {   draw_kong(n,space_c,x,y);
                            space_c=(space_c+1)%4;
                        }
                        break;
           case ESC  : system("cls");
                        gotoxy(FACE_X/2,FACE_Y);
                        printf("---游戏结束!---\n\n");
						gotoxy(FACE_X/2+2,FACE_Y);
						printf("你的分数为:%d",grade);
                        gotoxy(FACE_X/2+4,FACE_Y);
                        printf("---按任意键退出!---\n");
                        getch();
                        exit(0);
                        break;
            case  'R':
            case  'r':  main();
                        exit(0);
            case  'S':
            case  's':  while(1)
                        {   if(kbhit()!=0)//有输入就跳出
                            break;  
                        }
                        break;
            }
        }
    }
}

4.消除一行

int xc()//消除
{
    int i,j,k,sum;
    for(i=FACE_X-2;i>4;i--)
    {
        sum=0;
        for(j=1;j<FACE_Y-1;j++)
        {
            sum+=face.data[i][j];   
        }
        if(sum==0)
            break;
        if(sum==FACE_Y-2)   //满一行,减掉
        {   
            grade+=100;
            color(8);
            gotoxy(FACE_X-4,2*FACE_Y+2);
            printf("分数:%d",grade);
            for(j=1;j<FACE_Y-1;j++)
            {
                face.data[i][j]=Kong;
                gotoxy(i,2*j);
                printf(" ");
            }
            for(j=i;j>1;j--)
            {   sum=0;
                for(k=1;k<FACE_Y-1;k++)
                {
                    sum+=face.data[j-1][k]+face.data[j][k];
                    face.data[j][k]=face.data[j-1][k];
                    if(face.data[j][k]==Kong)
                    {
                        gotoxy(j,2*k);
                        printf(" ");
                    }
                    else
                    {
                        gotoxy(j,2*k);
                        color(face.color[j][k]);
                        printf("■");//消除之后剩余的方块
                    }
                }
                if(sum==0)
                    return 1;
            }

        }
    }
}

5.判断游戏结束

  for(i=1;i<FACE_Y-1;i++)
    {
        if(face.data[1][i]==Box)
        {
            char n;
            Sleep(10); //延时判断到顶
            system("cls");
            color(7);
            gotoxy(FACE_X/2-2,2*(FACE_Y/3));
            
            printf("你的分数为:%d",grade);
     
            gotoxy(FACE_X/2,2*(FACE_Y/3));
            printf("GAME OVER!\n");
            do
            {
                gotoxy(FACE_X/2+2,2*(FACE_Y/3));
                printf("是否重新开始游戏(y/n): ");
                scanf("%c",&n);
                gotoxy(FACE_X/2+4,2*(FACE_Y/3));
                if(n!='n' && n!='N' && n!='y' && n!='Y')
                    printf("输入错误,请重新输入!");
                else
                    break;
            }while(1);
            if(n=='n' || n=='N')
            {
                gotoxy(FACE_X/2+4,2*(FACE_Y/3));
                printf("按任意键退出游戏!");
                exit(0);
            }
            else if(n=='y' || n=='Y')
                main();
        }       
    }
    return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值