用c语言实现简易版扫雷

简易版扫雷的原理:在10x10的方格中存入1和0,1(即雷)由电脑随机产生并放入,玩家进行判断并输入<x,y>(x为列,y为行),若方格中为1,则玩家踩中雷,输出“Game Over”,若为0,则未踩中雷,显示周围的雷的数量并循环,直至判断出所有的0,玩家胜利.

首先,我们需引入头文件:

#ifndef _GAME_H_
#define _GAME_H_

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

#pragma warning(disable:4996)


void setMine();
void display();
void getMine();
int getMineNum();
void game();

#define ROW 10
#define COL 10
#define MINE_NUM 20


#endif

其次,主函数

#include"game.h"

void menu()
{
	printf("#####     欢迎来到扫雷游戏     ####\n");//菜单(提示玩家进行选择)
	printf("###################################\n");
	printf("#####  1.play          2.exit  ####\n");
	printf("###################################\n");
	printf("please select:\n");
}


int main()
{
	do {
		int select = 0;
		menu();
		scanf("%d", &select);
		switch(select){
		case 1:
			game();
			break;
		case 2:
			exit(0);
		default:
			printf("Enter error,try again!\n");
			break;
		}

	} while (1);
	system("pause");
	return 0;
}

实现游戏的函数     game.c

 
 
#include"game.h"

int getRandomNum(int start, int end)//获得放雷位置的随机数
{
	return rand() % (end - start + 1) + start;
}  
 

在表格的随机位置放置'1'(雷),完成布雷

void setMine(char mine[][COL+2], int row, int col)
{
	int count = MINE_NUM;
	srand((unsigned long)time(NULL));
	do {
		int x = getRandomNum(1, ROW);
		int y = getRandomNum(1, COL);
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	} while (count );
}
 
 

打印并展示表格

static void display(char board[][COL+2], int row, int col)
{
	int i = 1;
	printf("  ");
	for (;i <= COL;i++)
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0;i <= COL;i++)
	{
		printf("---");
	}
	printf("\n");
	for (i=1;i <= ROW;i++)
	{
		printf("%2d|",i);
		int j = 1;
		for (;j <= COL;j++)
		{
			printf("%2c|",board[i][j]);
		}
		printf("\n");
	}
}

获得周围有雷的个数

int getMineNum(char mine[][COL+2],int row,int col, int x, int y)
{
	return((mine[x - 1][y - 1] - '0') + (mine[x][y - 1] - '0')\
		+ (mine[x + 1][y - 1] - '0') + (mine[x - 1][y] - '0') \
		+(mine[x + 1][y] - '0') + (mine[x - 1][y + 1] - '0') \
		+(mine[x][y + 1] - '0') + (mine[x + 1][y + 1] - '0'));\
}

void game()//实现扫雷的整个思路
{
	char mine[ROW + 2][COL + 2];//定义两个表格,一个用来展示给玩家,一个用来后台实现扫雷
	char show[ROW + 2][COL + 2];

	memset(show, '*', (ROW + 2)*(COL + 2));//展示表格全部赋上'*'
	memset(mine, '0', (ROW + 2)*(COL + 2));
	setMine(mine, ROW + 2, COL + 2);
	int win = 0;
	do {
		int x = 0, y = 0;
		display(show, ROW + 2, COL + 2);
		
		printf("please enter <x,y>: \n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (mine[x][y] == '1')
			{
				printf("Game Over!\n");
				display(mine, ROW + 2, COL + 2);
				break;
			}
			else
			{
				int ret = getMineNum(mine, ROW + 2, COL + 2, x, y);
				show[x][y] = ret + '0';
				win++;
				if (win == ROW * COL - MINE_NUM)
				{
					printf("Congratulation,you win!\n");
					display(mine, ROW + 2, COL + 2);
					break;
				}
			}
		}
		else
		{
			printf("Enter error,try again!\n");
		}
	} while (1);
}

待完善,未加入展开函数和难度选择


猜你喜欢

转载自blog.csdn.net/dongbo_aaa/article/details/80048670