📄 block.c
字号:
}
/* The group function is about move block */
/* It is cental step move for a time */
/* The Rolate is process block rolating */
/* and move to left and right */
/* and process key value for move and rolated */
void movecental()
{
char c[4];
switch( getkey() )
{
case 0: if( endscreen(&time_mark,SCORE) )
{
EXITGAME=1; break;
}
else break;
case 3: rolateblock(); break;
case 4: moveblock(LEFT); break;
case 5: moveblock(RIGHT); break;
case 6: QUICKLY=1; break;
case 7: if( ++LEVER>9 ) LEVER=0;
setcolor(BLUE);
clearchar(LEVER_X,LEVER_Y,3);
sprintf(c,"%d",LEVER);
moveto(LEVER_X,LEVER_Y);
outtext(c);
break;
case 1:
case 2: clearchar(NORMAL_X,NORMAL_Y,6);
moveto(NORMAL_X,NORMAL_Y);
setcolor(BLUE);
DIFF=DIFF^1;
outtext(NORMAL[DIFF]);
break;
}
return;
}
void movestep()
{
BNODE *p;
int mark=0;
if( isstop() ) return;
for(p=head;p;p=p->next)
{
p->y++;
if( p->y >= PLAYWIDTH ) mark=1;
}
if( mark ) for(p=head;p;p=p->next) p->y--;
else DISTENCEY++;
return;
}
void rolateblock()
{
int i,j,l,temp,mark=1;
int b[32];
BNODE *p;
if( isstop() ) return;
if( DISTENCEX<0 || DISTENCEX>9 || isstop() ) return;
for(p=head,l=0; p && mark ;p=p->next,l++)
{
b[l++]=p->x; b[l]=p->y;
i=p->x; j=p->y;
i-=DISTENCEX; j-=DISTENCEY;
i--; j--;
temp=j;
j=-i; i=temp;
i++;j++;
if( i>PLAYLENGTH-DISTENCEX || j>PLAYWIDTH-DISTENCEY
|| i+DISTENCEX<0 || i+DISTENCEX>PLAYLENGTH-1)
{ mark=0; continue; }
p->x=i+DISTENCEX; p->y=j+DISTENCEY;
}
if( !mark )
{
for(i=0,p=head;i<l;i++,p=p->next)
{
p->x=b[i++]; p->y=b[i];
}
}
return;
}
void moveblock(int m1)
{
register i,l,mark=1;
BNODE *p;
switch( m1 )
{
case LEFT: if( ismove(LEFT) )
{
for(p=head,l=0; p && mark ;p=p->next,l++)
{
p->x-=1;
}
DISTENCEX--;
return;
}
return;
case RIGHT: if( ismove(RIGHT) )
{
for(p=head,l=0; p && mark ;p=p->next,l++)
{
p->x+=1;
}
DISTENCEX++;
return;
}
return;
}
return;
}
void wait(int x)
{
register i,j;
for(i=0;i<=x;i++)
for(j=0;j<5000;j++);
return;
}
int getbnodexy()
{
register i,j,l;
int bnum;
for(i=0,bnum=0,l=0;i<4;i++)
for(j=0;j<4;j++)
if( setview[i][j] )
{
blockaddr[l]=j; l++;
blockaddr[l]=i; l++;
bnum++;
}
return bnum;
}
int iskey()
{
return bioskey(1);
}
int getkey()
{
union{
char c[2];
int keys;
}k;
k.keys=bioskey(0);
if( !k.c[0] )
switch( k.c[1] )
{
case PAGE_UP: return 1;
case PAGE_DOWN: return 2;
case ARROW_UP: return 7;
case ARROW_LEFT: return 4;
case ARROW_RIGHT: return 5;
case ARROW_DOWN: return 6;
default: return 255;
}
else switch( k.c[0] )
{
case ESC: return 0;
case '2': return 6;
case '5': return 3;
case '4': return 4;
case '6': return 5;
case '0': return 6;
case 'y':
case 'Y': return 8;
case 'N':
case 'n': return 9;
case ENTER: return 10;
default: return 255;
}
}
int isstop()
{
BNODE *p,*p1;
int x,y;
for(p=head;p;p=p->next)
{
x=p->x;
y=p->y; y++;
if( y>PLAYWIDTH-1 ) return 1;
if( playview[y][x] )
{
for(p1=head;p1;p1=p1->next)
{
if( p1->x==x && p1->y==y )
break;
}
if(!p1) return 1;
}
}
return 0;
}
void clearline()
{
register i,j,l;
int number,line[4];
for(i=0;i<4;i++,line[i]=0);
for(i=0,number=0;i<PLAYWIDTH;i++)
{
for(j=0;j<PLAYLENGTH;j++)
{
if( !playview[i][j] ) break;
}
if(j==PLAYLENGTH )
{
line[number]=i; number++;
for(j=0;j<PLAYLENGTH;playview[i][j]=0,j++);
}
}
if( number )
{
for(i=0;i<number;i++)
{
for(j=line[i];j>0;j--)
{
for(l=0;l<PLAYLENGTH;l++)
{
playview[j][l]=playview[j-1][l];
}
}
}
for(i=0;i<PLAYLENGTH;playview[0][i]=0,i++);
printplayview();
changevar(number);
}
}
int gameover()
{
register i;
for(i=0;i<PLAYLENGTH ;i++)
if( playview[1][i] ) break;
if( i==PLAYLENGTH ) return 0;
if( endscreen(&time_mark,SCORE) ) return 1;
LEVER=0; SCORE=0; LINE=0; EXITGAME=0;
printvar();
clearplayview();
printplayview();
time_mark=t;
return 0;
}
int ismove(int mark)
{
register i,value;
BNODE *p;
switch(mark)
{
case RIGHT: value=1;
for(p=head;p;p=p->next)
{
if(p->x+1==PLAYLENGTH||playview[p->y][p->x+1])
value=0;
}
return value;
case LEFT: value=1;
for(p=head;p;p=p->next)
{
if( p->x-1<0 || playview[p->y][p->x-1] )
value=0;
}
return value;
}
return value;
}
void freememory()
{
BNODE *p;
for(p=head ;head; p=head)
{
head=head->next;
free(p);
}
return;
}
void placetime(struct time *playtime )
{
struct time tp;
static struct time starttime;
if( TIMEMARK ) { gettime(&starttime); TIMEMARK=0; }
gettime(&tp);
if( tp.ti_sec==starttime.ti_sec ) return;
starttime=tp;
playtime->ti_sec++;
if( playtime->ti_sec==60 )
{
playtime->ti_sec=0;
playtime->ti_min++;
if( playtime->ti_min==60 )
{
playtime->ti_min=0;
playtime->ti_hour++;
if( playtime->ti_hour==24 ) playtime->ti_hour=0;
}
}
printtime(*playtime);
return;
}
void printtime(struct time tp)
{
char buf[20];
sprintf(buf,"%02d:%02d:%02d",tp.ti_hour,tp.ti_min,tp.ti_sec);
settextjustify(LEFT_TEXT,TOP_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
setcolor(BLUE);
clearchar(TIME_X,TIME_Y,10);
moveto(TIME_X,TIME_Y);
outtext(buf);
return;
}
void clearchar(int x,int y,int charnum)
{
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(x,y,x+charnum*16,y+16);
return;
}
void changevar(int x)
{
char c[20];
LINE+=x;
switch(x){
case 1: SCORE+=100; break;
case 2: SCORE+=300; break;
case 3: SCORE+=700; break;
case 4: SCORE+=1500; break;
default: break;
}
if( SCORE>=(long)10000*(CURRENT+1) )
{
LEVER++; CURRENT++;
if( LEVER>10 ) {
LEVER=0;
clearchar(NORMAL_X,NORMAL_Y,6);
moveto(NORMAL_X,NORMAL_Y);
setcolor(BLUE);
outtext(NORMAL[DIFF]);
}
}
if( SCORE>HISCORE ) { HISCORE=SCORE; HIGH=1;}
else HIGH=0;
setcolor(BLUE);
clearchar(LEVER_X,LEVER_Y,3);
sprintf(c,"%d",LEVER);
moveto(LEVER_X,LEVER_Y);
outtext(c);
clearchar(SCORE_X,SCORE_Y,7);
sprintf(c,"%ld",SCORE);
moveto(SCORE_X,SCORE_Y);
outtext(c);
clearchar(LINE_X,LINE_Y,5);
sprintf(c,"%d",LINE);
moveto(LINE_X,LINE_Y);
outtext(c);
clearchar(HISCORE_X,HISCORE_Y,7);
sprintf(c,"%ld",HISCORE);
moveto(HISCORE_X,HISCORE_Y);
outtext(c);
}
void printvar()
{
char c[20];
setcolor(BLUE);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
clearchar(LEVER_X,LEVER_Y,3);
sprintf(c,"%d",LEVER);
moveto(LEVER_X,LEVER_Y);
outtext(c);
clearchar(SCORE_X,SCORE_Y,7);
sprintf(c,"%ld",SCORE);
moveto(SCORE_X,SCORE_Y);
outtext(c);
clearchar(LINE_X,LINE_Y,5);
sprintf(c,"%d",LINE);
moveto(LINE_X,LINE_Y);
outtext(c);
clearchar(HISCORE_X,HISCORE_Y,7);
sprintf(c,"%ld",HISCORE);
moveto(HISCORE_X,HISCORE_Y);
outtext(c);
moveto(NORMAL_X,NORMAL_Y);
outtext(NORMAL[DIFF]);
printtime(time_mark);
return;
}
void setvar()
{
int para[4],width,setx,sety;
register i,j,mark;
cleardevice();
setbkcolor(BLUE);
para[0]=LINE; para[1]=LEVER; para[2]=DIFF; para[3]=0;
setupscreen(para,&HISCORE);
LINE=para[0]; LEVER=para[1]; DIFF=para[2];
randomize();
for(i=PLAYWIDTH-1;i>=PLAYWIDTH-para[0];i--)
{
width=random(PLAYLENGTH-1)+1;
sety=i;
for(j=1;j<=width;j++)
{
for(mark=1;mark; )
{
setx=random(PLAYLENGTH);
if( playview[sety][setx]==0 )
{
playview[sety][setx]=1;
mark=0;
}
}
}
}
LINE=0;
return;
}
int is_one_block()
{
if(head->next->next==NULL) return 1;
else return 0;
}
void draw_one_block(int x,int y,int length,int width)
{
setfillstyle(SOLID_FILL,LIGHTRED);
bar(x,y,x+length-1,y+width-1);
setcolor(WHITE);
line(x+1,y+1,x+length-1,y+1);
line(x+1,y+1,x+1,y+width-2);
setcolor(DARKGRAY);
line(x+length-1,y+width-2,x+length-1,y+1);
line(x+1,y+width-2,x+length-1,y+width-2);
setfillstyle(SOLID_FILL,LIGHTGRAY);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -