论坛: 编程破解 标题: C语言写的俄罗斯方块源程序 复制本贴地址    
作者: dizi0774 [dizi0774]    论坛用户   登录
学c也有三个多月了,当初学C是为了考级,最近在聊天室中碰到一个叫做空穴来风的网友,他给我由他编写的俄罗斯方块游戏的源程序。从那以后我才知道原来C除了编写应付考级的小case和系统外,还可以用来写游戏!!呵呵。。。。。。如果哪位朋友需要的话可以发e-mail到我的邮箱。
我的e-mail是:dizi0774@163.com
(因为我还不会做网页,我网友的网页也不能用了,不能放在网上让大家down.所以只能通过e-mail发给你们了,如果有不懂的地方可以讨论一下,互相进步嘛。)

地主 发表时间: 05/11 00:49

回复: god__devil [god__devil]   论坛用户   登录
我要可以发给我吗?

B1层 发表时间: 05/11 12:09

回复: top [top]   论坛用户   登录
贴出来!大家看啊!

B2层 发表时间: 05/11 13:11

回复: dizi0774 [dizi0774]   论坛用户   登录
我也想贴出来的,但源程序太长了,老大会骂人吗?

B3层 发表时间: 05/11 14:00

回复: top [top]   论坛用户   登录
帖吧,不会的,大家看了后,斑竹要删就删好了!

B4层 发表时间: 05/11 15:17

回复: dizi0774 [dizi0774]   论坛用户   登录
既然大家都这么说,我就把这个游戏的源程序放到这来吧,
本着忠于原著,我没有对它做任何修改,大家可以先试一
下能否编译成功,若不行的话,大家可以找到begin函数,
把如下三条语句屏闭掉:
   registerbgidriver(EGAVGA_driver);
      registerbgifont(SANSSERIF_FONT);
      registerbgifont(TRIPLEX_FONT);
我将上面三句屏闭掉后在turbo c2.0环境下编译通过。
当然大家若不嫌麻烦的话还可以在tc所在目录下(dos中)把
上面用到的图形驱动和字体驱动用: BGIOBJ和TLIB命令把
它们转换成.obj文件后连接到图形库中。相信这两个命令大
家都会用吧,这样上面的三条语句就不必屏闭掉了,有什么问题
的话大家就说出来讨论一下吧。费话就不说了,下面是游戏
的源程序:
#define DOWN 2
#define COLOR BLUE
#define COLOR2 7
#define COLOR3 LIGHTGREEN
#include "graphics.h"
#include "stdlib.h"
#include "bios.h"
#include "time.h"
static int tn[28][4][2]={{-20,0,0,0,-20,20,0,20},{-20,0,0,0,-20,20,0,20},
  {-20,0,0,0,-20,20,0,20},{-20,0,0,0,-20,20,0,20},{-20,0,-20,20,0,20,-20,40},
  {-40,0,-20,0,0,0,-20,20},{-20,0,-40,20,-20,20,-20,40},{-20,0,-40,20,-20,20,0,20},
  {-20,0,-20,20,0,20,0,40},{0,0,20,0,-20,20,0,20},{-20,0,-20,20,0,20,0,40},
  {0,0,20,0,-20,20,0,20},{0,0,-20,20,0,20,-20,40},{-20,0,0,0,0,20,20,20},
  {0,0,-20,20,0,20,-20,40},{-20,0,0,0,0,20,20,20},{-20,0,-20,20,-20,40,0,40},
  {-40,0,-20,0,0,0,-40,20},{-40,0,-20,0,-20,20,-20,40},{0,0,-40,20,-20,20,0,20},
  {0,0,0,20,0,40,-20,40},{-20,0,-20,20,0,20,20,20},{-20,0,0,0,-20,20,-20,40},
  {-40,0,-20,0,0,0,0,20},{-20,0,-20,20,-20,40,-20,60},{-40,20,-20,20,0,20,20,20},
  {-20,0,-20,20,-20,40,-20,60},{-40,20,-20,20,0,20,20,20}};
 int A,T,v,v0;
 int TIME,level,chat=0;
 int highman=0;
 float mark=0;
 void *buffer;
 struct els_type{char name[10];float mark;}els[5];
