1993年,记得刚学会C语言,就试着写了个俄罗斯广块的小程序,微机课上机实习时带着程序一阵敲打和调试,终于把程序跑通了,看着丑陋的大方块从屏幕上端缓缓落下,这时老师走了过来说禁止玩游戏,我告诉他正在调试自己写的小程序,他看了看后无趣的走开了。
今天翻出来以前的代码,发现当时根本不知道软件工程是什么,代码中一行注释也没有,缩进也混乱,到处都充满着神奇的数字。
#include <graphics.h>
#include <alloc.h>
#include <bios.h>
#include <stdio.h>
#include <stdlib.h>
#define ESC 27
#define SPACE 0X3920
#define HOME 0X4700
#define PgUp 0X4900
#define UP 0X4800
void *buffer;
int jm[14][23];
main()
{
int a[7][3][2]={ 1,0,0,1,0,-1,
0,-1,1,0,1,1,
0,1,1,0,1,-1,
1,0,1,1,0,1,
-1,0,1,0,2,0,
0,-1,1,0,2,0,
0,-1,-1,0,-2,0 };
int i,j,x,y,n,dx[4],dy[4],dxm[4],dym[4];
int score=0,endflag=0,dropflag=1,speed=8000,key;
int gd=VGA,gm=VGAMED;
int xm,ym;
int *p_score=&score;
void put(int,int);
void putcopy(int,int);
int crash();
void put4();
int moveleft();
int moveright();
void rotate();
void clearline();
initgraph(&gd,&gm,"");
setbkcolor(BLACK);setcolor(GREEN);
setfillstyle(SOLID_FILL,GREEN);
bar(0,0,24,15);
buffer=malloc(imagesize(0,0,24,15));
getimage(0,0,24,15,buffer);
cleardevice();
gotoxy(1,9) ;printf("********************************");
gotoxy(1,10);printf("* HOME KEY ...... move left *") ;
gotoxy(1,11);printf("* PgUp KEY ...... move right *");
gotoxy(1,12);printf("* UP KEY ...... rotate *");
gotoxy(1,13);printf("* SPACE BAR ..... drop *");
gotoxy(1,14);printf("********************************");
for(i=0;i<=21;++i) {put(1,i);put(12,i);}
for(i=2;i<=11;++i) put(i,21);
for(i=0;i<=22;i++)
{jm[0][i]=1;jm[1][i]=1;
jm[12][i]=1;jm[13][i]=1;}
for (i=0;i<=13;++i)
{jm[i][0]=1;jm[i][1]=1;
jm[i][21]=1;jm[i][22]=1;}
while(endflag==0) {
if(dropflag==1)
{
n=random(7);x=6;y=3;
for(i=1;i<=3;++i)
{ dx[i]=a[n][i-1][0];
dy[i]=a[n][i-1][1];
}
gotoxy(5,20);printf("your score:%d",score);
if(crash(x,y,dx,dy)) endflag=1;
}
put4(x,y,dx,dy); key=0;
for(i=1;i<=speed;++i)
{ if(bioskey(1))
{ key=bioskey(0);break;}
}
xm=x;ym=y;
if(key==SPACE)
{
put4(xm,ym,dx,dy);
do { ++y;score+=10;}
while(crash(x,y,dx,dy)==0);
--y;
jm[x][y]=1;
for(i=1;i<=3;++i)
jm[x+dx[i]][y+dy[i]]=1;
clearline(y);
}
else
{ switch(key)
{
case 0x0837:
case HOME: x=moveleft(x,y,dx,dy);
break;
case 0x0a39:
case PgUp: x=moveright(x,y,dx,dy);
break;
case 0x0938:
case UP: rotate(x,y,dx,dy);
break;
case ESC : speed+=500;
default:
++y;
if(crash(x,y,dx,dy))
{
y=y-1;jm[x][y]=1;
for(i=1;i<=3;++i)
jm[x+dx[i]][y+dy[i]]=1;
score+=10;
clearline(y,p_score);
dropflag=1;
}
else
{ put4(xm,ym,dx,dy);
dropflag=0; };
break;
} /* end of switch */
} /* end of if(key==SPACE */
} /* end of while */
closegraph();
} /* end of program */
void put(int x,int y)
{
putimage(x*24+250,y*15,buffer,XOR_PUT);
}
void putcopy(int x,int y)
{putimage(x*24+250,y*15,buffer,COPY_PUT);}
int crash(int x,int y,int dx[4],int dy[4])
{ int temp;
temp=jm[x][y]+jm[x+dx[1]][y+dy[1]]
+jm[x+dx[2]][y+dy[2]]
+jm[x+dx[3]][y+dy[3]];
return temp;
}
void put4(int x,int y,int dx[4],int dy[4])
{
put(x,y);
put(x+dx[1],y+dy[1]);
put(x+dx[2],y+dy[2]);
put(x+dx[3],y+dy[3]);
}
int moveleft(int x,int y,int dx[4],int dy[4])
{
int xm,ym;
xm=x;ym=y;
x--;
if (crash(x,y,dx,dy))
++x;
put4(xm,ym,dx,dy);
return x;
}
int moveright(int x,int y,int dx[4],int dy[4])
{
int xm=x,ym=y;
++x;
if (crash(x,y,dx,dy))
--x;
put4(xm,ym,dx,dy);
return x;
}
void rotate(int x,int y,int dx[4],int dy[4])
{
int i,dxm[4],dym[4];
for (i=1;i<=3;++i)
{ dxm[i]=dx[i];dym[i]=dy[i];
dx[i]=dym[i];dy[i]=-dxm[i]; }
if (crash(x,y,dx,dy))
{
for (i=1;i<=3;++i) { dx[i]=dxm[i];
dy[i]=dym[i];}
}
put4(x,y,dxm,dym);
}
void clearline(int y,int *p_score)
{
int i,j,k,s=0;
int l[5],flag;
for (j=20;j>=y-2;--j)
{
flag=0;
for (i=2;i<=11;++i)
if(jm[i][j]==0)
{ flag=1;break; };
if (flag==0)
{ s++;l[s]=j; }
}
if (s!=0)
{
if(s==1) *p_score+=100;
if(s==2) *p_score+=300;
if(s==3) *p_score+=700;
if(s==4) *p_score+=1500;
for(k=s;k>=1;--k)
for (j=l[k];j>=3;--j)
for(i=2;i<=11;++i)
{
jm[i][j]=jm[i][j-1];
if (jm[i][j]!=0)
putcopy(i,j);
else
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
bar(i*24+250,j*15,i*24+274,j*15+15);
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
}
} /* next i,j,k */
} /* end if(s!=0)... */
} /* end of function */