C语言扫雷小游戏

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

  • CSDN java领域新星创作者blog.csdn.net/bug..
  • 掘金LV3用户 juejin.cn/user/bug..
  • 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
  • 华为云云享专家 bbs.huaweicloud.com/bug..

    写在前面

    我们已经写过了三子棋小游戏肯定没玩过瘾,我们再写个扫雷小游戏吧!

    @TOC

    认识游戏

    相信大家对扫雷都不陌生!每台电脑必备的小游戏!

    游戏规则

    就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!

    胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。

    简单说 就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了地雷,游戏失败!

    如何找到不是地雷标记出来呢? 每点开一个小格子,如果是雷,就游戏结束,如果不是就会出现数字,出现的数字表示,周围一圈雷的个数! 2表示周围一圈的地雷数为2个。 根据这些数字即可将地雷全部排除走向胜利!

    游戏框架

    游戏框架和三子棋一样!

    //游戏框架
    	int input = 0;
    	do 
    	{
    		menu();//菜单
    		scanf("%d", &input); //选择
    		switch (input)
    		{
    		case 1:game();
    			break;
    		case 0:printf("退出游戏\n");
    			break;
    		default:printf("输入错误,请重新输入\n");
    			break;
    		}
    	} while (input);
    
    
    

    我们写小游戏的框架基本上都是这样!

    游戏实现

    游戏的实现是我们这个游戏的重点内容! 我们如何才能将游戏实现呢? 先从原理入手!

    实现思想 用一个二维数组埋雷 另一个二维数组显示给玩家 当我们将雷弄成AxA的雷阵藏雷,会发现如果我们进行周围雷数的查找是会发生数组越界,所以我们可以创建(A+2)x(A+2)的雷阵,然后埋雷在AxA中!

    void game()
    {
    	//初始化布雷数组—— > 初始化棋盘数组—— > 
    	//设置地雷—— > 显示棋盘—— > 玩家扫雷
    	//埋雷
    	char mine[ROWS][COLS] = { 0 }; //雷区图
    	char show[ROWS][COLS] = { 0 }; //玩家图
    	//初始化棋盘
    	InitBoard(mine, ROWS, COLS,'0');
    	InitBoard(show, ROWS, COLS, '*');
    	//设置地雷
    	SetMine(mine, ROW, COL,MineCount);
    	PrintBoard(show, ROW, COL);
    	//玩家扫雷
    	int count = ROW*COL-MineCount;
    	while (CheckMine(mine,show, ROW, COL))
    	{
    		count--;
    		PrintBoard(show, ROW, COL);
    		if (count == 0)
    		{
    			printf("恭喜你,游戏胜利\n");
    			PrintBoard(mine, ROW, COL);
    			break;
    		}
    	}
    
    
    }
    
    
    //初始化棋盘
    void InitBoard(char board[ROW][COL], int row, int col, char x)
    {
    	int i = 0;
    	for (i = 0; i < row; i++)
    	{
    		int j = 0;
    		for (j = 0; j < col; j++)
    		{
    			board[i][j] = x;
    		}
    	}
    	return ;
    }
    
    
    
    //打印棋盘
    void PrintBoard(char board[ROW][COL], int row, int col)
    {
    	  int i = 0;
    	  //打印列号
    	  for (i = 0; i <= col; i++)
    		  printf(" %d ", i);
    	      printf("\n");
    	for (i = 0; i < row; i++)
    	{
    		printf(" %d ", i+1);
    		int j = 0;
    		for (j = 0; j <col; j++)
    		{
    			printf(" %c ", board[i][j]);
    		}
    		printf("\n");
    	}
    	return;
    }
    
    
    //埋雷
    void SetMine(char board[ROW][COL], int row, int col, int count)
    {
    	while (count)
    	{
    		int i = rand() % row;
    		int j = rand() % col;
    		if (board[i][j] == '0')
    		{
    			board[i][j] = '1';
    			count--;
    	    }
    	}
    }
    
    

    核心代码

    //查雷
    int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
    {
    	printf("请输入你要扫雷的坐标:>");
    	while (1)
    	{
    		int i = 0, j = 0;
    		scanf("%d%d", &i, &j);
    		if (i >=1 && i <= row && j >=1 && j <= col)
    		{
    			if (mine[i-1][j-1] != '1')
    			{
    				int  count=IsMineCount(mine,i-1,j-1);
    				show[i-1][j-1] = count+'0';
    				return 1;
    			}
    			else
    			{
    				printf("很遗憾,你被炸死了\n");
    				PrintBoard(mine, ROW, COL);
    				return 0;
    			}
    		}
    	}
    	
    }
    int  IsMineCount(char mine[ROW][COL], int x, int y)
    {
    	int count = 0;
    	int i= 0;
    	for (i = x - 1; i <= x + 1; i++)
    	{  
    		int j = 0;
    		for (j = y - 1; j <=y + 1; j++)
    		{
    			if (mine[i][j] == '1')
    			{
    				count++;
    
    			}
    		}
    	}
    	return count;
    }
    
    

    效果展示

    全部代码

    test.c文件

    #define _CRT_SECURE_NO_WARNINGS 1 
    #include"game.h"
    
    void menu()
    {
    	printf("******************************\n");
    	printf("**********    1.play    ******\n");
    	printf("**********    0.exit    ******\n");
    	printf("******************************\n");
    	printf("Input(1/0):>");
    }
    void game()
    {
    	//初始化布雷数组—— > 初始化棋盘数组—— > 设置地雷
    	//—— > 显示棋盘—— > 玩家扫雷
    	//埋雷
    	char mine[ROWS][COLS] = { 0 }; //雷区图
    	char show[ROWS][COLS] = { 0 }; //玩家图
    	//初始化棋盘
    	InitBoard(mine, ROWS, COLS,'0');
    	InitBoard(show, ROWS, COLS, '*');
    	//设置地雷
    	SetMine(mine, ROW, COL,MineCount);
    	PrintBoard(show, ROW, COL);
    	//玩家扫雷
    	int count = ROW*COL-MineCount;
    	while (CheckMine(mine,show, ROW, COL))
    	{
    		count--;
    		PrintBoard(show, ROW, COL);
    		if (count == 0)
    		{
    			printf("恭喜你,游戏胜利\n");
    			break;
    		}
    	}
    }
    
    

    game.h文件

    #pragma once
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    
    #define ROW 9  
    #define COL 9
    #define ROWS ROW+2
    #define COLS COL+2
    #define MineCount 6
    void InitBoard(char board[ROWS][COLS],int row,int col,char x);
    void SetMine(char board[ROWS][COLS], int row, int col,int count);
    void PrintBoard(char board[ROW][COL], int row, int col);
    int  CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col);
    int IsMineCount(char mine[ROWS][COLS],int i, int j);
    
    
    

    game.c文件

    #include"game.h"
    
    void InitBoard(char board[ROW][COL], int row, int col, char x)
    {
    	int i = 0;
    	for (i = 0; i < row; i++)
    	{
    		int j = 0;
    		for (j = 0; j < col; j++)
    		{
    			board[i][j] = x;
    		}
    	}
    	return ;
    }
    void SetMine(char board[ROW][COL], int row, int col, int count)
    {
    	while (count)
    	{
    		int i = rand() % row;
    		int j = rand() % col;
    		if (board[i][j] == '0')
    		{
    			board[i][j] = '1';
    			count--;
    	    }
    	}
    }
    void PrintBoard(char board[ROW][COL], int row, int col)
    {
    	  int i = 0;
    	  //打印列号
    	  for (i = 0; i <= col; i++)
    		  printf(" %d ", i);
    	      printf("\n");
    	for (i = 0; i < row; i++)
    	{
    		printf(" %d ", i+1);
    		int j = 0;
    		for (j = 0; j <col; j++)
    		{
    			printf(" %c ", board[i][j]);
    		}
    		printf("\n");
    	}
    	return;
    }
    int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
    {
    	printf("请输入你要扫雷的坐标:>");
    	while (1)
    	{
    		int i = 0, j = 0;
    		scanf("%d%d", &i, &j);
    		if (i >=1 && i <= row && j >=1 && j <= col)
    		{
    			if (mine[i-1][j-1] != '1')
    			{
    				int  count=IsMineCount(mine,i-1,j-1);
    				show[i-1][j-1] = count+'0';
    				return 1;
    			}
    			else
    			{
    				printf("很遗憾,你被炸死了\n");
    				return 0;
    			}
    		}
    	}
    	
    }
    int  IsMineCount(char mine[ROW][COL], int x, int y)
    {
    	int count = 0;
    	int i= 0;
    	for (i = x - 1; i <= x + 1; i++)
    	{  
    		int j = 0;
    		for (j = y - 1; j <=y + 1; j++)
    		{
    			if (mine[i][j] == '1')
    			{
    				count++;
    
    			}
    		}
    	}
    	return count;
    }
    
    

    <font color=red> 持续更新..... </font>

    #C语言#
    全部评论
    学习C语言扫雷小游戏
    点赞 回复 分享
    发布于 2022-10-16 16:16 河南

    相关推荐

    牛客915519934号:差不多得了 ,真以为我们好忽悠呢?当初就是听了你们的话没有赶上风口入行Java,现在还想再忽悠我呢?这明显就是一个新风口,国家大力发展制造业,以后这个圈子的钱只会越来越多,不管是入门还是大佬,只要进来少说有你一口饭吃,一个个自私自利自己上了车就劝退其他人,钱都让你赚得了呗。就这点东西,入门很容易的,学个pcb,单片机就可以去找工作了,少说一万五起,以后只会越来越高,以后想进阶就去FPGA,linux,给的钱吊打互联网,再说说你们一直说数电模电难?实际呢也不过一个月就能拿下的事情,你不需要学的多深,只需要入门就足够了,就按我说的学出来少说两万起,最好报个培训班,入门更快,兄弟们跟着我冲就完事了,趁着这个机会,狠狠赚他一笔。
    点赞 评论 收藏
    分享
    点赞 评论 收藏
    分享
    11-02 08:15
    已编辑
    门头沟学院 Java
    美团 Java后端开发 10w刀 美硕
    YamadaAnna:包留美的,你拿的美团 招银,没一个不加班的。考虑一下未来吧,应届生的工资真不重要,10w刀税后6w,省省还是能活下去的。回国了35岁怎么办,难道35岁还能返美么,就算35岁还能在国内找到工作,难道打算一辈子9点10点下班么。你有能力在美利坚找到工作,回国如果不是哪个965大厂给你发个ssp,真不值得。 等抽不中h1b,没办法了再回国吧。
    点赞 评论 收藏
    分享
    点赞 1 评论
    分享
    牛客网
    牛客企业服务