扫雷游戏:
1.第一次不会被炸死。
2.坐标周围没有雷,实现展开。
第一步:先建个头文件,方便我们写测试,游戏文件。
game.h 如下:
#ifndef _GAME_H_ //防止头文件被重复引用,用ifndef/define/endif产生预处理块 #define _GAME_H_ typedef unsigned int uint; enum OPTION //利用枚举,把EXIT,初始化为0,START为1 { EXIT, START }; enum MINE_COUNT //同理 { EASY_COUNT=10 }; #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set); //声明函数 void PrintBoard(char board[ROWS][COLS],int rows,int cols); void SetMine(char board[ROWS][COLS],int row,int col,int x,int y); int GetMineCount(char mine[ROWS][COLS],int x,int y); void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int row,int col,int x,int y); #endif
第二步:建测试文件(test.c),用循环实现重复玩游戏,调用函数功能
test.c 如下:
#include"game.h" //引用头文件 void menu() { printf("____________________\n"); //开始界面 printf("|*****扫雷游戏*****|\n"); printf("|******1.play******|\n"); printf("|******0.exit******|\n"); printf("|------------------|\n"); } void game() { int x = 0; int y = 0; int ret =0; int n = 0; char show[ROWS][COLS] = {0}; //创建2个数组,一个用来放你设置的雷,一个用来展示 char mine[ROWS][COLS] = {0}; InitBoard(show,ROWS,COLS,'*'); //初始化 InitBoard(mine,ROWS,COLS,'0'); PrintBoard(show,ROW,COL); //先把第一个图形展示出来 while(1) //用循环,是你能多次输入坐标 { printf("输入坐标:"); scanf("%d %d",&x,&y); if(n==0) //先让你输入坐标,才开始设置雷,这样就不会让你第一次被炸死了(也可以用其他办法) { SetMine(mine,ROWS,COLS,x,y); //设置雷 } if(x>0 && x<=ROW && y>0 && y<=COL) { ret = GetMineCount(mine,x,y); //得到雷数 if(ret==-1) { printf("很遗憾,你被炸死了\n"); PrintBoard(mine,ROW,COL); break; } else if(ret==-2) { printf("你已经排掉了所有雷"); break; } else { expend(mine,show,ROWS,COLS,x,y); //扩展 PrintBoard(show,ROW,COL); } } else printf("输入位置错误"); n++; } } int main() { int input = 0; srand((unsigned int )time(NULL)); //产生随机数 do { menu(); printf("请选择:"); scanf("%d",&input); switch(input) { case START: game(); break; case EXIT: printf("退出游戏\n"); break; default: printf("输入错误\n"); break; } } while(input); system("pause"); return 0; }
第三步:写game.c ,把函数封装在这里面,这样你每次调用,只需声明就ok了
game.c
#include"game.h" void InitBoard(char board[ROWS][COLS],int rows,int cols,char set) //初始化 { int i = 0; //也可用 memset(board,set,rols*cols*sizeof(board[0][0]) int j = 0; for(i=0; i<rows; i++) { for(j=0; j<cols; j++) board[i][j] = set; } } void PrintBoard(char board[ROWS][COLS],int row,int col) //打印函数 { int i = 0; int j = 0; printf(" "); for(i=1; i<col+1; i++) { printf(" %2d ",i); } printf("\n"); for(i=1; i<=row; i++) { printf("%-2d",i); for(j=1; j<=col; j++) { printf(" %2c ",board[i][j]); } printf("\n"); } } void SetMine(char board[ROWS][COLS],int rows,int cols,int x,int y) { int ret1 = 0; int ret2 = 0; int count = 0; while(count<EASY_COUNT) //设置10个雷,也可设很多个 { ret1 = rand()%(rows-3)+1; ret2 = rand()%(cols-3)+1; if(board[ret1][ret2]=='0') { if(ret1!=x || ret2!=y) { board[ret1][ret2] = '1'; count++; continue; } } } } int GetMineCount(char mine[ROWS][COLS],int x,int y) { if(mine[x][y]=='1') { return -1; } else if(mine[x][y]=='0') { return ((mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+ //得到x,y周围有多少个雷 mine[x][y-1]+mine[x][y+1]+ mine[x+1][y-1]+mine[x+1][y]+ mine[x+1][y+1])-8*('0')); } return -2; } void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int rows,int cols,int x,int y) { int i = 0; int j = 0; int count = 0; if(arr[x][y]=='*') { count=GetMineCount(board,x,y); if(count!=0 ) { arr[x][y]=count+'0'; } else { arr[x][y]='0'; for(i=-1; i<=1; i++) { for(j=-1; j<=1; j++) { if( (x+i>=1) && (x+i<=ROWS) && (y+j>=-1) &&(y+j<=COLS)) { if((i!=0)||(j!=0)) expend(board,arr,ROWS,COLS,x+i,y+j);//用递归不断展开,直到它周围有雷 } } } } } }//也可用 memset(board,set,rols*cols*sizeof(board[0][0]
到此结束,我们看一下运行结果
有哪里做的不好请大家见谅,毕竟我也是新手,希望大家每天都能进步。