main()
  {int i;
   char *f[]={"W","E","L","C","O","M","E"," ","T","O"," ","E","L","S","F","K","!"
       ,"M","a","d","e"," ","B","y"," ","A","R","T"," "};
   if(!begin())return 1;
   randomize();
   setbkcolor(BLACK);pic();
   settextstyle(3,0,7);
   outtextxy(230,250,"Wait......");
   Tt();
   moveto(11,17);
   for(i=0;i<17;i++){setcolor(YELLOW);
     v=getx();v0=gety();
     for(A=0;A<3;A++)outtextxy(v+A,v0+A,f[i]);
     setcolor(RED);moverel(3,3);
     outtext(f[i]);
     moverel(-3,-3);
     delay(TIME*10);
     }
   moveto(640,100);
   for(i=0;i<64;i++){lineto(630-10*i,100);delay(TIME/2);}
   moveto(120,400);
   for(i=17;i<29;i++){outtext(f[i]);delay(TIME*6);}
   sleep(1);
   menu(0);
   closegraph();
  }
  Tt()
   {int t,i;
    time_t start,finish;
    start=time(NULL);
    for(i=0;i<150;i++)delay(800);
    finish=time(NULL);
    t=difftime(finish,start);
    TIME=(int)(2400/t);
   }
  laugh()
   {box(305,140,230,250);
    outtextxy(310,160,"You play a level B");
    outtextxy(310,200,"It run a chat mode");
    outtextxy(310,240,"Chat key: Del,PgDn");
    outtextxy(310,280,"Now input the key");
    outtextxy(310,350,"Help:8831192-WGS");
    do{switch(getch()){
 case 'W':chat=6;return 1;
 case 'G':chat=12;return 1;
 case 'S':chat=18;return 1;}
 }while(1);
    }
   brush(int x,int y,int x1,int y1)
    {
    setfillstyle(1,COLOR);bar(x,y,x1,y1);/*brush(300,135,540,400);*/
    setfillstyle(1,COLOR2);setcolor(COLOR3);
   }
  pic()
   {int i,x,y,col;
    for(i=0;i<500;i++)
    {x=random(640)+1;y=random(480)+1;col=random(16);
     putpixel(x,y,col);}
    }

  circle0(int i,int y)
   {int j=0;
    setwritemode(0);
    if((i%4)==0){j=3;paint1(j,y); }
       else if((i%4)==1){j=2;paint1(j,y);}
  else if((i%4)==2){j=1;paint1(j,y); }
     else {j=0;paint1(j,y);}
    }

  paint1(int j,int y)
   {int k,e=0,x=0,c=0,d=0;
    for(k=0;k<8;k++,j++)
      {setcolor((j%4)+3);
       setfillstyle(SOLID_FILL,((j%4)+10));
       pieslice(220,y,(0+45*(e++)),(45+45*(x++)),20);
       pieslice(420,y,(315-45*(c++)),(360-45*(d++)),20);
      }
    }

  box(int x,int y,int l,int h)
   {setfillstyle(1,0);
    bar(x,y,x+l,y+h);
    setcolor(7);
    rectangle(x-1,y-1,x+l,y+h);
    setcolor(15);
    line(x+2 ,y+2,x+l-3,y+2 );
    line(x+2 ,y+2,x+2,y+h-3 );
    line(x+3 ,y+3,x+l-4 ,y+3 );
    line(x+3 ,y+3,x+3,y+h-4 );
    setfillstyle(1,7);
    bar(x+4,y+4,x+l-5,y+h-5);
   }

 menu(int i)                            /**************/
  {int size0,z,size1;
   union k{char ch[2];int i;}key;
   char *f[]={"PLAY","ABOUT","HISTORY","EXIT"};
   cleardevice();pic();
   setfillstyle(1,YELLOW);
   settextstyle(1,0,2);box(250,130,135,50);
   setcolor(YELLOW);
   outtextxy(290,140,"MENU");
   for(z=0;z<4;z++)box(245,200+z*50,150,50);
   setcolor(GREEN);
   for(z=0;z<4;z++)outtextxy(280,215+z*50,f[z]);
   setfillstyle(1,COLOR);
   setcolor(RED);
   outtextxy(280,215+i*50,f[i]);
   for(z=0;z<8;z++)
     {circle0(z,225+i*50);
      delay(TIME);
      z=(z==7)?0:z;
      if(bioskey(1)){key.i=bioskey(0);
       setcolor(GREEN);setfillstyle(1,BLACK);outtextxy(280,215+i*50,f[i]);
       bar(200,205+i*50,240,245+i*50);bar(400,205+i*50,440,245+i*50);
       if(!key.ch[0])
 switch(key.ch[1])
   {case 80:i=(i==3)?0:i+1;
    setcolor(RED);outtextxy(280,215+i*50,f[i]);break;
    case 72:i=(i==0)?3:i-1;
    setcolor(RED);outtextxy(280,215+i*50,f[i]);break;
   }
 else switch(key.ch[0])
   {case '\r':switch(i){
       case 0:go();menu(i);break;
       case 1:about();menu(i);break;
       case 2:history();menu(i);break;
       case 3:return 1;}
    case 27: return 1;
   }
     }
     }while(1);
   }
  about()
   {box(160,150,330,290);
    setcolor(RED);
    outtextxy( 260,160,"* ABOUT *");
    outtextxy( 170,210,"Russian Blocks V1.0 for DOS");
    outtextxy( 170,260,"Copyright(c) 1999 BY ART");
    outtextxy( 170,300,"My Oicq: 19155015");
    outtextxy( 170,340,"HTTP://321go.top263.net");
    outtextxy( 190,400,"press any key to leave");
    getch();
   }
  #include "stdio.h"
  #include "ctype.h"
  history()
   {char s[10];
    int p;
    FILE *fp;
    box(150,150,320,290);
    if((fp=fopen("history.els","rb"))==NULL)
 {fclose(fp);creat();fp=fopen("history.els","rb");}
    setcolor(RED);
    outtextxy( 260,160,"HISTORY");
    outtextxy( 160,195,"NAME           SCORES");
    outtextxy( 160,390,"   press any key to back");
    setcolor(YELLOW);
    for(p=0;p<5;p++)
      {fread(&els[p],sizeof(struct els_type),1,fp);
       sprintf(s,"%s",els[p].name);outtextxy(160,230+35*p,s);
       sprintf(s,"%0.0f",els[p].mark);outtextxy(320,230+35*p,s);
      }
    fclose(fp);
    getch();
   }
  creat()
   {int p;
    FILE *fp1;
    strcpy(els[0].name,"WGS");els[0].mark=35000;
    strcpy(els[1].name,"ART");els[1].mark=10000;
    strcpy(els[2].name,"NONAME");els[2].mark=0;
    strcpy(els[3].name,"NONAME");els[3].mark=0;
    strcpy(els[4].name,"NONAME");els[4].mark=0;
    fp1=fopen("history.els","wb");
    for(p=0;p<5;p++)
     fwrite(&els[p],sizeof(struct els_type),1,fp1);
    fclose(fp1);
   }
  markcomp()
   {FILE *fp2;
    int p;
    char a[6];
    struct els_type wgs;
    if((fp2=fopen("history.els","rb"))==NULL)creat();
    for(p=0;p<5;p++)fread(&els[p],sizeof(struct els_type),1,fp2);
    if(mark>els[4].mark){dialoge(a);
    strcpy(wgs.name,a);wgs.mark=mark;sort(wgs);
    fclose(fp2);
    fp2=fopen("history.els","wb+");
    for(p=0;p<5;p++)fwrite(&els[p],sizeof(struct els_type),1,fp2);
    }
    fclose(fp2);
    if(mark==els[0].mark)highman=1;
   }
   sort(struct els_type wgs)
     {int p;
      struct els_type temp;
      if(mark<els[4].mark)els[4]=wgs;
      else for(p=0;p<5;p++)
   if(mark>els[p].mark){temp=els[p];els[p]=wgs;wgs=temp;}
     }

   dialoge(char a[6])
   {int p=0;
    char q,s[6];
    union k{char ch[2];int i;}key;
    box(305,150,230,80);settextstyle(3,0,2);
    outtextxy(315,155,"CONGRATULATIONS!");
    outtextxy(310,195,"You name? _");
    do{key.i=bioskey(0);
       if(key.ch[0])
 if(isalnum(key.ch[0])){if(p==6)continue;
  a[p]=key.ch[0];sprintf(s,"%c_",key.ch[0]);
  outtextxy(428+16*p,195,s);
  p++;}
 else switch(key.ch[0])
 {case 8:a[p]='\0';if(p)p--;bar(428+16*p,195,460+16*p,220);
 outtextxy(428+16*p,195,"_");break;
  case 13:a[p]='\0';brush(303,148,535,230);
  return 1;
 }
      }while(1);
    }

  go()
   {int size;
    box(20,20,20,20);
    size=imagesize(20,20,40,40);
    buffer=malloc(size);
    getimage(20,20,40,40,buffer);
    putimage(20,20,buffer,1);
    view();
    cleardevice();
   }
  begin()
   {int gd=VGA,gm=2;
    registerbgidriver(EGAVGA_driver);
    registerbgifont(sansserif_font);
    registerbgifont(triplex_font);
    initgraph(&gd,&gm," ");
    if(gd<0){clrscr();
       printf("\nEGAVGA.BGI NOT FOUND!");
       getch();return 0;}
    return 1;
    }
  viewhelp(int i)
   {char *f[]={"Fast?Fast!","Carefully!!!","Ready,Go!","Let me out!","My God"};
    setfillstyle(1,COLOR2);
    bar(108,350,250,380);setcolor(RED);
    outtextxy(110,355,f[i]);setcolor(COLOR3);
   }
  chatview()
   {char s[4];
    bar(160,383,250,408);
    sprintf(s,"%d",chat);
    outtextxy(170,385,s);
   }
   pause()
    {do{bar(108,350,250,380);setcolor(RED);
outtextxy(110,355,"Pause!");delay(TIME*6);
setcolor(YELLOW);
        outtextxy(110,355,"Pause!");delay(TIME*6);
      }while(!kbhit());
      viewhelp(4);
    }
  view()                            /**************/
   {int i=2,size1;
    char s[2];
    void *buffer1;
    cleardevice();pic();
    level='A';
    setcolor(YELLOW);
    rectangle(99,39,541,441);
    setfillstyle(1,COLOR2);
    bar(100,40,295,440);
    setfillstyle(1,COLOR);
    bar(300,40,540,440);
    settextstyle(1,0,2);setcolor(COLOR3);
    outtextxy(110,45,"Next"); setfillstyle(1,COLOR2);
    outtextxy(110,150,"Score");bar(213,148,280,177);outtextxy(215,150,"0");
    outtextxy(110,200,"Speed");bar(213,198,280,224);outtextxy(215,200,"0");
    outtextxy(110,225,"Level");bar(213,226,280,248);outtextxy(215,225,"A");
    outtextxy(110,250,"Start");
    outtextxy(110,275,"Back");
    outtextxy(110,385,"Chat 0");
    outtextxy(110,410,"Enter to select");
    rectangle(105,349,252,381);
    size1=imagesize(110,325,170,345);
    buffer1=malloc(size1);
    getimage(110,325,170,345,buffer1);
    putimage(105,252,buffer1,XOR_PUT);
    viewhelp(i);
    v=0;
    do{mark=0;
      switch(getch())
      {case 72:putimage(105,202+25*i,buffer1,XOR_PUT);
       i=(i==0)?3:i-1;
       putimage(105,202+25*i,buffer1,XOR_PUT);
       break;
       case 80:putimage(105,202+25*i,buffer1,XOR_PUT);
       i=(i==3)?0:i+1;
       putimage(105,202+25*i,buffer1,XOR_PUT);
       break;
       case '\r':switch(i){
case 0:v=(v==9)?0:v+1;v0=v;sprintf(s,"%d",v);
       bar(213,202,235,224);outtextxy(215,200,s);break;
case 1:level=(level=='A')?'B':'A';sprintf(s,"%c",level);
       bar(213,222,235,244);outtextxy(215,225,s);break;
case 2:bar(180,145,280,170);outtextxy(215,150,"0");
       T=(13-v)*TIME;v0=v;play();chat=0;markcomp();break;
case 3:return 1;}break;
       case 27: return 1;
      }
     viewhelp(i);
     }while(1);
   }
  int win(int n1,int y1)
   {int i,j,n,q=0;
    for(j=0;j<4;j++)
     {for(i=0;i<12;i++)
       {if(getpixel(300+20*i+10,tn[n1][j][1]+y1+10)==COLOR)
             {n=0;break;}
else n=1;}
     if(n){xiao(tn[n1][j][1]+y1);q++;}
    }
    return(q);
   }
  score(int q)
   {char s[8];
    int m;
    switch(q){
      case 0:break;
      case 1: mark+=100;break;
      case 2: mark+=300;break;
      case 3: mark+=800;break;
      case 4: mark+=1500;break;}
     {m=v;
      v=(int)(v0+mark/5000)%10;
      T=(13-v)*TIME; sprintf(s,"%d",v);
      bar(213,202,235,224);outtextxy(215,200,s);}
      sprintf(s,"%4.0f",mark);
      bar(200,145,280,170);
      outtextxy(205,150,s);
      if((m!=v)&&(chat<18)){chat++,chatview();}
    }
   xiao(int y)
    {int i3,j3;
     for(j3=0;j3<3;j3++){if(j3==1)delay(500);
     for(i3=0;i3<12;i3++)
     putimage(300+20*i3,y,buffer,1);}
     for(j3=0;j3<(y-60)/20;j3++)
     for(i3=0;i3<12;i3++)
       if(getpixel(300+20*i3+10,y-20*j3+10)!=COLOR)
 {putimage(300+20*i3,y-20*j3,buffer,1);
  putimage(300+20*i3,y-20*j3+20,buffer,1);}
      return 1;
    }
  judge(int n1,int x1,int y1)
   {int j;
    for(j=0;j<4;j++)
    if(getpixel(tn[n1][j][0]+x1+10,tn[n1][j][1]+y1+10)!=COLOR)
    return 1;
    return 0;
   }
  paint(int n1,int x1,int y1)
   {int j;
    for(j=0;j<4;j++)
    putimage(tn[n1][j][0]+x1,tn[n1][j][1]+y1,buffer,1);
    return 0;
   }
  play()
   {int a,b,c,i,n,x,y,m;
    union k{int i; char ch[2];}key;
    if(level=='B'){laugh();brush(300,135,540,400);chatview();}
    viewhelp(4);
    a=random(28);paint(a,240,40);
    do{n=a;x=420;y=40;a=random(28);
      b=n%4;c=n-b;
      if(judge(n,x,y)){back();return 1;}
      else paint(n,x,y);
      paint(n,240,40);
      paint(a,240,40);
      do{for(m=0;m<64;m++){A=0;
if(bioskey(1))
{key.i=bioskey(0);
 if(!key.ch[0])
 switch(key.ch[1])
   {case 80:for(i=1;i<DOWN;i++){paint(n,x,y);y+=20;
    if(judge(n,x,y)){y-=20;paint(n,x,y);goto win;}
    else paint(n,x,y);}
    break;
    case 81:if(level=='B')if(chat){score(4);chat--;
     chatview();}break;
    case 83:if(chat){paint(n,x,y);
 chat--;chatview();goto end;}break;
    case 79:pause();break;
    case 77:A=20;break;
    case 75:A=-20;break;
   }
 else switch(key.ch[0])
   {
    case '\r':
    case ' ': b=(b==3)?0:b+1;paint(n,x,y);
      if(judge(c+b,x,y)){b-=1;paint(n,x,y);}
      else {n=c+b;paint(n,x,y);}
      break;
    case 27: back();return 1;
   }
      paint(n,x,y);x+=A;
      if(judge(n,x,y)&&A==0){paint(n,x,y);
win: score(win(n,y));goto end;}/*************/
      else {for(i=0;i<4;i++)
    if((tn[n][i][0]+x+10>540)||(tn[n][i][0]+x<300)||(getpixel(tn[n][i][0]+x+10,tn[n][i][1]+y+10)!=COLOR))x-=A;
    paint(n,x,y);}
     }
     else delay(T/40);}
     paint(n,x,y);if(judge(n,x,y+20)){paint(n,x,y);goto win;}
     else {y+=20;paint(n,x,y);}
      }while(1);
     end: ;
    }while(1);
   }
  back()
   {int i3,j3;
    char s[8];
    bar(190,40,290,120);
    for(j3=0;j3<20;j3++)
    {for(i3=0;i3<12;i3++)
       if(getpixel(300+20*i3+10,430-20*j3)==COLOR)
 putimage(300+20*i3,420-20*j3,buffer,1);
     delay(TIME*2);}
    for(j3=0;j3<20;j3++)
     {for(i3=0;i3<12;i3++)
 putimage(300+20*i3,40+20*j3,buffer,1);
      delay(TIME*2);
    }
   }




