回忆大学时刚学会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 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值