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; } }
到这里,我们的程序就完成了,我们看看程序的效果
以上就是一个简单的扫雷程序,多有不足之处,还望指教。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。