{
// printat(x*3+1, 241-(y-4)*12,\ printat(x*3+1, 241-(y-4)*12,\
}
//--------------------------------------------------------------------------//
void fk_show(void) //显示分数
{
printat(50, 12,chnint(score,1));
printat(60, 12,\ printat(40, 12,\得分:\ printat(54,36,chnint(line,1)); printat(40, 36,\行数:\ printat(54,60,chnchar(speed,1));
printat(40,60,\速度:\ printat(54,84,chnchar(automapn,1));
printat(40,84,\关数:\
}
//--------------------------------------------------------------------------//
void fk_reffk(void) //刷新方块
{ uchar i,j; uchar temp;
//----------------------------------------------//清除原来的方块
for (i=0;i<4;i++)
{
temp=(fk_mod[fk_type][fk_oldr][i]); for (j=fk_oldx;j { if(temp&0x01) { fk_cldot(j,fk_oldy+i); } temp>>=1; } } //----------------------------------------------//显示新的方块 for (i=0;i<4;i++) { temp=(fk_mod[fk_type][fk_r][i]); for (j=fk_x;j { if(temp&0x01) { fk_dot(j,fk_y+i); } temp>>=1; } } fk_oldx=fk_x;fk_oldy=fk_y;fk_oldr=fk_r; //保存新方块位置 } //--------------------------------------------------------------------------// void fk_refnew(void) //刷新预览方块 { uchar i,j; uchar temp; //----------------------------------------------//预览方块 for (i=0;i<4;i++) { temp=(fk_mod[fk_newtype][fk_newr][i]); for (j=NEWX;j { if(temp&0x01) { fk_dot(j,NEWY+i); } else { fk_cldot(j,NEWY+i); } temp>>=1; } } } //--------------------------------------------------------------------------// void fk_refline(yy) //刷新1行背景 { uchar i; uint temp; if (yy>=4) { temp=fk_map[yy]; for (i=0;i<12;i++) { if ((temp&0x01) !=0) fk_dot(i,yy); else fk_cldot(i,yy); temp >>= 1; } } } //--------------------------------------------------------------------------// bit fk_chk(void) //冲突检查 { uchar i; bit neq=0; for (i=0;i<4;i++) { if ( (((fk_mod[fk_type][fk_r][i])< (((fk_mod[fk_type][fk_r][i])< neq=1; } return(neq); } //--------------------------------------------------------------------------// void fk_new(void) //产生新方块 { srand(rand()+fk_x+fk_y+fk_r); fk_oldx=fk_x=5; fk_oldy=fk_y=LINEMAX; fk_type = fk_newtype; fk_oldr=fk_newr; fk_newtype = rand()%7; fk_newr=rand()%4; fk_refnew(); //刷新预览方块 if (fk_run) fk_reffk(); //刷新显示 } //--------------------------------------------------------------------------// void fk_add(void) //方块合并 { uchar i,j; uchar full=0x00; uchar fulltemp; uchar fullline=0x00; for (i=0;i<4;i++) //方块合并 { fk_map[fk_y+i] |= (fk_mod[fk_type][fk_r][i])< full <<= 1; if ((fk_y+i >= 4) && (fk_map[fk_y+i] == 0xffff)) //满行 { full |= 0x01; } } if (full != 0) //有满行 { for (j=0;j<3;j++) //消行闪烁3次 { delay(300); fulltemp=full; for (i=0;i<4;i++) //4行 { if ((fulltemp&0x08) != 0) { fk_map[fk_y+i] ^= FULLMAP; } fk_refline(fk_y+i); fulltemp <<= 1; } } fulltemp=full; for (i=fk_y;i { if ((i < LINEMAX+4)&&(fk_map[i-fullline]!=fk_map[i])) { fk_map[i-fullline]=fk_map[i]; fk_refline(i-fullline); } if ((i >= LINEMAX+4)&&(fk_map[i-fullline]!=~FULLMAP)) { fk_map[i-fullline]=~FULLMAP; //背景映象 fk_refline(i-fullline); } if ((fulltemp&0x08) != 0) { fullline++; } fulltemp <<= 1; } if (((line+fullline)/LINEGUAN) != (line/LINEGUAN))//每20行速度+1 speed ++; line += fullline; //更新分数、行数 score += (1< printat(46,180,strmap[fullline-1]); //夸奖 fk_show(); //显示分数 fk_new(); //产生新方块 } else { if (fk_y > LINEMAX-10) //在最高位置碰撞且不能消行则游戏结束 printat(46,180,\加油啊!\加油啊 if (fk_y > LINEMAX-6) //在最高位置碰撞且不能消行则游戏结束 printat(46,180,\糟糕了!\糟糕了 if (fk_y==LINEMAX) //在最高位置碰撞且不能消行则游戏结束 fk_run=0; //方块初始化 else fk_new(); //产生新方块 } } //--------------------------------------------------------------------------// void fk_init(void) //方块初始化 { uchar i; fk_run = 0; moven=0; Lcd6963Cls(); Lcd6963Rec(0,0,152,255); Lcd6963ChHz(0); //切换到16X16点阵 printat(2, 16,\欢迎光临文君阁\ printat(2, 48,\请按键选择:\ printat(2, 80,\ printat(2, 96,\左旋 8右旋 9右旋\ printat(2, 112,\左移 5右旋 6右移\ printat(2, 128,\速度 5开始 6关数\ printat(2, 144,\左移 2下移 3右移\ printat(2, 160,\ Lcd6963ChHz(1); //切换到12X12点阵 printat(46,180,\欢迎使用\ fk_show(); //显示分数 while (~fk_run) {