B5层 发表时间: 05/13 00:32

回复: cimsxiyang [cimsxiyang]   版主   登录
好帖子!
用来学习是再好不过的。

B6层 发表时间: 05/13 00:47

回复: dizi0774 [dizi0774]   论坛用户   登录
谢谢夕阳的鼓励.的确,我看懂了这个程序之后,一下子就觉得自己进步了不少.因为当时我只是为了考级,写的程序都是很简单的东西,如一些数学公式的解法啦,查找,排序,字符串及数组的转换什么的,没有什么实用价值,自从看了这个程序后,我对C语言在编写实用程序方面的理解深刻了很多,这个程序对C的初学者应该是一个比较典型的例子,其实若是只实现俄罗斯方块这个游戏的程序的话,它用的语句还不足两百行,其它的是实现游戏开始的动画及实现其它的一些功能(做弊模式,签名保留成绩),我们可以从中学到很多C关于函数的调用的方法.大家有什么心得和问题的话就在论坛中说出来,大家交流一下.愿大家都能够一日千里呀(哇塞!是真的就好了)!!!

B7层 发表时间: 05/13 02:25

回复: top [top]   论坛用户   登录


我看不明白啊!

有些地方注释一下就好了!
哎~`

菜 啊`!我已经COPY了!编译过后再说了!



