简易扫雷游戏实现

扫雷游戏主要功能:                  

  • 储存当前棋盘信息
  • 打印棋盘
  • 计算周围雷个数
  • 判断胜负                                

 主要子函数

  • //棋盘初始化函数
    void Init(char arr[ROWS][COLS], int row, int col, char set);
    
    //放雷函数
    void setmine(char arr[ROWS][COLS], int row, int col);
    
    //打印函数
    void Print(char arr[ROWS][COLS], int row, int col);
    
    //插叙函数
    int find(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
    
    //主界面函数
    void manu();
    
    //评估函数
    char judge(char arr[ROWS][COLS], int row, int col);

初始化函数 

void Init(char arr[ROWS][COLS], int row, int col, char set) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			arr[i][j] = set;//将每个元素置为set字符
		}
	}
}

 打印函数

void Print(char arr[ROWS][COLS], int row, int col) {
	printf("------------扫雷-------------\n");
	printf("   ");
	for (int i = 1; i <= row; i++) {
		printf(" %d ", i);//显示列信息
	}
	printf("\n");
	for (int i = 1; i <= row; i++) {
		printf(" %d ",i);//显示行信息
		for (int j = 1; j <= col; j++) {
			printf(" %c ", arr[i][j]);
		}
		printf("\n");
	}
}

 置雷函数

void setmine(char arr[ROWS][COLS], int row, int col) {
	int count = NUM_MINE;
	while (count) {
		int row1 = rand() % 9 + 1;//srand函数在调用前已经使用
		int col1 = rand() % 9 + 1;
		if (arr[row1][col1] == '0') {
			arr[row1][col1] = '1';
			count--;
		}
	}
}

评估函数 

char judge(char arr[ROWS][COLS], int row, int col) {
	return (arr[row - 1][col - 1] + arr[row][col - 1] + arr[row + 1][col - 1] 
+ arr[row - 1][col]+ arr[row + 1][col] +arr[row - 1][col + 1] 
+ arr[row][col + 1] + arr[row + 1][col + 1] )%'0'+'0';
//周围八个字符相加后对‘0’取余后加上‘0’保障返回的也为ASCII的值
}

查找函数

int find(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)//查询成功返回1,失败返回0
 {
	int row1 = 0;
	int col1 = 0;
	while (1) {
		printf("please input\n");
		scanf("%d %d", &row1, &col1);
		if (row1 > row || row1<0 || col1>col || col1 < 0) {
			printf("pos error\n");
			break;
		}
		else if (show[row1][col1] != '*') {
			printf("pos error\n");
			break;
		}
		else {
			if (mine[row1][col1] == '1') {
				printf("congratulations! You die\n");
				return 0;
			}
			else {
				char val = judge(mine, row1, col1);
				show[row1][col1] = val;
				break;
			}
		}
	}
	return 1;

}

主界面函数

void manu() {
	printf("-----------------------------\n");
	printf("-----------Welcome-----------\n");
	printf("-----------1: play-----------\n");
	printf("-----------2: quit-----------\n");
	printf("-----------------------------\n");
	printf("-----------------------------\n");
}

主函数

int main() {
	srand((unsigned int)time(NULL));
	int count = 0;
	int flag = 0;
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	Init(mine, ROWS, COLS, '0');
	Init(show, ROWS, COLS, '*');
	setmine(mine, ROWS, COLS);
	while (1) {
		manu();
		scanf("%d", &flag);
		if (flag == 1) {
		/*	Print(mine, ROW, COL);*/
			Print(show, ROW, COL);
			while (1) {
				if (find(mine, show, ROWS, COLS)) {
					count++;
				}
				else {
					Print(mine, ROW, COL);
					Print(show, ROW, COL);
					break;
				}
				Print(mine, ROW, COL);
				Print(show, ROW, COL);
				if (count == 81 - NUM_MINE) {
					printf("congratulation! You win\n");
					break;
				}
			}
		}
		else if (flag == 2) {
			break;
		}
		else {
			printf("error input\n");
			continue;
		}
	}
}

调试结果

 


总结:

        

        扫雷的基本功能实现了,但是比如运用递归实现一块区域的打开功能,放置国旗的功能尚未实现,之后研究在进行添加! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值