saolei.c

来自「扫雷游戏源代码」· C语言 代码 · 共 183 行

C
183
字号
struct point
{
	int value;//-1,0,1,2,3,4,5,6,7,8
	int state;//0,1,2
};
NUM_BOMBS
point table[M][N];

int IsLegal(int x, int y)
{
	if (x >= 0 && x < M && y >= 0 && y < N)
		return 1;
	else
		return 0;
}


void ChangeState(int x, int y, int s1, int s2)
{
	if (s1 == 0 && s2 == 1)

	else if(s1 == 0 && s2 == 2)

	else if(s1 == 2 && s2 == 0)

	else if(s1 == 2 && s2 == 1)

}

void Add1(int x, int y)
{
	if (IsLegal(x, y))
		if(table[x][y].value != -1)
			table[x][y].value += 1;
}

void Extend(int x, int y)
{
	if (IsLegal(x, y))
	{
		if (table[x][y].state == 0)
		{
			if (table[x][y].value == -1)
			{
				//闪动
			}
			else
			{
				ChangeState(x, y, 0, 1);
				if (table[x][y].value == 0)
				{
					ApplyNeighbors(x, y, Extend);
				}
			}
		}
	}
}

void ApplyNeighbors(int x, int y, void(*func)(int, int))
{
	int i, j;
	
	i = x-1; j = y-1;
	func(i, j);

	i = x-1; j = y;
	func(i, j);

	i = x-1; j = y+1;
	func(i, j);

	i = x; j = y-1;
	func(i, j);

	i = x; j = y+1;
	func(i, j);

	i = x+1; j = y-1;
	func(i, j);

 	i = x+1; j = y;
	func(i, j);

	i = x+1; j = y+1;
	func(i, j);
	
}

void Init()
{
	for(int i = 0; i < M; i++)
		for(int j = 0; j < N; j++)
		{
			//table[i][j].state = 0;
			table[i][j].value = 0;
			ChangeState(i, j, 0, 0);
		}

	int n = 0;
	srand(time(NULL));
	do{
		int val = rand() % (N*M);
		int i = val \ M;
		int j = val % N;
		if(table[i][j].value != -1)
		{
			table[i][j].value = -1;
			ApplyNeighbors(i, j, Add1);
			n++;
		}
		
	}while(n < NUMBOMBS);
}

void ShowBombs()
{
	for (int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
			if (table[i][j].value == -1)
			{
				if (table[i][j].state == 0)
					ChangeState(i, j, 0, 1);
				else if (table[i][j].state == 2)
					ChangeState(i, j, 2, 1);
			}
}


void LeftClick(int x, int y)
{
	if (table[x][y].state == 0)
	{
		if (table[x][y].value == -1)
		{
			ShowBombs();
			//爆炸点显示红雷,游戏结束
		}
		else
		{
			ChangeState(x, y, 0, 1);
			if (table[x][y].value == 0)
			{	
				ApplyNeighbors(x, y, Extend);
			}
		}
	}
}

void LeftRightClick(int x, int y)
{
	if (table[x][y].state == 1)
	{
		if (table[x][y].value >= 1)
		{
			ApplyNeighbors(x, y, Extend);
		}
	}
}

int RightClick(int x, int y)
{
	static int nflags = 0;

	if (table[x][y].state == 0)
	{
		ChangeState(x, y, 0, 2);
		nflags++;
	}
	else if (table[x][y].state == 2)
	{
		ChangeState(x, y, 2, 0);
		nflags--;
	}

	if (nflags == NUMBOMBS)
	{
		for(i = 0; i < M; i++)
			for(j = 0; j < N; j++)
				if(table[i][j].value == -1 && table[i][j].state != 2)
					return 0;
	}
	return 1;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?