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

📄 main.c

📁 一款用51单片机写的俄罗斯方块游戏完整项目下载
💻 C
📖 第 1 页 / 共 3 页
字号:
   *(p+3)=64;
   *(p+4)=0x88;
   *(p+5)=0xff;
   p=p+6;
  for(i=0;i<4;i++)
  {
    for(temp1=0;temp1<16;temp1++)
	  {
	    for(temp2=0;temp2<w;temp2++)
		   for(temp3=0;temp3<2;temp3++)
		   {
		     if(cut_pix[i][temp2])
			 *p=els[temp1][temp3];
             else
			 *p=0x00;
			 p++;
		   }
	  }
   }    
}
void make_els_all(void)//将方块的占用映射形式(21*14)变为去图实际象素BMP形式
{
  uchar i=0;
  uchar j=0;
  uchar temp1=0;
  uchar temp2=0;
  uchar temp3=0;
  uchar k=0;
  xdata uchar *p;
  uint m=0;
   p=ext_all;
   *p=0x00;
   *(p+1)=224;
   *(p+2)=272/256;
   *(p+3)=272%256;
   *(p+4)=0x88;
   *(p+5)=0xff;
   p=p+6;
  for(i=4;i<21;i++)
  {
    for(temp1=0;temp1<16;temp1++)
	  {
	    for(temp2=0;temp2<14;temp2++)
		   for(temp3=0;temp3<2;temp3++)
		   {
		     if(ext_els[temp2][i])
			 *p=els[temp1][temp3];
                          else
			 *p=0x00;
			 p++;
		   }
	  }
   }    
}
void make_els_ini(uchar k)//显示指定行数的方块,在方块刚下来的时候显示使用。
{
uint i=0;
uint h=0;
uchar *p;
uchar *t;
uchar w;
w=with();
if(k>4)
k=4;
t=els_16_t;
   *t=0x00;
   *(t+1)=w*16;
   *(t+2)=0;
   *(t+3)=k*16;
   *(t+4)=0x88;
   *(t+5)=0xff;
   t=t+6;
p=(els_16_r+6+(4-k)*w*2*16);
for(i=0;i<(k*w*2*16);i++)
 {
 *t=*p;
 t++;
 p++;
 }
}
void make_els_ini_left(uchar k)//显示指定行数的方块,在方块刚下来的时候显示使用。左移时候调用。制作映射数组
{
uint i=0;
uint h=0;
uchar *p;
uchar *t;
uchar w;
w=with();
if(k>4)
k=4;
if((abs_x+5)>14)
{

   w=(abs_x+5)-14;
   t=els_16_t;
   *t=0x00;
   *(t+1)=64-w*16;
   *(t+2)=0;
   *(t+3)=k*16;
   *(t+4)=0x88;
   *(t+5)=0xff;
   t=t+6;
   p=(els_16_r+6+(4-k)*(4-w)*2*16);
   for(i=0;i<(k*(4-w)*2*16);i++)
   {
    *t=*p;
    t++;
    p++;
   }
}
else
 {
   t=els_16_t;
   *t=0x00;
   *(t+1)=64;
   *(t+2)=0;
   *(t+3)=k*16;
   *(t+4)=0x88;
   *(t+5)=0xff;
   t=t+6;
   p=(els_16_r+6+(4-k)*8*16);
   for(i=0;i<(k*8*16);i++)
    {
      *t=*p;
      t++;
      p++;
    }
 }
}//显示指定行数的方块,在方块刚下来的时候显示使用。左移时候调用。显示实际象素
void make_els_cut_left(void)
{
  uchar i=0;
  uchar j=0;
  uchar w=0;
  uchar temp1=0;
  uchar temp2=0;
  uchar temp3=0;
  uchar k=0;
  uchar *p;
  uint m=0;
   p=els_16_r;
   *p=0x00;
   *(p+1)=64;
   *(p+2)=0x00;
   *(p+3)=64;
   *(p+4)=0x88;
   *(p+5)=0xff;
   
   if((abs_x+5)>14)
   {
      p=els_16_r;
   *p=0x00;
   *(p+1)=64;
   *(p+2)=0x00;
   *(p+3)=64;
   *(p+4)=0x88;
   *(p+5)=0xff;
   w=(abs_x+5)-14;
   *(p+1)=64-w*16;
   p=p+6;
   for(i=0;i<4;i++)
  {
    for(temp1=0;temp1<16;temp1++)
	  {
	    for(temp2=0;temp2<(4-w);temp2++)
		   for(temp3=0;temp3<2;temp3++)
		   {
		     if(cut_pix[i][temp2])
			 *p=els[temp1][temp3];
             else
			 *p=0x00;
			 p++;
		   }
	  }
   } 
   }
   else
   {
   p=p+6;
  for(i=0;i<4;i++)
  {
    for(temp1=0;temp1<16;temp1++)
	  {
	    for(temp2=0;temp2<4;temp2++)
		   for(temp3=0;temp3<2;temp3++)
		   {
		     if(cut_pix[i][temp2])
			 *p=els[temp1][temp3];
             else
			 *p=0x00;
			 p++;
		   }
	  }
   }    
   }
}

