回忆大学时刚学会C语言时写的俄罗斯方块小游戏
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 */
----==== Email: slofslb (GTD) qq.com 请将(GTD)换成@ ====----
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:申龙斌的程序人生
---- 魔方、桥牌、象棋、游戏人生...
---- BASIC、C++、JAVA、C#、Haskell、Objective-C、Open Inventor、程序人生...
---- GTD伴我实现人生目标
---- 区块链生存训练
---- 用欧拉计划学Rust编程
---- 申龙斌的读书笔记(2011-2019)
----

浙公网安备 33010602011771号