关于扫雷的代码的思考和实现

2024-01-23 16:08:03 浏览数 (2)

全部的代码写在了最后,看完文章后,可以自行参考。

对于扫雷的观察

随着不断对C语言的了解,我发现可以用C语言来创造出简单的游戏,就比如说相对简单的扫雷,当然在创造扫雷的时候,我先玩了一把,大概可以把扫雷分为这四步。 1、创造棋盘(由于扫雷是可以选择难度的,所以根据玩家实力的不同,要给玩家自由发挥能力的空间) 2、放置雷的位置(要让系统随机的放置,不能让每次的雷的规律能够可预测,从而实现扫雷游戏的可玩性) 3、展示棋盘(让玩家能够看到目前棋盘的状态,从而做出选择)


一、创造棋盘

如果说,要在一个9*9的方格内进行游戏,对于在内部的雷,容易实现第四步的展示周围雷的功能,==但是对于在棋盘边上的雷要怎么展示?不能让边上的雷九宫格都凑不齐。==所以,为了应对边角上的雷,要把棋盘扩大让宽和长都** 2**,这样就可以让边上的雷容易计算。

代码语言:javascript复制
#define ROW 9
#define COL 9
#define ROWS ROW 2
#define COLS COL 2
#define EASY_COUNT 10//规定默认10是雷的个数
void InitBoard(char board[ROWS][COLS], int rows, int clos,char set)
{
int i = 0;
	for (i = 0; i < rows; i  )
	{
		int j = 0;
		for (j = 0; j < clos; j  )
		{
			board[i][j] = set;
		}
	}
}

二、放置雷的位置

为了随机的雷,需要利用到#include<time.h>和srand((unsigned int)time(NULL))这样的话,可以根据时间的不同,创造出不同的值,让雷的位置能够不一样 。同时,利用自定义函数,自定义一个能让雷放置到棋盘里面的函数。

代码语言:javascript复制
void SetMine(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--;
		}
	}

}
int main()
{
	srand((unsigned int)time(NULL));
}

三、展示棋盘

初始展示

通过上面两步之后,都是相当于在背后实现了,棋盘的大致模样。到现在就应该是,让我们之前设置的棋盘能够在运行界面展示出来,让玩家能够看到。

代码语言:javascript复制
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i  )
	{
		printf("%d ", i);
	}
	printf("n");
	for (i = 1; i <= row; i  )
	{
		printf("%d ", i);//此时是打印行号
		int j = 0;
		for (j = 1; j <= col; j  )
		{
			printf("%c ", board[i][j]);//让之前设置的show的棋盘显现
		}
		printf("n");
	}
}

输入坐标后的展示的棋盘

第一步是算周围的雷有几个,又由于我输入的是字符,和数字不一样,所以要关注一下,防止输入错误。

代码语言:javascript复制
int GetMineCount(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');
}

注意

1、创造棋盘和放置雷和展示棋盘不能都在所谓的一个表面上进行,不然会造成混乱的情况 2、在”暗地里“进行代码运行的,在一个模板上,在能够让玩家看见的界面面上,要在另一个模板上进行。 3、在main函数中,创造mine是暗地里的,show函数是展示的

总结(全部代码结合并且区分,更利于加密等操作)

game.h

代码语言:javascript复制
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>


#define EASY_COUNT 10
#define ROW 9
#define	COL 9
#define ROWS ROW 2
#define COLS COL 2
//这是初始化
void InitBoard(char board[ROWS][COLS], int rows, int clos,char set);//现在这种情况是要加上分号的
//这是想让棋盘能在桌面上显示出来,打印
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//这是让系统随机生成几个雷,并且不能让玩家看到
void SetMine(char board[ROWS][COLS], int row, int col);
//这是排查周围有几个雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);

game.c

代码语言:javascript复制
#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int clos,char set)
{
	int i = 0;
	for (i = 0; i < rows; i  )
	{
		int j = 0;
		for (j = 0; j < clos; j  )
		{
			board[i][j] = set;
		}

	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i  )
	{
		printf("%d ", i);
	}
	printf("n");
	for (i = 1; i <= row; i  )
	{
		printf("%d ", i);//此时是打印行号
		int j = 0;
		for (j = 1; j <= col; j  )
		{
			printf("%c ", board[i][j]);
		}
		printf("n");
	}
}
/* {
	printf("--------扫雷游戏--------n");
	int i = 0;
	for (i = 1; i <= row; i  )
	{
		int j = 0;
		for (j = 1; j <= col; j  )
		{
			printf("%c ", board[i][j]);
		}
		printf("n");
	}
}*///此时是不知道行号和列号的 

void SetMine(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--;
		}
	}

}

int GetMineCount(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 FindMine(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("你要查看的坐标n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && y >= 1 && x <= row && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine,x,y);
				show[x][y] = count   '0';
				DisplayBoard(show, ROW, COL);
				win  ;
			}
		}
		else
		{
			printf("输入错误,重新输入n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你排雷成功n");
		DisplayBoard(mine, ROW, COL);
	}
}

test.c

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("****************n");
	printf("*****1. play****n");
	printf("*****0. exit****n");
	printf("****************n");
}

void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');//初始化棋盘
	DisplayBoard(show, ROW, COL);//打印出棋盘
	SetMine(mine, ROW, COL);//放置雷
	FindMine(mine,show, ROW, COL);//查询雷
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//位置不能错,要选对
		printf("请选择是否进行游戏>:n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			input = 0;
			printf("退出游戏n");
			break;
		default :
			printf("输入的值错误,请重新输入n");
		}

	} while (input);
	return 0;
}

0 人点赞