#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "game.h" //9*9 棋盘 上面布置10个雷-->需要一个9*9的数组 为了数组元素不越界 需要一个11*11的数组 //排查雷 //1.如果这个位置不是雷,就计算这个位置的周围8个坐标有几个雷,并显示雷的个数 //2.如果这个位置是雷,就炸死了,游戏结束了 //3.如果把不是雷的位置都找了出来,则游戏结束 //1.假设要布置10个雷:随机布置 void menu() { printf("******************************\n"); printf("*********** 1.play ***********\n"); printf("*********** 0.exit ***********\n "); printf("******************************\n"); } void game() { char mine[ROWS][COLS] = {0};//放布置好的雷的信息 char show[ROWS][COLS] = {0};//排查出的雷的信息 InitBoard(mine, ROWS, COLS, '0');//初始化棋盘函数 加外一层 初始化mine数组和show数组 InitBoard(show, ROWS, COLS, '*');//c=初始化棋盘 //DisplayBoard(mine,ROW,COL);//打印中间的9*9棋盘 打印雷的信息 DisplayBoard(show, ROW, COL);//打印扫雷界面 row 显示棋盘 rows 布置棋盘 //布置雷 SetMine(mine, ROW, COL); DisplayBoard(mine, ROW, COL); //布置雷的过程 可以看雷的安置 //排查雷 FindMine(mine, show, ROW, COL); } int main() { srand((unsigned int)time(NULL)); //rand函数前要调用srand int input = 0; do { menu(); printf("请选择>:\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
game.c
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)/t:要初始化的字符 {//for循环进行遍历 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; printf("——————扫雷——————\n"); for (i = 0; i <= col; i++)//打印列号 从0开始 对齐 { 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"); } printf("——————扫雷——————\n"); } void SetMine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT;//布置10个雷 while (count)//循环次数大于等于10次 { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] != '1')//判断雷区有没有东西 { mine[x][y] = '1'; count--; } } } int GetMineCount(char mine[ROWS][COLS], int x, int y) { 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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; int z = 0; while (win<row*col-EASY_COUNT)//一直让你扫雷 { printf("请您输入排查雷的坐标:x,y\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1')//判断坐标处是否是0; { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine, ROW, COL);//打印出mine数组 死得瞑目 break;//被炸死了 跳出 } else//不是雷 统计周围八个x,y坐标有几个雷 (x-1,y-1),(x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1) { if (mine[x - 1][y - 1] == '1') z++; if (mine[x - 1][y] == '1') z++; if (mine[x - 1][y + 1] == '1') z++; if (mine[x][y - 1] == '1') z++; if (mine[x][y + 1] == '1') z++; if (mine[x + 1][y - 1] == '1') z++; if (mine[x + 1][y] == '1') z++; if (mine[x + 1][y + 1] == '1') z++; //不是雷,就统计x,y坐标周围雷的个数 //int c = GetMineCount(mine, x, y); show[x][y] = z + '0'; //遍历重新打印 DisplayBoard(show, ROW, COL); win++; } } else { printf("坐标非法,请重新输入\n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,排雷成功!\n"); DisplayBoard(mine, ROW, COL); } }
头文件 game.h:
#pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 //.h是头文件 .c是源文件 #define COL 9 //显示棋盘数 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //简单版本定义 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);//11*11 rows:定义扫雷行列 //显示棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col);//9*9 row:真实布置行列 //布置雷 void SetMine(char mine[ROWS][COLS], int row, int col); //排查雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);