B8层 发表时间: 05/13 12:26

回复: dizi0774 [dizi0774]   论坛用户   登录
大家学得怎么样了?还不算特别困难吧?我把这个
游戏的部分自定义函数的功能按我的理解写出来,
让大家学习起来能够事半功倍,如果有不对的地方
欢迎大家指出:
Tt()/*延时一段时间并为全局变量TIME赋值*/
circle0()/*(在主菜单中)在作为选择标志的光条两边各画出一个不断旋转且不断变换颜色的圆圈*/
menu(int i)/*画出游戏菜单;
             利用不断画扇形及变化颜色来画出两个光盘状的圆形;
             当bioskey(1)检测到键盘有键按下时则将键值保存到key.i中,并画出两个与背景色相同的方形将光盘覆盖*/
             若key.ch高8位非0时,按回车则从选中的菜单中执行其中命令,若按ESC则退出游戏*/
about()/*此游戏信息*/
history/*读存档文件,若文件不存在则用creat()新建一个存档文件*/
markcomp()/*游戏结束后,用本次游戏成绩与历史成绩比较,并调用sort(struct els_type wgs)函数排序,保留前五名成绩*/
dialoge(char a[6])/*此游戏是保留游戏者签名的*/
go()/*获得单个方块的形状并存入buffer中*/
begin()/*图形初始化*/
viewhelp(int i)/*提示一些帮助信息*/
chatview()/*输出剩余的作敝次数*/
view()/*描述游戏画面*/
win()/*若方块到底部或碰到别的方块时,则调用些函数,能消行则消行,并返回所消行数,若不能消行则不做任处理*/
score(int q)/*根据所消行数加上相应的分数,并判断是否达到升级的分数,若达到升级分数的话则进行相应处理*/
xiao(int y)/*使可消行闪烁,即呈现出无->有-无>的效果,并使可消行之上的行往下落*/
judge(int n1,int x1,int y1)/*判断给定坐标的位置是否为方块,是方块则返值1,否则返值0*/
paint(int n1,int x1,int y1)/*输出4个方块组成的各种图案*/
play()/*游戏的操作(人机交互界面)*/
back()/*做出游戏结束时的动画效果*/



