📄 main.c
字号:
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 + -