电机控制工程师的福音:手把手教你配置TMS320F280049的SDFM模块进行电流采样
2026/6/8 5:13:41
使用两个二维数组实现核心存储:
mine[ROWS][COLS]:雷区数组,'1'表示地雷,'0'表示非雷(ROWS/COLS 比实际棋盘大 2,避免边界越界判断);show[ROWS][COLS]:显示数组,初始为'*'(未排查),排查后显示数字(周边地雷数)或空格,标记地雷时显示'#'。尺寸定义(以 9×9 棋盘为例):
c
运行
#define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define MINE_COUNT 10 // 地雷总数mine初始化为'0',再随机生成MINE_COUNT个'1'(地雷);show初始化为'*',隐藏所有信息。关键逻辑:随机生成地雷位置时,需判断位置是否已存在地雷,避免重复。
按行打印显示数组show,标注行号和列号,提升玩家操作体验,示例格式:
plaintext
1 2 3 4 5 6 7 8 9 1 * * * * * * * * * 2 * * * * * * * * * ... 9 * * * * * * * * *设计get_mine_count函数,传入坐标(x,y),遍历该位置周边 8 个格子,统计雷区数组中'1'的数量,返回结果用于显示。
'#'(再次输入可取消标记)。统计显示数组中未排查的格子数('*'和'#'的总数),若等于地雷数量,则判定玩家胜利。
c
运行
#include <stdio.h> #include <stdlib.h> #include <time.h> // 棋盘尺寸定义 #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define MINE_COUNT 10 // 函数声明 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); void PrintBoard(char board[ROWS][COLS], int row, int col); void SetMine(char mine[ROWS][COLS], int row, int col); int GetMineCount(char mine[ROWS][COLS], int x, int y); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); int main() { // 初始化雷区和显示数组 char mine[ROWS][COLS] = {0}; char show[ROWS][COLS] = {0}; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); // 随机生成地雷 srand((unsigned int)time(NULL)); SetMine(mine, ROW, COL); // 游戏主循环 FindMine(mine, show, ROW, COL); return 0; } // 初始化棋盘 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 PrintBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; // 打印列号 printf(" "); for (j = 1; j <= col; j++) { printf("%d ", j); } printf("\n"); // 打印棋盘内容 for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } // 设置地雷 void SetMine(char mine[ROWS][COLS], int row, int col) { int count = MINE_COUNT; while (count > 0) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } // 统计周边地雷数量 int GetMineCount(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 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 - MINE_COUNT) { // 打印当前棋盘 PrintBoard(show, row, col); // 玩家输入坐标 printf("请输入要排查的坐标(行 列):"); scanf("%d %d", &x, &y); // 校验坐标合法性 if (x >= 1 && x <= row && y >= 1 && y <= col) { // 踩雷 if (mine[x][y] == '1') { printf("很遗憾,你踩雷了!\n"); PrintBoard(mine, row, col); break; } else { // 未踩雷,统计周边地雷数 int count = GetMineCount(mine, x, y); show[x][y] = count + '0'; win++; } } else { printf("坐标非法,请重新输入!\n"); } } // 胜利判定 if (win == row * col - MINE_COUNT) { printf("恭喜你,排雷成功!\n"); PrintBoard(mine, row, col); } }0 0切换标记模式),支持标记 / 取消标记疑似地雷位置;SetConsoleTextAttribute);扫雷游戏的核心是二维数组的操作和逻辑分支的处理,重点需注意:
srand((unsigned int)time(NULL))),避免地雷位置固定;通过这个案例,不仅能巩固 C 语言的数组、循环、函数等基础语法,还能锻炼逻辑思维和边界条件处理能力。在此基础上,可进一步扩展图形界面、存档功能等,让游戏更完善。