☰
写一个扫雷代码
2026/10/27 18:59:08 网站建设 项目流程

第一步先将菜单以及选项给呈现出来

使用do....while来实现选项,因为只需要执行此选项即可,因此设置返回值为void

#include<stdio.h> static void menu() { printf("****************\n"); printf("***1.开始游戏***\n"); printf("***0.退出游戏***\n"); printf("****************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); int i = scanf("%d", &input); switch (input) { case 1: game(); //这个game函数实现整个游戏的运作 case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }

此时实现game这个函数,因为只需要它执行,不需要返回类型,同理设置为void

static void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL);//埋雷 //DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL);//打印棋盘 FindMine(mine, show, ROW, COL); }

逐条分析

这两条是创键棋盘,一个用来安置,一个用来查看

char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 };

这两条是用来初始化棋盘

InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*');

这是InitBoard函数的实现

第一条是初始化棋盘,在此棋盘内埋雷,第二条则是隐藏棋盘,来猜雷在哪里

void InitBoard(char board[ROWS][COLS], int r, int c, char set)//初始化棋盘 { int i = 0; for (i = 0; i < r; i++) { int j = 0; for (j = 0; j < c; j++) { board[i][j] = set; } } }

定义棋盘的大小

#define ROW 9 #define COL 9

当排雷时,会不可避免的越界,因此可以再加上一圈棋盘来防止越界

#define ROWS ROW+2 #define COLS COL+2

设置雷的个数

#define EASY_COUNT 10

埋雷

SetMine(mine, ROW, COL);//埋雷

实现如下

void SetMine(char mine[ROWS][COLS], int r, int c)//埋雷 { int count = EASY_COUNT; while (count) { int x = rand() % r + 1;//将x的值限定在9之内 int y = rand() % c + 1;//将y的值限定在9之内 if (mine[x][y] == '0')//如果值为'0',就将其设置为“雷” { mine[x][y] = '1';//如果值为'1',“雷”的个数减去一个 count--; } } }

srand((unsigned int)time(NULL));这条主要使rand函数生成的为随机值,包含的“time”就是一个一直在改变的值,从而可实现随机的效果

此函数用来排查雷

int GetMineCount(char mine[ROWS][COLS], int x, int y)

实现如下

int GetMineCount(char mine[ROWS][COLS], int x, int y)//判断每个坐标周围雷的个数 { int i = 0; int j = 0; int c = 0; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { if (mine[x + i][y + j] == '1') c++; } } return c; }

以下为找雷的代码

void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c)//找雷 { int x = 0; int y = 0; int win = 0; while (win<r*c-EASY_COUNT) { int f= scanf("%d %d", &x, &y); if (x >= 1 && x <= r && y >= 1 && y <= c) { if (mine[x][y] == '1') { printf("很遗憾,游戏结束\n"); DisplayBoard(mine, r, c); break; } else { if (show[x][y] == '*') { int c = GetMineCount(mine, x, y); show[x][y] = c + '0'; DisplayBoard(show, ROW, COL); win++; } else { printf("该坐标已经被排查过,请重新输入坐标\n"); } } } else { printf("输入的坐标非法,请重新输入\n"); } } if (win==r*c-EASY_COUNT) { printf("排雷成功\n"); DisplayBoard(mine, ROW, COL); } }

完整代码实现如下

game.h

#include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char board[ROWS][COLS], int r, int c, char set); void DisplayBoard(char board[ROWS][COLS], int r, int c); void SetMine(char mine[ROWS][COLS], int r, int c); void FindMine(char mine[ROWS][COLS

game.c

//函数定义 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void InitBoard(char board[ROWS][COLS], int r, int c, char set)//初始化棋盘 { int i = 0; for (i = 0; i < r; i++) { int j = 0; for (j = 0; j < c; j++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int r, int c)//打印棋盘 { int i = 0; printf("----扫雷----\n"); for (i = 0; i <= c; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= r; i++) { int j = 0; printf("%d ", i); for (j = 1; j <= c; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char mine[ROWS][COLS], int r, int c)//埋雷 { int count = EASY_COUNT; while (count) { int x = rand() % r + 1; int y = rand() % c + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } static int GetMineCount(char mine[ROWS][COLS], int x, int y)//判断每个坐标周围雷的个数 { int i = 0; int j = 0; int c = 0; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { if (mine[x + i][y + j] == '1') c++; } } return c; } void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c)//找雷 { int x = 0; int y = 0; int win = 0; while (win<r*c-EASY_COUNT) { int f= scanf("%d %d", &x, &y); if (x >= 1 && x <= r && y >= 1 && y <= c) { if (mine[x][y] == '1') { printf("很遗憾,游戏结束\n"); DisplayBoard(mine, r, c); break; } else { if (show[x][y] == '*') { int c = GetMineCount(mine, x, y); show[x][y] = c + '0'; DisplayBoard(show, ROW, COL); win++; } else { printf("该坐标已经被排查过,请重新输入坐标\n"); } } } else { printf("输入的坐标非法,请重新输入\n"); } } if (win==r*c-EASY_COUNT) { printf("排雷成功\n"); DisplayBoard(mine, ROW, COL); } }

text.h

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include"game.h" static void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL);//埋雷 //DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL);//打印棋盘 FindMine(mine, show, ROW, COL); } static void menu() { printf("****************\n"); printf("***1.开始游戏***\n"); printf("***0.退出游戏***\n"); printf("****************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); int i = scanf("%d", &input); switch (input) { case 1: game(); case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询