C语言实现扫雷

C语言实现扫雷
game.h
#ifndef _GAME_H_
#define _GAME_H_

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

#pragma warning(disable:4996)

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

void game();

#endif
main.c
#include"game.h"

void menu()
{
	printf("**********************\n");
	printf("****1 play**0 exit****\n");
	printf("**********************\n");
	printf("Please select:\n");
}
int main()
{
	int n;
	do{
		menu();
		scanf("%d",&n);
		switch (n){
		case 1:game();
			break;
		case 0:exit(0);
			break;
		default:
			printf("请输入<1 or 0>");
			break;
		}
	} while (1);
	
	system("pause");
	return 0;
}
game.c
#include"game.h"

void display(char board[][COL+2], int row,int col)
{
	int i;
	for (i = 0; i <= COL; i++)
	{
		board[0][i] = i;
		printf("  %d",board[0][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 get_random_num(int start, int end)
{
	return rand() % (end - start + 1) + start;//生成随机数;eg(1,10)rand()%10==0~9;+start==1~10;
}
void set_mines(char mines[][COL+2],int row,int col)
{
	int x, y;
	int num = MINE_NUM;
	srand((unsigned long)time(NULL));
	do
	{
		x = get_random_num(1,ROW);//雷在内部数组雷区
		y = get_random_num(1,COL);
		if (mines[x][y] = '0')
		{
			mines[x][y] = '1';
			num--;
		}
	} while (num);
}
int get_mines(char mines[][COL + 2], int row, int col, int x, int y)
{
	return (mines[x - 1][y - 1] - '0')+(mines[x - 1][y] - '0')+(mines[x - 1][y + 1] - '0')+
		   (mines[x][y - 1] - '0')+(mines[x][y +1] - '0')+(mines[x + 1][y - 1] - '0')+
		   (mines[x + 1][y] - '0')+(mines[x + 1][y + 1] - '0');
}

void game()
{
	int x, y;
	int count;
	char show[ROW+2][COL+2];
	char mines[ROW+2][COL+2];
	memset(show, '*', (ROW + 2)*(COL + 2));
	memset(mines, '0', (ROW + 2)*(COL + 2));
	set_mines(mines, ROW + 2, COL + 2);
	int win = 0;
	do{
		system("CLS");
		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)
		{
			int count = get_mines(mines, ROW + 2, COL + 2, x, y);//查看x行y列有多少雷
			if (mines[x][y] == '0')
			{
				//展开周围雷数或无雷
				if (mines[x - 1][y - 1] == '0')
				{
					show[x - 1][y - 1] = '0';
				}
				 if (mines[x - 1][y] == '0')
				 {
					 show[x - 1][y] ='0';
					
				}
				 if (mines[x - 1][y + 1] == '0')
				{
					
					 show[x - 1][y + 1] = count + '0';
				}
				if (mines[x][y - 1] == '0')
				{
					
					show[x][y - 1] =  '0';
				}
				if (mines[x][y + 1] == '0')
				{
					
					show[x][y + 1] =  '0';
				}
				if (mines[x + 1][y - 1] == '0')
				{
				   show[x + 1][y - 1] = count + '0';
				  
				}
				if (mines[x + 1][y] == '0')
				{
					show[x + 1][y] = count + '0';
					
				}
				if (mines[x + 1][y + 1] == '0')
				{
					
					show[x + 1][y + 1] ='0';
				}
			
				
				show[x][y] = count + '0';//count转字符型 写进show区,字符'0':48			
				// display(show, ROW + 2,COL+2);
				win++;
				if (win==ROW*COL-MINE_NUM)//检测完所有的空位置
				{
					printf("you win!\n");
					display(mines, ROW + 2, COL + 2);
					break;
				}
			}
			else
			{
				printf("Game Over!\n");
				display(mines, ROW + 2,COL+2);
				break;
				
			}
		}
		else{
			printf("Enter error! Please enter:<x,y>:\n");
		}
	} while(1);
}



猜你喜欢

转载自blog.csdn.net/zn_wuxunian/article/details/80037844