B9层 发表时间: 05/15 00:32

回复: fatcat [xu09]   论坛用户   登录
嗯!
不错~~~~~~~~~

B10层 发表时间: 05/15 14:14

回复: dizi0774 [dizi0774]   论坛用户   登录
注意play()函数,数法的精髓所在。

B11层 发表时间: 05/15 14:23

回复: top [top]   论坛用户   登录
难!我觉得难啊~~!

B12层 发表时间: 05/16 02:08

回复: tysx [tysx]      登录
啊!

B13层 发表时间: 05/16 20:02

回复: dizi0774 [dizi0774]   论坛用户   登录
哪里难的?把它指出来吧,过几天我再上一次网,然后就隐居山林了.因为我要学英语,我的E文差极了,从初中起考试就没有超过三十分.英语不好学计算机很吃力的,所以我下定决心,不学好<<计算机英语>>就不再上网了!!
不知道大家看懂了这个程序没有?要是看懂了的话,大家有没有兴趣改写这个程序,现在只有两种游戏模式,一个是正常的游戏模式,一个就是做弊模式,大家可以写一段程序,增加一些游戏模式,比如说以前小时侯玩的俄罗斯方块还有五个方块同时出现的情况吧?好一点的积木机(我们这是这样叫的,就是掌上的游戏机,注:不是GB)还有赛车,贪吃蛇什么的,再加上一些背景音乐,把这个游戏做好一点.
还有一点,看懂了的话只要你有时间你把它的流程图画出来,把自己写的功能模块加进去,用你自己的思想把这个游戏重写出来,我相信这样学的话你的水平一定能得到较快的提高.比如这个游戏判断当前位置是否有方块就是判断当前位置是否为背景色,大家要是改的话,把它的判断条件改用座标表示看看?(如对应座标有方块的就用一个变量存放1表示,没有的话该变量就为0,判断当前座标处是否有方块的条件就是读该变量的值.)
大家对这个程序要是还有什么不明白的地方就说出来吧,我会尽自己的能力回答大家的.


