IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言实现扫雷游戏(可展开) -> 正文阅读

[C++知识库]C语言实现扫雷游戏(可展开)

本人初学者一枚,反复尝试写扫雷游戏,终于勉强成功,就不做过多讲解了,直接上代码,希望对同为初学者的你起到借鉴作用。

头文件内容,我的头文件名“saolei.h ”。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>

#define X 9//设置棋盘行数
#define Y 9//设置棋盘列数
#define Xx X+2
#define Yy Y+2
#define LEI 10//设置雷数
void print1();
void test();
void panduan(char arr1[Xx][Yy], char arr2[Xx][Yy], int a, int b,int* leishu);
void doplay(char arr1[Xx][Yy], char arr2[Xx][Yy], int x, int y);
void fuzhi(char arr[Xx][Yy], int x, int y, char vil);
void bulei(char arr1[Xx][Yy], int x, int y);

下为完整代码

#include"saolei.h"

void print2(char arr2[Xx][Yy], int x, int y)//打印棋盘
{
?? ?int i, j;
?? ?for (i = 0;i <= x;i++)
?? ?{
?? ??? ?printf("%-4d", i);
?? ?}
?? ?printf("\n");
?? ?for (i = 1;i <= x;i++)
?? ?{
?? ??? ?printf(" ?");
?? ??? ??? ?for (j = 1;j <= y;j++)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("|---");
?? ??? ??? ?}
?? ??? ?printf("|\n");
?? ??? ?printf("%d ",i);
?? ??? ??? ?for (j = 1;j <= y;j++)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("| %c ", arr2[i][j]);
?? ??? ??? ?}
?? ??? ?printf("|\n");
?? ?}
?? ?printf(" ?");
?? ??? ?for (i = 1;i <= x;i++)
?? ??? ?{
?? ??? ??? ?printf("|---");
?? ??? ?}
?? ?printf("|\n");
}

