扫雷c语言简易版,它来了!!

本文介绍了使用C语言实现扫雷游戏的基本流程和关键代码,包括创建用户交互菜单、生成地图与初始化、地图打印和更新,以及game()函数的详细说明。通过这个游戏,读者可以加深对指针的理解。
摘要由CSDN通过智能技术生成

游戏介绍

  扫雷,顾名思义,就是排除所有的雷,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

基本流程

1.创建用户交互菜单;
2.创建地图并初始化;
3.打印地图;
4.程序读取玩家要翻的坐标并校验;
5.判断该位置的坐标是否有地雷,如果有地雷,则游戏结束;
6.如果不是地雷, 统计当前位置周围雷的个数, 并显示到地图上;
7.判定游戏是否胜利。

代码实现

创建用户交互菜单

int menu(){
   //用户交互菜单
	printf("======================\n");
	printf("1.开始游戏\n");
	printf("0.结束游戏\n");
	printf("======================\n");
	printf("请输入您的选择:");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

  这里我们最开始创建一个用户菜单供用户选择游戏的开始和结束。(这里小小的吐槽一下,每次我敲完代码,都会出现错误,而且大多数情况下都是scanf没有&,所以大家也要注意啦)

创建地图并初始化

void init(char ShowMap[MAX_ROW][MAX_COL], char MineMap[MAX_ROW][MAX_COL]){
   //初始化地图
	//先初始化showmap
	for (int row = 0; row < MAX_ROW; row++){
   
		for (int col = 0; col < MAX_COL; col++){
   
			ShowMap[row][col] = '*';//ShowMap的初始化我们用‘*’表示
		}
	}
	for (int row = 0; row < MAX_ROW; row++){
   
		for (int col = 0; col < MAX_COL; col++){
   
			MineMap[row][col] = '0';//MineMap的初始化我们用‘ ’表示
		}
	}
	int n = DEFAULT_MINE_COUNT;
	while (n > 0) {
   
		// 生成雷的随机位置. 
		int row = rand() % MAX_ROW; 
		int col = rand() % MAX_COL;
		if (MineMap[row][col] == '1') {
   
			// 如果当前位置已经有雷了, 就直接进入下次循环, 重新
			// 产生随机位置. 
			continue;
		}
		MineMap[row][col] = '1';
		n--;
	}
}

  这里要注意的是我们打印地图的时候要打印两个地图,一个是供用户选择坐标翻的地图,另外一个是我们地雷随机出现的地图,在MineMap中,我们地雷随机出现采用srand随机数,同时定义宏地雷的总数。

  我们初始化ShowMap一开始所有格子为’*’,MineMap一开始所有格子为‘0’,地雷我们用’1’来表示。

地图打印

void printMap(char theMap[MAX_ROW][MAX_COL]){
   //打印地图
	printf("  |");
	for (int col = 0; col < MAX_COL; col++) {
   
		printf("%d ", col);
	}
	printf("\n"
  • 181
    点赞
  • 567
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
以下是一个简单的基于Linux的扫雷游戏C语言代码。代码实现了一个简单的扫雷游戏,玩家可以选择不同的难度级别并尝试找到所有地雷。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 10 #define COL 10 #define EASY 10 #define MEDIUM 20 #define HARD 30 int main() { int board[ROW][COL], num_mines, num_flags; int i, j, r, c, count, gameover = 0, win = 0, choice; char action; srand(time(NULL)); printf("Welcome to Minesweeper\n"); printf("----------------------\n"); printf("Choose a difficulty level:\n"); printf("1. Easy\n2. Medium\n3. Hard\n"); scanf("%d", &choice); switch (choice) { case 1: num_mines = EASY; break; case 2: num_mines = MEDIUM; break; case 3: num_mines = HARD; break; default: printf("Invalid choice. Defaulting to Easy difficulty.\n"); num_mines = EASY; break; } //initialize board with 0's for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = 0; } } //place mines randomly for (i = 0; i < num_mines; i++) { r = rand() % ROW; c = rand() % COL; if (board[r][c] == -1) { //already a mine here i--; continue; } board[r][c] = -1; } //fill in numbers for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == -1) { //skip mines continue; } count = 0; if (i-1 >= 0 && j-1 >= 0 && board[i-1][j-1] == -1) count++; if (i-1 >= 0 && board[i-1][j] == -1) count++; if (i-1 >= 0 && j+1 < COL && board[i-1][j+1] == -1) count++; if (j-1 >= 0 && board[i][j-1] == -1) count++; if (j+1 < COL && board[i][j+1] == -1) count++; if (i+1 < ROW && j-1 >= 0 && board[i+1][j-1] == -1) count++; if (i+1 < ROW && board[i+1][j] == -1) count++; if (i+1 < ROW && j+1 < COL && board[i+1][j+1] == -1) count++; board[i][j] = count; } } //game loop while (!gameover && !win) { num_flags = 0; printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); num_flags++; } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); printf("Number of flags: %d\n", num_flags); printf("Enter coordinate and action (f = flag, u = unflag, r = reveal): "); scanf("%d %d %c", &r, &c, &action); if (r < 0 || r >= ROW || c < 0 || c >= COL) { printf("Invalid coordinate.\n"); continue; } if (action == 'f' || action == 'F') { //flag if (board[r][c] != -2) { board[r][c] = -2; } else { board[r][c] = 0; } } else if (action == 'r' || action == 'R') { //reveal if (board[r][c] == -1) { //mine gameover = 1; } else { board[r][c] += 10; //reveal if (board[r][c] == 9) { //win win = 1; } else if (board[r][c] == 10) { //empty square //reveal adjacent squares if (r-1 >= 0 && c-1 >= 0 && board[r-1][c-1] >= 0 && board[r-1][c-1] <= 8) board[r-1][c-1] += 10; if (r-1 >= 0 && board[r-1][c] >= 0 && board[r-1][c] <= 8) board[r-1][c] += 10; if (r-1 >= 0 && c+1 < COL && board[r-1][c+1] >= 0 && board[r-1][c+1] <= 8) board[r-1][c+1] += 10; if (c-1 >= 0 && board[r][c-1] >= 0 && board[r][c-1] <= 8) board[r][c-1] += 10; if (c+1 < COL && board[r][c+1] >= 0 && board[r][c+1] <= 8) board[r][c+1] += 10; if (r+1 < ROW && c-1 >= 0 && board[r+1][c-1] >= 0 && board[r+1][c-1] <= 8) board[r+1][c-1] += 10; if (r+1 < ROW && board[r+1][c] >= 0 && board[r+1][c] <= 8) board[r+1][c] += 10; if (r+1 < ROW && c+1 < COL && board[r+1][c+1] >= 0 && board[r+1][c+1] <= 8) board[r+1][c+1] += 10; } } } else if (action == 'u' || action == 'U') { //unflag if (board[r][c] == -2) { board[r][c] = 0; } } else { printf("Invalid action.\n"); } } //game over, reveal all squares printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else if (board[i][j] == -1) { //mine printf("M "); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); if (gameover) { printf("Game over! You hit a mine.\n"); } else { printf("Congratulations, you win!\n"); } return 0; } ``` 该代码包括以下功能: - 难度选择 - 地雷随机放置 - 数字填充 - 可以插旗 - 可以取消插旗 - 可以揭开方块 - 只有揭开所有非地雷方块才能获胜 这个代码还有可以改进的地方,比如增加计时器和玩家得分等等。但是,希望这个代码可以给你提供一个基础的思路和参考。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值