C语言远征之基础篇

c语言远征第9天

写一个简易版的扫雷游戏

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

#define MAX_ROW 9
#define MAX_COL 9

char showmap[MAX_ROW][MAX_COL] ;
char minemap[MAX_ROW][MAX_COL] ;
int meau()
{
	printf("************************\n");
	printf("1.开始游戏\n");
	printf("0.离开游戏\n");
	printf("************************\n");
	printf("请输入你的选择:>");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
//对两张地图进行初始化
void init()
{
	srand((unsigned int)time(0));
	int row = 0;
	int count = 0;
	for (row = 0;row < MAX_ROW; ++row)
	{
		for (int col = 0;col < MAX_COL; ++col)
		{
			showmap[row][col] = '*';
		}
	}
	for (int row = 0; row < MAX_ROW; ++row)
	{
		for (int col = 0; col < MAX_COL; ++col)
		{
			minemap[row][col] = '0';
		}
	}
	while (1)
	{
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		int minecount = 10;
		if (minemap[row][col] != '1')
		{
			minemap[row][col] = '1';
			count++;
			if (count >= minecount)
			{
				break;
			}
		}
	}
}
//打印地图
void printmap(char map[MAX_ROW][MAX_COL])
{
	int row = 0;
	int col = 0;
	printf("   ");
	for (int i = 0; i < MAX_ROW; ++i)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 0; i < MAX_ROW +1; ++i)
	{
		printf("--");
	}
	printf("\n");
	for (; row < MAX_ROW; ++row)
	{
		printf("%d| ", row);
		for (col=0; col < MAX_COL; ++col)
		{
			printf("%c ",map[row][col]);
		}
		printf("\n");
	}

}
//根据当前位置周围8个格子有几个地雷,并将数字更新到show_map;
void Updateshowmap(int row,int col,char showmap[MAX_ROW][MAX_COL],char minemap[MAX_ROW][MAX_COL])
{
	int num = 0;
	if (row-1>=0&&col-1>=0&&row-1<MAX_ROW&&col-1<MAX_COL&&minemap[row - 1][col - 1] == '1')
	{
		num++;
	}
	else if (row - 1 >= 0 && col - 1 >= 0 && row - 1 < MAX_ROW&&col - 1 < MAX_COL&&minemap[row - 1][col - 1] == '0')
	{
		Updateshowmap(row - 1, col - 1,showmap,minemap);
	}
	
	if (row - 1 >= 0 && col >= 0 && row - 1<MAX_ROW&&col<MAX_COL&&minemap[row - 1][col] == '1')
	{
		num++;
	}
	else if (row - 1 >= 0 && col  >= 0 && row - 1 < MAX_ROW&&col  < MAX_COL&&minemap[row - 1][col] == '0')
	{
		Updateshowmap(row - 1, col, showmap, minemap);
	}

	if (row - 1 >= 0 && col + 1 >= 0 && row - 1<MAX_ROW&&col + 1<MAX_COL&&minemap[row - 1][col + 1] == '1')
	{
		num++;
	}
	else if (row - 1 >= 0 && col+1 >= 0 && row - 1 < MAX_ROW&&col+1  < MAX_COL&&minemap[row - 1][col+1] == '0')
	{
		Updateshowmap(row - 1, col +1, showmap, minemap);
	}

	if (row  >= 0 && col - 1 >= 0 && row <MAX_ROW&&col - 1<MAX_COL&&minemap[row][col - 1] == '1')
	{
		num++;
	}
	if (row >= 0 && col +1 >= 0 && row <MAX_ROW&&col +1<MAX_COL && minemap[row][col + 1] == '1')
	{
		num++;
	}
	if (row +1 >= 0 && col - 1 >= 0 && row + 1<MAX_ROW&&col - 1<MAX_COL&&minemap[row + 1][col - 1] == '1')
	{
		num++;
	}
	if (row +1 >= 0 && col >= 0 && row +1<MAX_ROW&&col<MAX_COL&&minemap[row + 1][col] == '1')
	{
		num++;
	}
	if (row +1 >= 0 && col +1 >= 0 && row +1<MAX_ROW&&col +1<MAX_COL&&minemap[row+1][col+1] == '1')
	{
		num++;
	}
	showmap[row][col] = '0' + num;//num为int型,要想转为字符型输出,需要加上'0'
}
void game()
{
	int row = 0;
	int col = 0;
	int minecount = 10;
	int mine_count_already_show = 0;
	int blank_count_already_show = 0;
	init();
	while (1)
	{
		printmap(showmap);
		//调试阶段 TODO
		//printmap(minemap);
		
		printf("请输入一组坐标:>");
		scanf("%d %d", &row, &col);
		system("cls");
		if (row < 0 || col < 0 || row >= MAX_ROW || col >= MAX_COL)
		{
			printf("非法操作\n");
			continue;
		}
		if (showmap[row][col] != '*')
		{
			printf("该位置已经被翻开\n");
			continue;
		}
		if (minemap[row][col] == '1')
		{
			printf("游戏结束\n");
			printmap(minemap);
			break;
		}
		blank_count_already_show++;
		//判定所有非雷区域被翻开
		if (blank_count_already_show == MAX_COL * MAX_ROW - minecount)
		{
			printf("游戏胜利\n");
			printmap(minemap);
			break;
		}
		//统计当前位置周围雷的个数
		Updateshowmap(row,col,showmap,minemap);
	}
}
int main()
{
	while(1)
	{
		int choice = meau();
		if (choice)
		{
			game();
		}
		else if(!choice)
		{
			printf("goodbye\n");
			break;
		}
		else
		{
			printf("您的输入有误\n");
		}
	}
	system("pause");
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值