扫雷游戏代码分享(c基础)

hi , I am 36.

代码来之不易👍👍👍

创建两个.c 一个.h

1:test.c

cs 复制代码
#include"game.h"

void game()
{
	//创建数组
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	char temp[ROWS][COLS] = { 0 };
	//初始化数组
	Iniarr(mine, ROWS, COLS, '0');
	Iniarr(show, ROWS, COLS, '*');
	Iniarr(temp, ROWS, COLS, '0');


	//选择模式
	mold(mine, ROW, COL);

	//打印出来
	/*Minebord(mine, ROW, COL);*/
	Showbord(show, ROW, COL);

	//排查
	int flag = 1;
	while (flag)
	{
		/*Minebord(mine, ROW, COL);*/

		flag = Tell__count(mine, show, temp,ROWS, COLS);
		
		Showbord(show, ROW, COL);
		int x = 0;
		//判断胜利
		if (x = Iswin(mine, show, ROW, COL)) break;
		//是否标记
		if (flag) 	
		{
			Isflag(show, ROW, COL);
			Showbord(show, ROW, COL);
		}
		
	}
	if (flag == 0)
	{
		Minebord(mine, ROW, COL);
		printf("你输了\n\n\n");
		Sleep(2000);
	}
	else
	{
		printf("\nCongratulations!!!\a\a\n");
		printf("Congratulations!!!\a\a\n");
		printf("Congratulations!!!\a\a\n");
		printf("Congratulations!!!\a\a\n");
		printf("Congratulations!!!\a\a\n");
		printf("Congratulations!!!\a\a\n");

	}
}


int main()
{

	//设置种子值
	srand((unsigned int)time(NULL));

	Myintub();//介绍
	menu();//菜单
	int n = 0;
	do
	{


		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); printf("请问是否继续?\n"); menu(); break;
		case 0:system("cls"); Myintuo(); break;
		default:system("cls"); printf("该值无效 请重新输入\n"); Sleep(1000); system("cls"); menu(); break;
		}

	} while (n);




	return 0;
}

2: game.h

cs 复制代码
#pragma once
#define _CRT_SECURE_NO_WARNINGS

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

#include<stdio.h>
#include<windows.h>
#include<time.h>




void Myintub();

void Myintuo();

void menu();

void Iniarr(char arr[ROWS][COLS], int rows, int cols, int set);

void Minebord(char arr[ROWS][COLS], int row, int col);

void Showbord(char arr[ROWS][COLS], int row, int col);

void mold(char arr[ROWS][COLS], int row, int col);

void Ini__my__count(char arr[ROWS][COLS], int row, int col,int n);

int  Tell__count(char arr[ROWS][COLS], char show[ROWS][COLS], char temp[ROWS][COLS], int rows, int cols);

int  print(char mine[ROWS][COLS], char show[ROWS][COLS], char temp[ROWS][COLS], int rows, int cols,int x, int y);

int Iswin(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

void Isflag(char arr[ROWS][COLS], int row, int col);

void Flag1(char arr[ROWS][COLS], int row, int col);

void Flag2(char arr[ROWS][COLS], int row, int col);

void Flag3(char arr[ROWS][COLS], int row, int col);

3:game.c

cs 复制代码
#include"game.h"

void Myintub()
{
	printf("hi, I am 36\n");
	printf("let us begine \n");

	Sleep(1500);
	system("cls");
}

void Myintuo()
{
	printf("hi, I am 36.\n");
	printf("bye bye \n");

	Sleep(1500);
}

void menu()
{
	printf("**** 扫雷游戏 ****\n");
	printf("******************\n");
	printf("**** 1  play *****\n");
	printf("**** 0  exit *****\n");
	printf("**** 扫雷游戏 ****\n");
	printf("请选择:>");

}

void Iniarr(char arr[ROWS][COLS], int rows, int cols, int set)
{

	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)

			arr[i][j] = set;
	}

}

void Minebord(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("*** 扫雷游戏 ******\n");
	for (j = 0; j <= row; j++)
	{
		printf("%d ", j);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);

		for (j = 1; j <= col; j++)
			printf("%c ", arr[i][j]);
		printf("\n");
	}
	printf("*** 扫雷游戏 ******\n");
}

void Showbord(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("\n*** 扫雷游戏 ******\n\n");

	for (j = 0; j <= row; j++)
	{
		printf("%d ", j);
	}
	printf("\n");

	


	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);

		for (j = 1; j <= col; j++)
			printf("%c ", arr[i][j]);
		printf("\n");
	}

	printf("\n*** 扫雷游戏 ******\n");
}

void mold(char arr[ROWS][COLS], int row, int col)
{


	printf("**** 扫雷游戏 ****\n");
	printf("**** 0  简单 *****\n");
	printf("**** 1  中等 *****\n");
	printf("**** 2  困难 *****\n");
	printf("**** 扫雷游戏 ****\n");
	int n = 0;
	int flag = 0;
	do
	{
		flag = 0;
		printf("请选择难度:>");
		scanf("%d", &n);
		system("cls");
		switch (n)
		{
		case 0:Ini__my__count(arr, ROW, COL, n); break;
		case 1:Ini__my__count(arr, ROW, COL, n); break;
		case 2:Ini__my__count(arr, ROW, COL, n); break;
		default: printf("该值无效 请重新输入\n"); flag = 36; break;
		}
	} while (flag);
}

