ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

扫雷之简单实现(C语言)

2022-02-22 00:02:57  阅读:214  来源: 互联网

标签:ROWS show int COLS C语言 char 扫雷 简单 mine


目录

1.扫雷游戏基本规则

        2.程序框架

        (1)申明

         (2)菜单打印

        3.游戏game()的实现

        (1)主要逻辑

        (2)代码

        4.完整代码

        (1)game.h

        (2)game.c 

        (3)text.c


1.扫雷游戏基本规则

需找到雷区中所有非地雷的坐标,不可踩地雷

输入一坐标,若该坐标非地雷,则会显示该地雷周围8个坐标有几个地雷

   图中圈1周围的八个位置中有一个地雷 

若踩到地雷,游戏失败


2.程序框架

text.c__测试游戏的逻辑(源文件)

game.c__函数(源文件)

game.h__符号的定义 函数的声明(头文件)

(1)申明

game.h中,申明扫雷需实现的功能:

#include <stdio.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);

//打印
void show_board(char arr[ROWS][COLS], int row, int col);

//布置雷
void set_mine(char arr[ROWS][COLS], int row, int col);

//排查雷
void find_mine(char mine[ROWS][COLS], char [ROWS][COLS] , int row, int col);

//标记雷
//void mark(char show[ROWS][COLS], int x, int y);

//取消标记雷
//void cancel(char show[ROWS][COLS], int x, int y);

 

 (2)菜单打印

text.c中首先实现游戏菜单的打印,如下:

#include "game.h"
void menu()
{
	printf("****************************\n");
	printf("********   1.play    *******\n");
	printf("********   0.exit    *******\n");
	printf("****************************\n");
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择是否开始游戏:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game(); //游戏的实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入:>\n");
			break;
		}
	} while (input);
		return 0;
}

3.游戏game()的实现

(1)主要逻辑

扫雷游戏函数的实现
      1.  创建两数组:mine数组、show数组,

       分别用于存放布置好的雷的信息、用于存放排查出的累的信息
   
      2.初始化两棋盘
        mine棋盘中 ,'1'-雷      '0'-非雷  
        show棋盘中,   *-排查      数组字符(数字) -已排查

      3.布置雷     set_mine
  
      4.打印棋盘  show_board


      5 排查雷  find_mine

(2)代码

代码体现如下:

//text.c
void game()
{
	//扫雷游戏的实现
	char mine[ROWS][COLS] = { 0 };//'0'
	char show[ROWS][COLS] = { 0 };//'*'
	/*mine数组用于存放布置好的雷的信息
	show数组用于存放排查出的累的信息*/
	//初始化棋盘
	init_board(mine, ROWS, COLS,'0');
	init_board(show, ROWS, COLS,'*');
	//布置雷
	set_mine(mine, ROW, COL);
	/*show_board(mine, ROW, COL);*/
	//打印棋盘
	show_board(show , ROW, COL);
	//排查雷
	find_mine(mine, show, ROW, COL);


}

具体实现game.c中具体实现如下:

//初始化棋盘,且可指定初始化为何字符
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for ( i = 0; i < rows; i++)
	{
		for ( j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

//布置雷
void set_mine(char arr[ROWS][COLS], int row,int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (arr[x][y] != '1')
		{
			arr[x][y] = '1';//布置雷
			count--;
		}
	}
}

//打印棋盘
void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("-----------扫雷------------\n");
    //同时打印行列,易于输入坐标
	for(j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}//列
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("-----------扫雷------------\n");

}

//返回周围8坐标的雷数(附“排查雷”函数而生)
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] 
		+ mine[x - 1][y] + 
		mine[x - 1][y + 1] + 
		mine[x][y - 1] + 
		mine[x][y + 1] + 
		mine[x + 1][y - 1] +
		mine[x + 1][y] + 
		mine[x + 1][y + 1] - 8 * '0';
        //'0'-'0'=整形0,而非字符0
}

//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,您踩到雷了\n");
				show_board(mine, ROW, COL);
				break;
			}
			else
			{
				//算周围8个位置有几个雷
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';//将count的类型转换为字符型
				show_board(show,ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标不合法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
		show_board(mine, ROW, COL);
	
	}
}

4.完整代码

能力有限,以上并没有实现1. 图形界面的建立  2.雷的标记及取消  3.某坐标周围若无雷,界面的自动展开。

完整代码如下

(1)game.h

//game.h

#include <stdio.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);

//打印
void show_board(char arr[ROWS][COLS], int row, int col);

//布置雷
void set_mine(char arr[ROWS][COLS], int row, int col);

//排查雷
void find_mine(char mine[ROWS][COLS], char [ROWS][COLS] , int row, int col);

//标记雷
void mark(char show[ROWS][COLS], int x, int y);

//取消标记雷
void cancel(char show[ROWS][COLS], int x, int y);

(2)game.c 

//game.c

#include "game.h"

//布置雷,10个

//初始化棋盘,且可指定初始化为何字符
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for ( i = 0; i < rows; i++)
	{
		for ( j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

//布置雷
void set_mine(char arr[ROWS][COLS], int row,int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (arr[x][y] != '1')
		{
			arr[x][y] = '1';//布置雷
			count--;
		}
	}
}

//打印棋盘
void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("-----------扫雷------------\n");
	for(j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("-----------扫雷------------\n");

}

//
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] 
		+ mine[x - 1][y] + 
		mine[x - 1][y + 1] + 
		mine[x][y - 1] + 
		mine[x][y + 1] + 
		mine[x + 1][y - 1] +
		mine[x + 1][y] + 
		mine[x + 1][y + 1] - 8 * '0';//'0'-'0'=整形0,而非字符0
}

//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,您踩到雷了\n");
				show_board(mine, ROW, COL);
				break;
			}
			else
			{
				//算周围8个位置有几个雷
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';//将count的类型转换为字符型
				show_board(show,ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标不合法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
		show_board(mine, ROW, COL);
	
	}
}

//标记雷
void mark(char show[ROWS][COLS], int x, int y)
{
	show[x][y] = '#';
}

//取消标记雷
void cancel(char show[ROWS][COLS], int x, int y)
{
	show[x][y] = '*';
}

(3)text.c

//text.c

#include "game.h"
void menu()
{
	printf("****************************\n");
	printf("********   1.play    *******\n");
	printf("********   0.exit    *******\n");
	printf("****************************\n");
}
void game()
{
	//扫雷游戏的实现
	char mine[ROWS][COLS] = { 0 };//'0'
	char show[ROWS][COLS] = { 0 };//'*'
	/*mine数组用于存放布置好的雷的信息
	show数组用于存放排查出的累的信息*/
	//初始化棋盘
	init_board(mine, ROWS, COLS,'0');
	init_board(show, ROWS, COLS,'*');
	//布置雷
	set_mine(mine, ROW, COL);
	/*show_board(mine, ROW, COL);*/
	//打印棋盘
	show_board(show , ROW, COL);
	//排查雷
	find_mine(mine, show, ROW, COL);


}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择是否开始游戏:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入:>\n");
			break;
		}
	} while (input);
		return 0;
}

标签:ROWS,show,int,COLS,C语言,char,扫雷,简单,mine
来源: https://blog.csdn.net/weixin_57085103/article/details/122909209

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有