C语言之扫雷游戏

一、头文件game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#include
#define COUNT 10
#include
//声明函数
//棋盘初始化函数
void initboard(char arr[ROWS][COLS], int rows, int cols,char set);
//打印棋盘
void displayboard(char arr[ROWS][COLS], int row, int col);
//布置雷
void setmine(char arr[ROWS][COLS], int row, int col);
//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

二、game.c


#include"game.h"
#include
void initboard(char arr[ROWS][COLS], int rows, int cols,char set) {
	int i = 0;
	for (; i < rows; i++) {
		int j = 0;
		for (; j < cols; j++) {
			arr[i][j] = set;
		}
	}
}
void displayboard(char arr[ROWS][COLS], int row, int col) {
	int i = 0;
	printf("--扫雷游戏--\n");
	for (i = 0; i <= col; i++) {
		printf("%d", i);
	}printf("\n");
	for (i = 1; i <= row; i++) {
		int j = 1;
		printf("%d", i);
		for (; j <= col; j++) {
			printf("%c",arr[i][j]);
		}printf("\n");
	}
}
void setmine(char arr[ROWS][COLS], int row, int col) {
	int count = COUNT;
	while (count) {
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0') {
			arr[x][y] = '1';
			count--;
		}
	}
}
int getmine(char mine[ROWS][COLS], int x, int y) {
	return 
		mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + 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= 1 && x <= row && y >= 1 && y <= col) {
			if (mine[x][y] == '1') {
				printf("有雷");
				displayboard(mine, ROW, COL);
				break;
			}
			else {
				//坐标不是雷
				int counter = getmine(mine, x, y);
				show[x][y] = counter + '0';
				displayboard(show, ROW, COL);
				win++;
			}
		}
		else {
			printf("error");
		}
	}if (win == row * col - COUNT) {
		printf("你赢了\n");
		displayboard(mine, ROW, COL);
	}
}
  1. initboard 函数: 这个函数接收一个二维字符数组 arr 作为棋盘,以及棋盘的行数 rows 和列数 cols。它将棋盘上所有的位置都设置为传入的 set 字符。在这个上下文中,set 应当为 '0' 表示无雷的安全位置。

  2. displayboard 函数: 这个函数负责将棋盘打印到控制台。首先打印顶部编号,然后是棋盘每一行的编号和对应的内容。这里有一个小错误,即对行和列的遍历是从 1 开始的,但实际上数组的下标是从 0 开始的。

  3. setmine 函数: 这个函数随机地在棋盘上放置一定数量的雷。它生成随机坐标,并将对应的棋盘位置设置为 '1' 表示雷。这个过程一直持续到所有雷都被放置完毕。

  4. getmine 函数: 这个函数计算指定单元格周围八个方向上雷的数量。它通过对周围的单元格求和并减去 8 * '0' 来实现这一点。这里的逻辑是错误的,因为它没有考虑到只有当值为 '1' 时才表示雷的存在。

  5. findmine 函数: 这个函数允许玩家输入坐标来翻开棋盘上的一个格子。如果翻开的格子是雷,则游戏结束并显示整个雷区;如果不是雷,则显示周围雷的数量。同时,每成功翻开一个安全格子,变量 win 会增加,直到翻开所有非雷的格子,此时宣布玩家胜利。

三、test.c

#include
#include"game.h"
void menu() {
	printf("1:play\n");
	printf("0:exit\n");
}
void game() {
	//扫雷游戏
	//mine数组里存放雷的位置
	//show数组里存放排查出雷的位置
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化棋盘
	initboard(mine, ROWS, COLS, '0');
	initboard(show, ROWS, COLS, '*');
	//打印棋盘
	/*displayboard(mine, ROW, COL);*/
	/*printf("\n");
	displayboard(show, ROW, COL);*/
	//布置雷
	//随机布置十个雷
	setmine(mine,ROW,COL);
	displayboard(mine, ROW, COL);
	displayboard(show, ROW, COL);
	//排查雷
	findmine(mine, show, ROW, COL);
}
void test() {
	int input = 0;  
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input) {
		case 1:
			printf("扫雷开始:\n");
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误:/n");
			break;
		}
	} while (input);
}
int main() {
	test();
	return 0;
}

你可能感兴趣的:(c语言,游戏,开发语言)