扫雷游戏简单实现(C语言)

文章分享了一个早期编写的C语言扫雷游戏的源代码,包括游戏的基本功能实现,如初始化棋盘、布置雷、排查雷等。代码中定义了游戏的行数、列数和雷的数量,还提供了一个简单的菜单系统。虽然代码已完成大部分功能,但作者指出存在优化空间,鼓励读者自行改进。
摘要由CSDN通过智能技术生成

  今天给大家分享的是自己很早时期写的扫雷游戏。该扫雷游戏功能大部分已经实现,但缺少一些优化,由于本人一直没有时间进行修改,所以就直接分享思路给大家,至于优化问题就留给大家自己补充吧!

  下面是源码:

一.头文件test.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 9      //行数
#define COL 9      //列数
#define EASY_MINE 10
#define ROWS ROW + 2   
#define COLS COL + 2

void menu();   //菜单
void game();   //游戏地图
//初始化
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);

//展示棋盘
void DisplayBoard(char Board[ROWS][COLS], int row, int col);

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

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

//查找输入坐标周围的雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y);

二.源文件test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"

void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
	int i, j;    //i控制行数,j控制列数
	for (i = 0; i < rows; i++)
	{

		for (j = 0; j < cols; j++)
		{
			Board[i][j] = set;
		}
	}
}

void DisplayBoard(char Board[ROWS][COLS], int row, int col)     //展示棋盘
{
	int i, j;  //i控制行数,j控制列数
	printf("------------------------------------------------扫雷游戏------------------------------------------------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d\t", i);
	}
	printf("\n\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d\t", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c\t", Board[i][j]);
		}
		printf("\n\n");
	}
	printf("------------------------------------------------扫雷游戏------------------------------------------------\n");
}

void Setmine(char mine[ROWS][COLS], int row, int col)
{
	//布置十个雷
	int count = 10;    //雷的数量
	while (count > 0 && count < 11)
	{
		//生成随机的下标
		int x = rand() % row + 1;    //行数的下标
		int y = rand() % col + 1;    //列数的下标
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}

}

void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	//1.首先玩家需要填入需要排查的坐标
	//2.检查坐标是不是雷
	/*
	* 如果是雷    则提醒玩家被雷炸死  游戏结束
	* 如果不是雷  则统计该玩家输入的坐标周围有几个雷 并存储排查雷的信息到show数组里 游戏继续
	*/
	int x, y;
	int Find = 0;     //记录已经找到的不是雷的个数
	while (Find < row * col - EASY_MINE)
	{
		printf("请输入坐标(先输入行后输入列):");
		scanf("%d%d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("您输入的信息有误,请重新输入!\n");
		}
		else
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,您被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//查找输入坐标的周围8格内是否含有雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + 48;
				//显示排查信息
				DisplayBoard(show, ROW, COL);
				Find++;
			}
		}
		if (Find == row * col - EASY_MINE)
		{
			printf("\n\n");
			printf("*******************************************************\n");
			printf("\n");
			printf("恭喜您找到了全部雷的位置,您赢了!!\n");
			printf("\n");
			printf("*******************************************************\n");
			printf("\n\n");
			printf("复盘:\n");
			DisplayBoard(mine, ROW, COL);
		}
	}
}

int GetMineCount(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 * 48;
}

三.源文件main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"

void menu()    //菜单
{
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("***********     扫雷          ***************\n");
	printf("***********  1. 开始游戏      ***************\n");
	printf("***********  0. 退出游戏      ***************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
}

void game()    //游戏地图
{
	char mine[ROWS][COLS];   //存放布置好的雷的信息 初始化为0
	char show[ROWS][COLS];  //向玩家展示的棋盘,存放排查出的雷的信息  初始化为‘*’

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//展示棋盘
	DisplayBoard(mine,ROW,COL);
	DisplayBoard(show, ROW, COL);

	//布置雷
	Setmine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);

	//排查雷
	Findmine(mine, show, ROW, COL);

}
int main()
{
	srand((unsigned int)time(NULL));   //为了让编译器不报警告,建议加上unsigned int进行强制转换
	int choice;    //储存游戏开始的选择
	do {
		menu();
		printf("请选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("好的,游戏马上开始\n");
			Sleep(2500);
			game();
			break;
		case 0:
			printf("好的,欢迎下次游玩\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (choice != 0);    //选1为真,则继续循环,重新选择;选0则直接跳出do while循环;选其他的同样重新选择
	return 0;
}

  初始C语言系列可能要先暂缓一下了,等我忙完火速更新!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值