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++知识库]实现简易扫雷

思路如下:

*定义宏表盘为ROW*COL的规格 然后雷数为MINE

*定义宏 ROWS和COLS为ROW+2,COL+1,方便后期计算九宫格的雷数

*设定真实埋雷的函数

*设定显示给玩家的雷盘函数

*设定显示雷盘的函数

*设定埋雷函数

*设定输入函数

*设定判断函数

头文件如下

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

#define ROW  9
#define COL  9

#define MINE 10

#define ROWS  ROW+2
#define COLS  COL+2

void Initiateshow(char boardshow[ROWS][COLS], int rows, int cols);

void  Displayshow(char boardshow[ROWS][COLS], int rows, int cols);

void Setmine(char board[ROWS][COLS]);

void Display(char board[ROWS][COLS], int rows, int cols);

void Initiatejudge(char board[ROWS][COLS], int rows, int cols);

int Input(char board[ROWS][COLS], char boardshow[ROWS][COLS], int over);

void Scan(char board[ROWS][COLS], char boardshow[ROWS][COLS], int a, int b);

void game();

int Win(int win, int over);

逻辑主体如下,为常规的菜单、选择

void menu()
{
	printf("************************\n");
	printf("*****    1.PLAY    *****\n");
	printf("*****    2.QUIT    *****\n");
	printf("************************\n");
}
void choose()
{
	printf("Plz input ur choice : ");
	int i = 0;
	int g = 1;
	while (g)
	{
		scanf("%d", &i);
		switch (i)
		{
			case 1:
				game();
				g = 0;
				break;
			case 2:
				printf("Game over.");
				g = 0;
				break;
			default:
				printf("Plz try again : ");
		}
	}
}
void game()
{
	char show[ROWS][COLS] = { 0 };  //用于显示的雷盘
	char board[ROWS][COLS] = { 0 };   //用于判断的雷盘 -> 直接当作真实雷盘

	Initiateshow(show, ROWS, COLS);  //全#
	Initiatejudge(board, ROWS, COLS);  //全0

	Setmine(board);  //埋雷

	Displayshow(show, ROWS, COLS);   //打印各表盘
	//Display(board, ROWS, COLS);

	int over = 1;
	while (over)
	{
		over =  Input(board, show, over);
	}
}
int main()
{
	menu();
	choose();
	return 0;
}

然后是游戏函数主体

初始化函数:将展示给玩家的表盘全除了行标列标全设置为#,将真实的雷盘全设置为0

void Initiatejudge(char board[ROWS][COLS], int rows, int cols)  
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = '0';    //初始化为0
		}
	}
}
void Initiateshow(char show[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			show[i][j] = '#';  //  将表盘初始化为#
		}
	}
}

打印表盘函数:

void Display(char board[ROWS][COLS], int rows, int cols)  //只是设计出来为了看看雷
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)  //范围0~10
	{
		for (j = 0; j < cols; j++)
		{
			if (j != (cols - 1))
				printf("%c ", board[i][j]);
			else
				printf("%c\n", board[i][j]);

		}
	}
}
void Displayshow(char show[ROWS][COLS], int rows, int cols) 
{
	 int i = 0;
	 int j = 0;
	 for (i = 0, j = 0; j < cols; j++)  //输入第一排的指示数字,只到9
	 {
		 if (j != (cols - 1))
			printf("%d ", j);
		 else
			 printf("%c", j); 
	 }  //no problem
	 for (i = 1; i < rows-1; i++)   //输入接下来排的指示数字 
	 {	
		 printf("%d ", i);
		 for (j = 1; j < cols-1; j++)
		 {
			 if (j != cols - 2)
				 printf("%c ", show[i][j]);
			 else
				 printf("%c\n", show[i][j]);
		 }
	 }
}

埋雷函数:常规的rand和if判断、循环

void Setmine (char board[ROWS][COLS])
{
	srand((size_t)time(NULL));
	int i = 0;
	int r = 0;
	int c = 0;
	for (i = 0; i < MINE; i++)  //设定十颗雷
	{  
		int s = 1;
		while (s)
		{
			int r = rand() % ROW;
			int c = rand() % COL;  //下标范围0~8   +1后下标范围1~9  总范围为0~10  
			if (board[r+1][c+1] == '0')   //若位置为空 则埋雷* 否则继续寻找下一个空位置
			{
				board[r+1][c+1] = '*';
				s = 0;   //成功埋雷后跳出死循环
			}
		}
	}
}

输入函数:、

????????为函数设置返回值,是为了实现结束前面死循环。在代码编写初期就遇到了无法结束死循环的问题,后来是发现函数没有设置返回值,导致前面的over值没有办法被改变,一直死循环,下面的函数同理。

? ? ? ? 嵌套了扫描函数,判断九宫格雷的个数;判断是否取得最终胜利的函数

int Input(char board[ROWS][COLS], char show[ROWS][COLS], int over) 
{ 
	int a = 0;
	int b = 0;
	printf("Plz input two number within 1~9 : ");   
	int g = 1;
	int win = 0;
	while (g)
	{
		scanf("%d %d", &a, &b);   //a和b是输入的数 也是真实的下标
		if (a >= 1 && a <= 9 && b >= 1 && b <= 9)  //输入合法则进入判断程序, 死循环终止
		{
			if (board[a][b] != '*')    //若没有雷,进入Scan函数,将四周雷数显示出来
			{
				Scan(board, show, a, b);   
				win++;   //没有踩雷后win++
				Win(win, over);   //判断是否赢了
			}
			else //有雷 直接游戏结束
			{
				Displayshow(board, ROWS, COLS);
				printf("Game over!\n");
				over = 0;
			}
			g = 0;
		}
		else
			printf("Plz try agin : ");   //输入不合法则重新输入,死循环继续进行
	} 
	return over;
}
void Scan(char board[ROWS][COLS], char show[ROWS][COLS], int a, int b)   //在board上扫雷 在show上显示结果
{
	int count = 0; //检测到又雷就++
	int r = 0;
	int c = 0;
	for (r = a-1; r < a + 2; r++)
	{
		for (c = b - 1; c < b + 2; c++)
		{
			if (board[r][c] == '*')
				count++;
		}
	}   //计算完成
	if (count != 0)
		show[a][b] = count + '0';  //字符形式不能直接输出整型数字 而是对应的ASC码值  '0'+对应数字可以实现
	else
		show[a][b] = '0';
	Displayshow(show, ROWS, COLS);
}
int Win(int win, int over)
{
	if (win == ROW * COL - MINE)
	{
		printf("BINGO!!");
		over = 0;
	}
	return over;
}

代码的不足:

? ? ? ?* 还是希望晚些时候可以学习一个函数,可以实现页面的刷新功能,将显示过的内容屏蔽

? ? ? ? *后期再尝试一下扫开一片无雷区的实现

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:09:25  更:2021-11-23 12:09:43 
 
开发: 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/24 7:56:41-

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