void Ini__my__count(char arr[ROWS][COLS], int row, int col,int n)
{

	//雷的个数
	int a = 0;
	a = (n + 1) * 10;
	//创建坐标
	int x = 0;
	int y = 0;

	while (a)
	{
		x = rand() % row  + 1;
		y = rand() % col  + 1;
		if (arr[x][y] == '0')
		{
			
			arr[x][y] = '1';
			
			a--;
		}
	}


	//判断
	/*for (x = 0; x < row + 2; x++)
	{
		for (y = 0; y < col + 2; y++)

			printf("%d %d %c\n",x, y, arr[x][y]);
	}*/

}

int Tell__count(char mine[ROWS][COLS], char show[ROWS][COLS], char temp[ROWS][COLS], int rows, int cols)
{
	int x = 0;
	int y = 0;
	int flag = 0;
	do
	{
		printf("请输入排查坐标:>");
		scanf("%d %d", &x, &y);
		if (x == 36 && y == 36)
		{
			flag = 1;
			Minebord(mine, ROW, COL);
		}
		else if (x < 1 || x>9 || y < 1 || y>9)
		{
			printf("请输入合法值\n");
			flag = 1;

		}
		else if (show[x][y] != '*'&& show[x][y] != '?'&& show[x][y] != '$')
		{
			printf("该坐标已被排查,请重新输入\n");
			flag = 1;

		}
		else
			flag = 0;
		
	} while (flag);
	 return print(mine, show,temp, rows, cols, x, y);

}

int  print(char mine[ROWS][COLS], char show[ROWS][COLS], char temp[ROWS][COLS], int rows, int cols, int x, int y)
{

	//若是雷返回0
	if (mine[x][y] == '1')		
		return 0;

	//不是雷返回1
	//打印个数
	else
	{
		int i = 0;
		int j = 0;
		temp[x][y] = '1';

		//创建计数变量
		int count = 0;

		for (i = -1; i <= 1; i++)
			for (j = -1; j <= 1; j++)
				if (mine[x + i][y + j] == '1')
					count++;
		if (count != 0)
		{
			show[x][y] = count + '0';
			return 1;
		}
		else
		{
			show[x][y] = ' ';
			for (i = -1; i <= 1; i++)
			{
				for (j = -1; j <= 1; j++)
				{
					if (x + i <= 9 && x + i >= 1 && y + j <= 9 && y + j >= 1 && temp[x + i][y + j] == '0')
					{
						print(mine, show, temp, rows, cols, x + i, y + j);

					}

				}
			}
			return 1;

		}
	}


}

int Iswin(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{

	int i = 0;
	int j = 0;
	int a = 0;
	int b = 0;


	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
			if (mine[i][j] == '1')
				a++;

	}

	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
			if (show[i][j] == '*')
				b++;

	}
	if (a == b)
		return 36;
	else return 0;
}

void Isflag(char arr[ROWS][COLS], int row, int col)
{


	int n = 0;
	do
	{
		printf("\n*****************\n");
		printf("请问是否标记操作?\n");
		printf("***0   exit    **\n");
		printf("** 1   $       **\n");
		printf("** 2   ?       **\n");
		printf("** 3   *       **\n");

		printf("请选择:>");
		scanf("%d", &n);
		switch (n)
		{
		case 0:	system("cls");break;
		case 1:Flag1(arr, row, col); break;
		case 2:Flag2(arr, row, col); break;
		case 3:Flag3(arr, row, col); break;
		default:printf("该值无效\n请重新输入:>"); break;
		}

	} while (n);


}

void Flag1(char arr[ROWS][COLS], int row, int col)
{
	printf("请输入坐标:>");
	int x = 0;
	int y = 0;
	
		scanf("%d %d", &x, &y);
		if (arr[x][y] == '*')
		{
			arr[x][y] = '$';
			Showbord(arr, row, col);
		}
}

void Flag2(char arr[ROWS][COLS], int row, int col)
{
	printf("请输入坐标:>");
	int x = 0;
	int y = 0;

	scanf("%d %d", &x, &y);
	if (arr[x][y] == '*')
	{
		arr[x][y] = '?';
		Showbord(arr, row, col);
	}
}

void Flag3(char arr[ROWS][COLS], int row, int col)
{
	printf("请输入坐标:>");
	int x = 0;
	int y = 0;

	scanf("%d %d", &x, &y);
	if (arr[x][y] == '$' || arr[x][y] == '?')
	{
		arr[x][y] = '*';
		Showbord(arr, row, col);

	}

}
相关推荐
林开落L3 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色4 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download6 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
单音GG19 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
SoraLuna26 分钟前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷29 分钟前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿29 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
九圣残炎36 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
YSRM1 小时前
Experimental Analysis of Dedicated GPU in Virtual Framework using vGPU 论文分析
算法·gpu算力·vgpu·pci直通
iiiiiankor1 小时前
C/C++内存管理 | new的机制 | 重载自己的operator new
java·c语言·c++