C语言模拟实现扫雷游戏
扫雷是Windows系统的经典游戏,下文将利用c语言实现这个经典的小游戏。本版本程序添加了炸弹标记功能。但由于作者水平实现较为死板,此处留坑待以后学习后改进。
Part1主函数部分:
此部分主要提供用户界面,不同程序均可利用:
intmain() { srand((unsignedint)time(NULL)); intinput=0; do { menu(); printf("请选择:>\n"); scanf("%d",&input); switch(input) { case1: printf("游戏开始!\n"); game(); break; case0: printf("退出游戏!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } }while(input); return0; }
Part2函数部分:
我们来思考一下函数的组成:
voidmenu();//实现主函数中菜单 voidgame();//游戏的核心函数 voidInitBoard(charboard[ROWS][COLS],introw,intcol,charset);//初始化扫雷盘 voidDisplayBoard(charboard[ROWS][COLS],introw,intcol);//可视化扫雷盘 voidSetMine(charmine[ROWS][COLS],introw,intcol,intcount);//设置雷盘 voidFindMine(charshow[ROWS][COLS],charmine[ROWS][COLS],introw,intcol,intcount);//寻找雷区(用户寻找雷) intCountMine(charboard[ROWS][COLS],intx,inty);//统计周围雷的数量 voidshow_recusion(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty);//实现点击一下的扩大化应用 intcheckwin(charmine[ROWS][COLS],introw,intcol);//检查是否获胜
Part3整体实现:
#include#include #include #defineROW9 #defineCOL9 #defineROWSROW+2 #defineCOLSCOL+2 #defineEASY_COUNT10 voidmenu(); voidgame(); voidInitBoard(charboard[ROWS][COLS],introw,intcol,charset); voidDisplayBoard(charboard[ROWS][COLS],introw,intcol); voidSetMine(charmine[ROWS][COLS],introw,intcol,intcount); voidFindMine(charshow[ROWS][COLS],charmine[ROWS][COLS],introw,intcol,intcount); intCountMine(charboard[ROWS][COLS],intx,inty); voidshow_recusion(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty); intcheckwin(charmine[ROWS][COLS],introw,intcol); intmain() { srand((unsignedint)time(NULL)); intinput=0; do { menu(); printf("请选择:>\n"); scanf("%d",&input); switch(input) { case1: printf("游戏开始!\n"); game(); break; case0: printf("退出游戏!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } }while(input); return0; } voidmenu() { printf("****************\n"); printf("*****1.play*****\n"); printf("*****0.exit*****\n"); printf("****************\n"); } voidInitBoard(charboard[ROWS][COLS],introw,intcol,charset) { inti=0,j=0; for(i=0;i =1) { intx=rand()%row+1; inty=rand()%col+1; if(mine[x][y]=='0') { mine[x][y]='1'; count--; } } } intCountMine(charboard[ROWS][COLS],intx,inty) { inti=0,j=0; intsum=0; for(i=x-1;i<=x+1;i++) { for(j=y-1;j<=y+1;j++) { sum+=board[i][j]; } } returnsum-9*'0';//巧妙利用10设计,将字符串转化为整型输出 } voidshow_recusion(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty) { inti=0,j=0; for(i=x-1;i<=x+1;i++) { for(j=y-1;j<=y+1;j++) { if(show[i][j]!=''&&i>=1&&i<=ROW&&j>=1&&j<=COL) { inttemp=CountMine(mine,i,j); show[i][j]=temp+'0'; if(show[i][j]=='0') { show[x][y]=''; show_recusion(mine,show,i,j);//递归实现扫雷的扩展 } } } } } intcheckwin(charshow[ROWS][COLS],introw,intcol) { inti=0,j=0; intcount=row*col-EASY_COUNT; for(i=1;i<=row;i++) { for(j=0;j<=col;j++) { if(show[i][j]!='*'&&show[i][j]!='B') { count--;//遍历检查是否全部非雷区已被判断 } } } if(count==0) { return1; } else { return0; } } voidFindMine(charshow[ROWS][COLS],charmine[ROWS][COLS],introw,intcol,intcount)// { while(1) { intinput=0; printf("******1标记雷区*****\n");//实现扫雷中的标记功能 printf("******2输入坐标*****\n");//实现扫雷中的输入功能 scanf("%d",&input); if(input==1){ printf("请输入要选择的坐标:>\n"); intx,y; scanf("%d%d",&x,&y); if(x>=1&&x<=row&&y>=1&&y<=col) { if(show[x][y]=='*') { show[x][y]='B'; DisplayBoard(show,ROW,COL); } else { printf("非法输入!请重新输入!\n"); } } else { printf("请重新输入!\n"); } } elseif(input==2) { printf("请输入要选择的坐标:>\n"); intx,y; scanf("%d%d",&x,&y); if(x>=1&&x<=row&&y>=1&&y<=col) { if(show[x][y]=='*'||show[x][y]=='B') { if(mine[x][y]=='1') { printf("boom!很遗憾您输了!\n"); break; } else { show[x][y]=CountMine(mine,x,y)+'0'; if(show[x][y]=='0') { show[x][y]=''; show_recusion(mine,show,x,y); } DisplayBoard(show,row,col); if(checkwin(show,ROW,COL)==1) { printf("恭喜您获胜了!\n"); break; } } } else { printf("重复输入!请重新输入!\n"); } } else { printf("请重新输入!\n"); } }else{ printf("输入错误!\n"); } } } voidgame() { charmine[ROWS][COLS]; charshow[ROWS][COLS]; InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'*'); //DisplayBoard(mine,ROW,COL);//此处代码为测试用 DisplayBoard(show,ROW,COL); SetMine(mine,ROW,COL,EASY_COUNT); //DisplayBoard(mine,ROW,COL);//此处代码为测试用 //DisplayBoard(show,ROW,COL);//此处代码为测试用 FindMine(show,mine,ROW,COL,EASY_COUNT); }
Part4总结:
扫雷及三子棋为C语言数组知识、条件语句、函数知识的综合应用,更多的体现了设计程序的合理性和严谨性,即合理设计搭建函数。相比于五子棋需要更多算法知识,扫雷相对较为容易,但依然有很多细节有待优化。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。