俄罗斯方块

来源:互联网 发布:中国各省贸易数据库 编辑:程序博客网 时间:2024/05/17 23:51

在 我的资源 中提供下载

资源下载。

俄罗斯方块的思路:

(1)将每个小方块写在一个4*4的数组中。(数组中的值为1时,表示这个地方有块存在;为0时。表示这个地方没有块存在)

(2)定义3个25*20的数组,作为俄罗斯方块的面板。

        a面板:使方块在上面移动;

        b面板:储存已经固定的块;

        c面板:将a,b面板上面的信息整合在一起,显示出来,并且在显示结束之后,立即清0;

(3)块在a面板上面移动的时候,一定要使用有块存在的边界,与b面板上的边界判断冲突,而不是使用块数组的边界。

         0 0 0 0

         1 1 1 0

         0 0 1 0    使用本行为判断的边界

         0 0 0 0    而不是使用本行

(4)在写消行时,一定要使这一行的所有数组元素为1时,才可以消行。

(5)写出块旋转的时候,是每个块的4种形式,都写出来,等待将来可以调用。

写出块的代码:

void block(int x, int y )//x,y
{
 setfillcolor(RED);//设置填充颜色
 fillrectangle(x, y, x + Block1, y + Block1);
}
void blockL(int b[][4], int m,int n )//x,y,状态,大小
{
 switch (m)
 {
 case 1://第一个块   L 
  switch (n)
  {
  case 1: 
   b[0][0] = 1;
   b[1][0] = 1;
   b[2][0] = 1;
   b[2][1] = 1;    
   break;      
  case 2:       
   b[0][0] = 1;    
   b[0][1] = 1;    
   b[0][2] = 1;    
   b[1][0] = 1;
   break;
  case 3:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][1] = 1;
   b[2][1] = 1;
   break;
  case 0:
   b[0][0] = 1;
   b[1][0] = 1;
   b[1][2] = 1;
   b[1][1] = 1;
   break;
  }
  break;
 case 2:// I 型
  switch (n)
  {       
  case 1:      
   b[0][0] = 1;   
   b[0][1] = 1;   
   b[0][2] = 1;   
   b[0][3] = 1;   
   break;
  case 2:
   b[1][0] = 1;
   b[2][0] = 1;
   b[3][0] = 1;
   b[0][0] = 1;
   break;
  case 3:
   b[0][0] = 1;
   b[0][1] = 1;
   b[0][2] = 1;
   b[0][3] = 1;
   break;
  case 0:
   b[1][0] = 1;
   b[2][0] = 1;
   b[3][0] = 1;
   b[0][0] = 1;
   break;
  }
  break;
 case 3://反L
  switch (n)     
  {       
  case 1:      
   b[2][0] = 1;   
   b[2][1] = 1;   
   b[1][1] = 1;   
   b[0][1] = 1;
   break;
  case 2:
   b[0][0] = 1;
   b[1][0] = 1;
   b[1][1] = 1;
   b[1][2] = 1;
   break;
  case 3:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][0] = 1;
   b[2][0] = 1;
   break;         
  case 0:          
   b[0][0] = 1;       
   b[0][1] = 1;       
   b[0][2] = 1;       
   b[1][2] = 1;       
   break;
  }
  break;
 case 4:   //田  字型         
  switch (n)          
  {            
  case 1:           
   b[0][0] = 1;        
   b[0][1] = 1;        
   b[1][0] = 1;
   b[1][1] = 1;
   break;
  case 2:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][0] = 1;
   b[1][1] = 1;
   break;
  case 3:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][0] = 1;
   b[1][1] = 1;
   break;
  case 0:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][0] = 1;
   b[1][1] = 1;
   break;
  }
  break;
 case 5:     //土字型
  switch (n)     
  {       
  case 1:      
   b[1][0] = 1;   
   b[1][1] = 1;   
   b[1][2] = 1;
   b[0][1] = 1;
   break;
  case 2:
   b[0][0] = 1;
   b[1][0] = 1;
   b[2][0] = 1;
   b[1][1] = 1;
   break;
  case 3:
   b[0][1] = 1;
   b[0][2] = 1;
   b[0][0] = 1;
   b[1][1] = 1;
   break;
  case 0:
   b[0][1] = 1;
   b[1][1] = 1;
   b[2][1] = 1;
   b[1][0] = 1;
   break;
  }
  break;
 case 6://反Z
  switch (n)    
  {      
  case 1:     
   b[0][0] = 1;  
   b[1][0] = 1;  
   b[1][1] = 1;  
   b[2][1] = 1;
   break;
  case 2:
   b[1][0] = 1;
   b[1][1] = 1;
   b[0][2] = 1;
   b[0][1] = 1;
   break;
  case 3:
   b[0][0] = 1;;
   b[1][0] = 1;;
   b[1][1] = 1;;
   b[2][1] = 1;;
   break;
  case 0:
   b[1][0] = 1;
   b[1][1] = 1;
   b[0][2] = 1;
   b[0][1] = 1;
   break;
  }
  break;
 case 0:
  switch (n)    
  {      
  case 1:     
   b[0][1] = 1;  
   b[2][0] = 1;  
   b[1][1] = 1;  
   b[1][0] = 1;  
   break;    
  case 2:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][1] = 1;
   b[1][2] = 1;
   break;
  case 3:
   b[0][1] = 1;
   b[2][0] = 1;
   b[1][1] = 1;
   b[1][0] = 1;
   break;
  case 0:
   b[0][0] = 1;
   b[0][1] = 1;
   b[1][1] = 1;
   b[1][2] = 1;
   break;
  }
  break;
 }

}

