33.【C语言】实践扫雷游戏

目录

1.预备知识

2.游戏的运行

3.编写过程

4.代码

game.h

DisplayBoard.c

 FineMine.c

game.c

GetMineCount.c

InitBoard.c

main.c

SetMine.c

5.define定义符号常量注意事项

1.替换原则

2.编译器不允许对定义的符号常量进行修改


1.预备知识

第13篇 一维数组 第13.5篇 二维数组

第28篇 库函数 第29篇 自定义函数 第30篇 函数补充

2.游戏的运行

1.随机布置雷

2.排雷

基本规则:

3d710df864344b2a9912405bf30b3cda.png点开一个格子后,显示1,对于9*9,代表以1为中心的去心九宫格内有一个雷,找到后标记

,直到标完所有的雷,游戏结束;如果中途点中雷,游戏结束

794c11d3da124074b11e3863f73a549a.pngb9b68844495944cfaaf41ef224d333e3.png74478ccec2194993b0934fe4e6785dc5.png

3.编写过程

现创建9*9的雷区,编写代码ddfa4243cc6542c880e563ed6e315a57.png

但这样会程出现问题,边缘的雷需要另外写代码(否则九宫格越界)-->为了方便,扩大一圈(11*11)69253a5512324289868c02f6f896a2ac.png

定义二维数组:char board[11][11]

两个二维数组:一个布雷,一个显示玩家排雷的状态

4.代码

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 10
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
void menu();
void game();
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void SetMine(char board[ROWS][COLS], int row, int col);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
int GetMineCount(char mine[ROWS][COLS], int x, int y);

DisplayBoard.c

#include "game.h"
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
	printf("-------99扫雷-------\n");
	printf("0 ");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);//打印行
	}
	printf("y");
	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");
	}
	printf("x");
	printf("\n--------------------\n");
}

 FineMine.c

#include "game.h"
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-COUNT)
	{
		
		//DisplayBoard(mine, ROW, COL);//作弊模式:)
		printf("输入排查雷的坐标 x y :>");
		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);
				Sleep(3000);
				system("cls");
				break;
			}
			else
			{
				win++;
				system("cls");
				int sum = GetMineCount(mine, x, y);//t统计去心九宫格雷的个数
				show[x][y] = sum + '0';
				
				DisplayBoard(show, ROW, COL);
			}
		}

		else
		{
			printf("输入有误,重新输入\n");
		}

	}
	if (win== row * col - COUNT)
		printf("赢了\n");
}

game.c

#include "game.h"
void game()
{
	char mine[ROWS][COLS] = { 0 };//定义布雷数组
	char show[ROWS][COLS] = { 0 };//定义显示玩家排雷的状态的数组
	InitBoard(mine, ROWS, COLS, '0');//初始化布雷数组
	InitBoard(show, ROWS, COLS, '?');//初始化显示玩家排雷的状态的数组
	SetMine(mine, ROW,COL);//布雷
	DisplayBoard(show, ROW, COL);//打印显示玩家排雷的状态的数组
	FindMine(mine,show,ROW,COL);//玩家找雷
}

GetMineCount.c

#include "game.h"
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
	return mine[x][y + 1] + mine[x][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] - 8 * '0';
}

InitBoard.c

#include "game.h"
//初始化雷区
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

main.c


#include "game.h"
int main()
{
	int tmp = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//调用菜单函数
		scanf("%d", &tmp);
		switch (tmp)
		{
		case 2:
			break;
		default:
		{
			printf("输入错误,重新选择!\n");
			Sleep(1000);
			system("cls");
			break;
		}
		  case 1:
		  {
			  system("cls");
			  game();
			  break;
		  }

		}

	} 
	while (tmp != 2);
	return 0;
}

#include "game.h"
void menu()//主菜单函数
{
	printf("**********************************************\n");
	printf("*******************1.PLAY********************\n");
	printf("*******************2.EXIT*********************\n");
	printf("**********************************************\n");
	printf("请选择:\n");
}

SetMine.c

#include "game.h"
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;//x:1~9
		int y = rand() % col + 1;//y:1~9
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}

}

有兴趣可以看看 CE实现扫雷作弊

5.define定义符号常量注意事项

1.替换原则

#define ROW 9(此为定义符号常量)和平常给变量赋值(int ROW = 9;)有所不同,编译器对前者的处理的策略为:将函数中ROW全部替换为9,而对后者对ROW赋值为9,变量在内存中有存储空间

2.编译器不允许对定义的符号常量进行修改

#define ROW 9
int main()
{
	ROW++;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangcoder

赠人玫瑰手有余香,感谢支持~

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

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

打赏作者

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

抵扣说明:

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

余额充值