微信公开课小程序热门讨论「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」最新回复-扫雷游戏(c语言版)已经编译运行确认了:#includegraphics.h#includestdlib.h#includedos.h#defineLEFTPRESS0xff01#defineLEFTCLICK0xff10#defineLEFTDRAG0xff19#defineMOUSEMOVE0xff08struct{intnum;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/introundnum;/*统计格子周围有多少雷*/intflag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/}Mine[10][10];intgameAGAIN=0;/*是否重来的变量*/intgamePLAY=0;/*是否是第一次玩游戏的标志*/intmineNUM;/*统计处理过的格子数*/charrandmineNUM[3];/*显示数字的字符串*/intKeystate;intMouseExist;intMouseButton;intMouseX;intMouseY;voidInit(void);/*图形驱动*/voidMouseOn(void);/*鼠标光标显示*/voidMouseOff(void);/*鼠标光标隐藏*/voidMouseSetXY(int,int);/*设置当前位置*/intLeftPress(void);/*左键按下*/intRightPress(void);/*鼠标右键按下*/voidMouseGetXY(void);/*得到当前位置*/voidControl(void);/*游戏开始,重新,关闭*/voidGameBegain(void);/*游戏开始画面*/voidDrawSmile(void);/*画笑脸*/voidDrawRedflag(int,int);/*显示红旗*/voidDrawEmpty(int,int,int,int);/*两种空格子的显示*/voidGameOver(void);/*游戏结束*/voidGameWin(void);/*显示胜利*/intMineStatistics(int,int);/*统计每个格子周围的雷数*/intShowWhite(int,int);/*显示无雷区的空白部分*/voidGamePlay(void);/*游戏过程*/voidClose(void);/*图形关闭*/voidmain(void){Init();Control();Close();}voidInit(void)/*图形开始*/{intgd=DETECT,gm;initgraph(&gd,&gm,c:\\tc);}voidClose(void)/*图形关闭*/{closegraph();}voidMouseOn(void)/*鼠标光标显示*/{_AX=0x01;geninterrupt(0x33);}voidMouseOff(void)/*鼠标光标隐藏*/{_AX=0x02;geninterrupt(0x33);}voidMouseSetXY(intx,inty)/*设置当前位置*/{_CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);}intLeftPress(void)/*鼠标左键按下*/{_AX=0x03;geninterrupt(0x33);return(_BX&1);}intRightPress(void)/*鼠标右键按下*/{_AX=0x03;geninterrupt(0x33);return(_BX&2);}voidMouseGetXY(void)/*得到当前位置*/{_AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;}voidControl(void)/*游戏开始,重新,关闭*/{intgameFLAG=1;/*游戏失败后判断是否重新开始的标志*/while(1){if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/{GameBegain();/*游戏初始画面*/GamePlay();/*具体游戏*/if(gameAGAIN==1)/*游戏中重新开始*/{gameAGAIN=0;continue;}}MouseOn();gameFLAG=0;if(LeftPress())/*判断是否重新开始*/{MouseGetXY();if(MouseX280&&MouseX300&&MouseY65&&MouseY85){gameFLAG=1;continue;}}if(kbhit())/*判断是否按键退出*/break;}MouseOff();}voidDrawSmile(void)/*画笑脸*/{setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/bar(287,80,293,81);}voidDrawRedflag(inti,intj)/*显示红旗*/{setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);}voidDrawEmpty(inti,intj,intmode,intcolor)/*两种空格子的显示*/{setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*没有单击过的大格子*/bar(200+j*208,100+i*208,200+j*20+8,100+i*20+8);elseif(mode==1)/*单击过后显示空白的小格子*/bar(200+j*207,100+i*207,200+j*20+7,100+i*20+7);}voidGameBegain(void)/*游戏开始画面*/{inti,j;cleardevice();if(gamePLAY!=1){MouseSetXY(290,70);/*鼠标一开始的位置,并作为它的初始坐标*/MouseX=290;MouseY=70;}gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i10;i++)/*画格子*/for(j=0;j10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*画脸*/randomize();__page_break__for(i=0;i10;i++)/*100个格子随机赋值有没有地雷*/for(j=0;j10;j++){Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/if(Mine[i][j].num==1)mineNUM++;/*现有雷数加1*/elseMine[i][j].num=2;Mine[i][j].flag=0;/*表示没红旗标志*/}sprintf(randmineNUM,%d,mineNUM);/*显示这次总共有多少雷数*/setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100mineNUM;/*变量取空白格数量*/MouseOn();}voidGameOver(void)/*游戏结束画面*/{inti,j;setcolor(0);for(i=0;i10;i++)for(j=0;j10;j++)if(Mine[i][j].num==1)/*显示所有的地雷*/{DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);fillellipse(200+j*20,100+i*20,7,7);}}voidGameWin(void)/*显示胜利*/{setcolor(11);settextstyle(0,0,2);outtextxy(230,30,YOUWIN!);}intMineStatistics(inti,intj)/*统计每个格子周围的雷数*/{intnNUM=0;if(i==0&&j==0)/*左上角格子的统计*/{if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;}elseif(i==0&&j==9)/*右上角格子的统计*/{if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;}elseif(i==9&&j==0)/*左下角格子的统计*/{if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;}elseif(i==9&&j==9)/*右下角格子的统计*/{if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;}elseif(j==0)/*左边第一列格子的统计*/{if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i1][j].num==1)nNUM++;if(Mine[i1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;}elseif(j==9)/*右边第一列格子的统计*/{if(Mine[i][j1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i1][j].num==1)nNUM++;if(Mine[i1][j1].num==1)nNUM++;if(Mine[i+1][j1].num==1)nNUM++;}elseif(i==0)/*第一行格子的统计*/{if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;}elseif(i==9)/*最后一行格子的统计*/{if(Mine[i1][j].num==1)nNUM++;if(Mine[i][j1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i1][j1].num==1)nNUM++;if(Mine[i1][j+1].num==1)nNUM++;}else/*普通格子的统计*/{if(Mine[i1][j].num==1)nNUM++;if(Mine[i1][j+1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i+1][j1].num==1)nNUM++;if(Mine[i][j1].num==1)nNUM++;if(Mine[i1][j1].num==1)nNUM++;}__page_break__return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/}intShowWhite(inti,intj)/*显示无雷区的空白部分*/{if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/return;mineNUM;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/{DrawEmpty(i,j,1,7);Mine[i][j].num=0;}elseif(Mine[i][j].roundnum!=0)/*输出雷数*/{DrawEmpty(i,j,0,8);sprintf(randmineNUM,%d,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/return;}/*8个方向递归显示所有的空白格子*/if(i!=0&&Mine[i1][j].num!=1)ShowWhite(i1,j);if(i!=0&&j!=9&&Mine[i1][j+1].num!=1)ShowWhite(i1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j1].num!=1)ShowWhite(i+1,j1);if(j!=0&&Mine[i][j1].num!=1)ShowWhite(i,j1);if(i!=0&&j!=0&&Mine[i1][j1].num!=1)ShowWhite(i1,j1);}voidGamePlay(void)/*游戏过程*/{inti,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/for(i=0;i10;i++)for(j=0;j10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/while(!kbhit()){if(LeftPress())/*鼠标左键盘按下*/{MouseGetXY();if(MouseX280&&MouseX300&&MouseY65&&MouseY85)/*重新来*/{MouseOff();gameAGAIN=1;break;}if(MouseX190&&MouseX390&&MouseY90&&MouseY290)/*当前鼠标位置在格子范围内*/{j=(MouseX190)/20;/*x坐标*/i=(MouseY90)/20;/*y坐标*/if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/continue;if(Mine[i][j].num!=0)/*如果格子没有处理过*/{if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/{MouseOff();GameOver();/*游戏失败*/break;}else/*鼠标按下的格子不是地雷*/{MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/ShowWhite(i,j);else/*按下格子周围有地雷*/{sprintf(randmineNUM,%d,Num);/*输出当前格子周围的雷数*/setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM;}MouseOn();Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/if(mineNUM1)/*胜利了*/{GameWin();break;}}}}}if(RightPress())/*鼠标右键键盘按下*/{MouseGetXY();if(MouseX190&&MouseX390&&MouseY90&&MouseY290)/*当前鼠标位置在格子范围内*/{j=(MouseX190)/20;/*x坐标*/i=(MouseY90)/20;/*y坐标*/MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/{DrawRedflag(i,j);Mine[i][j].flag=1;}elseif(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/{DrawEmpty(i,j,0,8);Mine[i][j].flag=0;}}MouseOn();sleep(1);}}}
在不同机子上编译时需修改init()函数中TC路径#includegraphics.h#includestdlib.h#includemath.h#includebios.h#definepi3.14#definer10#defineright8292#defineleft 7777#defineesc283#definepause14624structball{ intx,y; intoldx,oldy; intderection;/*球的方向采用角度制,范围是0-360度*/}ball;structplatform{ intx,y; unsignedkey; intoldx,oldy;}platform;intscore=0;/*得分*/intspeed=1;/*速度*/unsignedkey;voidinit();voidbase();voidscoreview();voidplay();doublechange(intx);voidgameover();voidclose();voidmain(){ init(); base(); scoreview(); play(); getch(); close();}voidinit()/*初始化图形模式*/{ intgm=DETECT,gd; initgraph(&gm,&gd,G:tcbgi);/*根据不同的TC进行路径修改*/}voidclose()/*关闭图形模式*/{ closegraph();}voidbase()/*画边框,球以及板并且对球和板的各参数初始化*/{ inti; setbkcolor(GREEN); setcolor(8); setfillstyle(4,LIGHTGRAY); rectangle(149,149,501,351); rectangle(140,140,510,360); floodfill(141,141,8); setfillstyle(9,BLUE); platform.x=300; platform.y=343; bar(platform.x,platform.y,platform.x+40,platform.y+5); randomize(); ball.x=random(330)+160; ball.y=160; ball.derection=random(30)+280;setfillstyle(1,YELLOW); setcolor(YELLOW); fillellipse(ball.x,ball.y,r,r);}voidscoreview()/*显示当前的得分数*/{ charsco[20]; setcolor(WHITE); setfillstyle(1,YELLOW); bar(300,50,440,80); sprintf(sco,score:%d,score); setcolor(RED); settextstyle(0,0,2); outtextxy(310,60,sco);}voidplay(){ inti=5; settextstyle(0,0,2); setcolor(11); outtextxy(50,400,AforleftDforright);/*提示各个控制键*/ outtextxy(50,450,spaceforpause ESCforquit); setcolor(RED); setfillstyle(1,GREEN); while(!kbhit())/*开始之前提示按任意键进入游戏,且提示不停闪烁*/ {outtextxy(100,100,pressanykeytobegin!);delay(400);bar(100,100,500,120);delay(400); }while(1) {while(!kbhit()){ball.oldx=ball.x; ball.oldy=ball.y;/*记录下当前球的位置*/ /*根据球的方向来利用角度的正切值来改变球的坐标*/ if(ball.derection0&&ball.derection90){ball.x+=10;ball.y+=(-10*tan(change(ball.derection)));} if(ball.derection90&&ball.derection180){ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));} if(ball.derection180&&ball.derection270){ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));} if(ball.derection270&&ball.derection360){ball.x+=10;ball.y+=(-10*tan(change(ball.derection)));} if(ball.y+r=platform.y)/*如果球到底有两种情况*/ {if(ball.x+r-platform.x0||ball.x-r-platform.x40)/*球不在板上*/{ ball.y=platform.y-r+7; setfillstyle(1,GREEN); setcolor(GREEN); fillellipse(ball.oldx,ball.oldy,r,r); /*球在游戏结束处闪烁五次*/ while(i) {setfillstyle(1,YELLOW);setcolor(YELLOW);fillellipse(ball.x,ball.y,r,r);delay(300);setfillstyle(1,GREEN);setcolor(GREEN);fillellipse(ball.x,ball.y,r,r);delay(300);i--;}gameover();/*游戏结束*/ }else{ball.y=platform.y-r; ball.derection=360-ball.derection;/*球在板上的话得一分,且速度加一但不能超过5*/ score++; speed++;if(speed5)speed=5;scoreview();/*刷新得分*/} } /*如果球撞墙或板后修正坐标并改变方向*/ if(ball.y-r150) {ball.y=150+r;ball.derection=360-ball.derection; } if(ball.x-r150) {ball.x=150+r;if(ball.derection180&&ball.derection270)ball.derection=540-ball.derection;if(ball.derection90&&ball.derection180)ball.derection=180-ball.derection; } if(ball.x+r500) {ball.x=500-r;if(ball.derection270&&ball.derection360)ball.derection=540-ball.derection;if(ball.derection0&&ball.derection90)ball.derection=180-ball.derection; } setfillstyle(1,GREEN); setcolor(GREEN); fillellipse(ball.oldx,ball.oldy,r,r);/*在先前位置用底色抹掉球*/ setfillstyle(1,YELLOW); setcolor(YELLOW); fillellipse(ball.x,ball.y,r,r);/*在新位置显示球*/ delay(150+(5-speed)*50);}/*对底板的控制*/key=bioskey(0);platform.oldx=platform.x;platform.oldy=platform.y;/*记录下底板先前位置*//*通过方向键改变底板的坐标*/if(key==right)platform.x+=15;if(key==left)platform.x-=15;if(key==esc)gameover();/*如果暂停则闪烁提示按任意键(除暂停键)继续*/if(key==pause) while(!kbhit()){setcolor(RED);outtextxy(10,20,paused!pressanykeytocontinue.);delay(400);setfillstyle(1,GREEN);bar(10,20,600,40);delay(400);};if(platform.x150)platform.x=150;if(platform.x460)platform.x=460;/*对底板坐标修正*/setfillstyle(1,GREEN);bar(platform.oldx,platform.y,platform.oldx+40,platform.y+5);/*在先前位置抹掉底板*/setfillstyle(9,BLUE);bar(platform.x,platform.y,platform.x+40,platform.y+5);/*在新位置显示底板*/}}voidgameover()/*游戏结束,显示最终得分*/{charbuffer[50];cleardevice();sprintf(buffer,yourfinalscoreis:%d,score);setcolor(BLUE);settextstyle(0,0,3);outtextxy(100,300,buffer);setcolor(RED);settextstyle(0,0,5);outtextxy(0,150,thanksforplay!);getch();exit(0);}doublechange(intx)/*将角度转化为弧度*/{ doubleradians; return(x*pi/180);} 更多有关「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」的疑问请扫码关注微信公开课+小程序!了解更多
方法1:微信扫描微信公开课小程序码即可订阅热议话题「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」
方法2:微信搜索微信公开课小程序名称进入,即可订阅热议话题「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」
方法3:微信网页访问即速商店,长按识别微信公开课小程序码即可订阅热议话题「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」
微信公开课小程序热议话题「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」由微信公开课原创摘录于微信小程序商店shop.jisuapp.cn,转载请注明出处。
微信公开课热议话题「急求C语言编译的小游戏(如扫雷),附带源代码和注释。」由微信公开课开发者向微信用户提供,并对本服务内容、数据资料及其运营行为等真实性、合法性及有效性承担全部责任。