int main() //主函数
{
?? ?srand((unsigned int)time(NULL));
?? ?int input=0;
?? ?do
?? ?{
?? ??? ?print1();
?? ??? ?scanf("%d",&input);
?? ??? ?switch (input)
?? ??? ?{
?? ??? ?case 0:
?? ??? ??? ?printf("古德白\n");
?? ??? ??? ?break;
?? ??? ?case 1:
?? ??? ??? ?// system(“cls”);
?? ??? ??? ?test();
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("输入错误,重新收入\n");
?? ??? ?}
?? ?} while (input);
?? ?return 0;
}
void print1()//打印菜单,简单了点,可以用
{
?? ?printf("0.退出游戏\n1.开始游戏\n");
}
void test()
{
?? ?char arr1[Xx][Yy] = { 0 };
?? ?char arr2[Xx][Yy] = { 0 };

//初始化雷区
?? ?fuzhi(arr1, Xx, Yy,0);

//初始化棋盘
?? ?fuzhi(arr2, Xx, Yy,'*');

//布雷
?? ?bulei(arr1, X, Y);
?? ?print2(arr2, X, Y);
//?? ?print2(arr1, X, Y);

?? ?//玩游戏
?? ?doplay(arr1,arr2, X, Y);

}
void bulei(char arr1[Xx][Yy], int x, int y)
{
?? ?int count = LEI;
?? ?while (count)
?? ?{
?? ??? ?int q = rand() % X + 1;
?? ??? ?int w = rand() % Y + 1;
?? ??? ?if (arr1[q][w] == 0)
?? ??? ?{
?? ??? ??? ?arr1[q][w] = 1;
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
}
void fuzhi(char arr[Xx][Yy], int x, int y, char vil)
{
?? ?for (int i = 0;i <x;i++)
?? ?{
?? ??? ?for (int j = 0;j<y;j++)
?? ??? ?{
?? ??? ??? ?arr[i][j] = vil;
?? ??? ?}
?? ?}
}
void doplay(char arr1[Xx][Yy], char arr2[Xx][Yy], int x, int y)
{

//给出除雷数之外为点开的棋盘个数
?? ?int leishu = X * Y - LEI;
?? ?int a, b;
?? ?printf("请选择要下的位置->\n");
?? ?To1:
?? ?scanf("%d", &a);
?? ?scanf("%d", &b);
?? ?if (a<1 || a>x || b<1 || b>y)
?? ?{
?? ??? ?printf("坐标错误,请重新选择->\n");
?? ??? ?goto To1;
?? ?}
?? ? if (arr1[a][b] == 1)
?? ?{
?? ??? ?arr1[a][b] = 0;
?? ??? ?while (1)
?? ??? ?{
?? ??? ??? ?int q = rand() % X + 1;
?? ??? ??? ?int w = rand() % Y + 1;
?? ??? ??? ?if (arr1[q][w] == 0 && (q != a || w != b))
?? ??? ??? ?{
?? ??? ??? ??? ?arr1[q][w] = 1;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ?}

//把未点开数进行传参,没进入一次判断未點开数减1
?? ?panduan(arr1, arr2, a,b,&leishu);?? ?
?? ?while (leishu)
?? ?{
?? ??? ?system("CLS");
?? ??? ?//print2(arr1, X, Y);
?? ??? ?print2(arr2, X, Y);
?? ??? ?printf("请选择要下的位置->\n");
?? ??? ?scanf("%d%d", &a, &b);
?? ??? ?if (arr2[a][b] != '*')
?? ??? ?{
?? ??? ??? ?continue;
?? ??? ?}
?? ??? ?if (arr1[a][b] == 1)
?? ??? ?{
?? ??? ??? ?system("CLS");
?? ??? ??? ?printf("此处埋雷,游戏结束\n");
?? ??? ??? ?print2(arr1, X, Y);
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a, b,&leishu);
?? ??? ?}?? ??? ?
?? ?}?

//如果可未点开数为0,过关
?? ?if (leishu == 0)
?? ?{
?? ??? ?system("CLS");
?? ??? ?print2(arr1, X, Y);
?? ??? ?printf("恭喜过关\n");
?? ?}
}

//判断坐标,如果该坐标周围八个坐标相加等于0,输入空格并递归判断周围坐标,如果大于0输入字符数值
void panduan(char arr1[Xx][Yy], char arr2[Xx][Yy], int a, int b,int* leishu)
{

//可點开数减1
?? ? * leishu-=1;
?? ?int mmx =0;
?? ?for (int i = a - 1;i <= a + 1;i++)
?? ?{
?? ??? ?for (int j = b - 1;j <= b + 1;j++)
?? ??? ?{
?? ??? ??? ?if (arr1[i][j] == 1)
?? ??? ??? ?{
?? ??? ??? ??? ?mmx++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if (mmx == 0)
?? ?{
?? ??? ?arr2[a][b] = ' ';

? ? ?//分别判断周围(八个坐标是否合法,并且未判断过)进行递归判断
?? ??? ?if (a - 1 > 0 && b - 1 > 0&&arr2[a-1][b-1]=='*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a - 1, b - 1,leishu);
?? ??? ?}?? ??? ?
?? ??? ?if (a - 1 > 0 && arr2[a - 1][b] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a - 1, b, leishu);
?? ??? ?}
?? ??? ?if (a - 1 > 0 && b + 1 <= Y && arr2[a-1][b+1] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a - 1, b + 1, leishu);
?? ??? ?}
?? ??? ?if ( b - 1 > 0 && arr2[a][b-1] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a, b - 1, leishu);
?? ??? ?}
?? ??? ?if ( b + 1 <= Y && arr2[a][b+1] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a, b + 1, leishu);
?? ??? ?}
?? ??? ?if ( a + 1 <= X && b - 1 > 0 && arr2[a+1][b - 1] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a + 1, b - 1, leishu);
?? ??? ?}
?? ??? ?if ( a + 1 <= X && arr2[a +1][b] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a + 1, b, leishu);
?? ??? ?}
?? ??? ?if (a+1<=X&&b+1<=Y&& arr2[a +1][b+1] == '*')
?? ??? ?{
?? ??? ??? ?panduan(arr1, arr2, a + 1, b + 1, leishu);
?? ??? ?}
?? ?}
?? ?else
?? ?{
?? ??? ?arr2[a][b] = mmx + '0';
?? ?}?? ??? ?
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 11:56:22  更:2021-08-26 11:58:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:41:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码