主函数代码:

 while (Game)
 {//开始游戏
  if (fly)//飞行状态
  {
   if (kbhit())//如果有键按下
   {
    char c;
    c = getch();
    switch (c)
    {
    case 'S'://加速下落
     moveSucc = move(a1, b, hang, lie + 2);//在临时面板上上移动成功为1
     chongtu = chongtu1(a2, a1);//检查是否冲突,1为冲突
     if (!chongtu&&moveSucc)//不冲突且移动成功
      move(a1, b, hang, lie++);
     break;
    case 'A'://左移
     if (hang - 1 >= 0)
     {
      moveSucc = move(a1, b, hang - 1, lie);//在临时面板上上移动成功为1
      chongtu = chongtu1(a2, a1);//检查是否冲突,1为冲突
      if (!chongtu&&moveSucc)//不冲突且移动成功
      {
       move(a1, b, hang--, lie);
      }
     }
     break;
    case 'W'://旋转
     for (int i = 0; i < 4; i++)
     for (int j = 0; j < 4; j++)
      b[i][j] = 0;
     if (n < 3)
      blockL(b, m, n += 1);
     else
     {
      n = 0;
      blockL(b, m, n);
     }
     moveSucc = move(a1, b, hang, lie );//在临时面板上上移动成功为1
     chongtu = chongtu1(a2, a1);//检查是否冲突,1为冲突
     if (!chongtu&&moveSucc)//不冲突且移动成功
      move(a1, b, hang, lie);
     break;
    case 'D'://右移
     moveSucc = move(a1, b, hang+1, lie );//在临时面板上上移动成功为1
     chongtu = chongtu1(a2, a1);//检查是否冲突,1为冲突
     if (!chongtu&&moveSucc)//不冲突且移动成功
     {
      move(a1, b, hang++, lie );
     }
     break;
    case 'P'://暂停
     Pause();
     break;
    }
   }
       //自由下落
   moveSucc = move(a1, b, hang, lie+1);//在临时面板上上移动成功为1
   chongtu = chongtu1(a2,a1);//检查是否冲突,1为冲突
   if (!chongtu&&moveSucc)//不冲突且移动成功
    move(a1, b, hang, lie++);
   else
   {
    move(a1, b, hang, lie--);
    A1toA(a2,a1);
    fly = 0;
   }
   clearrectangle((WEIGHT - Weight1) / 2, (HIGH - High1) / 2, WEIGHT - (WEIGHT - Weight1) / 2, HIGH - (HIGH - High1) / 2);
   rectangle((WEIGHT - Weight1) / 2, (HIGH - High1) / 2, WEIGHT - (WEIGHT - Weight1) / 2, HIGH - (HIGH - High1) / 2);
   A1toA(a,a1);
   A1toA(a,a2);
   print(a);
   Sleep(diffcult);
   for (int i = 0; i < 25; i++)
   for (int j = 0; j < 20; j++)
    a[i][j] = 0; 
  }
  else
  {
   m = rand() % 7;
   n = rand() % 4;
   fly = 1;
   lie = 0;
   hang = 9;
   for (int i = 0; i < 4; i++)
   for (int j = 0; j < 4; j++)
    b[i][j] = 0;
   blockL(b, m, n);
   moveSucc = move(a1, b, hang, lie);//在临时面板上上移动成功为1
   chongtu = chongtu1(a2, a1);
   if (chongtu)
   {
    Game = 0;
    TCHAR s[] = _T("游戏结束");
    outtextxy(10, 20, s);
   }
   else
   {
    sorce1 = sorce(a2, sorce1);
    TCHAR s[5];
    _stprintf(s, _T("%d"), sorce1);
     TCHAR s1[] = _T("分数:");
    outtextxy(500, 100, s1);
    outtextxy(550, 100, s);
   }
  }
 }

剩下的函数功能,需要大家自己补齐哦!!!相信自己可以完成。

这是大概的思路,若有问题,可以留言,我们讨论一下。

0 0
原创粉丝点击