⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一款用51单片机写的俄罗斯方块游戏完整项目下载
💻 C
📖 第 1 页 / 共 3 页
字号:
  cut_p(abs_x,abs_y);
  un_pix();
  make_els_cut();
  draw_bmp(10+(abs_x*16),8+((abs_y-4)*16),els_16_r,bmp_2); 
  if(abs_y>16)
  abs_y=0;
}
else
  {
    if(abs_y!=0)
   {
      cut_p((abs_x-1),(abs_y));
      make_els_cut();
      make_els_ini(abs_y);
      draw_bmp(10+((abs_x-1)*16),8,els_16_t,bmp_2); 
    }
     cut_p((abs_x),abs_y);
     un_pix();
     make_els_cut();
     make_els_ini(abs_y);
     draw_bmp(10+(abs_x*16),8,els_16_t,bmp_2); 
   }
}
/********************************************************************

函 数 名:left()
功 能:方块左移处理
说 明:左移处理,每次绝对坐标ABS—X减一,先清上次方块,再画现在方块,并且分为方块是否露出完处理
调 用:main()  每次分析完下降可能性后调用
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void left(void)
{
if(abs_x>0)
abs_x--;
if(abs_y>3)
{
   {
      cut_p((abs_x+1),(abs_y));
      make_els_cut_left();
      draw_bmp(10+((abs_x+1)*16),8+((abs_y-4)*16),els_16_r,bmp_2); 
   }
  cut_p(abs_x,abs_y);
  un_pix();
  make_els_cut();
  draw_bmp(10+(abs_x*16),8+((abs_y-4)*16),els_16_r,bmp_2); 
  if(abs_y>16)
  abs_y=0;
}
else
  {

      cut_p((abs_x+1),(abs_y));
      make_els_cut_left();
      make_els_ini_left(abs_y);
      draw_bmp(10+((abs_x+1)*16),8,els_16_t,bmp_2); 
     cut_p((abs_x),abs_y);
     un_pix();
     make_els_cut();
     make_els_ini(abs_y);
     draw_bmp(10+(abs_x*16),8,els_16_t,bmp_2); 
   }
   
}
/********************************************************************

函 数 名:lock()
功 能:方块锁定处理
说 明:锁定处理,当方块不能下降时调用,将目前方块锁定到全局方块影射数组中
调 用:test_down()  每次分析完下降可能性后调用
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void lock(void)
{
   uchar a=0;
   uchar b=0;
   for(a=0;a<4;a++)
     for(b=0;b<4;b++)
	  if(els_p[els_type][els_next][a][b])
	    ext_els[b+abs_x][abs_y+a]=0xff;
}
/********************************************************************

函 数 名:make_line()
功 能:测试是否有一行方块被添满
说 明:依次分析每一行,将行数返回
调 用:test_down() del_aline()  每次分析完下降可能性后调用 在删除已经造成一行的函数中调用
入口参数:无
返 回 值:满一行方块的行序号
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/ 
uchar make_line()
{
  uchar x=0;
  uchar y=0;
  uchar b=0;
  for(y=0;y<21;y++)
   {
   b=0;
    for(x=0;x<14;x++)
      {
	 if(ext_els[x][y]==0)
	 {
	  b=1;
	 }
	 else
	 {
	  if((x>=13)&&(!b))
	  return y;
         }
      }
	if((y>=20)&&(b))
	return 0;
   }
}
/********************************************************************

函 数 名:del_aline()
功 能:删除全局方块有无影射数组中已经堆满一行的数据,并将数据依次下移一行
说 明:依次分析每一行,将行数返回
调 用:test_down()   每次分析完下降可能性后调用 
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/ 
void del_aline(void)
{
  uchar a=0;
  uchar b=0;
  uchar c=0;
  c=make_line();
  for(a=0;a<14;a++)
   for(b=0;b<21;b++)
    ext_els_temp[a][b]=ext_els[a][b];
  for(b=0;b<14;b++)
   for(a=0;a<c;a++)
    ext_els[b][a+1]=ext_els_temp[b][a];
     score=score+50;
}
/********************************************************************

函 数 名:test_down()
功 能:测试是否有下降的可能性
说 明:依次分析每一行,将行数返回
调 用:main()  每次按下下降按件或者系统自动下降定时到后调用,并且如果下降到位,则新一轮方块下降初始化
入口参数:无
返 回 值:返回下降的可能性 1有下降可能 0 下降到位
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/ 
uchar test_down(void)
{
  uchar a=0;
  uchar b=0;
  uchar c=0;
  if(abs_y>16)
  {
    lock();
    els_type=((TL0+3)%7);
    if(make_line())
    {
     while(make_line())
     del_aline();
     make_els_all();
     draw_bmp(10,8,ext_all,bmp_2);
     display_dig(score,270,70,0xff,0x23);
    }
    abs_y=0;
    abs_x=5;
    return 0;
  }
  for(b=0;b<4;b++)
   for(a=0;a<4;a++)
    {
	if((ext_els[abs_x+a][abs_y+4-b])&&(els_p[els_type][els_next][3-b][a]==0xff))
	{
	  lock();
	  els_type=((TL0+3)%7);
          for(c=0;c<14;c++)
	  if(ext_els[c][4]!=0)
	  {
            gameover=1;
	  }
	  if(make_line())
           {
            while(make_line())
            del_aline();
            make_els_all();
            draw_bmp(10,8,ext_all,bmp_2);
            display_dig(score,270,70,0xff,0x23);
           }
	  abs_y=0;
	  abs_x=5;
	  return 0;
        }
  }
  return 1;
}	
/********************************************************************

函 数 名:test_left()
功 能:测试是否有下降的可能性
说 明:返回左移的可能性 1有左移可能 0 左边有遮挡
调 用:main()  每次按下左移动按件后调用。
入口参数:无
返 回 值:左移可能性
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
uchar test_left(void)
{
  uchar a=0;
  uchar b=0;
  if(abs_x==0)
  {
    return 0;
  }
  for(b=0;b<4;b++)
   for(a=0;a<4;a++)
    {
	if((ext_els[abs_x+b-1][abs_y+a])&&(els_p[els_type][els_next][a][b]==0xff))
	{
	  return 0;
        }
    }
  return 1;
} 
/********************************************************************

函 数 名:test_right()
功 能:测试是否有右移的可能性
说 明:返回右移的可能性 1有右移可能 0 左边有遮挡
调 用:main()  每次按下右移动按件后调用。
入口参数:无
返 回 值:右移可能性
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
uchar test_right(void)
{
  uchar a=0;
  uchar b=0;
  uchar c=0;
  c=cur_with();
  if((abs_x+c)>13)
  {
	return 0;
  }
  for(b=0;b<c;b++)
   for(a=0;a<4;a++)
    {
	if((ext_els[abs_x+b+1][abs_y+a])&&(els_p[els_type][els_next][a][b]==0xff))
	{
	  return 0;
        }
    }
  return 1;
}
/********************************************************************

函 数 名:change()
功 能:变形处理
说 明:当前形状序列号加一,指向下一形状,然后伪调用LEFT()函数变形后显示
调 用:main()  每次按下变形按件后调用。
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void change(void)
 {
   if(els_next<3)
     els_next++;
   else
     els_next=0;
   make_els_temp();
   if(abs_y>3)
    {
      abs_x++;
      left();
    }
   else
   {
    abs_x++;
    left();
   }
 }
/********************************************************************

函 数 名:main()
功 能:主函数
说 明:初始菜单设置 初始中断 定时后进入 主循环 轮检按件
调 用:
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
main()
{
uint k=0;
uint kk=0;
uchar aa=0;
uchar bb=0;
uchar color=0;
ini_int();
draw_meun();
make_els_all();
draw_bmp(10,8,ext_all,bmp_2);
abs_x=5;
abs_y=0;
els_type=3;
els_next=0;
while(1)
{
switch(newkey)
{
   case 5:            //down
   {
     EA=0;
     if(gameover)
     {
       draw_meun();
       for(aa=0;aa<14;aa++)
       for(kk=0;kk<21;kk++)
       ext_els[aa][kk]=0;
	   
       draw_bmp(90,90,face,bmp_256);
	   while(P1&0X80)
	   {
	   EA=0;
	   if(color%10)
	   display_char(80,160,game_over_c,0xff,0x88);
	   else
	   display_char(80,160,game_over_c,0xff,0xff);
	   color++;
       }
	   EA=1;
	   clean_rec(8,10,224,238,0xff,0x01);  //清全屏
       gameover=0;
     }
     if(test_down())
     down();
     newkey=0;
     EA=1;
     break;
   }
  case 2:             //left
  {
      EA=0;
      if(test_left())
      left();
      newkey=0;
      EA=1;
      break;
  }
  case 10:           //right
  {
    EA=0;
    if(test_right())
    right();
    newkey=0;
    EA=1;
    break;
  }
 case 8:          //作弊 更换任意想要的方块
 {
   EA=0;
   newkey=0;
   els_type++;
   if(els_type>6)
   els_type=0;
   if(abs_y>3)
   {
     abs_x++;
     left();
   }
   else
   {
   abs_x++;
   left();
   }
   newkey=0;
   EA=1;
   break;
 }
 case 6:          //change next 
   {
   EA=0;
   change();
   newkey=0;
   EA=1;
   break;
   }
  }
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -