扫雷游戏

来源:互联网 发布:网络销售总结 编辑:程序博客网 时间:2024/05/20 18:46

扫雷游戏的难点在于递归判断周围是否有雷,没有的的话自动撑开这片区域。在一个就是它需要两个数组,一个用来显示一个用来埋雷。这样这样做是为了每个所要显示周围雷的个数都为9,就不用再把周边的元素单独处理了。


game.h

#ifndef __GAME_H__#define __GAME_H__#define ROWS 11#define COLS 11#define _mine 10void init_board(char mine[ROWS][COLS], char ret, int row, int col);void display(char mine[ROWS][COLS], int row, int col);void set_mine(char mine[ROWS][COLS],int x, int y);void count_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int* tmp);#endif

game.c
#include<string.h>#include<stdio.h>#include<stdlib.h>#include"game.h"void init_board(char mine[ROWS][COLS], char ret, int row, int col){memset(mine, ret, ROWS*COLS*sizeof(mine[1][1]));}void display(char mine[ROWS][COLS], int row, int col){int i;printf("  ");for(i=1; i<=ROWS-2; i++){printf("%d ",i);}printf("\n");for(i=1; i<=ROWS-2; i++){int j;printf("%d ",i);for(j=1; j<=COLS-2; j++){printf("%c ",mine[i][j]);}printf("\n");}}void set_mine(char mine[ROWS][COLS],int x,int y){int a=0;while(a<_mine){int i=rand()%9+1;int j=rand()%9+1;if((i!=x)||(j!=y))//由于第一个已经被揭开,所以不能再往上面布雷{if(mine[i][j]!='1'){mine[i][j]='1';a++;}}}}void count_mine(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y, int* tmp)//用递归使得揭开的那个数等于0时撑开周围的一片区域{int count=mine[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]-7*48;(*tmp)--;if(count=='0'){show[x][y]=' ';//等于零时不显示if((x-1>0)&&(show[x-1][y]=='*'))//只判断x是因为x和y传过来就是符合规定的数,只有x-1才有机会不合规定。下面的道理也一样count_mine(mine,show, x-1, y,tmp);if((x-1>0)&&(y-1>0)&&(show[x-1][y-1]=='*'))count_mine(mine,show, x-1, y-1,tmp);if((y-1>0)&&(show[x][y-1]=='*'))count_mine(mine,show, x, y-1,tmp);if((x+1<10)&&(y-1>0)&&(show[x+1][y-1])=='*')count_mine(mine,show, x+1, y-1,tmp);if((x+1<10)&&(show[x+1][y]=='*'))count_mine(mine,show, x+1, y,tmp);if((x+1<10)&&(y+1<10)&&(show[x+1][y+1]=='*'))count_mine(mine,show, x+1, y+1,tmp);if((x>0)&&(y+1<10)&&(show[x][y+1]=='*'))count_mine(mine,show, x, y+1,tmp);if((x-1>0)&&(y+1<10)&&(show[x-1][y+1]=='*'))count_mine(mine,show, x-1, y+1,tmp);}else show[x][y]=count;}

test.c

#include<stdio.h>#include<time.h>#include<stdlib.h>#include"game.h"void menu(){printf("*************************\n");printf("**** 1 play   0 exit ****\n");printf("*************************\n");}void game(){char mine[ROWS][COLS];char show[ROWS][COLS];int tmp=0;int x=0 ;int y=0;init_board(mine, '0', ROWS, COLS);init_board(show, '*', ROWS, COLS);display(show, ROWS, COLS);tmp=(ROWS-2)*(COLS-2)-_mine;//所要排雷的最多步数printf("请输入坐标>:");//第一步不埋雷scanf("%d%d",&x,&y);if(((x>=1)&&(x<=ROWS-2))&&((y>=1)&&(y<=COLS-2))){;}else{printf("输入有误,请重新输入:");}set_mine(mine, x, y);//走完第一步埋雷count_mine(mine,show,x,y,&tmp);//数这个坐标周围有几颗雷,值返回给显示矩阵。display(mine,ROWS,COLS);display(show,ROWS,COLS);while(tmp>0){printf("请输入坐标>:");scanf("%d%d",&x,&y);if(((x>=1)&&(x<=ROWS-2))&&((y>=1)&&(y<=COLS-2))&&show[x][y]=='*'){ if(mine[x][y]=='0'){count_mine(mine,show, x, y,&tmp);} else {printf("很遗憾,你牺牲了\n");break; } display(show, ROWS, COLS);}else{printf("坐标输入有误,请重新输入>:");}}if(tmp==0){printf("恭喜你,成功排除所有雷子\n");}}int main(){int input;srand((unsigned int)time(NULL));do{menu();printf("请选择>:");scanf("%d",&input);switch(input){case 0:break;case 1:game();break;default:printf("输入有误,请重新选择>:");break;}}while(input);return 0;}

0 0
原创粉丝点击