C语言实现扫雷游戏(可展开)
本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下
#一、游戏的思路
先理清游戏大概需要实现的功能,菜单功能的实现、棋盘初始化、打印棋盘、布置雷等。运用两个数组,一个放入布置雷的信息,另一个放入排查雷的信息。选一个坐标扫雷,坐标有雷则游戏结束,没有就计算选中坐标的周围8个格子中雷的总数放入选中的坐标中,若选中的坐标周围8个格子中都没有雷则自动展开。考虑到棋盘边框的情况,实际数组要比打印出的棋盘多两行两列。下面是宏定义和函数声明:
ROW、COL为打印行、列,ROWS、COLS为实际的数组行列
EASY_COUNT为雷的个数,可根据需要调整行列和雷的个数
#defineROW9 #defineCOL9 #defineROWSROW+2 #defineCOLSCOL+2 #defineEASY_COUNT10 #include#include #include #include voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset); voidDisplayBoard(charboard[ROWS][COLS],introw,intcol); voidSetMine(charboard[ROWS][COLS],introw,intcol); voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol); voidExcludeMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty);
二、游戏测试
游戏实现的大致思路体现和菜单的实现,代码如下:
#define_CRT_SECURE_NO_WARNINGS1 #include"game.h" voidmenu() { printf("##############################\n"); printf("######1.play0.exit######\n"); printf("##############################\n"); } //布置雷-字符组存储-雷用1表示,非雷用0表示-最外层一圈放0 //排查雷-为避免歧义,再用一个字符组存储排查出来的雷的信息-未排除的用#表示 //最外层加一圈字符,只在中间设置雷,并打印展示棋盘中间位置,因此实际存放数组要比打印的棋盘多两行两列 voidgame() { //雷的信息存储 //1.布置好的雷的信息 charmine[ROWS][COLS]={0}; //2.排查出的雷的信息 charshow[ROWS][COLS]={0}; //初始化 InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'#'); //打印棋盘 //DisplayBoard(mine,ROW,COL);//测试使用 DisplayBoard(show,ROW,COL); //布置雷 SetMine(mine,ROW,COL); //DisplayBoard(mine,ROW,COL);//测试使用 //扫雷 FindMine(mine,show,ROW,COL); } voidtest() { intinput=0; srand((unsignedint)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d",&input); switch(input) { case1: game(); printf("将返回主菜单\n"); Sleep(5*1000); break; case0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } }while(input); } intmain() { test(); return0; }
三、游戏流程
存放函数的源文件需要引用头文件
#define_CRT_SECURE_NO_WARNINGS1 #include"game.h"
1.初始化棋盘
voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset) { inti=0; intj=0; for(i=0;i2.棋盘打印
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"); } }3.布置雷
voidSetMine(charboard[ROWS][COLS],introw,intcol) { intcount=EASY_COUNT; while(count) { intx=rand()%row+1;//1-9 inty=rand()%col+1; if(board[x][y]=='0') { board[x][y]='1'; count--; } } }4.查找雷和胜负判断
intCheckShow(charshow[ROWS][COLS],introw,intcol) { intwin=0; inti=0; intj=0; for(i=1;i<=row;i++) { for(j=1;j<=col;j++) { if(show[i][j]=='#') win++; } } returnwin; } voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol) { intx=0; inty=0; intwin=0; //9*9-10=71 while(1) { printf("请输入排查雷的坐标:>"); scanf("%d%d",&x,&y); if(x>=1&&x<=row&&y>=1&&y<=col) { //坐标合法 //1.踩雷 if(mine[x][y]=='1') { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine,row,col); break; } else//不是雷 { //计算x,y坐标周围有几个雷 ExcludeMine(mine,show,x,y); DisplayBoard(show,row,col); win=CheckShow(show,row,col); if(win==EASY_COUNT) break; } } else { printf("坐标非法,请重新输入!\n"); } } if(win==EASY_COUNT) { printf("恭喜你,排雷成功\n"); DisplayBoard(mine,row,col); } }5.扫雷的展开和提醒
//'1'-'0'=1 intget_mine_count(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'; } voidExcludeMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty) { intcount=get_mine_count(mine,x,y); if(count!=0) { show[x][y]=count+'0'; } else { show[x][y]=''; if(show[x-1][y]=='#') ExcludeMine(mine,show,x-1,y); if(show[x-1][y-1]=='#') ExcludeMine(mine,show,x-1,y-1); if(show[x][y-1]=='#') ExcludeMine(mine,show,x,y-1); if(show[x+1][y-1]=='#') ExcludeMine(mine,show,x+1,y-1); if(show[x+1][y]=='#') ExcludeMine(mine,show,x+1,y); if(show[x+1][y+1]=='#') ExcludeMine(mine,show,x+1,y+1); if(show[x][y+1]=='#') ExcludeMine(mine,show,x,y+1); if(show[x-1][y+1]=='#') ExcludeMine(mine,show,x-1,y+1); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。