正文

一年以前最后一次用TC2005-12-15 19:00:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/jywzzz/8285.html

分享到:

        大概一年没有用C语言了吧,一直处于OO之中,用JAVA,又换成MFC。看核心技术,又看设计模式。幸好我有个习惯,写过的东西基本上全部保留下来,于是,可以看看当年的思维。         一年前写的扫雷、面向过程的C,现在看来,有如隔世。  #include<graphics.h>#include<dos.h>#include<conio.h>#include<stdlib.h> #define Timer 0x1c typedef enum boolean{False,True}BOOLEAN; typedef struct box{ int num; int veil;}Box; Box bx[32][18];int bmx[2]={1,1};int bmy[2]={1,1}; int dead=0;char *msg1="The time you spent is %d";char *msg2="The best score is %d";char buffer[30]; #ifdef __cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif /*************************************** time functions *******************************/int TCounter=0; void interrupt ( *oldhandler)(__CPPARGS); void interrupt newhandler(__CPPARGS){ TCounter++; oldhandler();}void SetTimer(void interrupt(*IntProc)(__CPPARGS)){ oldhandler=getvect(Timer); disable(); setvect(Timer,IntProc); enable();}void CloseTimer(){ disable(); setvect(Timer,oldhandler); enable();}/***************************************** mouse functions *********************************/void mshow(){ union REGS ireg,oreg; ireg.x.ax=1; int86(0x33,&ireg,&oreg);} void mhide(){ union REGS ireg,oreg; ireg.x.ax=2; int86(0x33,&ireg,&oreg);} void getmxy(int *x,int *y){ union REGS ireg,oreg; ireg.x.ax=3; int86(0x33,&ireg,&oreg); *x=oreg.x.cx; *y=oreg.x.dx;} BOOLEAN lbtnp(){ union REGS ireg,oreg; ireg.x.ax=3; int86(0x33,&ireg,&oreg); if(oreg.x.bx & 1)  return True; else  return False;} BOOLEAN rbtnp(){ union REGS ireg,oreg; ireg.x.ax=3; int86(0x33,&ireg,&oreg); if(oreg.x.bx & 2)  return True; else  return False;}/************************************** init box **************************************/void initbox(void){ int i,j,rx,ry; for(i=0;i<32;i++){  for(j=0;j<18;j++){   bx[i][j].veil=1;   bx[i][j].num=0;  } } for(i=0;i<32;i++){  bx[i][0].veil=0;  bx[i][17].veil=0; } for(i=0;i<18;i++){  bx[0][i].veil=0;  bx[31][i].veil=0; }/****** 99 bombs asset *******/ for(i=0;i<99;i++){  rx=random(30)+1;  ry=random(16)+1;  while(bx[rx][ry].num==9){   rx=random(30)+1;   ry=random(16)+1;  }  bx[rx][ry].num=9; }/********* count numbers ******/ for(i=1;i<31;i++){  for(j=1;j<17;j++){   if(bx[i][j].num!=9){    if(bx[i-1][j].num==9)bx[i][j].num++;    if(bx[i+1][j].num==9)bx[i][j].num++;    if(bx[i][j-1].num==9)bx[i][j].num++;    if(bx[i][j+1].num==9)bx[i][j].num++;    if(bx[i-1][j-1].num==9)bx[i][j].num++;    if(bx[i-1][j+1].num==9)bx[i][j].num++;    if(bx[i+1][j-1].num==9)bx[i][j].num++;    if(bx[i+1][j+1].num==9)bx[i][j].num++;   }  } }} /************************************** print head *************************************/void printhead(int f,int t){ char *c="00"; char *m="0000"; itoa(f,c,10); itoa(t,m,10); setfillstyle(1,1); bar(0,0,639,28); bar(0,29,18,350); bar(621,29,639,350); setcolor(14); rectangle(230,5,299,24); outtextxy(253,12,"New"); rectangle(340,5,409,24); outtextxy(359,12,"Exit"); rectangle(20,5,89,24); outtextxy(49,12,c); rectangle(550,5,619,24); outtextxy(570,12,m); setcolor(12);}/************************************ init back groud **********************************/void initbg(void){ int i,j; setcolor(12); setfillstyle(1,8); for(i=0;i<2;i++){  setactivepage(i);  bar(21,31,618,348);  for(j=19;j<639;j+=20){   line(j,29,j,350);   line(j+1,29,j+1,350);  }  for(j=29;j<349;j+=20){   line(19,j,620,j);   line(19,j+1,620,j+1);  }  line(19,349,620,349); }}/************************************ print back groud *********************************/void printbg(int cp,int x,int y){ int i,j,a,b; char *c="0"; for(i=bmx[cp]-1;i<=bmx[cp]+1;i++){  a=i*20;  for(j=bmy[cp]-1;j<=bmy[cp]+1;j++){   b=j*20;   setcolor(12);   rectangle(a,b+10,a+19,b+29);   switch(bx[i][j].veil){   case 0:    *c=bx[i][j].num+48;    setfillstyle(1,15);    setcolor(bx[i][j].num);    bar(a+1,b+11,a+18,b+28);    if(bx[i][j].num>0)     outtextxy(a+7,b+16,c);    break;   case 1:    setfillstyle(1,8);    bar(a+1,b+11,a+18,b+28);    break;   case 2:    setfillstyle(1,8);    bar(a+1,b+11,a+18,b+28);    setfillstyle(1,9);    bar(a+6,b+16,a+13,b+23);    setfillstyle(1,11);    bar(a+8,b+18,a+11,b+21);    break;   default:    break;   }   if(dead){    if(bx[i][j].num==9){     setcolor(10);     setfillstyle(1,14);     pieslice(i*20+10,j*20+20,0,360,5);    }    else{     if(bx[i][j].veil==2){      setcolor(4);      line(i*20,j*20+10,i*20+19,j*20+29);      line(i*20,j*20+29,i*20+19,j*20+10);     }    }   }  } } bmx[cp]=x/20; if(bmx[cp]<1)bmx[cp]=1; if(bmx[cp]>30)bmx[cp]=30; bmy[cp]=(y-10)/20; if(bmy[cp]<1)bmy[cp]=1; if(bmy[cp]>16)bmy[cp]=16;}/************************************ print dead back groud ****************************/void printdbg(void){ int c,i,j; for(c=0;c<2;c++){  setactivepage(c);  for(i=1;i<31;i++)   for(j=1;j<17;j++){    if(bx[i][j].num==9){     setcolor(10);     setfillstyle(1,14);     pieslice(i*20+10,j*20+20,0,360,5);    }    else{     if(bx[i][j].veil==2){      setcolor(4);      line(i*20,j*20+10,i*20+19,j*20+29);      line(i*20,j*20+29,i*20+19,j*20+10);     }    }   } }}/*********************************** print complete back groud *************************/void printcbg(int *t,int *qt){ cleardevice(); setcolor(12); if(*qt>*t)*qt=*t; outtextxy(200,100,"Well done!"); sprintf(buffer,msg1,*t); outtextxy(200,130,buffer); sprintf(buffer,msg2,*qt); outtextxy(200,160,buffer);}/*************************************** print mouse ***********************************/void printm(int x,int y,int c){ int i; for(i=1;i<4;i++){  setcolor((c-i)%9+1);  rectangle(x-i,y-i,x+i,y+i); } setcolor(14); rectangle(x-4,y-4,x+4,y+4); setcolor(12);}/***************************************** open box ************************************/void openbox(int x,int y){ char *c="0"; int i,a,b; if(bx[x][y].num==0 && bx[x][y].veil==1){  bx[x][y].veil=0;  openbox(x+1,y);  openbox(x-1,y);  openbox(x,y+1);  openbox(x,y-1);  openbox(x-1,y-1);  openbox(x+1,y-1);  openbox(x-1,y+1);  openbox(x+1,y+1); } if(bx[x][y].veil!=2){  bx[x][y].veil=0;  for(i=0;i<2;i++){   setactivepage(i);   *c=bx[x][y].num+48;   setfillstyle(1,15);   setcolor(bx[x][y].num);   a=x*20;   b=y*20;   bar(a+1,b+11,a+18,b+28);   if(bx[x][y].num>0)    outtextxy(a+7,b+16,c);  } }}/************************************** lr click open **********************************/void lropen(int x,int y){ int i,a,b; char *c="0"; if(bx[x][y].num==9){  dead=1;  return; } if(bx[x][y].num==0)openbox(x,y); else{  bx[x][y].veil=0;  for(i=0;i<2;i++){   setactivepage(i);   *c=bx[x][y].num+48;   setfillstyle(1,15);   setcolor(bx[x][y].num);   a=x*20;   b=y*20;   bar(a+1,b+11,a+18,b+28);   outtextxy(a+7,b+16,c);  } }}/**************************************** main *****************************************/int main(void){ int gdriver=EGA,gmode=EGAHI; int curpage=0; int i,j,mx,my,f,rlag=0,flag=99,complete=0,time=0,ctime=0,qtime=999; BOOLEAN lpress=False; /*i,j from 1 to n ; mx my for mouse*/ initgraph(&gdriver,&gmode,"c:\\turboc2"); setbkcolor(1); initbox(); initbg(); SetTimer(newhandler); mshow(); while(1){  if(TCounter>0){   TCounter=0;   if(!lbtnp())    lpress=False;   else    lpress=True;   if(ctime==18){    time++;    ctime=0;   }   getmxy(&mx,&my);   curpage=(1-curpage);   setactivepage(curpage);   if(complete)    printcbg(&time,&qtime);   else    printbg(curpage,mx,my);   printhead(flag,time);   printm(mx,my,ctime/2);   setvisualpage(curpage);   if(!dead && !complete && mx<620 && mx>19 && my>29){    if(lpress){     if(rbtnp() && rlag>5){      rlag=0;      if(bx[bmx[curpage]][bmy[curpage]].veil==0 && bx[bmx[curpage]][bmy[curpage]].num>0){       f=0;       if(bx[bmx[curpage]-1][bmy[curpage]-1].veil==2)f++;       if(bx[bmx[curpage]-1][bmy[curpage]].veil==2)f++;       if(bx[bmx[curpage]-1][bmy[curpage]+1].veil==2)f++;       if(bx[bmx[curpage]][bmy[curpage]-1].veil==2)f++;       if(bx[bmx[curpage]][bmy[curpage]+1].veil==2)f++;       if(bx[bmx[curpage]+1][bmy[curpage]-1].veil==2)f++;       if(bx[bmx[curpage]+1][bmy[curpage]].veil==2)f++;       if(bx[bmx[curpage]+1][bmy[curpage]+1].veil==2)f++;       if(bx[bmx[curpage]][bmy[curpage]].num==f){        if(bx[bmx[curpage]-1][bmy[curpage]-1].veil==1)         lropen(bmx[curpage]-1,bmy[curpage]-1);        if(bx[bmx[curpage]-1][bmy[curpage]].veil==1)         lropen(bmx[curpage]-1,bmy[curpage]);        if(bx[bmx[curpage]-1][bmy[curpage]+1].veil==1)         lropen(bmx[curpage]-1,bmy[curpage]+1);        if(bx[bmx[curpage]][bmy[curpage]-1].veil==1)         lropen(bmx[curpage],bmy[curpage]-1);        if(bx[bmx[curpage]][bmy[curpage]+1].veil==1)         lropen(bmx[curpage],bmy[curpage]+1);        if(bx[bmx[curpage]+1][bmy[curpage]-1].veil==1)         lropen(bmx[curpage]+1,bmy[curpage]-1);        if(bx[bmx[curpage]+1][bmy[curpage]].veil==1)         lropen(bmx[curpage]+1,bmy[curpage]);        if(bx[bmx[curpage]+1][bmy[curpage]+1].veil==1)         lropen(bmx[curpage]+1,bmy[curpage]+1);       }      }      if(dead==1)       printdbg();     }     else{      if(bx[bmx[curpage]][bmy[curpage]].veil!=2){       if(bx[bmx[curpage]][bmy[curpage]].num==9){        dead=1;        printdbg();       }       else        openbox(bmx[curpage],bmy[curpage]);      }     }    }    else{     if(rbtnp()){      if(rlag>5 && bx[bmx[curpage]][bmy[curpage]].veil!=0){       rlag=0;       bx[bmx[curpage]][bmy[curpage]].veil=3-bx[bmx[curpage]][bmy[curpage]].veil;       if(bx[bmx[curpage]][bmy[curpage]].veil==2)        flag--;       else        flag++;/*for test     if(bx[bmx[curpage]][bmy[curpage]].num==9)       complete=1;        */       if(flag==0){        complete=1;        for(i=1;i<31;i++){         for(j=1;j<17;j++){          if(bx[i][j].num==9 && bx[i][j].veil!=2){           complete=0;           break;          }         }         if(complete==0)          break;        }       }      }     }    }   }   else{    if(my<23 && my>13 && lbtnp()){     if(mx<298 && mx>231){      dead=0;      complete=0;      flag=99;      time=0;      ctime=0;      initbox();      initbg();     }     if(mx<408 && mx>341)      exit(0);    }   }   if(rlag<6)    rlag++;   if(dead==0 && complete==0)    ctime++;  } } mhide(); CloseTimer(); closegraph(); return 0;}

阅读(2377) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册