tc 游戏 挖雷
/*仿挖雷。2.3(簡明) tc 版本,鼠標改成了彈起后才響應*/
/*生成exe文件后可以獨立運行*/
/*03年7月 賈勝華 xiajia_1981@163.com*/
#include <graphics.h>
#include <math.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
union REGS regs;
int size=15;/*用于表示每個方塊的大小(正方形的邊長)*/
int pix,piy=50;/*pix,piy是矩陣的偏移量*/
char b[2]="1";/*用于顯示方格周圍的雷的個數*/
int pan[30][16];/*用于記錄盤面的情況:0:沒有、9:有雷、1~8:周圍雷的個數*/
int pan1[30][16];/*pan1[][]紀錄當前的挖雷情況,0:沒有操作、1:打開了、2:標記了*/
int tt;/*紀錄時間參數*/
int Eflags;/*用于標記鼠標按鈕的有效性,0:有效,1:無效,2:這是鼠標的任意鍵等于重新開始*/
int Msinit();
void Draw(int x,int y,int sizex,int sizey);
void Facedraw(int x,int y,int sizel,int k);
void Dead(int sizel,int x,int y);
void Setmouse(int xmax,int ymax,int x,int y);
int Msread(int *xp,int *yp,int *bup,struct time t1,int k);
void Draw1(int x,int y);
int Open(int x,int y);
float Random();
void Have(int sum,int x,int y,int xx,int yy);
void Help();
void Coread();
void Ddraw2(int x,int y);
/*下面是主函數*/
main()
{
?int mode=VGAHI,devices=VGA; /*圖形模式初始化的變量*/
?char ams;?????????????????? /*鼠標操作中的標志變量*/
?int xms,yms,bms;??????????? /*鼠標的狀態變量*/
?int i,j,k,k1=0;???????????? /*i,j,k是循環變量*/
?int x=9,y=9,flags=0;??????? /*x,y矩陣的大小*/
?int sum=10;???????????????? /*sum 盤面的雷的總數目,是個x,y的函數*/
?int x1=0,y1=0;????????????? /*用于記錄光標當前的位置*/
?int x11=0,y11=0;??????????? /*暫時保存鼠標位置的值*/
?int sizel=10;?????????????? /*臉的大小*/
?int cflags=1;????/*這是菜單操作標志變量,沒有彈出1,彈出0*/
?struct time t1={0,0,0,0};?? /*時間結構體,頭文件已定義*/
?int co[3];?????/*暫時紀錄歷史紀錄*/
?void far *Map;????/*用于保存鼠標圖片*/
?char name[3][20];???/*名字字符串,用于記錄名字*/
?FILE * p;?????/*文件指針用于文件操作*/
?
?int state[8]={0};???/*用于標記菜單的懸浮狀態是否有效*/
?
?Msinit();????????????????????????????? /*鼠標初始化*/
?registerbgidriver(EGAVGA_driver);??/*如果編譯時,這一行出錯,請屏蔽這一行*/
?initgraph(&devices,&mode,"//tc//BGI"); /*圖形模式初始化*/
?
?/*為圖片指針分配內存*/
?if((Map=farmalloc(imagesize(0,0,20,20)))==NULL)/*圖片的大小是20*20*/
?{
??printf("Memory ererr!/n");
??printf("Press any key to out!/n");
??exit(1);
?}
?
?/*用于檢驗文件是否完整*/
?while((p = fopen("out.xia", "r")) == NULL) /*如果不能打開就新建一個*/
?{
??if((p = fopen("out.xia", "w")) == NULL)/*如果不能新建就提示錯誤并推出*/
??{
???printf("The file cannot open!/n");
???printf("Presss any key to exit!/n");
???getch();
???exit(1);
??}
??/*寫入初始內容*/
??fprintf(p,"%d %d %d,%s/n%s/n%s/n",999,999,999,"xiajia","xiajia","xiajia");
??fclose(p);
?}
?/*暫時讀出歷史紀錄。并用co[3]紀錄*/
?fscanf(p,"%d %d %d,",&co[0],&co[1],&co[2]);
?for(i=0;i<3;i++)
??fscanf(p,"%s/n",name[i]);
?fclose(p);
?
?Setmouse(1,1,615,460);??/*設置鼠標的活動范圍*/
?pix=250-x*size/2;???/*計算地雷按鈕矩陣的左邊*/
?
bss:??? b[0]='1';????? ??/*游戲開始和重來的切入點*/
??flags=0;???/*測試中這個變量好像沒有作用,但是為了邏輯的完整性暫時保留*/
??k=0;
??Eflags=0;
??tt=0;
??cleardevice();/*清屏*/
??
??for(i=0;i<30;i++)/*盤面初始化*/
??{
???for(j=0;j<16;j++)
???{
????pan[i][j]=0;
????pan1[i][j]=0;
???}
??}
??
??for(;;) /*用于生成雷的盤面情況*/
??{
???i=(int)(x*Random());
???j=(int)(y*Random());
???if(pan[i][j]==0)
???{
????pan[i][j]=9;
????k=k+1;
???}
???if(k==sum) break;
??}?
??
??for(i=0;i<x;i++)/*用于統計各點的周邊情況*/
??{
???for(j=0;j<y;j++)
???{
????if(pan[i][j]==0)/*只有沒有雷的才需要處理*/
????{
?????if(i-1>=0 && j-1>=0 && pan[i-1][j-1]==9) pan[i][j]++;
?????if(j-1>=0 && pan[i][j-1]==9) ??? pan[i][j]++;
?????if(i+1<x && j-1>=0 && pan[i+1][j-1]==9)? pan[i][j]++;
?????if(i-1>=0 && pan[i-1][j]==9) ??? pan[i][j]++;
?????if(i+1<x && pan[i+1][j]==9) ??? pan[i][j]++;
?????if(i-1>=0 && j+1<y && pan[i-1][j+1]==9)? pan[i][j]++;
?????if(j+1<y && pan[i][j+1]==9) ??? pan[i][j]++;
?????if(i+1<x && j+1<y && pan[i+1][j+1]==9)?? pan[i][j]++;
????}
???}
??}
??
??if(sum==10)/*畫底座*/
??{
???Draw(170,1,162,200);
???setcolor(1);
???outtextxy(178,5,"Game( )");
???setcolor(4);
???outtextxy(178,5,"???? G");
??}/*小*/
??else
??{
???if(sum==40)
???{
????Draw(115,1,272,307);
????setcolor(1);
????outtextxy(125,5,"Game(G)");
????setcolor(4);
????outtextxy(125,5,"???? G");
???}/*中*/
???else
???{
????if(sum==99)
????{
?????Draw(40,1,470,307);
?????setcolor(1);
?????outtextxy(45,5,"Game(G)");
?????setcolor(4);
?????outtextxy(45,5,"???? G");
????}/*大*/
???}
??}
??
??setcolor(1);/*顯示提示信息*/
??outtextxy(100,350,"? : Help.");
??setcolor(4);
??outtextxy(100,350,"H");
??setcolor(1);
??outtextxy(200,350," /??? : exit.");
??setcolor(4);
??outtextxy(200,350,"Q");
??outtextxy(220,350,"ESC");
??setcolor(1);
??outtextxy(330,350,"? : cores.");
??setcolor(4);
??outtextxy(330,350,"R");
??
??Facedraw(250,30,sizel,2);/*顯示控制按鈕,臉型*/
??
??for(i=0;i<x;i++)/*這一段用于描繪盤面*/
??{
???for(j=0;j<y;j++)
???{
????Draw(i*size+pix,j*size+piy,size,size);
???}
??}
??
??Have(sum,pix+20,30,x,y);/*各項的初始顯示*/
??k=0;
??setfillstyle(1, 0);
??bar(460-pix,25,490-pix,40);
??setcolor(4);
??outtextxy(465-pix,30,"000");
??
??/*下面這一段用于接收用戶的控制,并做出反應*/
??for(;;)
??{
???ams=Msread(&xms,&yms,&bms,t1,k);/*讀取鼠標狀態*/
???
???/*下面一段用于保存并記錄鼠標圖片*/
???if(flags!=0)
???{
????putimage(x11,y11,Map,COPY_PUT);
???}
???x11=xms;
???y11=yms;
???flags=1;
???
???/*菜單懸浮狀態的判斷*/
???/*Game*/
???if(((xms>=pix-5 && xms<=pix+49 && yms>=3 && yms<=13) || ams=='g' || ams=='G') && state[0]==0)
???{
????state[0]=1;
????setfillstyle(1, 1);
????bar(pix-5,3,pix+49,13);
????setcolor(7);
????outtextxy(pix-5,5,"Game(G)");
????setcolor(2);
????outtextxy(pix-5,5,"???? G");
???}else
???{
????if((xms<pix-5 || xms>pix+49 || yms<3 || yms>13)&& cflags==1 && state[0]==1)
????{
?????state[0]=0;
?????setfillstyle(1, 7);
?????bar(pix-5,3,pix+49,13);
?????setcolor(1);
?????outtextxy(pix-5,5,"Game(G)");
?????setcolor(4);
?????outtextxy(pix-5,5,"???? G");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=17 && yms<28)|| (ams=='r' || ams=='R')) && cflags==0 && state[1]==0)
???{
????state[1]=1;
????setfillstyle(1, 1);
????bar(pix-6,17,pix+85,28);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,19,"Restar(R)");
????setcolor(2);
????outtextxy(pix-4,19,"?????? R");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<17 || yms>=28)) && cflags==0 && state[1]==1)
????{
?????state[1]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,17,pix+85,28);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,19,"Restar(R)");
?????setcolor(4);
?????outtextxy(pix-4,19,"?????? R");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=28 && yms<39) || (ams=='e' || ams=='E')) && cflags==0 && state[2]==0)
???{
????state[2]=1;
????setfillstyle(1, 1);
????bar(pix-6,28,pix+85,39);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,30,"Easy? (E)");
????setcolor(2);
????outtextxy(pix-4,30,"?????? E");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<28 || yms>=39)) && cflags==0 && state[2]==1)
????{
?????state[2]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,28,pix+85,39);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,30,"Easy? (E)");
?????setcolor(4);
?????outtextxy(pix-4,30,"?????? E");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=39 && yms<50) || (ams=='n' || ams=='N')) && cflags==0 && state[3]==0)
???{
????state[3]=1;
????setfillstyle(1, 1);
????bar(pix-6,39,pix+85,50);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,41,"Nomall(N)");
????setcolor(2);
????outtextxy(pix-4,41,"?????? N");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<39 || yms>=50)) && cflags==0 && state[3]==1)
????{
?????state[3]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,39,pix+85,50);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,41,"Nomall(N)");
?????setcolor(4);
?????outtextxy(pix-4,41,"?????? N");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=50 && yms<61) || (ams=='h' || ams=='H')) && cflags==0 && state[4]==0)
???{
????state[4]=1;
????setfillstyle(1, 1);
????bar(pix-6,50,pix+85,61);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,52,"Hard? (H)");
????setcolor(2);
????outtextxy(pix-4,52,"?????? H");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<50 || yms>=61)) && cflags==0 && state[4]==1)
????{
?????state[4]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,50,pix+85,61);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,52,"Hard? (H)");
?????setcolor(4);
?????outtextxy(pix-4,52,"?????? H");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=61 && yms<72) || (ams=='c' || ams=='C')) && cflags==0 && state[5]==0)
???{
????state[5]=1;
????setfillstyle(1, 1);
????bar(pix-6,61,pix+85,72);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,63,"Corse (C)");
????setcolor(2);
????outtextxy(pix-4,63,"?????? C");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<61 || yms>=72)) && cflags==0 && state[5]==1)
????{
?????state[5]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,61,pix+85,72);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,63,"Corse (C)");
?????setcolor(4);
?????outtextxy(pix-4,63,"?????? C");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=72 && yms<83) || (ams=='l' || ams=='L')) && cflags==0 && state[6]==0)
???{
????state[6]=1;
????setfillstyle(1, 1);
????bar(pix-6,72,pix+85,83);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,74,"Help? (L)");
????setcolor(2);
????outtextxy(pix-4,74,"?????? L");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<72 || yms>=83)) && cflags==0 && state[6]==1)
????{
?????state[6]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,72,pix+85,83);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,74,"Help? (L)");
?????setcolor(4);
?????outtextxy(pix-4,74,"?????? L");
????}
???}
???if(((xms>=pix-6 && xms<=pix+85 && yms>=83 && yms<94) || ams=='q' || ams=='Q' || ams==27) && cflags==0 && state[7]==0)
???{
????state[7]=1;
????setfillstyle(1, 1);
????bar(pix-6,83,pix+85,94);
????setcolor(7);/*下面顯示菜單項*/
????outtextxy(pix-4,85,"Quit? (Q)");
????setcolor(2);
????outtextxy(pix-4,85,"?????? Q");
???}else
???{
????if(((xms<pix-6 || xms>pix+85 || yms<83 || yms>=94)) && cflags==0 && state[7]==1)
????{
?????state[7]=0;
?????setfillstyle(1, 7);
?????bar(pix-6,83,pix+85,94);
?????setcolor(1);/*下面顯示菜單項*/
?????outtextxy(pix-4,85,"Quit? (Q)");
?????setcolor(4);
?????outtextxy(pix-4,85,"?????? Q");
????}
???}
????????????
?????/*這里插入菜單操作*/
???if((xms>=pix-5 && xms<=pix+49 && yms>=3 && yms<=13 && bms==1) || ams=='g' || ams=='G')/*點中菜單的判斷*/
???{
????Draw(pix-10,14,100,88); /*畫菜單*/
????cflags=0;
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,19,"Restar(R)");
????setcolor(4);
????outtextxy(pix-4,19,"?????? R");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,30,"Easy? (E)");
????setcolor(4);
????outtextxy(pix-4,30,"?????? E");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,41,"Nomall(N)");
????setcolor(4);
????outtextxy(pix-4,41,"?????? N");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,52,"Hard? (H)");
????setcolor(4);
????outtextxy(pix-4,52,"?????? H");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,63,"Corse (C)");
????setcolor(4);
????outtextxy(pix-4,63,"?????? C");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,74,"Help? (L)");
????setcolor(4);
????outtextxy(pix-4,74,"?????? L");
????setcolor(1);/*下面顯示菜單項*/
????outtextxy(pix-4,85,"Quit? (Q)");
????setcolor(4);
????outtextxy(pix-4,85,"?????? Q");
????bms=0;
???}/*完成菜單的描繪*/
????????????
???/*這里是為了完全實現鼠標控制才加入的內容*/
???if(Eflags==2 && (bms!=0 || ams!=-1))
???{
????goto bss;
???}
????????????
???/*下面實現菜單的功能,每一項響應一個菜單項*/
???if(cflags==0)
???{
????if((xms>=pix-6 && xms<=pix+85 && yms>=17 && yms<28 && bms==1)|| (ams=='r' || ams=='R'))/*下面依次響應菜單中各項*/
????{
?????cflags=1;
?????goto bss;
????}
????else
????{
?????if((xms>=pix-6 && xms<=pix+85 && yms>=28 && yms<39 && bms==1) || ams=='e' || ams=='E')
?????{
??????cflags=1;
??????x=9;
??????y=9;
??????sum=10;
??????pix=250-x*size/2;
??????goto bss;
?????}
?????else
?????{
??????if((xms>=pix-6 && xms<=pix+85 && yms>=39 && yms<50 && bms==1) || ams=='n' || ams=='N')
??????{
???????cflags=1;
???????x=16;
???????y=16;
???????sum=40;
???????pix=250-x*size/2;
???????goto bss;
??????}
??????else
??????{
???????if((xms>=pix-6 && xms<=pix+85 && yms>=50 && yms<61 && bms==1) || ams=='h' || ams=='H')
???????{
????????cflags=1;
????????x=30;
????????y=16;
????????sum=99;
????????pix=250-x*size/2+25;
????????goto bss;
???????}
???????else
???????{
????????if((xms>=pix-6 && xms<=pix+85 && yms>=61 && yms<72 && bms==1) || ams=='c' || ams=='C')
????????{
?????????cflags=1;
?????????Coread();
????????}
????????else
????????{?if((xms>=pix-6 && xms<=pix+85 && yms>=72 && yms<83 && bms==1) || ams=='l' || ams=='L')
????????{
?????????cflags=1;
?????????Help();
????????}
????????else
????????{?if((xms>=pix-6 && xms<=pix+85 && yms>=83 && yms<94 && bms==1) || ams=='q' || ams=='Q' || ams==27)
????????{
?????????cflags=1;
?????????fclose(p);
?????????closegraph();
?????????farfree(Map);
?????????exit(1);
????????}
????????else
????????{?if(bms!=0)
????????{
?????????cflags=1;
?????????goto bss;
????????}
????????}
????????}
????????}
???????}
??????}
?????}
????}
???}/*結束菜單功能的實現*/
???/*在笑臉按鈕處單擊時重新開始*/
???if(cflags!=0 && xms >=250-sizel-2 && yms >= 30-sizel-2 && xms<=250+sizel+2 && yms<=30+sizel+2 && bms==1 )
???{
????goto bss;
???}
????????????
???if(Eflags==0 && cflags!=0 && xms-pix>=0 && yms-piy >=0 && xms<pix+x*size && yms<piy+y*size )/*111判斷*/
???{
????x1=(int)((xms-pix)/size);/*計算鼠標目前的按鈕位置*/
????y1=(int)((yms-piy)/size);
????
????if(ams==-1 && bms==1 && pan1[x1][y1]==0)/*單擊鼠標左鍵*/
????{
?????if(k==0)/*k這里判斷是否是第一次按下.0:不計時,1:開始計時*/
?????{
??????gettime(&t1);
??????k=1;
?????}
?????if(pan[x1][y1]!=9)
?????{
??????Draw1(x1,y1);
??????Open(x,y);
?????}
?????else
?????{
??????Dead(sizel,x,y);
??????k=0;
?????}
????}
?????????????
????if(ams==-1 && bms==2 && pan1[x1][y1]==0)/*單擊鼠標右鍵*/
????{
?????delay(100);
?????setcolor(0);
?????circle(x1*size+pix+7,y1*size+piy+7,4);
?????pan1[x1][y1]=2;
?????Have(sum,pix+20,30,x,y);
????}
????else
????{
?????if(ams==-1 && bms==2 && pan1[x1][y1]==2)/*單擊鼠標右鍵*/
?????{
??????delay(100);
??????Draw(x1*size+pix,y1*size+piy,size,size);
??????pan1[x1][y1]=0;
??????Have(sum,pix+20,30,x,y);
?????}/*相當于鼠標右擊*/
????}?
????if(ams==-1 && bms==3 && pan1[x1][y1]==1)
????{/*相當于鼠標雙擊,有效性判斷*/
?????i=0;
?????if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]==2) i++;
?????if(y1-1>=0 && pan1[x1][y1-1]==2)i++;
?????if(x1+1<x && y1-1>=0 && pan1[x1+1][y1-1]==2) i++;
?????if(x1-1>=0 && pan1[x1-1][y1]==2) i++;
?????if(x1+1<x && pan1[x1+1][y1]==2) i++;
?????if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]==2) i++;
?????if(y1+1<y && pan1[x1][y1+1]==2) i++;
?????if(x1+1<x && y1+1<y && pan1[x1+1][y1+1]==2) i++;
?????if(i==pan[x1][y1])???? /*有效*/
?????{
??????if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]!=2)
??????{
???????if(pan[x1-1][y1-1]!=9)
????????Draw1(x1-1,y1-1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(y1-1>=0? && pan1[x1][y1-1]!=2)
??????{
???????if(pan[x1][y1-1]!=9)
????????Draw1(x1,y1-1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(x1+1<x && y1-1>=0 && pan1[x1+1][y1-1]!=2)
??????{
???????if(pan[x1+1][y1-1]!=9)
????????Draw1(x1+1,y1-1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(x1-1>=0? && pan1[x1-1][y1]!=2)
??????{
???????if(pan[x1-1][y1]!=9)
????????Draw1(x1-1,y1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(x1+1<x && pan1[x1+1][y1]!=2)
??????{
???????if(pan[x1+1][y1]!=9)
????????Draw1(x1+1,y1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]!=2)
??????{
???????if(pan[x1-1][y1+1]!=9)
????????Draw1(x1-1,y1+1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(y1+1<y && pan1[x1][y1+1]!=2)
??????{
???????if(pan[x1][y1+1]!=9)
????????Draw1(x1,y1+1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????if(x1+1<x && y1+1<y &&pan1[x1+1][y1+1]!=2)
??????{
???????if(pan[x1+1][y1+1]!=9)
????????Draw1(x1+1,y1+1);
???????else
???????{
????????Dead(sizel,x,y);
????????k=0;
???????}
??????}
??????Open(x,y);
?????}
????}
??????????????
????/*勝利條件*/
????k1=0;
????for(i=0;i<x;i++)
????{
?????for(j=0;j<y;j++)
?????{
??????if(pan1[i][j]!=1) k1++;
?????}
????}
??????
????if(k1==sum)
????{
?????for(i=0;i<x;i++)
?????{
??????for(j=0;j<y;j++)
??????{
???????if(pan1[i][j]==0)
???????{
????????setcolor(10);circle(i*size+pix+7,j*size+piy+7,4);
???????}
??????}
?????}
???????
?????Facedraw(250,30,sizel,3);
?????
?????if(x==9 && tt<co[0])? {j=0;co[0]=tt;i=0;}
?????if(x==16 && tt<co[1]) {j=1;co[1]=tt;i=0;}
?????if(x==30 && tt<co[2]) {j=2;co[2]=tt;i=0;}
?????
?????if(i==0)
?????{
??????Draw(10,10,300,55);
??????setcolor(4);
??????outtextxy(20,15,"You break the corse!");
??????outtextxy(20,25,"Please input your name(0 - 19):");
??????setfillstyle(1, 14);
??????bar(20,35,200,50);
??????for(i=0;i<19;i++)
??????{
???????name[j][i]=getch();
???????if(name[j][i]==8) i=i-2;
???????if(name[j][i]==13) {name[j][i]='/0';break;}
???????name[j][i+1]='/0';
???????setfillstyle(1, 14);
???????bar(20,35,200,50);
???????setcolor(1);
???????outtextxy(20,40,name[j]);
??????}
??????
??????if((p = fopen("out.xia", "w")) == NULL)
??????{
???????printf("The file cannot open!/n");
???????exit(1);
??????}
??????fprintf(p,"%d %d %d,",co[0],co[1],co[2]);
??????for(i=0;i<3;i++)
???????fprintf(p,"%s/n",name[i]);
??????fclose(p);
??????Coread();
?????}
?????getch();
?????goto bss;
????}
??}/*結束111的判斷*/
??
??/*下面是一些快捷功能鍵的定義*/
??if(ams=='q'||ams=='Q'|| ams==27 ) {fclose(p);closegraph();farfree(Map);exit(1);}?? /*退出主程序的唯一出口*/
??if(ams=='c'||ams=='C') goto bss;? ?/*重來*/
??if(ams=='h'||ams=='H') {Help();k=0;}??/*幫助文檔*/
??if(ams=='r'||ams=='R') {Coread();k=0;}?/*察看成績*/
??
??getimage(xms,yms,xms+20,yms+20,Map);
??Ddraw2(xms,yms);
??delay(10);
??}/*結束鼠標循環讀取的死循環*/
}
/*++++++++主函數結束++++++++*/
/*這個函數用于實現鼠標的初始化*/
int Msinit()
{
?int recored;
?regs.x.ax=0;
?int86 (0x33, ®s, ®s);
?recored=regs.x.ax;
?if(recored==0)
?{
??printf("Mouse not found or Mouse driver not installed./n");
??return 0;
?}
?else
??return recored;
}
/*下面這個子程序是完成描繪一個按鈕*/
void Draw(int x,int y,int sizex,int sizey)/* x, y為左上角坐標sizex,sizey為長和寬*/
{
?int sizx=sizex-1;
?int sizy=sizey-1;
?setcolor(15);/*這里最好用白色*/
?line(x,y,x+sizx-1,y);
?line(x,y+1,x+sizx-2,y+1);
?line(x,y,x,y+sizy-1);
?line(x+1,y,x+1,y+sizy-2);
?setcolor(8);/*這里最好用深灰色*/
?line(x+1,y+sizy,x+sizx,y+sizy);
?line(x+2,y+sizy-1,x+sizx,y+sizy-1);
?line(x+sizx-1,y+1,x+sizx-1,y+sizy);
?line(x+sizx,y+2,x+sizx,y+sizy);
?setcolor(7);/*這里最好用灰色*/
?putpixel(x,y+sizy,3);
?putpixel(x+1,y+sizy-1,3);
?putpixel(x+sizx,y,3);
?putpixel(x+sizx-1,y+1,3);
?setfillstyle(1, 7);/*這里最好用灰色,設置填充模式*/
?bar(x+2,y+2,x+sizx-2,y+sizy-2);
}
/*下面是一些畫圖程序*/
/*形參x,y笑臉的中心坐標,sizel臉的大小(半徑),
k為要描述的臉型,1:哭、2:平常、3:笑*/
void Facedraw(int x,int y,int sizel,int k)
{
?Draw(x-sizel-3,y-sizel-3,2*(sizel+4),2*(sizel+4));/*畫一個按鈕*/
?setcolor(14);
?setfillstyle(1, 14);
?pieslice(x, y, 0, 360, sizel);/*畫一個黃色的圓面*/
?setfillstyle(1, 0);
?setcolor(0);
?if(k==1)/*失敗*/
?{
??line(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);/*畫兩個差表示眼睛*/
??line(x-sizel*7/20,y-sizel*3/20,x-sizel*3/20,y-sizel*7/20);
??line(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);
??line(x+sizel*3/20,y-sizel*3/20,x+sizel*7/20,y-sizel*7/20);
??arc(x,y+sizel,20,160, sizel/2);
?}
?if(k==2)/*平常*/
?{
??bar(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);
??bar(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);
??arc(x,y,200,340, sizel*3/4);
?}
?if(k==3)/*成功*/
?{
??bar(x-sizel/2,y-sizel/2,x-sizel*3/20,y-sizel*3/20);
??bar(x+sizel*3/20,y-sizel/2,x+sizel/2,y-sizel*3/20);
??line(x-sizel*3/20,y-sizel/2,x+sizel*3/20,y-sizel/2);
??line(x-sizel/2,y-sizel*5/20,x-sizel,y);
??line(x+sizel/2,y-sizel*5/20,x+sizel,y);
??arc(x,y,200,340, sizel*3/4); /*嘴巴*/
?}
}
/*死亡后的處理程序*/
/*x,y要判斷的點的坐標,sizel為臉的大小*/
void Dead(int sizel,int x,int y)
{
?int i,j;/*循環變量*/
?setcolor(4);
?for(i=0;i<x;i++)
?{
??for(j=0;j<y;j++)
??{
???if(pan[i][j]==9)
???{
????circle(i*size+pix+7,j*size+piy+7,4);
???}/*用紅色的圓圈標記有雷的方塊*/
??}
?}
?Facedraw(250,30,sizel,1);
?Eflags=1;
}
/*下面的函數用于實現設置鼠標的移動范圍*/
/*xmax,ymax為左上角的坐標x,y矩陣的大小*/
void Setmouse(int xmax,int ymax,int x,int y)
{
?int left,right,top,buttom;/*這四個變量用于確定移動的左上角和右下角*/
?left=xmax;
?right=x;
?top=ymax;
?buttom=y;
?regs.x.ax=7;
?regs.x.cx=left;
?regs.x.dx=right;
?int86(0x33,®s,®s);
?regs.x.ax=8;
?regs.x.cx=top;
?regs.x.dx=buttom;
?int86(0x33,®s,®s);
}
/*下面這個函數用于實現鼠標的讀取*/
/*xp,yp,bup分別為鼠標的位置和按鍵情況,t1,k是時間現實參數,t1為開始時間,k為開始標記*/
int Msread(int *xp,int *yp,int *bup,struct time t1,int k)
{
?int x0=*xp,y0=*yp,bu0=0,bu1=0;
?int xnew,ynew,ch;
?int tt1=0;/*用于記錄時間差*/
?struct time t2;
?char ttt[4]="000";
?*bup=0;
?do
?{
??if(kbhit()) return getch();
??regs.x.ax=3;
??int86(0x33,®s,®s);
??xnew=regs.x.cx;
??ynew=regs.x.dx;
??bu0=regs.x.bx;
??if(bu0!=0) bu1=bu0;
??/*下面用于顯示時間*/
??if(k==1)/*如果已經開始就計算時間差*/
?????? ?{
???gettime(&t2);
???tt1=(t2.ti_hour- t1.ti_hour)*3600 + (t2.ti_min- t1.ti_min)*60 + t2.ti_sec? - t1.ti_sec;/*有待改進*/
???if(tt1<=999 && tt!=tt1)/*當時間差有改變時,才顯示*/
???{
????tt=tt1;
????ttt[0]=(tt-tt%100)/100+48;
????ttt[1]=(tt%100-tt%10)/10 +48;
????ttt[2]=tt%10+48;
????setfillstyle(1, 0);
????bar(460-pix,25,490-pix,40);
????setcolor(4);
????outtextxy(465-pix,30,ttt);
???}
?????? ?}
??if(bu0==0 && bu1!=0) *bup=bu1;
??if(bu1==3) *bup=3;
?? ?}
?while(xnew==x0 && ynew==y0 && *bup==0);
?*xp=xnew;
?*yp=ynew;
?return -1;/*鍵盤無輸入時返回-1,其次返回鍵盤值*/
}
void Draw1(int x,int y)/*這個函數用于在x,y的位置描繪開后的情況*/
{
?setfillstyle(1, 7);
?bar(x*size+pix,y*size+piy,x*size+size+pix-1,y*size+size+piy-1);
?
?/*在四個角上畫上點標記*/
?/*putpixel(x*size+pix,y*size+piy,8);
?putpixel(x*size+size+pix-1,y*size+size+piy-1,8);
?putpixel(x*size+pix,y*size+size+piy-1,8);
?putpixel(x*size+size+pix-1,y*size+piy,8);*/
?
?setcolor(8);
?setlinestyle(1, 0, 1);
?rectangle(x*size+pix,y*size+piy,x*size+size+pix-1,y*size+size+piy-1);
?setlinestyle(0, 0, 1);
?
?if(pan[x][y]!=0)/*沒有雷的話不做顯示*/
?? ?{
??b[0]=pan[x][y]+48;
??if(pan[x][y]!=7)/*防止字的顏色和背景顏色相同*/
???setcolor(pan[x][y]);
??else setcolor(9);
??outtextxy (x*size+pix+3,y*size+piy+3,b);
?? ?}
?pan1[x][y]=1;/*在pan1[][]中標記這一點的挖雷情況*/
}
/*自開函數*/
int Open(int x,int y)/*函數中引入pan2[][]的目的是為了增加自開的效率,但是還是有不足之處*/
{
?int i,j,k;
?int pan2[30][16]={0};/*pan2[][],臨時紀錄盤面的自開情況,0沒有自開過,1:已經自開過(30 這里有危險的技術性問題!!!)*/
?for(;;)
?{
??k=0;/*是一個標記變量*/
??for(i=0;i<x;i++)
??{
???for(j=0;j<y;j++)
???{
????if (pan[i][j]==0 && pan1[i][j]==1 && pan2[i][j]==0)/*如果滿足下面條件,沒有雷,已經打開,沒有自開過就繼續*/
????{
?????pan2[i][j]=1;/*標記自開過*/
?????k=k+1;
?????/*開周圍的點*/
?????if(i-1>=0 && j-1>=0 && pan1[i-1][j-1]==0) Draw1(i-1,j-1); /*左上方*/
?????if(j-1>=0 && pan1[i][j-1]==0) Draw1(i,j-1);?????? /*上方*/
?????if(i+1<x && j-1>=0 && pan1[i+1][j-1]==0) Draw1(i+1,j-1);? /*右上方*/
?????if(i-1>=0 && pan1[i-1][j]==0) Draw1(i-1,j);?? ?????? /*左方*/
?????if(i+1<x && pan1[i+1][j]==0) Draw1(i+1,j);????????????? /*右方*/
?????if(i-1>=0 && j+1<y && pan1[i-1][j+1]==0) Draw1(i-1,j+1);? /*左下方*/
?????if(j+1<y && pan1[i][j+1]==0) Draw1(i,j+1);????????????? /*下方*/
?????if(i+1<x && j+1<y && pan1[i+1][j+1]==0) Draw1(i+1,j+1);?? /*右下方*/
????}
???}
??}
??if(k==0) return 0;/*沒有新的自開點時退出*/
?}
}
float Random()/*隨即數生成函數,加入了時間變量目的在于加強它的隨機性*/
{
?float aa;
?int i,j;
?struct time t;
?gettime(&t);
?i=t.ti_min+t.ti_hour+t.ti_sec+t.ti_hund;
?for(j=0;j<i;j++)
?{
??rand();
?}
?aa=rand()/32767.0;
?return aa;/*返回產生的隨機數(0-1)*/
}
/*下面是一個顯示剩余雷數目的函數*/
void Have(int sum,int x,int y,int xx,int yy)/*游戲中雷的總數目不能多余99顆,sum 為雷的總數目,x,y為顯示的地點*/
{
?int i,j,k=0;
?char a[3]="1";
?for(i=0;i<xx;i++)
?{
??for(j=0;j<yy;j++)
??{if (pan1[i][j]==2) k++;}/*統計一共標記了多少*/
??k=sum-k;/*剩下了多少*/
??if(k<0) k=0;
??a[0]=(k-(k%10))/10+48;/*字符轉換*/
??a[1]=k%10+48;
??setfillstyle(1, 0);
??bar(x-5,y-5,x+20,y+10);/*在原點涂黑*/
??setcolor(4);
??outtextxy(x,y,a);/*顯示數目*/
?}
}
/*下面是幫助函數*/
void Help()
{
?Draw(40,50,560,160);
?setcolor(1);
?outtextxy(300,60,"Help");
?setcolor(4);
?outtextxy(50,80,"Welcome to play this game. The mouse is supplied.");
?outtextxy(50,90,"Please press the left button open the box.");
?outtextxy(50,100,"Press the right button to mark the boom.");
?outtextxy(50,110,"You can choose difrence difficalt of the game in the menu.");
?outtextxy(50,120,"'Big' with 99 booms,'Normal' with 40 booms,'Small' with 10 booms.");
?outtextxy(50,130,"Press the smeil-face-button or press 'C' to play again.");
?outtextxy(50,140,"When game had ended please press any key to play a new one.");
?outtextxy(50,150,"Press 'Q' or 'Esc' to quit the game");
?outtextxy(50,160,"If you find out all booms then you are win. ");
?outtextxy(50,170,"This programer is program by Jia ShengHua. ");
?outtextxy(50,180,"Any problem please send E-mail to xiajia_1981@163.com. (2003-07)");
?setcolor(9);
?outtextxy(50,190,"Press any key to play again.");
?Eflags=2;
}
void Coread()/*這個函數用于讀取紀錄并顯示*/
{
?int co[3],i;
?char name[3][20];
?char cco[3][4];
?FILE * p;
?for(i=0;i<3;i++)
??cco[i][3]='/0';
?
?if((p = fopen("out.xia", "rb")) == NULL)
?{
??printf("The file cannot open!/n");
??exit(1);
?}
?
?fscanf(p,"%d %d %d,",&co[0],&co[1],&co[2]);
?for(i=0;i<3;i++)
??fscanf(p,"%s/n",name[i]);
?fclose(p);
?Draw(10,20,320,90);
?setcolor(1);
?outtextxy(140,30,"HighCore");
?setcolor(2);
?outtextxy(20,50,"Easy");
?outtextxy(20,60,"Normal");
?outtextxy(20,70,"Hard");
?
?for(i=0;i<3;i++)
?{
??cco[i][0]=(co[i]-co[i]%100)/100+48;
??cco[i][1]=(co[i]%100-co[i]%10)/10 +48;
??cco[i][2]=co[i]%10+48;
?}
?
?setcolor(3);
?outtextxy(100,50,cco[0]);
?outtextxy(100,60,cco[1]);
?outtextxy(100,70,cco[2]);
?
?setcolor(5);
?outtextxy(150,50,name[0]);
?outtextxy(150,60,name[1]);
?outtextxy(150,70,name[2]);?
?
?setcolor(9);
?outtextxy(30,85,"Press any key to play again.");
?Eflags=2;
}
/*這個函數用來畫鼠標光標,x,y,為左上角坐標,大小為20*20*/
void Ddraw2(int x,int y)
{
?/*這個地方暫時使用簡易光標,程序成熟以后使用復雜的*/
?setcolor(1);
?line(x,y,x,y+18);
?line(x+1,y,x+1,y+18);
?line(x,y,x+12,y+12);
?line(x+1,y,x+13,y+12);
?line(x,y+18,x+4,y+14);
?line(x,y+17,x+4,y+13);
?line(x+4,y+14,x+6,y+20);
?line(x+4,y+13,x+6,y+19);
?line(x+6,y+20,x+10,y+18);
?line(x+6,y+19,x+10,y+17);
?line(x+10,y+18,x+8,y+12);
?line(x+10,y+17,x+8,y+11);
?line(x+8,y+12,x+12,y+12);
?line(x+8,y+11,x+12,y+11);
}
總結
- 上一篇: php gd平涂,水彩画基本技法教学:平
- 下一篇: vue之猫眼json数据的获取直接用于自