B14层 发表时间: 05/20 20:45

回复: lyhzyh [lyhzyh]   论坛用户   登录
很好呀 呵呵~~~~~~

B15层 发表时间: 05/21 02:26

回复: wei7ge [wei7ge]   论坛用户   登录
#include "stdlib.h"
#include "stdio.h"
#include "dos.h"
#include "bios.h"
#include "graphics.h"
#include "math.h"
#include "time.h"
#include "ctype.h"
#define DELAY for(count=0;count<=interval;count++){delay(count);}
#define FX x0=nowblock.shapex[i]+px
#define FY y0=nowblock.shapey[i]+py
#define INTERVAL 300
#define ESC 0x11b
#define ENTER 0x1c0d
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define p 0x1970
#define P 0x1950
#define w 0x1177
#define W 0x1157
#define a 0x1e61
#define A 0x1e41
#define s 0x1f73
#define S 0x1f53
#define d 0x2064
#define D 0x2044
#define x 0x2d78
#define X 0x2d58
#define r 0x1372
#define R 0x1352
#define y 0x1579
#define Y 0x1559
#define n 0x316e
#define N 0x314e

/*********方块结构***********/
struct block
{
  int shapex[4],shapey[4];
  int color,next;
};
/**********定义全局变量************/
int i,j;
int s0,t0;
int x0,y0;
int i0,j0;
int px,py,dx,dy;
int score,level;
int key,count,num;
int interval,mode;
int grid[12][21];
time_t start,finish;
struct tm *ptr;
char *c;
struct block nowblock,nextblock;
/******方块信息*************************/
struct block shape[19]={
{0,-1,1,2,0,0,0,0,3,1},
{0,0,0,0,0,-1,1,2,3,0},
{0,-1,0,1,0,0,-1,0,4,3},
{0,0,0,1,0,1,-1,0,4,4},
{0,-1,1,0,0,0,0,1,4,5},
{0,0,0,-1,0,1,-1,0,4,2},
{0,0,0,1,0,1,-1,1,5,7},
{0,-1,1,-1,0,0,0,1,5,8},
{0,0,0,-1,0,1,-1,-1,5,9},
{0,-1,1,1,0,0,0,-1,5,6},
{0,0,0,-1,0,1,-1,1,9,11},
{0,-1,1,-1,0,0,0,-1,9,12},
{0,0,0,1,0,1,-1,-1,9,13},
{0,-1,1,1,0,0,0,1,9,10},
{0,-1,0,1,0,0,1,1,11,15},
{0,0,1,1,0,1,0,-1,11,14},
{0,0,-1,1,0,1,1,0,12,17},
{0,0,1,1,0,-1,0,1,12,16},
{0,0,1,1,0,1,0,1,13,18}
};
/***********初始化**************************/
init()
{
for(i=0;i<=20;i++)
  {
grid[0][i]=2;
grid[11][i]=2;
  }
for(i=0;i<=11;i++)
  grid[i][20]=2;
for(i=0;i<20;i++)
  for(j=1;j<11;j++)
grid[j][i]=0;
px=5,py=-1,dx=0,dy=0;
score=0,level=1,mode=1;
interval=INTERVAL,num=0;
}
/************欢迎界面************************/
welcome()
{
settextstyle(4,0,7);
setcolor(4);
outtextxy(172,154,"RUSSIAN");
DELAY;
setcolor(4);
outtextxy(171,152,"RUSSIAN");
sleep(1);
setcolor(10);
outtextxy(170,150,"RUSSIAN");
settextstyle(0,0,1);
outtextxy(290,230,"loading...");
setcolor(14);
setfillstyle(1,15);
bar(199,240,441,250);
setcolor(2);
for(i=0;i<231;i+=10)
  {
    setfillstyle(1,1);
    bar(201+i,241,209+i,249);
    for(j=1;j<=27;j++)
    delay(j*77);
  }
}
/************显示选择模式*******************/
timelimited(int s0,int t0)
  {
    setfillstyle(1,1);
    bar(220,190,420,280);
    setcolor(14);
    settextstyle(0,0,1);
    outtextxy(227,203,"please choose mode...");
    setfillstyle(1,s0);
    bar(250,225,395,243);
    setcolor(0);
    outtextxy(257,230,"no time limited");
    setfillstyle(1,t0);
    bar(250,255,395,273);
    setcolor(0);
    outtextxy(257,260,"time limited(60s)");
  }
