C语言实现扫雷小游戏(循环、函数)

本文详细描述了一个基于C++编写的命令行版扫雷游戏的实现过程,包括菜单操作、游戏流程(初始化棋盘、埋雷、找雷),以及关键函数如随机数生成、棋盘操作和雷的计数等。
摘要由CSDN通过智能技术生成

1.进入菜单栏,出现提示;输入1进入游戏,输入0退出游戏,输入其他后重新输入;

do{
		srand((unsigned int)time(NULL));
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;//break只是跳出switch
		case 0:
			break;
		default:
			break;
		}
	} while (input);

2.输入1,进入游戏;根据棋盘的格式,建立两个合适大小的棋盘,一个是实际棋盘,一个是显示棋盘;

	char qi[Rows][Cols] = { 0 };
	char pan[Rows][Cols] = { 0 };
	chushi(qi, Rows, Cols, '0');
	chushi(pan, Rows, Cols, '*');

3.将两个棋盘初始化;一个全为零,一个全为星;初始化运用了调用函数,两层for循环,将他们初始化为传给函数的符号;

void chushi(char board[Rows][Cols], 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;
		}
	}
}

4.打印出显示出显示棋盘;打印函数主要是由两层for循环组成,第一层for循环时为了显示最上侧的列标;第二层for循环里面包着另一层for循环,先显示出每行的行标,再打印每一行,每行打印完后,换行,进入下一行的处理;

void print(char board[Rows][Cols], int row, int col)
{
	int i = 0;
	for (i = 0;i <= col;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");
	}
}

5.显示函数执行完后,进入埋雷函数,这里主要是用到了随机数的产生和取模;设置i j变量,是他们成为雷的行列坐标,对产生的随机数对9取模,得到0-8的数,再加1,得到1-9的数;设置计数器,每埋完一个雷计数器减1,直到埋完所有的雷,退出循环;

void setmine(char board[Rows][Cols], int row, int col)
{
	int i = 0;
	int j = 0;
	int cout = cunt;
	while (cout)
	{
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (board[i][j] != '1')
		{
			board[i][j] = '1';
		}
		cout--;
	}
}

6.进入找雷函数,输入两个棋盘,设置次数变量,输入x y,如果输入的坐标对应实际棋盘里的字符是1,打印出实际棋盘,跳出while函数;否则,执行else语句,进入雷的次数的函数,雷的次数函数是返回周围八个空格字符1的和再减去8个字符0(字符1减去字符0得到的值为1,数字1加字符0得到的是字符1);得到的是x y坐标周围1的个数,即雷的个数,赋给显示棋盘此坐标的元素;打印出显示棋盘,次数加1;最后循环结束,判断次数的值是否为71(81个格-10个雷),如果是,则排出10个雷所有的位置,游戏胜利;否则游戏结束,被炸死;

int leicnt(char board[Rows][Cols], int x, int y)
{
	return board[x - 1][y] + board[x - 1][y-1] + board[x][y-1] + board[x+1][y-1] + board[x+1][y] + board[x+1][y+1] + board[x][y+1] + board[x - 1][y+1] - 8 * '0';
}
void findmine(char board[Rows][Cols], char board1[Rows][Cols], int row, int col)
{
	int x = 0;
	int y = 0;
	int cishu = 0;
	while (cishu<=71)
	{
		scanf("%d %d", &x, &y);
		if ('1' == board[x][y])
		{
			print(board, Row, Col);
			break;
		}
		else
		{
			board1[x][y] = leicnt(board, x, y) + '0';
			print(board1, Row, Col);
			cishu++;
		}
	}
	if (cishu == 71)
	{
		printf("游戏胜利\n");
	}
	else
	{
		printf("对不起,你被炸死了\n");
	}
}

7.完整代码

函数声明文件:
#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 cunt 10
void menu();
void game();
void chushi(char board[Rows][Cols], int row, int col, char x);
void print(char board[Rows][Cols], int row, int col);
void setmine(char board[Rows][Cols], int row, int col);
void findmine(char board[Rows][Cols], char board1[Rows][Cols], int row, int col);
int leicnt(char board[Rows][Cols], int x, int y);
函数实现文件:
#include"shengming.h"
void menu()
{
	printf("**************\n");
	printf("***1.enter****\n");
	printf("***0.exit ****\n");
	printf("**************\n");

}
void game()
{
	char qi[rows][cols] = { 0 };
	char pan[rows][cols] = { 0 };
	chushi(qi, rows, cols, '0');
	chushi(pan, rows, cols, '*');
	/*print(qi, row, col);*/
	print(pan, row, col);
	setmine(qi, row, col);
	findmine(qi, pan, row, col);
}
void chushi(char board[rows][cols], 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;
		}
	}
}
void print(char board[rows][cols], int row, int col)
{
	int i = 0;
	for (i = 0;i <= col;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");
	}
}
void setmine(char board[rows][cols], int row, int col)
{
	int i = 0;
	int j = 0;
	int cout = cunt;
	while (cout)
	{
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (board[i][j] != '1')
		{
			board[i][j] = '1';
		}
		cout--;
	}
}
int leicnt(char board[rows][cols], int x, int y)
{
	return board[x - 1][y] + board[x - 1][y-1] + board[x][y-1] + board[x+1][y-1] + board[x+1][y] + board[x+1][y+1] + board[x][y+1] + board[x - 1][y+1] - 8 * '0';
}
void findmine(char board[rows][cols], char board1[rows][cols], int row, int col)
{
	int x = 0;
	int y = 0;
	int cishu = 0;
	while (cishu<=71)
	{
		scanf("%d %d", &x, &y);
		if ('1' == board[x][y])
		{
			print(board, row, col);
			break;
		}
		else
		{
			board1[x][y] = leicnt(board, x, y) + '0';
			print(board1, row, col);
			cishu++;
		}
	}
	if (cishu == 71)
	{
		printf("游戏胜利\n");
	}
	else
	{
		printf("对不起,你被炸死了\n");
	}
}
函数调用文件:
#include"shengming.h"
int main()
{
	int input = 0;
	do{
		srand((unsigned int)time(NULL));
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;//break只是跳出switch
		case 0:
			break;
		default:
			break;
		}
	} while (input);
	return 0;
}

8.运行结果:

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值