C语言实现扫雷游戏的示例分析
这篇文章给大家分享的是有关C语言实现扫雷游戏的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一,创建菜单先明确要做什么,选择合适的语句来对想法进行实现:
test.cvoidmenu(){printf("*******************\n");printf("*****1.play****\n");printf("*****0.exit****\n");printf("*******************\n");}voidtest(){intinput=0;do{menu();printf("请选择:");scanf("%d",&input);switch(input){case1://扫雷break;case0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}}while(input);}intmain(){test();return0;}二,创建游戏内容
在game函数重创新建。在test()函数中case1: 下调用game。
case1://扫雷game();1.场景创建和初始化
这里我们要明白,我们游戏中雷是提前布置好的,呈现在我们眼前的场景是经过遮掩的,那么我们创建两个场景,mine 和 show,且都是二维数组。
在扫雷的时候我们要计算输入坐标周围一圈有没有雷,因此我们要考虑在边界坐标的越界问题,因此若展现在面前的是x*y的数组,那么实际数组的大小应该是(x+2)*(y+2)的大小。
为了改变场景大小方便,我们创建行列时采用宏定义(在game.h)中。
game.h#include<stdio.h>//为玩家展现的场景大小#defineROW9#defineCOL9//场景真实大小防越界#defineROWSROW+2#defineCOLSCOL+2//函数声明voidinitboard(charboard[ROWS][COLS],introws,intcols,charset);//初始化
game.c//函数定义voidinitboard(charboard[ROWS][COLS],introws,intcols,charset)//初始化场景{inti=0;intj=0;for(i=0;i<rows;i++){for(j=0;j<cols;j++){board[i][j]=set;//set接收test.h中传来的字符}}}
test.cvoidgame(){//创建数组charmine[ROWS][COLS]={0};//布置雷charshow[ROWS][COLS]={0};//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show,ROWS,COLS,'*');}2.场景打印
game.h#include<stdio.h>//为玩家展现的场景大小#defineROW9#defineCOL9//场景真实大小防越界#defineROWSROW+2#defineCOLSCOL+2//函数声明voidinitboard(charboard[ROWS][COLS],introws,intcols,charset);//初始化voiddisplayboard(charboard[ROWS][COLS],introw,intcol);//打印场景
game.cvoiddisplayboard(charboard[ROWS][COLS],introw,intcol)//打印场景{inti=0;intj=0;for(i=0;i<=col;i++){printf("%d",i);//打印列号为了方便玩家快速输入坐标}printf("\n");//换行打印场景for(i=1;i<=row;i++){printf("%d",i);//打印行号为了方便玩家快速输入坐标for(j=1;j<=col;j++){printf("%c",board[i][j]);}printf("\n");//每行打印完记得换行}}
test.cvoidgame(){//创建数组charmine[ROWS][COLS]={0};//布置雷charshow[ROWS][COLS]={0};//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show,ROWS,COLS,'*');//打印棋盘displayboard(show,ROW,COL);displayboard(mine,ROW,COL);}
打印如下:
注:玩游戏时只打印 show 的场景。
3.埋雷game.h#include<stdio.h>#include<stdlib.h>//随机埋雷,要用到随机数#include<time.h>//为玩家展现的场景大小#defineROW9#defineCOL9//场景真实大小防越界#defineROWSROW+2#defineCOLSCOL+2//函数声明voidinitboard(charboard[ROWS][COLS],introws,intcols,charset);//初始化voiddisplayboard(charboard[ROWS][COLS],introw,intcol);//打印场景voidsetmine(charmine[ROWS][COLS],introw,intcol);//布置雷
game.cvoidsetmine(charmine[ROWS][COLS],introw,intcol)//布置雷{intcount=10;while(count)//循环10次,放10个雷{intx=rand()%row+1;//0~9inty=rand()%col+1;//0~9if(mine[x][y]=='0')//判断这个位置有没有放雷{mine[x][y]='1';//雷为'1'count--;}}}
test.cvoidgame(){//创建数组charmine[ROWS][COLS]={0};//布置雷charshow[ROWS][COLS]={0};//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show,ROWS,COLS,'*');//打印棋盘//displayboard(show,ROW,COL);//displayboard(mine,ROW,COL);//布置雷setmine(mine,ROW,COL);displayboard(show,ROW,COL);//埋完雷后将show打印出来,准备下一步进行排雷}
埋雷这里要用到随机数,不要忘了提前使用 srand()噢
4.排雷game.h#include<stdio.h>#include<stdlib.h>//随机埋雷,要用到随机数#include<time.h>//为玩家展现的场景大小#defineROW9#defineCOL9//场景真实大小防越界#defineROWSROW+2#defineCOLSCOL+2//函数声明voidinitboard(charboard[ROWS][COLS],introws,intcols,charset);//初始化voiddisplayboard(charboard[ROWS][COLS],introw,intcol);//打印场景voidsetmine(charmine[ROWS][COLS],introw,intcol);//布置雷voidfindmine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);//排雷
这里注意,我们同时接收 mine 和 show 数组,用int row, int col 来使两个场景有链接关系
game.hintget_mine(charmine[ROWS][COLS],intx,inty)//找雷数,该函数在排雷函数里使用,直接在//findmine外定义即可{returnmine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+//这8个坐标为x,y周围一圈mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]-8*'0';//'数字'-'0'=数字}voidfindmine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol)//排雷{intx=0;inty=0;intwin=0;while(win<row*col-10)//判断雷是否排完{printf("请输入要排查的坐标:");scanf("%d%d",&x,&y);if(x>=1&&x<=row&&y>=1&&y<=col)//判断坐标是否在可视范围{//判断if(mine[x][y]=='1')//踩雷{printf("很遗憾,你被炸死了!\n");displayboard(mine,ROW,COL);break;}else//不是雷{//计算x,y坐标周围的雷intn=get_mine(mine,x,y);//求周围一圈雷的个数if(n!=0)show[x][y]=n+'0';//并将个数通过show场景显示出来displayboard(show,ROW,COL);//打印showwin++;}}else{printf("输入坐标非法,无法排雷,请重新输入:\n");}}if(win==row*col-10){printf("排雷成功\n");displayboard(mine,ROW,COL);}}
注:数字 + '0' = '数字' 详细参考ASCII码表
二进制 字符
48 '0'
49 '1'
50 '2'
51 '3'
52 '4'
53 '5'
54 '6'
55 '7'
56 '8'
57 '9'
这样简单版本的扫雷就完成了。
注:头文件stdio.h在game.c和test.c里面都要引用,我们将stdio.h放入game.h里面,直接用双引号引用game.h。
完整代码1.game.h#include<stdio.h>#include<stdlib.h>#include<time.h>#defineROW9#defineCOL9#defineROWSROW+2#defineCOLSCOL+2//函数声明voidinitboard(charboard[ROWS][COLS],introws,intcols,charset);//初始化voiddisplayboard(charboard[ROWS][COLS],introw,intcol);//打印场景voidsetmine(charmine[ROWS][COLS],introw,intcol);//布置雷voidfindmine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);//排雷2.game.c
#include"game.h"voidinitboard(charboard[ROWS][COLS],introws,intcols,charset)//初始化场景{inti=0;intj=0;for(i=0;i<rows;i++){for(j=0;j<cols;j++){board[i][j]=set;}}}voiddisplayboard(charboard[ROWS][COLS],introw,intcol)//打印场景{inti=0;intj=0;for(i=0;i<=col;i++){printf("%d",i);//打印列号}printf("\n");for(i=1;i<=row;i++){printf("%d",i);//打印行号for(j=1;j<=col;j++){printf("%c",board[i][j]);}printf("\n");}}voidsetmine(charmine[ROWS][COLS],introw,intcol)//布置雷{intcount=10;while(count){intx=rand()%row+1;inty=rand()%col+1;if(mine[x][y]=='0'){mine[x][y]='1';count--;}}}intget_mine(charmine[ROWS][COLS],intx,inty)//找雷数{returnmine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]-8*'0';}voidfindmine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol)//排雷{intx=0;inty=0;intwin=0;while(win<row*col-10){printf("请输入要排查的坐标:");scanf("%d%d",&x,&y);if(x>=1&&x<=row&&y>=1&&y<=col){//判断if(mine[x][y]=='1'){printf("很遗憾,你被炸死了!\n");displayboard(mine,ROW,COL);break;}else{//计算x,y坐标周围的雷intn=get_mine(mine,x,y);if(n!=0)show[x][y]=n+'0';displayboard(show,ROW,COL);win++;}}else{printf("输入坐标非法,无法排雷,请重新输入:\n");}}if(win==row*col-10){printf("排雷成功\n");displayboard(mine,ROW,COL);}}3.test.c
#include"game.h"voidgame(){//创建数组charmine[ROWS][COLS]={0};//布置雷charshow[ROWS][COLS]={0};//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show,ROWS,COLS,'*');//打印棋盘//displayboard(show,ROW,COL);//displayboard(mine,ROW,COL);//布置雷setmine(mine,ROW,COL);//displayboard(mine,ROW,COL);displayboard(show,ROW,COL);//排雷findmine(mine,show,ROW,COL);}voidmenu(){printf("*******************\n");printf("*****1.play****\n");printf("*****0.exit****\n");printf("*******************\n");}voidtest(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:");scanf("%d",&input);switch(input){case1://扫雷game();break;case0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}}while(input);}intmain(){test();return0;}
实战如下:
对了,对埋雷函数我们还可以进行优化,将雷的个数进行宏定义放在game.h里,方便修改雷的数量。
优化到下个版本时会一起修改的
感谢各位的阅读!关于“C语言实现扫雷游戏的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。