初学C语言《扫雷》

扫雷

简单的可控化扫雷


<font color=#999AAA


分析

在这里插入图片描述
玩家选择雷格,出现的数字即周围一圈所包含雷的个数,当我们不去点击格子,我们不知道其下的情况,可以试想是不是有一个在背后处理雷的布局,表面有一个玩家操控的布局,我们只需要建立简单的联系使两个布局发挥作用。


一,头文件

game.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW  9//我们选择难度最小的9*9雷区
#define COL  9
#define ROWS ROW+2//最外圈排雷需要
#define COLS COL+2
#define EASY_COUNT 10//声明内容,详情见下文
void intborad(char board[ROWS][COLS], int rows, int cols, char ret);

void disprond(char board[ROWS][COLS], int row, int col);

void setball(char board[ROWS][COLS], int row, int col);
void findball(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

二、主函数

int main()
{
	test();//游戏最大框架,开始界面的进入游戏与相关选择

	return 0;
}

1.test

void test()
{
	srand((unsigned int)time(NULL));


	menu();//菜单打印
	int input=0;
	printf("请选择>");
	do//由选择来决定下文
	{
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			break;
		default:
			printf("输入错误请重输入");
			break;
		}
	} while (1);
}

menu

void menu()
{
	printf("************************************n");
	printf("*******        1 . play    *********n");
	printf("*******        2 . exit    *********n");
	printf("************************************n");
}

在这里插入图片描述

2, game

void game()
{
//相同类型方便后期啊建立联系,对背后的修改可反映到展示函数
	char mine[ROWS][COLS] = { 0 };//背后
	char show[ROWS][COLS] = { 0 };//玩家看到的
//将背后全初始化为0,雷放为一
	intborad(mine, ROWS, COLS, '0');
	intborad(show, ROWS, COLS, '*');
//注释代码可供开发者在制作过程中检查
	//disprond(mine, ROW, COL);
	//disprond(show, ROW, COL);
	setball(mine, ROW, COL);//布置雷
	//setball(show, ROW, COL);
	disprond(show, ROW, COL);

	//disprond(show, ROW, COL);

	findball(mine, show, ROW, COL);//排雷且建立联系
}

示例:完成一个目的,可以先把这一步想好,后续反复打磨填充。

二、game.c

1.初始化

void intborad(char board[ROWS][COLS], int rows, int cols, char ret)
void intborad(char board[ROWS][COLS], int rows, int cols, char ret)
{
	int i=0;
	int j=0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}

2.打印

代码如下(示例):

void disprond(char board[ROWS][COLS], int row, int col)
{
	int i=0;
	int j=0;
	//列(列行坐标方便玩家操作)
	for (i = 0; i <= row; i++)
	{
		printf(" %d", i);
	}
	printf("n");
	//行以及内容
	for (i = 1; i <= col; i++)
	{
		printf(" %d", i);
		for (j = 1; j <= col; j++)
		{
			printf(" %c", board[i][j]);
		}
		printf("n");
	}
}

在这里插入图片描述

3.布置雷

void setball(char board[ROWS][COLS], int row, int col)

代码如下(示例):

void setball(char board[ROWS][COLS], int row, int col)
{
	int count= EASY_COUNT;//见头文件,埋十颗
	while (count)
	{
		int x = rand() % row + 1;//随机数
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//雷为1
		}
		count--;
	}
}

4.找雷

void findball(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)//为了最外围多加一圈,现在是9*9内
		{
			if (mine[x][y] == '1')//布置雷时将雷设为1
			{
				printf("恭喜你被炸死了n");
				disprond(mine, row, col);
				break;
			}
			else
			{
				int n = get_mine_count(mine, x, y);//游戏有点某一个扩散一片的现象,就周围都为0,需要不断寻找
				show[x][y] = n + '0';//整形转化为字符,建立联系
				disprond(show, row, col);
				win++;
			}
		}
		else
		{
			printf("请输入正确坐标n");
		}
	}
	if (win == row * col - EASY_COUNT)//71
	{
		printf("排雷成功");
		disprond(mine, row, col);
	}
}

.get_mine_count(mine, x, y)

static int get_mine_count(char mine[ROWS][COLS], int x, int  y)
{
//检索周围雷的个数
	return mine[x - 1][y] +
	 mine[x - 1][y - 1] +
	  mine[x][y - 1] +
	   mine[x + 1][y - 1] + 
	   mine[x + 1][y] +
	    mine[x + 1][y + 1] +
	     mine[x][y + 1] +
	      mine[x - 1][y + 1] - 8 * '0';
}

在这里插入图片描述

将雷布置在不可见背后棋盘


代码整合

game.h

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW  9
#define COL  9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void intborad(char board[ROWS][COLS], int rows, int cols, char ret);

void disprond(char board[ROWS][COLS], int row, int col);

void setball(char board[ROWS][COLS], int row, int col);
void findball(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("************************************n");
	printf("*******        1 . play    *********n");
	printf("*******        2 . exit    *********n");
	printf("************************************n");
}
void game()
{

	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };

	intborad(mine, ROWS, COLS, '0');
	intborad(show, ROWS, COLS, '*');

	//disprond(mine, ROW, COL);
	//disprond(show, ROW, COL);
	setball(mine, ROW, COL);
	//setball(show, ROW, COL);
	disprond(show, ROW, COL);

	//disprond(show, ROW, COL);

	findball(mine, show, ROW, COL);
}
void test()
{
	srand((unsigned int)time(NULL));


	menu();
	int input=0;
	printf("请选择>");
	do
	{
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			break;
		default:
			printf("输入错误请重输入");
			break;
		}
	} while (1);
}
int main()
{
	test();

	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void intborad(char board[ROWS][COLS], int rows, int cols, char ret)
{
	int i=0;
	int j=0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}
void disprond(char board[ROWS][COLS], int row, int col)
{
	int i=0;
	int j=0;
	//列
	for (i = 0; i <= row; i++)
	{
		printf(" %d", i);
	}
	printf("n");
	//行以及内容
	for (i = 1; i <= col; i++)
	{
		printf(" %d", i);
		for (j = 1; j <= col; j++)
		{
			printf(" %c", board[i][j]);
		}
		printf("n");
	}
}
void setball(char board[ROWS][COLS], int row, int col)
{
	int count= EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
		}
		count--;
	}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int  y)
{
	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';
}
void findball(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");
				disprond(mine, row, col);
				break;
			}
			else
			{
				int n = get_mine_count(mine, x, y);
				show[x][y] = n + '0';
				disprond(show, row, col);
				win++;
			}
		}
		else
		{
			printf("请输入正确坐标n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("排雷成功");
		disprond(mine, row, col);
	}
}

“主要是理解,明确思路,理清思路就是对所学知识的简单应用”

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>