C语言如何实现扫雷程序
这篇文章给大家分享的是有关C语言如何实现扫雷程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。
game.h //包含函数的声明,宏定义test.c //包含主函数,函数调用game.c //包含函数的定义
整体思路
1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示。
//使用宏定义定义常量,方便之后对数组的使用 #defineROW11//雷 #defineCOL11 #defineROWS9//棋盘 #defineCOLS9 #defineTHUNDER10//雷数 charmine[ROW][COL]={0};//存雷数组 charshow[ROWS][COLS]={0};//展示数组 Arr_init(mine,show,ROW,COL,ROWS,COLS);//数组初始化
2.完成对数组的初始化后,我们需要对雷进行放置
voidCol_thu(charmine[ROW][COL],introw,intcol,intthunder)//布置雷 { intx,y; inti=0; while(i3.布置完雷后,我们需要打印所需要的棋盘
存雷棋盘
voidPrint_che1(charmine[ROW][COL],introw,intcol)//打印存雷棋盘 { inti,j; for(i=0;i|
展示棋盘
voidPrint_che2(charshow[ROWS][COLS],introws,intcols)//打印展示棋盘 { inti,j; for(i=0;i<=rows;i++)//方便我们输入坐标 { printf("%2d",i); } printf("\n"); for(i=0;i4.打印完棋盘后,我们开始扫雷了。
在扫雷的过程中,我们需要在没有找到雷时展示输入坐标周围的雷数并进行展开,同时,为了增加游戏的可玩性,当第一次就找到雷时,我们需要将雷转移到其他位置。
统计周围雷数
voidNum_mines(charmine[ROW][COL],charshow[ROWS][COLS],intx,inty)//计算输入坐标周围的雷数 { intch; ch=mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+mine[x][y-1]+mine[x][y+1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]-8*'0'; show[x-1][y-1]=ch+48;//数字对应的ASCLL与数字字符相差48 }展开
voidopen_show(charmine[ROW][COL],charshow[ROWS][COLS],introws,intx,inty)//计算输入坐标及周围的雷数(展开) { if(mine[x][y-1]=='0')//中x,y { if(x-1>=0&&y-1>=0&&x+1<=rows+1&&y+1<=rows+1)//防止越界情况(所有的坐标+1<=rows+1,-1>=0) { Num_mines(mine,show,x,y);//返回坐标周围的雷数 } } if(mine[x-1][y-1]=='0')//左上角x-1,y-1 { if(x-2>=0&&y-2>=0&&x<=rows+1&&y<=rows+1) { Num_mines(mine,show,x-1,y-1); } } if(mine[x-1][y]=='0')//上x-1,y { if(x-2>=0&&y-1>=0&&x<=rows+1&&y+1<=rows+1) { Num_mines(mine,show,x-1,y); } } if(mine[x-1][y+1]=='0')//右上角x-1,y+1 { if(x-2>=0&&y>=0&&x<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x-1,y+1); } } if(mine[x][y-1]=='0')//左x,y-1 { if(x-1>=0&&y-2>=0&&x+1<=rows+1&&y<=rows+1) { Num_mines(mine,show,x,y-1); } } if(mine[x][y+1]=='0')//右x,y+1 { if(x-1>=0&&y>=0&&x+1<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x,y+1); } } if(mine[x+1][y-1]=='0')//左下角x+1,y-1 { if(x>=0&&y-2>=0&&x+2<=rows+1&&y<=rows+1) { Num_mines(mine,show,x+1,y-1); } } if(mine[x+1][y]=='0')//下x+1,y { if(x>=0&&y-1>=0&&x+2<=rows+1&&y+1<=rows+1) { Num_mines(mine,show,x+1,y); } } if(mine[x+1][y+1]=='0')//右下角x+1,y+1 { if(x>=0&&y>=0&&x+2<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x+1,y+1); } } }扫雷
charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti)//找雷 { intx,y; flag1: printf("请玩家输入坐标"); scanf("%d%d",&x,&y); flag: if((x>0&&x<=row-2)&&(y>0&&y<=col-2))//判断输入坐标的正确性 { if(mine[x][y]=='0')//没找到雷 { open_show(mine,show,ROWS,x,y);//计算输入坐标及周围的雷数(展开) return'0'; } else//找到雷 { if(i==0)//第一个就找到雷 { mine[x][y]='0'; while(1) { inta,b; a=rand()%(row-2)+1; b=rand()%(col-2)+1; if(mine[a][b]=='0') { mine[a][b]='1'; gotoflag; } } } else { show[x-1][y-1]='1'; return'1'; } } } else { printf("输入错误\n"); gotoflag1; } }确定大致思路后,我们完成程序的流程部分,并放入我们所创建的文件中。
代码如下:
game.h //包含函数的声明,宏定义
#ifndef__GAME_H__ #define__GAME_H__ #include#include #include #include #defineROW11//雷 #defineCOL11 #defineROWS9//棋盘 #defineCOLS9 #defineTHUNDER10//雷数 voidArr_init(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,introws,intcols);//数组初始化 voidCol_thu(charmine[ROW][COL],introw,intcol,intthunder);//布置雷 voidPrint_che1(charmine[ROW][COL],introw,intcol);//打印存雷棋盘 voidPrint_che2(charshow[ROWS][COLS],introws,intcols);//打印展示棋盘 charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti);//找雷 voidNum_mines(charmine[ROW][COL],charshow[ROWS][COLS],intx,inty);//计算输入坐标周围的雷数 voidopen_show(charmine[ROW][COL],charshow[ROWS][COLS],introws,intx,inty);////计算输入坐标及周围的雷数(展开) #endif//__GAME_H__ test.c //包含主函数,函数调用
#define_CRT_SECURE_NO_WARNINGS1 #include"game.h" voidmenu()//菜单函数 { printf("********************\n"); printf("****1.play****\n"); printf("****0.exit****\n"); printf("********************\n"); } voidgame()//游戏函数 { inti; charmine[ROW][COL]={0};//存雷数组 charshow[ROWS][COLS]={0};//展示数组 Arr_init(mine,show,ROW,COL,ROWS,COLS);//数组初始化 Col_thu(mine,ROW,COL,THUNDER);//布置雷 Print_che2(show,ROWS,COLS);//打印展示棋盘 for(i=0;igame.c //包含函数的定义
#include"game.h" voidArr_init(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,introws,intcols)//数组初始化 { inti,j; for(i=0;i=0&&y-1>=0&&x+1<=rows+1&&y+1<=rows+1)//防止越界情况(所有的坐标+1<=rows+1,-1>=0) { Num_mines(mine,show,x,y);//返回坐标周围的雷数 } } if(mine[x-1][y-1]=='0')//左上角x-1,y-1 { if(x-2>=0&&y-2>=0&&x<=rows+1&&y<=rows+1) { Num_mines(mine,show,x-1,y-1); } } if(mine[x-1][y]=='0')//上x-1,y { if(x-2>=0&&y-1>=0&&x<=rows+1&&y+1<=rows+1) { Num_mines(mine,show,x-1,y); } } if(mine[x-1][y+1]=='0')//右上角x-1,y+1 { if(x-2>=0&&y>=0&&x<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x-1,y+1); } } if(mine[x][y-1]=='0')//左x,y-1 { if(x-1>=0&&y-2>=0&&x+1<=rows+1&&y<=rows+1) { Num_mines(mine,show,x,y-1); } } if(mine[x][y+1]=='0')//右x,y+1 { if(x-1>=0&&y>=0&&x+1<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x,y+1); } } if(mine[x+1][y-1]=='0')//左下角x+1,y-1 { if(x>=0&&y-2>=0&&x+2<=rows+1&&y<=rows+1) { Num_mines(mine,show,x+1,y-1); } } if(mine[x+1][y]=='0')//下x+1,y { if(x>=0&&y-1>=0&&x+2<=rows+1&&y+1<=rows+1) { Num_mines(mine,show,x+1,y); } } if(mine[x+1][y+1]=='0')//右下角x+1,y+1 { if(x>=0&&y>=0&&x+2<=rows+1&&y+2<=rows+1) { Num_mines(mine,show,x+1,y+1); } } } charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti)//找雷 { intx,y; flag1: printf("请玩家输入坐标"); scanf("%d%d",&x,&y); flag: if((x>0&&x<=row-2)&&(y>0&&y<=col-2))//判断输入坐标的正确性 { if(mine[x][y]=='0')//没找到雷 { open_show(mine,show,ROWS,x,y);//计算输入坐标及周围的雷数(展开) return'0'; } else//找到雷 { if(i==0)//第一个就找到雷 { mine[x][y]='0'; while(1) { inta,b; a=rand()%(row-2)+1; b=rand()%(col-2)+1; if(mine[a][b]=='0') { mine[a][b]='1'; gotoflag; } } } else { show[x-1][y-1]='1'; return'1'; } } } else { printf("输入错误\n"); gotoflag1; } }
到这里,我们的程序就完成了,我们看看程序的效果
感谢各位的阅读!关于“C语言如何实现扫雷程序”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
推荐阅读
-
windows安装touble c
近期有些网友想要了解windows?安装touble的相关情况,小编通过整理给您分享一下。为什么现在还需要TurboC?在当今V...
-
C/C++如何获取CAN信号
C/C++如何获取CAN信号本篇内容主要讲解“C/C++如何获取C...
-
C语言怎么通过二分查找实现猜数字游戏
C语言怎么通过二分查找实现猜数字游戏本文小编为大家详细介绍“C语言...
-
C语言数据结构中的线性表怎么使用
C语言数据结构中的线性表怎么使用这篇文章主要介绍“C语言数据结构中...
-
C语言的数据结构怎么理解
C语言的数据结构怎么理解这篇文章主要介绍了C语言的数据结构怎么理解...
-
C语言与C++中内存管理的方法
C语言与C++中内存管理的方法这篇文章主要介绍了C语言与C++中内...
-
C语言链式队列与循环队列怎么实现
C语言链式队列与循环队列怎么实现这篇文章主要介绍了C语言链式队列与...
-
C语言冒泡排序怎么实现
C语言冒泡排序怎么实现这篇文章主要介绍了C语言冒泡排序怎么实现的相...
-
C语言如何实现斐波那契数列
C语言如何实现斐波那契数列这篇文章主要介绍了C语言如何实现斐波那契...
-
C语言如何实现无符号数和有符号数间的运算
C语言如何实现无符号数和有符号数间的运算本篇内容主要讲解“C语言如...