俄罗斯方块代码

#include<stdio.h>
#include<conio.h>
#include<bios.h>

#define KEY_UP 0x48
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_DOWN 0x50
#define TIME 10000

int i,j,score=0;/*所得分数*/
int p[7][4][4][4]={0};/*存放物体,7表示有7种物体,第一个4表示每种最多有4种变形*/
int a;/*在数组中确定是哪个物体*/
int b;/*确定变化后的物体*/
int x,y;/*光标位置标志*/
int q[18][14]={0};/*存放物体下落后形成的图形*/
int key;/*按键标志*/
int fast;/*按下加速标志*/
int die;/*死亡标志*/

void delay()/*延迟函数*/
{ long t1,t2,t3;
  for(t1=0;t1<=1200;t1++)
     for(t2=0;t2<=TIME;t2++)
         if(0==fast)
    {for(t3=0;t3<=15;t3++)
                 ;
            }
}
void boundary()/*显示边界,可移动有效范围为(21,5)~(35,23)*/
{j=5;
 gotoxy(21,5);
 for(i=0;i<14;i++)
   printf("-");
 gotoxy(21,24);
 for(i=0;i<14;i++)
   printf("-");
 for(i=0;i<20;i++)
   {gotoxy(20,j++);
    printf("l");
   }
  j=5;
 for(i=0;i<20;i++)
   {
     gotoxy(35,j++);
    printf("l");
   }
}
void show_object()/*显示物体*/
{ for(i=0;i<4;i++)
   {gotoxy(x,y);
    for(j=0;j<4;j++)
      if(p[a][b][i][j]==0)
          gotoxy(x+j+1,y);
      else
          printf("*");
      y++;
    } 
  y=y-4;
}
void graph()/*显示物体堆积后的图形*/
{ int m=21,n=6;
  gotoxy(m,n);
  for(i=0;i<18;i++)
   {for(j=0;j<14;j++)
      {if(q[i][j]==0)
   printf(" ");/*若不输出空格,光标不移动。*/
       else
          printf("*");
      }
     printf("/n");
     gotoxy(m,++n);
    }
}
void show()/*总的显示函数*/
{ clrscr();
  boundary();
  graph();
  show_object();
}
int arrive_boundaryl()/*判断有没有出左边*/
{int l=1;
 for(j=0;j<4;j++)
   for(i=0;i<4;i++)
    if(p[a][b][i][j]==1&&x+j-1<21)
       l=0;
 return l;   
}
int arrive_boundaryr()/*判断有没有出右边*/
{int r=1;
 for(j=3;j>-1;j--)
   for(i=0;i<4;i++)
    if(p[a][b][i][j]==1&&x+j+1>34)
        r=0;
 return r;
}
void change()/*变换*/
{if(b>3)
  b=0;
 else
  b++;
}
int dead()/*判断是否死亡*/
{int c=1;
 for(i=0;i<14;i++)
  if(q[1][i]==1)
     c=0;
  else
      ;
 return c;
}
void get_grade()/*判断是否得分,有则要更新图形*/
{ int m,n;
  for(i=0;i<18;i++)
    for(j=0;j<14;j++)
     { if(q[i][j]==0)
         break;
       else
         if(j==13)
          {score++;        /*分数加一*/
           for(m=i;m>0;m--)
             for(n=0;n<14;n++)
               q[m][n]=q[m-1][n];
           for(m=0;m<14;m++)
               q[0][m]=0;         
          }/*得分则将上一行依次复制给该行*/
      }
}
void move()/*计算能否继续向下运动*/
{int flag;
   for(i=0;i<4;i++)
    {for(j=0;j<4;j++)
      if(p[a][b][i][j]==1&&(q[y-5+i+1][x-21+j]==1||y+4==23))
             {flag=0;break;
             }
      else  
             flag=1;
      if(0==flag)
          break;
    }
  if(flag)
     y++;
   else
     {for(i=0;i<4;i++)
       {for(j=0;j<4;j++)
   if(p[a][b][i][j]==1)
             q[y-5+i][x-21+j]=1;
       }
       get_grade();   
       a=rand()%7+0;
       b=0;
       x=25;y=4;
     }
}
 
