构建游戏的大致思路
首先判断玩家是否玩游戏
构建两个棋盘,一个展示给玩家的棋盘,一个布雷信息的棋盘
再构建排雷方法
最后判断输赢
主函数main()
#include <stdio.h> #include <stdlib.h> //扫雷游戏 #include "game2.h" void menu() { printf("********** 1.Play 0.exit ***********\n"); } void game() { //雷的信息存储 //1.布置好的雷的信息 char mine[ROWS][COLS] = {0}; //11*11 //2.排查出雷的信息 char show[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); } int test() { int input = 0; srand((unsigned int)time(NULL)); do{ menu(); printf("请选择:>"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择:\n"); } }while(input); //表示玩了之后还可以玩 不想玩选0 直接退出循环 } int main() { test(); return 0; }
声明game.h()
#define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //布置雷的个数 #include <stdio.h> #include <stdlib.h> #include <time.h> void InitBoard(char board[ROWS][COLS],int rows, int cols, char set); void DisplayBoard(char board[ROWS][COLS], int row, int col); void SetMine(char board[ROWS][COLS], int row, int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
游戏实现函数
#include "game2.h" void InitBoard(char board[ROWS][COLS],int rows, int cols, char set) { int i = 0; int j = 0; for(i = 0; i<rows; i++) { for(j = 0; j<cols; j++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS],int row, int col) { int i = 0; int j = 0; //打印列号 for(i=0; i<=col;i++) { printf("%d ",i); } printf("\n"); for(i=1;i<=row;i++) //注意i=1开始 打印中间的9*9的棋盘 { //打印行号 printf("%d ",i); for(j=1;j<=col;j++) //j=1开始 { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while(count) { int x = rand() % row+1; //1-9; int y = rand() % col+1; //1-9; if(board[x][y] == '0') { board[x][y] = '1'; count--; } } } // '0' - '0' = 0 // '1' - '0' = 1 // '3' - '0' = 3 get_mine_count(char mine[ROWS][COLS],int x, int y) { return 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'; } //展开功能的实现 //void Expand(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) //{ // int i = 0; // int j = 0; // int count1 = 0; // int count = 0; // count = get_mine_count(mine, x, y); //统计x,y坐标周围雷数 // if(count == 0) // { // show[x][y] = ' '; //展示棋盘该坐标为 空格 // //判断x,y周围坐标 // for(i=x-1;i<=x+1;i++) // { // for(j=y-1;j<=j+1;j++) // { // if(i != x && j != y) // { // count1 = get_mine_count(mine, i, j); // if (count1 == 0) // Expand(mine,show,i,j); // else // show[i][j] = count1 + '0'; // } // // } // } // // } // else // show[x][y] = count +'0'; //} void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while(win< row*col-EASY_COUNT) { printf("请输入排查雷的坐标:>"); scanf("%d%d",&x,&y); //坐标合法 if(x>=1 && x<=row && y>=1 && y<=col) { //踩雷 if(mine[x][y] == '1') { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine,row,col); break; } else //不踩雷 { //计算x,y坐标周围有几个雷 int count = get_mine_count(mine, x, y); show[x][y] = count + '0'; //count 变为字符 DisplayBoard(show,row,col); // Expand(mine,show,x,y); // DisplayBoard(mine,row,col); // DisplayBoard(show,row,col); } } else { printf("输入坐标非法,请重新输入\n"); } } if(win == row*col-EASY_COUNT) { printf("恭喜你,排雷成功!\n"); DisplayBoard(mine,row,col); } }