C语言简单数组实现扫雷游戏

      运用c语言数组知识实现简单的扫雷小游戏,游戏可以自己设定棋盘大小,其中以“*”代表雷,以“$”代表旗子

      话不多说直接上代码

game.h

定义函数,主要的函数定义在这里

#define _CRT_SECURE_NO_WARNINGS 1;
#define ROW 10
#define COL 10
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL],int row,int col);

void DispalyBoard(char board[ROW][COL], int row, int col);

void Mine(char board[ROW][COL], int row, int col,int x, int y);

char FakeClick(char board[ROW][COL], int x, int y);

void circle(char board[ROW][COL], int x, int y);

void FakeDisplay(char board[ROW][COL], char board2[ROW][COL]);

void Flag(char board[ROW][COL],int row,int col);

int judge(char board[ROW][COL], char board2[ROW][COL]);

int judge2(char board[ROW][COL], char board2[ROW][COL], int x, int y);

int ergodic(char board[ROW][COL]);

test.c

        运行程序在这里进行运行,首先选择游戏玩或不玩,之后运用坐标的方式来代替鼠标点击棋盘中的方格,在输入坐标时如果选择了y就代表着要进行插旗,如若直接输入坐标则是正常点击,游戏规则与玩法和扫雷几乎一样

#define _CRT_SECURE_NO_WARNINGS 1;
#include<stdio.h>
#include"game.h"
#define ROW 10
#define COL 10
index()
{
	printf("*************************\n");
	printf("*      1.play game      *\n");
	printf("*      0.  exit         *\n");
	printf("*************************\n");
}

game()
{
	int i = 0;
	int j = 0;
	int a = 0;
	char b;
	char board[ROW][COL];
	char board2[ROW][COL];
	InitBoard(board,ROW,COL);
	InitBoard(board2, ROW, COL);
	DispalyBoard(board2, ROW, COL);
	printf("\n");
	printf("这是一个%dX%d的棋盘,请不要越界!\n",ROW-2,COL-2);
	while (1)
	{
		printf("请输入要点击的坐标:");
		scanf("%d,%d", &i, &j);
		if (0 < i <= 18 && 0 < j <= 18)
		{
			if (a < 1)
			{
				Mine(board, ROW, COL, i + 1, j + 1);
				a++;
			}
			printf("\n");
			circle(board, i + 1, j + 1);
			FakeDisplay(board, board2);
			DispalyBoard(board, ROW, COL);
			printf("\n");
			DispalyBoard(board2, ROW, COL);
			printf("请问要插旗子吗(y/n)\n");
			scanf("%c", &b);
			if (b == 'y')
			{
				printf("请输入棋子的坐标:");
				scanf("%d,%d", &i, &j);
				Flag(board2, i + 1, j + 1);
				DispalyBoard(board2, ROW, COL);
			}
		}
		else if (b == 'n')
		{
			continue;
		}
		if (judge2(board, board2, i, j) == 1)
		{
			printf("失败了,嘤嘤嘤(っ °Д °;)っ\n");
			break;
		}
		if (a == (ROW-2)*(COL-2)-(ROW/2))
		{
			judge(board, board2);
			printf("你成功了,耶耶耶┗|`O′|┛ 嗷~~");
			break;
		}
	}

}
int main()
{
	int a = 0;
	srand((unsigned)time(NULL));
	do
	{
		index();
		printf("请输入要选择的选项\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
				game();
				break;
		case 0:
			printf("退出\n");
			break;
		default:
			printf("没有此选项,请重新选择\n");
			break;
		}
	} while (a);


	return 0;
}

game.c

       最主要的代码就是实现点击之后雷的个数显示,和运用数组迁移实现点击棋盘的显示,并且由于对初学者比较友好所以部分代码写的比较繁琐

#define _CRT_SECURE_NO_WARNINGS 1;
#include"game.h"
#include<stdio.h>
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 1; i < row-1; i++)
	{
		for (j = 1; j < col-1; j++)
		{
			board[i][j] = ' ';
		}
	}
	for (j = 0; j < row; j++)
	{
		board[row-1][j] = '#';
	}
	for (j = 0; j < row; j++)
	{
		board[0][j] = '#';
	}
	for (j = 1; j < row-1; j++)
	{
		board[j][0] = '#';
	}
	for (j = 1; j < row - 1; j++)
	{
		board[j][row-1] = '#';
	}
}

void DispalyBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c |", board[i][j]);
		}		
		printf("\n");
		printf("————————————————————\n");
	}
}
void Mine(char board[ROW][COL], int row, int col,int x,int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW/2; i++)
	{
		int X = rand() % (row);
		int Y = rand() % (col);
		if (board[X][Y] != '*' && X != x-1 && Y != y-1 && board[X][Y]!='#'&& 0<X<row-1 && 0<Y<col-1)
		{
			board[X][Y] = '*';
		}
		else
		{
			i--;
			continue;
		}

	}
} 
char FakeClick(char board2[ROW][COL], int x, int y)
{
	int j = 0;
		        if (board2[x - 2][y - 1] == '*')
				{
					j++;
				}
				if (board2[x][y-1] == '*')
				{
					j++;
				}
				if (board2[x-2][y] == '*')
				{
					j++;
				}
				if (board2[x-1][y] == '*')
				{
					j++;
				}
				if (board2[x][y] == '*')
				{
					j++;
				}
				if (board2[x-2][y-2] == '*')
				{
					j++;
				}
				if (board2[x - 1][y - 2] == '*')
				{
					j++;
				}
				if (board2[x][y - 2] == '*')
				{
					j++;
				}
			   
			   char i = j + '0';
			return i;
}
void circle(char board2[ROW][COL], int x, int y)
{
	int d = x;
	int c = x;
	int b = x;
	int j = 0;
	int e = y;
	if (board2[x - 2][y - 1] != '*' && board2[x - 2][y - 1] != '#')
	{
		board2[x - 2][y - 1] = FakeClick(board2, x - 1, y);
	}
	if (board2[x][y - 1] != '*' && board2[x][y - 1] != '#')
	{
		board2[x][y - 1] = FakeClick(board2, x + 1, y);
	}
	if (board2[x - 1][y - 1] != '*' && board2[x - 1][y - 1] != '#')
	{
		board2[x - 1][y - 1] = FakeClick(board2, x, y);
	}
	for (j = 0; j < 3; j++)
	{
		if (board2[x - 2][y - 2] != '*' && board2[x - 2][y - 2] != '#')
		{
			board2[x - 2][y - 2] = FakeClick(board2, x - 1, y - 1);
		}
		x++;
	}

	for (j = 0; j < 3; j++)
	{
		if (board2[c - 2][y] != '*' && board2[c - 2][y] != '#')
		{
			board2[c - 2][y] = FakeClick(board2, c - 1, y + 1);
		}
		else
		{
			continue;
		}
		c++;
	}
}

void FakeDisplay(char board[ROW][COL],char board2[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] != '*' && 0<i<ROW-1 && 0<j<COL-1)
			{
				board2[i][j] = board[i][j];
			}
			else
			{
				continue;
			}
		}
	}
}
void Flag(char board[ROW][COL],int row,int col)
{
	char a = board[row - 1][col - 1];
	while (1)
	{
		if (board[row - 1][col - 1] == ' ')
		{
			board[row - 1][col - 1] = '$';
			break;
		}
		else
			printf("坐标输入错误,请重新输入\n");
	}
}
int judge(char board[ROW][COL], char board2[ROW][COL])
{
	int i = 0;
	int j = 0;
	int a = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < ROW; j++)
		{
			if (board[i][j] != '*' )
			{
				if (board2[i][j] !=' ')
				{
					a++;
				}
			}
		}
	}
	return a;
}
int judge2(char board[ROW][COL], char board2[ROW][COL],int x,int y)
{
	int i = 0;
	int j = 0;
	int a = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < ROW; j++)
		{
			if (board[i][j] == '*' && board2[i][j]!='$')
			{
				if (i == x && j == y)
				{
					a = 1;
				}
			}
		}
	}
	return a;
}
int ergodic(char board[ROW][COL])
{
	int i = 0;
	int j = 0;
	int a = 1;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < ROW; j++)
		{
			if (board[i][j] != ' ')
			{
				a++;
			 }
		}
	}
	return a;
}

       运用的几乎全是数组的知识,非常适合初学者做着玩来提高理解,虽然简单,但是也废了博主不少时间,也有一点小bug(多多包涵)

下面则为游戏开始棋盘的输出方式

输入坐标显示,并且随机显示5颗雷(雷的个数可以自己恒定)

运用数组挪移即可不显示雷

插入旗子,只需输入y,在输入旗子的坐标即可

如果点击的坐标是雷,游戏结束

同理,如果所有旗子覆盖了雷,并且其他位置全部被点开,则游戏胜利 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值