void main()
{a=5;
 b=0;
 x=25;y=4;
 fast=0;
 die=0;
 p[0][0][0][1]=1;p[0][0][1][1]=1;p[0][0][2][1]=1;p[0][0][3][1]=1;/*长条及其变形*/
 p[0][1][3][0]=1;p[0][1][3][1]=1;p[0][1][3][2]=1;p[0][1][3][3]=1;
 p[0][2][0][1]=1;p[0][2][1][1]=1;p[0][2][2][1]=1;p[0][2][3][1]=1;
 p[0][3][3][0]=1;p[0][3][3][1]=1;p[0][3][3][2]=1;p[0][3][3][3]=1;

 p[1][0][2][2]=1;p[1][0][2][3]=1;p[1][0][3][2]=1;p[1][0][3][3]=1;/*正方体及其变形*/
 p[1][1][2][2]=1;p[1][1][2][3]=1;p[1][1][3][2]=1;p[1][1][3][3]=1;
 p[1][2][2][2]=1;p[1][2][2][3]=1;p[1][2][3][2]=1;p[1][2][3][3]=1;
 p[1][3][2][2]=1;p[1][3][2][3]=1;p[1][3][3][2]=1;p[1][3][3][3]=1;

 p[2][0][2][1]=1;p[2][0][3][0]=1;p[2][0][3][1]=1;p[2][0][3][2]=1;/*上型及其变形*/
 p[2][1][1][1]=1;p[2][1][2][0]=1;p[2][1][2][1]=1;p[2][1][3][1]=1;
 p[2][2][2][0]=1;p[2][2][2][1]=1;p[2][2][2][2]=1;p[2][2][3][1]=1;
 p[2][3][1][1]=1;p[2][3][2][1]=1;p[2][3][2][2]=1;p[2][3][3][1]=1;

 p[3][0][1][1]=1;p[3][0][1][2]=1;p[3][0][2][1]=1;p[3][0][3][1]=1;/*反7型及其变形*/
 p[3][1][2][0]=1;p[3][1][3][0]=1;p[3][1][3][1]=1;p[3][1][3][2]=1;
 p[3][2][1][1]=1;p[3][2][2][1]=1;p[3][2][3][0]=1;p[3][2][3][1]=1;
 p[3][3][2][0]=1;p[3][3][2][1]=1;p[3][3][2][2]=1;p[3][3][3][2]=1;

 p[4][0][1][1]=1;p[4][0][1][2]=1;p[4][0][2][2]=1;p[4][0][3][2]=1;/*7型及其变形*/
 p[4][1][2][0]=1;p[4][1][2][1]=1;p[4][1][2][2]=1;p[4][1][3][0]=1;
 p[4][2][1][0]=1;p[4][2][2][0]=1;p[4][2][3][0]=1;p[4][2][3][1]=1;
 p[4][3][2][2]=1;p[4][3][3][0]=1;p[4][3][3][1]=1;p[4][3][3][2]=1;

 p[5][0][2][1]=1;p[5][0][2][2]=1;p[5][0][3][0]=1;p[5][0][3][1]=1;/*反z型及其变形*/
 p[5][1][1][1]=1;p[5][1][2][1]=1;p[5][1][2][2]=1;p[5][1][3][2]=1;
 p[5][2][2][1]=1;p[5][2][2][2]=1;p[5][2][3][0]=1;p[5][2][3][1]=1;
 p[5][3][1][1]=1;p[5][3][2][1]=1;p[5][3][2][2]=1;p[5][3][3][2]=1;

 p[6][0][2][0]=1;p[6][0][2][1]=1;p[6][0][3][1]=1;p[6][0][3][2]=1;/*z型及其变形*/
 p[6][1][1][2]=1;p[6][1][2][1]=1;p[6][1][2][2]=1;p[6][1][3][1]=1;
 p[6][2][2][0]=1;p[6][2][2][1]=1;p[6][2][3][1]=1;p[6][2][3][2]=1;
 p[6][3][1][2]=1;p[6][3][2][1]=1;p[6][3][2][2]=1;p[6][3][3][1]=1;
 while(1)
  { while(!kbhit())
      {y++;
       delay();
       move();
       if(!dead())
         {die=1;
          goto over;
          }
       show();
       fast=0;
      }
    key=getch();
    switch(key)
     {case KEY_UP:  
              change();break; /*变形*/
      case KEY_DOWN:
              fast=1;break; /*加速*/
      case KEY_LEFT:
              if(arrive_boundaryl())
                 x--;break;
      case KEY_RIGHT:
              if(arrive_boundaryr())
                 x++;break;
     }
     if(key==32)/*空格退出*/
         break;
over:if(die)
        {char again;
         clrscr();
         gotoxy(20,10);
         printf("do you want again?y/n");
         scanf("%c",&again);
         if('y'==again)
           {for(i=0;i<18;i++)
             for(j=0;j<14;j++)
                q[i][j]=0;
            die=0;/*重新开始*/ 
           }
         else
            break;
        }
  }
}
/*漏洞1:物体运动到两侧无法返回中间(已解决)*/
/*漏洞2:部分物体变形会出现错误*/
/*漏洞3:物体下落后形成的图形有些时候不对*/
/*漏洞4:不会死亡(已解决)*/
/*漏洞5:游戏结束按下y无法重新开始时*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值