扫雷的简易实现

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

#define ROW 10//行
#define COL 10//列
#define ROWS ROW+2//地雷棋盘行
#define COLS COL+2//地雷棋盘列
//地雷棋盘比棋盘多初和末各两行两列

void menu();//菜单
void New(char* Chq, int row, int col);//初始化棋盘
void MineBuild(char Chq[ROWS][COLS], int row, int col, int num);//设置地雷
void GameShow(char Chq[ROW][COL], int row, int col);//打印棋盘
void MineShow(char Chq[ROWS][COLS], int row, int col);//打印地雷棋盘
int Player(char Chq[ROW][COL], char MineChq[ROWS][COLS], int row, int col, int num);//玩家游戏

game.h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"


void menu() {//菜单
	printf("\n*************************************\n***   1.开始游戏     2.结束游戏   ***\n*************************************\n");
	printf("请输入:>");
}

void New(char* Chq, int row, int col){
	assert(Chq != NULL);
	int i = 0,j = 0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
		*(Chq + i * col + j) = ' ';
		}
	}
}//初始化为空格

void GameShow(char Chq[ROW][COL], int row, int col) {
	int m = 0; int n = 0;
	for (m = 0; m < row; m++) {
		for (n = 0; n < col; n++) {
			printf(" %c ", Chq[m][n]);//打印数据
			if (n < col - 1) {
				printf("|");//打印分隔列
			}
		}
		printf("\n");
		{
			for (n = 0; n < col; n++)//打印分隔行
				if (m < row - 1) {
					if (n < col - 1)
						printf("---|");//除最后一行打印
					else
						printf("---");//最后一列打印
				}
		}
		printf("\n");
	}
}

void MineShow(char MineChq[ROWS][COLS], int row, int col) {
	int m = 0; int n = 0;
	for (m = 1; m < row - 1; m++) {
		for (n = 1; n < col - 1; n++) {
			printf(" %c ", MineChq[m][n]);//打印数据
			if (n < col - 2) {
				printf("|");//打印分隔列
			}
		}
		printf("\n");
		{
			for (n = 1; n < col - 1; n++)//打印分隔行
				if (m < row - 2) {
					if (n < col - 2)
						printf("---|");//除最后一行打印
					else
						printf("---");//最后一列打印
				}
		}
		printf("\n");
	}
}

void MineBuild(char MineChq[ROWS][COLS], int row, int col, int num) {
	int x = 0;
	int y = 0;
	int z = 0;

	for (z = 0; z < num;) {//创造雷
		x = rand() % (row - 2);
		y = rand() % (col - 2);
		if (MineChq[x + 1][y + 1] == ' ') {
			MineChq[x + 1][y + 1] = '*';
			z++;
		}
	}
	for (int i = 1; i < row - 1; i++) {//创造雷周围的数字
		for (int j = 1; j < col - 1; j++) {

			if (MineChq[i][j] != '*') {
				int a = 0;
				if (MineChq[i - 1][j - 1] == '*')
					a++;
				if (MineChq[i - 1][j] == '*')
					a++;
				if (MineChq[i - 1][j + 1] == '*')
					a++;
				if (MineChq[i][j - 1] == '*')
					a++;
				if (MineChq[i][j + 1] == '*')
					a++;
				if (MineChq[i + 1][j - 1] == '*')
					a++;
				if (MineChq[i + 1][j] == '*')
					a++;
				if (MineChq[i + 1][j + 1] == '*')
					a++;
				MineChq[i][j] = a + '0';
			}
		}
	}
}

int Player(char Chq[ROW][COL], char MineChq[ROWS][COLS], int row, int col, int num) {//玩家操作
	int x = 0, y = 0, win = 0;
	int test = EOF;
	while (1) {
		while (test = getchar(), test != '\n' && test != EOF);
		printf("请输入要走的坐标(例如1,1):>");
		x = 0; y = 0;
		scanf_s("%d,%d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col) {
			if (win == row * col - num) {//判断胜利条件
				printf("恭喜你,游戏胜利\n");
				return 0;
			}
			if (MineChq[x][y] == '*') {//判断失败条件
				system("cls");
				printf("雷炸了!游戏结束!\n");
				MineShow(MineChq, ROW + 2, COL + 2);
				return 0;
			}
			else if (Chq[x - 1][y - 1] != ' ')//判断位置是否重复
			{
				printf("该位置已走,请重新输入\n");
			}
			else {//将输入坐标处数字复制到棋盘上
				Chq[x - 1][y - 1] = MineChq[x][y];
				system("cls");
				GameShow(Chq, ROW, COL);
				win++;//走一步一增加,计算是否胜利
			}
		}
		else
		{
			printf("超出范围或输入错误,请重新输入\n");
			continue;
		}
	}
}

game.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void game()
{
	system("cls");
	int a = 0; int ret;
	char Chq[ROW][COL] = { 0 };
	char MineChq[ROWS][COLS] = { 0 };
	New(Chq, ROW, COL); //初始化展示棋盘
	New(MineChq, ROWS, COLS);//初始化地雷棋盘
	GameShow(Chq, ROW, COL);//展示棋盘	
	while (1)
	{
		printf("创造雷的数量:>");
		scanf_s("%d", &a);
		if (a >= ROW * COL)
			printf("雷数量超过上限,请重新输入\n");
		else
		{
			system("cls");
			MineBuild(MineChq, ROWS, COLS, a);
			GameShow(Chq, ROW, COL);
			printf("创造成功,开始游戏\n");
			break;
		}
	};//在棋盘中创建雷
	while (1)
	{
		ret = Player(Chq, MineChq, ROW, COL, a);
		if (ret == 0)
			break;
	}
}

int main() {
	int IsGame = 0, a = 1;
	int test = EOF;
	srand((unsigned int)time(NULL));
	while (a) {
		menu();
		scanf_s("%d", &IsGame);
		switch (IsGame) {//是否进行游戏
		case 1:
			game();
			break;
		case 2:
			printf("游戏结束!");
			a = 0;
			break;
		default:
			printf("输入错误,请重新输入");
			break;
		}
		while (test = getchar(), test != '\n' && test != EOF);
	}
	system("pause");
	return 0;
}

test.c文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kvaic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值