C语言-扫雷

步骤

  1. 首先打印游戏选择菜单
  2. 地图及初始化
    • 展示给玩家的地图(show_map)
    • 地雷的图(mine_map可知地雷的位置)
  3. 打印地图
  4. 用户输入坐标,并检查坐标的合理性
  5. 判断当前位置是否有地雷,没有则出现数字(表示周围格子中有几个地雷)
  6. 打印新的地图
  7. 重复3~6步骤,直到踩雷游戏结束,或胜利。
  8. 重新继续游戏或退出!

代码

  • 主函数及游戏选择菜单
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    #define ROW 9
    #define COL 9
    #define COUNT 10 //地雷个数
    
    int menu()
    {
    	printf("*************************\n");
    	printf("******   1.play    ******\n");
    	printf("******   0.exit    ******\n");
    	printf("*************************\n");
    	printf("请选择:>");
    	int choice = 0;
    	scanf("%d", &choice);
    	return choice;
    }
     
    int main()
    {
    	int choice = 0;
    	srand((unsigned int)time(NULL));
    	while (1)
    	{
    		choice = menu();
    		if (choice == 1)
    		{
    			game();
    		}
    		else if (choice == 0)
    		{
    			printf("goodbye!\n");
    			break;
    		}
    		else
    		{
    			printf("输入有误,请重新输入!\n");
    		}
    	}
    
    	system("pause");
    	return 0;
    }   

    ~ 进入游戏

  • 1.创建两个二维数组;2.对两个二维数组进行初始化;3.打印地图;4.让用户输入一组坐标;5.判定是否踩雷;6.判断游戏是否胜利;7.更新地图,把当前位置变成一个数字(数字为周围格子里地雷个数)

  • void game()
    {
    	//1.创建两个二维数组
    	char show_map[ROW][COL];
    	char mine_map[ROW][COL];
    	//2.对两个二维数组进行初始化
    	Init(show_map, mine_map); 
    	int blank_count = 0;
    	while (1)
    	{
    		PrintMap(mine_map);//为了方便调试,临时打印mine_map
    		printf("\n");
    
    		//3.打印地图
    		PrintMap(show_map);
    		//4.让用户输入一组坐标
    		printf("请输入坐标:>");
    		int i = 0;
    		int j = 0;
    		scanf("%d %d", &i, &j);
    		if (i < 0 || i >= ROW || j < 0 || j >= COL)
    		{
    			printf("输入有误,请重新输入!\n");
    			continue;
    		}
    		if (show_map[i][j] != '*')
    		{
    			//这个位置已经被翻开
    			printf("输入的位置已被翻开,请重新输入!\n");
    			continue;
    		}
    		//5.判定是否踩雷
    		if (mine_map[i][j] == '1')
    		{
    			//踩雷了,提示游戏结束
    			PrintMap(mine_map);
    			printf("游戏结束!\n");
    			break;
    		}
    		blank_count++;
    		//6.游戏是否胜利
    		if (blank_count == ROW * COL - COUNT)
    		{
    			printf("恭喜你,扫雷成功!\n");
    			break;
    		}
    		//7.更新地图,把当前位置变成一个数字
    		UpdateShowMa(show_map, mine_map, i, j);
    	}
    }

     

  • 初始化地图
    void Init(char show_map[ROW][COL], char mine_map[ROW][COL])
    {
    	//1.show_map 全部初始化为 *
    	for (int i = 0; i < ROW; i++)
    	{
    		for (int j = 0; j < COL; j++)
    		{
    			show_map[i][j] = '*';
    		}
    	}
    	//2.mine_map初始化
    	for (int i = 0; i < ROW; i++)
    	{
    		for (int j = 0; j < COL; j++)
    		{
    			mine_map[i][j] = '0';
    		}
    	}
    	//3.随机生成10个位置作为地雷
    	int mine_count = COUNT;
    	while (mine_count > 0)
    	{
    		//生成随机坐标
    		int i = rand() % ROW;
    		int j = rand() % COL;
    		if (mine_map[i][j] == '1')
    		{
    			continue;
    		}
    		mine_map[i][j] = '1';
    		--mine_count;
    	}
    }

     

  • 打印地图
    void PrintMap(char map[ROW][COL])
    {
    	//1.先打印第一行(坐标)
    	printf("   |");
    	for (int j = 0; j < COL; j++)
    	{
    		printf(" %d", j);
    	}
    	printf("\n");
    	//2.打印一行分隔符
    	for (int j = 0; j < COL; j++)
    	{
    		printf("---");
    	}
    	printf("\n");
    	//3.按照每行来分别打印
    	for (int i = 0; i < ROW; i++)
    	{
    		printf("  %d|", i);
    		for (int j = 0; j < COL; j++)
    		{
    			printf(" %c", map[i][j]);
    		}
    		printf("\n");
    	}
    }

     

  • 判断落子周围格子地雷的个数
    void UpdateShowMa(char show_map[ROW][COL], char mine_map[ROW][COL], int i, int j)
    {
    	//判定当前位置(i,j),周围8个格子有几个雷
    	int count = 0;
    	if (i - 1 >= 0 && j - 1 >= 0 && mine_map[i - 1][j - 1] == '1')
    	{ 
    		count++;
    	}
    	if (i - 1 >= 0 && mine_map[i - 1][j] == '1')
    	{
    		count++;
    	}
    	if (i - 1 >= 0 && j + 1 < COL && mine_map[i - 1][j + 1] == '1')
    	{
    		count++;
    	}
    	if (j - 1 >= 0 && mine_map[i][j - 1] == '1')
    	{
    		count++;
    	}
    	if (j + 1 < COL && mine_map[i][j + 1] == '1')
    	{
    		count++;
    	}
    	if (i + 1 < ROW && j - 1 >= 0 && mine_map[i + 1][j - 1] == '1')
    	{
    		count++;
    	}
    	if (i + 1 < ROW && mine_map[i + 1][j] == '1')
    	{
    		count++;
    	}
    	if (i + 1 < ROW && j + 1 < COL && mine_map[i + 1][j + 1] == '1')
    	{
    		count++;
    	}
    	//count 里面的值就已经是周围雷的个数了
    	show_map[i][j] = count + '0';
    }

    OVER!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值