C语言实现扫雷。可以标记。

做这个游戏的思路是,因为要显示未扫出的坐标*,又要显示扫出的坐标,还要保存雷的坐标,显然一个数组实现起来有困难。不妨设置两个数组,一个存雷的坐标,另一个用来用户进行操作。

此代码实现了扫雷时候进行扩展,近似WIN系统里的扫雷。
还可以进行标记雷的位置,防止扫错。

代码如下:

<game.h>

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

#define ROW 11
#define COL 11
#define ROWS 9
#define COLS 9
#define MINE_NO 10

void init(char mine[ROW][COL],char show[ROW][COL],int row,int col);

void print(char arr[ROW][COL],int rows,int cols);

void arrmine(char mine[ROW][COL],int rows,int cols);

void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

int countmine(char mine[ROW][COL],int x,int y);

void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

<tset.c>

#include "game.h"




void game()
{
	char mine[ROW][COL] = {0};
	char show[ROW][COL] = {0};
	init(mine,show,ROW,COL);  //初始化雷阵行列
	arrmine(mine,ROWS,COLS);	//布置雷阵	
	print(mine,ROWS,COLS);		//打印雷阵
	printf("***********************************\n");
	print(show,ROWS,COLS);
	selecoor(mine,show,ROWS,COLS);	//玩家选择雷坐标
}


void menu()
{
	while(1)
	{
		int n = 0;
		printf("*************************\n");
		printf("*****     1.play    *****\n");
		printf("*****     0.exit    *****\n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d",&n);
		if(n == 1)
		{
			printf("游戏开始!\n");
			game();
		}
		else if(n == 0)
		{
			printf("退出游戏!\n");
			break;
		}
		else
		{
			printf("输入错误,请重新输入。\n");
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	menu();
	return 0;
}

<game.c>

#include "game.h"


void init(char mine[ROW][COL],char show[ROW][COL],int row,int col)
{
	int i = 0,j = 0;
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
}

void print(char arr[ROW][COL],int rows,int cols)
{
	int i = 0,j = 0;
	for(i=0 ;i<=rows+1 ;i++)
	{
		if(i<2)
		{
			printf("  ");
		}
		else
		{
			printf("%d ",i-1);
		}
	}
	printf("\n");
	for(i=0 ;i<=rows+1 ;i++)
	{
		printf("- ");
	}
	printf("\n");
	for(i=1 ;i<=rows ;i++)
	{
		printf("%d ",i);
		printf("| ");
		for(j=1 ;j<=cols ;j++)
		{
			printf("%c ",arr[i][j]);
		}
		printf(" |");
		printf("\n");
	}
	for(i=0 ;i<=rows+1 ;i++)
	{
		printf("- ");
	}
	printf("\n");
}

void arrmine(char mine[ROW][COL],int rows,int cols)
{
	int x = 0,y = 0;
	int i = MINE_NO;
	while(i)
	{
		x = rand()%rows+1;
		y = rand()%cols+1;
		if(mine[x][y] != '1')
		{
			mine[x][y] = '1';
			i--;
		}
	}
}

int countmine(char mine[ROW][COL],int a,int b)
{
	return mine[a-1][b]+mine[a-1][b-1]+mine[a][b-1]+mine[a+1][b-1]+mine[a+1][b]
	+mine[a+1][b+1]+mine[a][b+1]+mine[a-1][b+1]-8*'0';
}

void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y)
{
	if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS)
	{
		show[x-1][y] = countmine(mine,x-1,y)+'0';
		launchTL(mine,show,ROWS,COLS,x-1,y);
		show[x-1][y-1] = countmine(mine,x-1,y-1)+'0';
		launchTL(mine,show,ROWS,COLS,x-1,y-1);
		show[x][y-1] = countmine(mine,x,y-1)+'0';
		launchTL(mine,show,ROWS,COLS,x,y-1);
	}
}
void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y)
{
	if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS)
	{
		show[x+1][y] = countmine(mine,x+1,y)+'0';
		launchDR(mine,show,ROWS,COLS,x+1,y);
		show[x][y+1] = countmine(mine,x,y+1)+'0';
		launchDR(mine,show,ROWS,COLS,x,y+1);
		show[x-1][y+1] = countmine(mine,x-1,y+1)+'0';
		launchDR(mine,show,ROWS,COLS,x-1,y+1);
	}
}

void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols)
{
	int x = 0,y = 0,count1 = 0,i = 0,j = 0;
	int o = 0,p = 0;
	int s;
	while(1)
	{
		int count2 = 0;
		printf("请选择要排查的坐标:\n");
		scanf("%d %d",&x,&y);
		if(count1 == 0 && mine[x][y] == '1')
		{
			int n =1,tmp1 = 0,tmp2 = 0;
			while(n)
			{
				tmp1 = rand()%rows+1;
				tmp2 = rand()%cols+1;
				if(mine[tmp1][tmp2] == '0')
				{
					mine[tmp1][tmp2] = '1';
					mine[x][y] = '0';
					n = 0;
				}
			}
		}
			count1 = 1;
		if(show[x][y] == 'X')
		{
			printf("该坐标已被标记,请重新输入:\n");
			continue;
		}
		printf("是否需要标记地雷?(1是/2否)\n");
		scanf("%d",&s);
		if(s == 1)
		{
			printf("请输入标记的坐标:\n");
			scanf("%d %d",&o,&p);
			show[o][p] = 'X';
		}
		if(show[x][y] != '*')
		{
			printf("该坐标已被排查或输入错误,请重新输入:\n");
			continue;
		}
		if(mine[x][y] == '1')
		{
			printf("你被炸死了!\n");
			print(mine,ROWS,COLS);
			break;
		}
		show[x][y] = countmine(mine,x,y)+'0'; //计算周围雷数
		launchTL(mine,show,ROWS,COLS,x,y);
		launchDR(mine,show,ROWS,COLS,x,y);//展开无雷区
		print(show,ROWS,COLS);
		for(i=1 ;i<=rows ;i++)
		{
			for(j=1 ;j<=cols ;j++)
			{
				if(show[i][j] == '*')
				{
							count2++;
				}
			}
		}
		if(count2 == MINE_NO)
		{
			printf("你赢了。\n");
			break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39487033/article/details/79782007