/********************************************************************

函 数 名:ini_int()
功 能:   定时器 和中断初始化
说 明:
调 用:   main()
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void ini_int(void)
{
      EA=0;
      EX0=0;
      ET1=0;
      EX1=0;
      ET0=1;
      PT1=0;
      PT0=1;
      PX1=1;
      PX0=0;
      IT0=1;
      TMOD=0X01;
      TH0=0X00;
      TL0=0X01;
      TR0=1;
      EA=1;
}
xdata uchar delay_1s=0;  //连按时间存放
xdata uchar have_down=0; //有下降按件按下
xdata uchar key=0;       
xdata uchar oldkey=0;    //上次按件号
xdata uchar newkey=0;    //本次按件号
xdata uchar eq_time=0;
xdata uchar eq_key_lab=0; //连按标志
/********************************************************************

函 数 名:time_int()
功 能:系统定时和按件处理
说 明:
调 用:
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void time_int()interrupt 1
{
          uchar a=0;
          uchar b=0;
	  uchar c=0;
	  uchar d=0;
	  uchar e=0;
	  uchar f=0;
	  uchar j=0;
	  uchar k=0;
	  uchar m=0;
          TH0=0X00;
	  TL0=0X00;
	  //定时一秒
      if(delay_1s>30)
	  {
	  have_down=1;
       delay_1s=0;
	  newkey=5;  //每隔0。5秒 方块自动下降
	  }
      else
          delay_1s++;//以上语句为方块自动下降的处理
  
	  P1=0XF0;
	  a=(0x01);
	  m=P1;
	  if(!(P1==0xf0))
	  {
	     for(c=0;c<3;c++)
		 {
		 k=~a;
		 b=(0xff&k);
		 P1=b;
		 d=(P1>>4);
		 a=(a<<1);
		 if(d!=0x0f)
           for(e=0;e<4;e++)
		  {
		   d=d>>e;
		   if(!(d&0x01))
		   {
		   key=(c*4)+e+1;
		   goto test_eq;
		   }
		   else
		   key=0;
		  }
	        }
         }
	  else
	  key=0;
	  test_eq:
	  if((key!=0))
	  {
	         oldkey=key;
		 key=0;
	         if(eq_time<60)
	           eq_time++;
		 else
		 {
                   eq_time=70;
		    eq_key_lab=0xff;
		 }
          }
	  else if((oldkey!=0)&&(key==0))
	  {
	  newkey=oldkey;
	  eq_time=0;
	  oldkey=0;
	  eq_key_lab=0x00;
	  }//以上语句为按件处理 单次按下 和连按分析
		  
}
/********************************************************************

函 数 名:draw_meun()
功 能:画简单的菜单
说 明:调用画图函数和写字符函数  目前工作在小图象缓冲模式 点亮分辨率:352*288 点
调 用:main()  每次游戏开始调用
入口参数:无
返 回 值:无
设 计:志博51 AVR PIC 开发板  日 期:2007年11月13日
变 更 日 期:
变 更 备 注:
***********************************************************************/
void draw_meun(void)  //画简单的菜单
{
clean_rec(0,0,352,288,0xff,0x04);  //清全屏

display_char(270,30,zifu,0xff,0x12); 
display_dig(score,270,50,0xff,0x23);

display_char(240,260,qq,0xff,0x32);
display_char(240,240,http,0xff,0x32);

draw_bmp(244,200,qq_ico,bmp_256); //DRAW QQ ICO
clean_rec(0,0,352,8,0x45,1);   //画上边
clean_rec(0,280,352,8,0x45,1); //画下边
clean_rec(0,0,10,288,0x45,1);   //画左间
clean_rec(347,0,5,288,0x45,1); //画右间
clean_rec(234,0,5,288,0x45,1); //画中间

clean_rec(234,90,113,5,0x45,1);   
display_char(240,110,mcu,0xff,0x32);
display_char(240,126,frq,0xff,0x32);
display_char(240,142,ram,0xff,0x32);
display_char(240,158,rom,0xff,0x32);
clean_rec(234,180,113,5,0x45,1);   
}
/********************************************************************

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

}
/********************************************************************

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

⌨️ 快捷键说明

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