扫雷游戏(C语言)

思路

  • 首先需要两张棋盘,一张是设置雷的棋盘(右图),一张是显示给用户(左图,1代表有雷,0代表无雷)
  • 再则需要考虑的是:寻找雷

    如图:如果输入坐标未踩中雷,则将其周围含有几个雷的信息显示,可以利用下面式子,来寻找雷

字符1-字符0=数字1

  • 最后便是展开无雷周围区域

如果输入的坐标的点周围没有雷,则将其周围八个点的区域进行展开,从而提高扫雷效率。

函数

1.菜单栏显示
2. 棋盘初始化
3.棋盘打印
4.设置雷
5.寻找雷
6.展开雷的信息

//game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

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

#define MINE_NUM 1
//棋盘初始化
void InitBoard(char board[][ROWS], int row, int col, char set);
//打印键盘
void Show(char board[][ROWS], int row, int col);
//设置雷
void SetMine(char mine[][ROWS], int row, int col);
//找雷
void FindMine(char mine[][ROWS], char mineInfo[][ROWS], int row, int col);
//如果未踩到雷,对信息进行显示
void Show_area(char mineInfo[][ROWS], char mine[][ROWS], int x, int y);
void Game();
void menu();

//game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int count = 0;
//菜单栏
void menu(){
	printf("**********************\n");
	printf("********0.exit********\n");
	printf("********1.play********\n");
	printf("**********************\n");
}
//打印棋盘
void Show(char board[][ROWS], int row, int col){
	int i = 0; 
	int j = 0;
	printf("---------------------------\n");
	for (i = 0; i <= row;i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row;i++) {
		printf("%d ", i);
		for (j = 1; j <= col;j++) {
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("--------------------------\n");
}
//棋盘初始化
void InitBoard(char board[][ROWS], int row, int col, char set) {
	int i = 0;
	int j = 0;
	for (i = 0; i < row;i++) {
		for (j = 0; j < col;j++) {
			board[i][j] = set;
		}
	}
}
//设置雷
void SetMine(char mine[][ROWS], int row, int col) {
	int count = MINE_NUM;
	int x = 0;
	int y = 0;
	while (count!=0) {
		x = rand() % row + 1;//[1-10)
		y = rand() % col + 1;
		if (mine[x][y]=='0') {
			mine[x][y] = '1'; //将雷设为1
			count--;
		}
	}
}
//字符1-字符0=十进制数字1
int GetMineCout(char mine[][ROWS], int x, int y) {
	return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] 
		+ mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';
}
//找雷
void FindMine(char mine[][ROWS], char mineInfo[][ROWS], int row, int col) {
	int x = 0;
	int y = 0;
	while (count<(row*col-MINE_NUM)) {
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);
		if (x>=1&&x<=row&&y>=1&&y<=col) {
			if (mine[x][y]=='1') {
				printf("你被炸死了\n");
				break;
			}
			else {
				
				Show_area(mineInfo, mine, x, y);
			}
		}
		else
		{
			printf("坐标不合法\n");
		}
	}
}
//如果没有踩中雷,则展示其周围8个格子的信息,从而提高扫雷效率
void Show_area(char mineInfo[][ROWS],char mine[][ROWS],int x, int y) {
	int ret = GetMineCout(mine, x, y);
	mineInfo[x][y] = ret + '0';
	if (mineInfo[x][y]=='0') {			//代表周围格子没有雷
		mineInfo[x -1][y -1] = mine[x - 1][y - 1];
		mineInfo[x - 1][y] = mine[x - 1][y];
		mineInfo[x - 1][y + 1] = mine[x - 1][y + 1];
		mineInfo[x][y - 1] = mine[x][y - 1];
		mineInfo[x][y + 1] = mine[x][y + 1];
		mineInfo[x + 1][y - 1] = mine[x + 1][y - 1];
		mineInfo[x + 1][y] = mine[x + 1][y];
		mineInfo[x + 1][y + 1] = mine[x + 1][y + 1];
		Show(mineInfo, ROW, COL);
		count += 8;
	}
	else{   //代表格子周围有雷,则不展示其周围的信息
		Show(mineInfo, ROW ,COL);
		count++;
	}
}
void Game() {
	char mine[ROWS][COLS] = { 0 };//存放雷
	char mineInfo[ROWS][COLS] = { 0 };  //存放雷的信息
	InitBoard(mine, ROWS, COLS, '0'); //初始化棋盘
	InitBoard(mineInfo, ROWS, COLS,'*');//展示给玩家
	Show(mineInfo, ROW, COL);//打印
	SetMine(mine, ROW, COL);//设置雷
	FindMine(mine, mineInfo, ROW, COL);//找雷 
}




//main.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int main(){
		int input = 0;
		srand((unsigned int)time(NULL));
		do
		{
			menu();
			printf("请输入你的选择:");
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				Game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("请输入正确的数字\n");
				break;
			}
		} while (input);
		return 0;
	}

发布了50 篇原创文章 · 获赞 19 · 访问量 4740

猜你喜欢

转载自blog.csdn.net/qq_44723296/article/details/99683268