/**********选择模式*************************/
choosemode()
{
timelimited(15,1);
while(1)
  {
  key=0;
  while(bioskey(1)==0);
  key=bioskey(0);
  if(key==UP)
    {
      timelimited(15,1);
      mode=1;
    }
    if(key==DOWN)
      {
      timelimited(1,15);
      mode=2;
      }
    if(key==ENTER)
    {
      cleardevice();
      break;
    }
  }
}
/*********等待进入**************************/
waiting()
{
  setfillstyle(1,1);
  bar(0,465,640,480);
  outtextxy(5,469,"press any key to continue...");
  getch();
  setfillstyle(0,0);
  bar(0,465,640,480);
}
/****************显示上次情况***************/
showlastscore()
{FILE *fp;
char lastname[20];
char lastscore[3];
if((fp=fopen("name","r"))!=NULL)
  {
  fgets(lastname,20,fp);
  fclose(fp);
  outtextxy(40,100,lastname);
  }
if((fp=fopen("highscore","r"))!=NULL)
  {
  fgets(lastscore,3,fp);
  fclose(fp);
  outtextxy(40,120,lastscore);
  }
  setcolor(14);
  outtextxy(40,70,"Last time:");
}
/*********游戏主界面**********************/
showface()
{
  setcolor(14);
  setlinestyle(0,0,1);
  rectangle(157,37,363,443);
  setlinestyle(0,0,1);
  rectangle(160,40,360,440);
  rectangle(439,39,541,141);
  circle(490,230,50);
  rectangle(439,319,541,441);
  line(440,340,540,340);
  settextstyle(0,0,1);
  setcolor(14);
  outtextxy(460,330,"--HELP--");
  setcolor(10);
  outtextxy(447,350,"ESC:EXIT");
  outtextxy(447,360,"X:SPEED UP");
  outtextxy(447,370,"A:LEFT");
  outtextxy(447,380,"D:RIGHT");
  outtextxy(447,390,"W:CHANGE");
  outtextxy(447,400,"S&P:PAUSE");
  outtextxy(447,410,"R:RESTART");
  outtextxy(447,420,"Y:YES");
  outtextxy(447,430,"N:NO");
  outtextxy(460,220,"SCORE 0");
  outtextxy(460,240,"LEVEL 1");
  setcolor(14);
  outtextxy(40,365,"Copyright:");
  setcolor(10);
  outtextxy(40,385,"wei7ge");
  outtextxy(40,395,"wei7ge@163.com");
  outtextxy(40,405,"05.8.8");
  showlastscore();
}
/*************产生方块****************************/
struct block createblock()
{
  struct block newblock=shape[random(19)];
  return newblock;
}
/***********检查边界*******************************/
checkborder()
{
  for(i=0;i<=3;i++)
  {
    FX+dx,FY+dy;
    if(y0>=0)
      if(grid[x0][y0]==2)
return 0;
    if(x0<1||x0>10)
      return 0;
  }
  return 1;
}
/*********画下一块**********************************/
drawnext()
{
  setfillstyle(0,0);
  bar(440,40,540,140);
  setfillstyle(1,nextblock.color);
  for(i=0;i<=3;i++)
  {
  x0=nextblock.shapex[i]+2;
  y0=nextblock.shapey[i]+2;
  i0=x0*20+440;
  j0=y0*20+40;
  bar(i0+1,j0+1,i0+19,j0+19);
  }
}
/********判断消行*****************************/
deline()
{
  for(i=19;i>=0;i--)
{
for(j=1;j<=10;j++)
{
  if(grid[j][i]!=2)
  {break;}
  else num++;
}
if(num==10)
  {
j=0;
while(j<2)
  {
    for(t0=1;t0<=10;t0++)
    grid[t0][i]=0;
    renovate();
    hao();
    DELAY;
    sound(500);
    DELAY;
    nosound();
    for(t0=1;t0<=10;t0++)
      grid[t0][i]=2;
    renovate();
    setfillstyle(0,0);
    bar(40,210,95,270);
    DELAY;
    j++;
  }
for(s0=i;s0>0;s0--)
  for(t0=1;t0<=10;t0++)
grid[t0][s0]=grid[t0][s0-1];
i++;renovate();
if(score==900) score=0;
else score+=10;
level=floor(score/100)+1;
  }
num=0;
}
}
/*******显示分数*******************************/
showscore()
{
  char cscore[3],clevel[1];
  sprintf(cscore,"%d",score);
  sprintf(clevel,"%d",level);
  setfillstyle(0,0);
  bar(500,220,520,250);
  outtextxy(507,220,cscore);
  outtextxy(507,240,clevel);
}
/********方块旋转***********************/
struct block changeblock()
{
  struct block newblock=nowblock;
  nowblock=shape[nowblock.next];
  if(!checkborder())
{
          nowblock=newblock;
}
  return nowblock;
}
/**************移动一格*********************/
drawblock()
{
  for(i=0;i<=3;i++)
{
        FX,FY;
if(y0>=0)
grid[x0][y0]=1;
}
  renovate();
  DELAY;
  for(i=0;i<=3;i++)
{
          FX,FY;
  if(y0>=0)
  grid[x0][y0]=0;
}
}
/**********刷新******************************/
renovate()
{
  for(t0=0;t0<20;t0++)
    for(s0=1;s0<11;s0++)
{
          if(grid[s0][t0]==1)
  setfillstyle(1,nowblock.color);
  if(grid[s0][t0]==2)
  setfillstyle(1,2);
  if(grid[s0][t0]==0)
  setfillstyle(0,15);
  bar(s0*20+141,t0*20+41,s0*20+159,t0*20+59);
}
}
/********显示:好*******************************/
hao()
{
  setcolor(14);
  line(60,210,40,240);
  line(40,240,60,270);
  line(40,215,70,215);
  line(60,215,40,270);
  line(70,210,90,210);
  line(90,210,80,235);
  line(80,235,80,270);
  line(80,270,75,268);
  line(65,235,93,235);
}
/***********显示时间**************************/
showtime(time_t temp)
{
  setfillstyle(0,0);
  bar(160,455,360,465);
  ptr=localtime(&temp);
  c=asctime(ptr);
  setcolor(2);
  if(temp==start)
    outtextxy(160,20,c);
  else
    outtextxy(160,455,c);
}
/*********游戏结束*****************************/
gameover()
{
for(i=19;i>=0;i--)
{
  for(j=1;j<11;j++)
  grid[j][i]=2;
  renovate();
  delay(7777);
}
settextstyle(0,0,5);
setcolor(4);
outtextxy(102,152,"GAME OVER");
DELAY;
setcolor(10);
outtextxy(100,150,"GAME OVER");
DELAY;
setcolor(4);
outtextxy(98,148,"GAME OVER");
setcolor(14);
settextstyle(0,0,2);
outtextxy(212,242,"R--Again!");
outtextxy(222,282,"ESC--Exit!");
DELAY;
setcolor(5);
outtextxy(210,240,"R--Again!");
outtextxy(224,284,"ESC--Exit!");
}
/*****************输入姓名*********************/
entername()
{
FILE *fp;
char ch;
if((fp=fopen("name","w"))!=NULL)
  {
    printf("\n\n\n\n\n\n              Please enter your name...");
    while((ch=fgetchar())!='\n')
    fputc(ch,fp);
    fclose(fp);
  }
if((fp=fopen("highscore","w"))!=NULL)
  {
    fprintf(fp,"%d",score);
    fclose(fp);
  }
if((fp=fopen("name","r"))!=NULL)
  {
    clrscr();
    printf("\n\n\n\n\n\n\n");
    printf("              ");
    ch=fgetc(fp);
    while(ch!=EOF)
    {
      putchar(ch);
      ch=fgetc(fp);
    }
    fclose(fp);
  }
  printf("\n\n              Your score is %d.",score);
  printf("\n\n              You are the best! well done!");
  sleep(3);
  return;
}
/*********主函数****************************/
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
welcome();
loop:
cleardevice();
init();
randomize();
choosemode();
showface();
waiting();
time(&start);
showtime(start);
nextblock=createblock();
do
  {
    nowblock=nextblock;
    nextblock=createblock();
    drawnext();
    while(checkborder())
    {
      renovate();
      drawblock();
      while(1)
      {
if(bioskey(1)!=0)
  key=bioskey(0);
else break;
switch(key)
{
  case DOWN:
  case X:
  case x:{interval=0;break;}
  case UP:
  case W:
  case w:{nowblock=changeblock();break;}
  case LEFT:
  case A:
  case a:{dx=-1;if(!checkborder()) dx=0;break;}
  case RIGHT:
  case D:
  case d:{dx=1;if(!checkborder()) dx=0;break;}
  case ESC:{
    setfillstyle(1,1);
    bar(0,465,640,480);
    outtextxy(5,469,"Are you sure to exit(Y\\N)...");
    while(1)
      {
      key=bioskey(0);
      if(key==y||key==Y)
{
  closegraph();
  entername();
  exit(0);
}
      if(key==n||key==N)
{
  setfillstyle(0,0);
  bar(0,465,640,480);
  break;
}
      }
  }
  case p:
  case P:
  case s:
  case S:{waiting();break;}
  case r:
  case R:{
  setfillstyle(1,1);
          bar(0,465,640,480);
          outtextxy(5,469,"Are you sure to restart(Y\\N)...");
          while(1)
    {
    key=bioskey(0);
            if(key==y||key==Y)
      {
      setfillstyle(0,0);
              bar(0,465,640,480);
              goto loop;
                      }
            if(key==n||key==N)
      {
      setfillstyle(0,0);
              bar(0,465,640,480);
              break;
              }
            }
}
}
      }
      if(dx==0) dy=1;
      else dy=0;
      px+=dx,py+=dy;
      dx=0,dy=0;
    }
    for(i=0;i<=3;i++)
    {
      FX,FY;
      grid[x0][y0-1]=2;
    }
    renovate();
    interval=INTERVAL-level*20;
    deline();
    showscore();
    px=5,py=-1;
    time(&finish);
    showtime(finish);
    if(mode==2)
      if(difftime(finish,start)>=60)
        break;
  }while(checkborder());
gameover();
while(1)
  {
  key=bioskey(0);
  if(key==r||key==R)
    goto loop;
  if(key==ESC)
    {
    cleardevice();
    closegraph();
    entername();
    exit(0);
    }
}
}

B16层 发表时间: 05-08-08 10:14

回复: 286 [unique]   版主   登录
http://www.20cn.net/cgi-bin/club/show.pl?key=LRdQXpUeFNht&cat=tech&forum=code&page=1&position=3&id=1063718736

B17层 发表时间: 05-08-08 10:17

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号