C语言实现9*9扫雷游戏(待完善)

【游戏分析】

1、建立两个二维数组,一个为用于统计雷的个数,另一个用于给玩家展示;

2、要实现9*9扫雷游戏,必须统计每个方格周围有几个雷,但考虑到边界统计雷的个数不是在一个正方形之内,所以建立两个     11*11的二维数组,打印棋盘的时候只打印1到10范围内的,边界不予考虑;

3、要统计雷的个数,怎么统计好呢?

先把放置雷的棋盘都设置为‘0’,然后有电脑产生随机数,放入到棋盘之内,并把雷的位置赋值为‘1’(为一的时候方便统计个数)

4、亮点:

玩家在第一步输入坐标时,肯定死不了,所以就采用,先让玩家输入第一步坐标,再让电脑产生不是玩家输入坐标的10个随机雷坐标。

【程序如下】

//game.h

#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10    //雷的个数


void game();
void menu();
void Inmine(char arr[ROWS][COLS], int rows, int cols, char set);
void DisplayMine(char arr[ROWS][COLS], int row, int col);
void SetMine(char arr[ROWS][COLS], int row, int col, int x, int y);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
char GetMineCount(char mine[ROWS][COLS], int x, int y);
//void DeleteBlack(char mine[ROWS][COLS], char show[ROWS][COLS], int count, int x, int y);


#endif //__GAME_H__

//test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
	    menu();
		printf("玩游戏请按:1   退出游戏请按:0  >>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			exit(1);
			break;
		default:
			printf("输入错误请重新输入:>>\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}

//game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
char GetMineCount(char mine[ROWS][COLS], int x, int y)  //统计玩家输入坐标x,y周围有几个雷,
                                                        //即统计有几个字符1
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0')+'0' ;
}
void SetMine(char arr[ROWS][COLS], int row, int col,int x,int y)
{
	int count = EASY_COUNT;
	while (count)
	{
		int a = 0;
		int b = 0;
		a = rand() % row + 1;
		b = rand() % row + 1;
		if ((arr[a][b] != '1') && ((x != a) || (y != b)))  //第一步不被炸死
		{
			arr[a][b] = '1';
			count--;
		}
	}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入坐标:>>");
	int num = 0;                  //全局变量
	scanf("%d%d", &x, &y);
	while (show[x][y] != '*')
	{
		printf("请重新输入:>>");
		scanf("%d%d", &x, &y);
	}
	SetMine(mine, ROW, COL, x, y);       //等玩家输入第一个坐标x,y之后,在产生电脑随机值
	while (1)
	{
		if (x >= 1 && x <= row && y >= 0 && y <= col)
		{
			num++;
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				break;
			}
			else
			{
				if (num == row*col - EASY_COUNT)
				{
					printf("恭喜你,排雷成功!\n");
					break;
				}
				char count = GetMineCount(mine, x,y);
				show[x][y] = count;
				//DeleteBlack(mine, show, count, x, y);
				DisplayMine(show, ROW, COL);
			}
			printf("请继续输入:>>");
		}
		else
		{
			printf("坐标错误,请重新输入坐标:>>\n");
		}
		scanf("%d%d", &x, &y);
		while (show[x][y] != '*')
		{
			printf("请重新输入:>>");
			scanf("%d%d", &x, &y);
		}
	}
}
void DisplayMine(char arr[ROWS][COLS], int row, int col)  //给用户展现的雷盘
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= col; 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 Inmine(char arr[ROWS][COLS], int rows, int cols, char set)  //初始化两个棋盘
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}
void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	Inmine(mine, ROWS, COLS, '0');
	Inmine(show, ROWS, COLS, '*');
	DisplayMine(show, ROW, COL);
	FindMine(mine, show, ROW, COL);
}
void menu()
{
	printf("***************************************\n");
	printf("***********    1. play     ************\n");
	printf("***********    0. exit     ************\n");
	printf("***************************************\n");
}

【效果展示】


猜你喜欢

转载自blog.csdn.net/weixin_41318405/article/details/80037405