大概一年没有用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;}

评论