小游戏——扫雷(c语言版)

设计思路:

1、定义两个二维数组;一个随机生成20个雷,另一个向玩家显示。

2、玩家输入坐标,判定该坐标在布雷的数组对应的位置是否有雷,若有,则游戏结束;若无,则显示该坐标周围雷的个数,若周围没有雷,则展开周围的区域。

void game()// 首先建立一个游戏的框架

void game()
{
	clock_t start, end;
	int duration;
	int x, y;
	int win ;
	char mine[row + 2][line + 2]; 
	char show[row + 2][line + 2];
	memset(mine, '0', (row + 2)*(line + 2)); //每次游戏开始,将雷谱初始化为‘0’
	memset(show, '*', (row + 2)*(line + 2)); //将显示的数组初始化为‘*’
	setmine(mine);
	display(show);
	start = clock();
	do
	{
		system("cls");
		display(show);
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if (mine[x][y] == '0')
		{
			win=unfold(mine, show, x, y);


			if (win == row*line)
				printf("you win!");
		}
		else if (mine[x][y] == '1')
		{
			printf("game over!\n");
			display(mine);
			break;
		}
	} while (1);
	end = clock();
	duration = (int)(end - start) / CLOCKS_PER_SEC;
	printf("time: %d seconds\n", duration);
}

 然后实现对应功能的函数


void setmine()// 埋雷,生成合法的随机数作为坐标,在对应位置设置为雷(‘0’代表没有雷,‘1’代表有)。

void setmine(char mine[row+2][line+2])
{
	int x = 0;
	int y = 0;
	srand((unsigned long)time(NULL));
	for (int i = 0; i < num; i++)
	{
		x = getRandomNum(1, row);
		y = getRandomNum(1, line);
		if ('0' == mine[x][y])
		{
			mine[x][y] = '1';
		}
		else
		{
			i -= 1;
		}
	}
}
int getRandomNum()//生成合法的随机数

int getRandomNum(int start, int end)
{
	return (rand() % (end - start + 1) + start);
}

void display//打印棋盘

void display(char show[row + 2][line + 2])
{
	int i = 0;
	int j = 0;
	printf("   ");
	for (i = 0; i < line; i++)
	{
		printf("%2d ", i + 1);
	}
	printf("\n");
	printf("   ");
	for (i = 0; i < line; i++)
	{
		printf("---");
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%2d|", i);
		for (j = 1; j <= line; j++)
		{
			printf("%2c|", show[i][j]);
		}
		printf("\n");
	}
	
}

int getmine()//计算坐标周围雷的个数

int getmine(char mine[row + 2][line + 2], 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');
}

int unfold()// 若对应坐标没雷,且周围也没有雷,则展开坐标周围区域

扫描二维码关注公众号,回复: 1306148 查看本文章
int unfold(char mine[row+2][line+2], char show[row+2][line+2], int x, int y) 
{
	int ret;
	static int count=0;
	ret = getmine(mine, x, y);
	if (ret == 0)
	{
		show[x][y] = ret + '0';
		count++;
		if ((x - 1)>0 && (y - 1)&&(show[x - 1][y - 1] == '*'))
			unfold(mine, show, x - 1, y - 1);
		if ((x - 1)>0 && (y - 1)&&(show[x - 1][y] == '*'))
			unfold(mine, show, x - 1, y);
		if ((x - 1)>0 && (y - 1) && (show[x - 1][y + 1] == '*'))
			unfold(mine, show, x - 1, y + 1);
		if ((x - 1)>0 && (y - 1) && (show[x][y - 1] == '*'))
			unfold(mine, show, x, y - 1);
		if ((x - 1)>0 && (y - 1) && (show[x][y + 1] == '*'))
			unfold(mine, show, x, y + 1);
		if ((x - 1)>0 && (y - 1) && (show[x + 1][y - 1] == '*'))
			unfold(mine, show, x + 1, y - 1);
		if ((x - 1)>0 && (y - 1) && (show[x + 1][y] == '*'))
			unfold(mine, show, x + 1, y);
		if ((x - 1)>0 && (y - 1) && (show[x + 1][y + 1] == '*'))
			unfold(mine, show, x + 1, y + 1);
		display(show);
	}
	else
	{
		show[x][y] = ret + '0';
		count++;
	}
	return count;
}


main.c//测试

#include "game.h"
void menu()
{
	printf("*******************************\n");
	printf("*** 1.play         2.exit   ***\n");
	printf("*******************************\n");
	printf("请选择:");

}


int main()
{
	do
	{
		menu();
		int i=0;
		scanf("%d", &i);
		switch (i)
		{
		case 1:
			game();
			break;
		case 2:exit(0);
		default:
			printf("Error,please try again\n");
			break;
		}
	} while (1);

	system("pause");
	return 0;
}

game.h//头文件

#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include<stdlib.h>  
#include<string.h> 
#pragma warning (disable:4996)
#define row 10
#define line 10
#define num 20
void game();
void setmine(char mine[row + 2][line + 2]);
int getRandomNum(int start, int end);
void display(char show[row + 2][line + 2]);
int getmine(char board[row + 2][line + 2], int x, int y);
int unfold(char mine[row + 2][line + 2], char show[row + 2][line + 2], int x, int y);


#endif

猜你喜欢

转载自blog.csdn.net/weixin_40246808/article/details/80039553