扫雷游戏编程
2026/6/30 9:53:35 网站建设 项目流程

一、扫雷游戏介绍

扫雷(Minesweeper)是一款经典的逻辑推理游戏。虽然规则简单,但非常考验逻辑判断和一定的运气。以下是扫雷的核心规则与基本技巧:
1. 游戏目标
在一个隐藏的网格中,找出所有没有地雷的格子,并避开所有地雷。一旦点开地雷,游戏直接失败;当所有安全格子都被点开(或所有地雷都被正确标记)时,游戏胜利。
2. 核心数字规则(最重要)
当你点开一个安全的格子时,上面会显示一个数字(1-8)。
这个数字代表:以该格子为中心,周围紧挨着的 8 个格子中,一共埋藏了多少颗地雷。
例如:
显示 1:周围 8 个格子中,只有 1 颗地雷。
显示 3:周围 8 个格子中,有 3 颗地雷。
显示 0(通常不显示数字,直接展开一片空白):周围 8 个格子全都没有地雷。
3. 玩家操作
左键点击:翻开格子。如果点到地雷则游戏结束;如果是数字或空白则继续。

由于只是入门级的扫雷游戏教程,这里不使用鼠标点击,而是使用输入坐标为代替。

二、前期代码

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <stdio.h> #include "game.h" void menu() { printf("********扫雷游戏*********\n"); printf("*******1、开始游戏*******\n"); printf("*******0、退出游戏*******\n"); } void game() { char show[ROWS][COLS] = { 0 }; char mine[ROWS][COLS] = {0}; initboard(mine,ROWS,COLS,'0'); initboard(show, ROWS, COLS, '*'); displayboard(show, ROW, COL); setmine(mine, ROW, COL); //排雷 finemine(mine,show,ROW,COL); } void test() { srand((unsigned int)time(NULL)); int input=0; do { menu(); printf("请选择:\n"); scanf("%d", &input); switch (input) { case 1: printf("---------开始游戏---------\n"); game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误!"); printf("重新选择:\n"); break; } } while (input); } int main() { test(); return 0; }

在test.c的源文件中实现目录及各种函数调用功能。

三、核心内容

1、创建棋盘

这里我们考虑使用两个数组,一个数组存放雷与非雷,另一个存放排查出的雷的信息。

原因:防止冲突,区别设置雷为1和统计雷个数为1做区分。

如果棋盘的大小是9*9,数组的大小就给11*11。

因为若查找的地方没有地雷,需要显示周围八格中地雷的数量,而在最下方(9,7)的位置周围不足八格,这样就很容易出错,所以我们需要在周围再加上一圈格子,并且这一圈不存放地雷。

#pragma once #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2
char show[ROWS][COLS] = { 0 }; char mine[ROWS][COLS] = {0};

实现效果:

2、棋盘初始化

定义一个initbroad的函数

void initboard(char board[ROWS][COLS], int rows, int cols,char set) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { board[i][j] = set; } } }

将创建的两个棋盘分别初始化

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

效果展示:

3、制作一个展示棋盘的功能

定义一个函数displaybroad

void displayboard(char board[ROWS][COLS], int row, int col) { for (int i = 0; i <= row; i++) { printf("%d ", i); } printf("\n"); for (int i = 1; i <= row; i++) { printf("%d ", i); for (int j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } }

4、放置地雷到棋盘中

制作一个放置地雷的函数

void setmine(char board[ROWS][COLS], int row, int col) { int count = 10; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } }

一共放置十个地雷。

setmine(mine, ROW, COL);

效果展示:

没有雷的都是0,有雷的就变成1。

5、排雷过程

static int get_mine_count(char mine[ROWS][COLS],int x,int y) { int count = (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'; return count; } void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x=0, y=0; int win = 0; while (win<col*row-10) { printf("请输入你要排查的坐标:\n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你被炸死了\n"); displayboard(mine, ROW, COL); break; } else { int count = get_mine_count(mine, x, y); show[x][y] = count + '0'; displayboard(show, ROW, COL); win++; } } else { printf("坐标非法,请重新输入\n"); } } if (win == col * row - 10) { printf("恭喜你,排雷成功!"); displayboard(mine, ROW, COL); } }

如果输入不是雷,就会显示周围的雷数,此效果展示中把雷在哪都显示出来了,在全部源码中我不会打印雷在哪的,大家可以试玩哟

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

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

立即咨询