#c语言学习07—扫雷游戏设计

扫雷

game_saolei.h

#include <stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define Bomb_Num 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void memu();
void game();
void InitBoard(char Board[ROWS][COLS], int rows, int cols,char set);
void Display(char Board[ROWS][COLS],int row,int col);
void Bomb_set(char Board[ROWS][COLS], int row, int col);
void FindBomb(char Board_Bomb[ROWS][COLS], char Show_Bomb[ROWS][COLS], int row, int col);
int Check_Bomb_Num(char Board_Bomb[ROWS][COLS], int row, int col);

game_saolei.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game_saolei.h"
void memu()
{
	printf("#####################\n");
	printf("####1.play 0.exit####\n");
	printf("#####################\n");
}
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i, j = 0;
	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 = 0;
	printf("  ");
	for (i = 1; i <= col; i++)
	{
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ",i);
		for (j = 1; j <=col; j++)
		{
			printf("%c ", Board[i][j]);
		}
		printf("\n");
	}
}
void Bomb_set(char Board[ROWS][COLS], int row, int col)
{
	int Bomb_count = Bomb_Num;
	while (Bomb_count)
	{
		
		int x = rand() % row + 1;//产生一个1-9的横坐标
		int y = rand() % col + 1;
		if (Board[x][y] == '0')
		{
			Bomb_count--;
			Board[x][y] = '1';
		}
	}
}

int Check_Bomb_Num(char Board_Bomb[ROWS][COLS],int row,int col)
{
	int sum = 0;
		int i, j = 0;
		for (i = row - 1; i <= row + 1; i++)
		{
			for (j = col - 1; j <= col + 1; j++)
			{
				sum = Board_Bomb[i][j] - '0' + sum;
			}
		}
		return sum;
}
void FindBomb(char Board_Bomb[ROWS][COLS], char Show_Bomb[ROWS][COLS], int row, int col)
{
	int x, y = 0;
	int win = 0;//
	while (win<ROW*COL- Bomb_Num)
	{
		printf("请输入您想排查的坐标>\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= col && y >= 1 && y <= row)
		{
			int sum = 0;
			//若合法则检查该处是否有雷
			if (Board_Bomb[x][y] == '1')
			{
				printf("您踩到雷了,游戏结束\n");
				Displayboard(Board_Bomb, ROW, COL);
				break;
			}
			else//不是雷,要计算xy附近的雷
			{
				sum = Check_Bomb_Num(Board_Bomb, x, y);
				Show_Bomb[x][y] = '0' + sum;
				Displayboard(Show_Bomb, ROW, COL);
				win++;//扫雷成功一次加1,循环继续到win变成  总量ROW*COL-Bomb_Num时,玩家胜出
			}
				
		}
		else
		{
			printf("输入坐标不合法,请重新输入\n");
		}
		if (win == ROW * COL - Bomb_Num)
		{
			printf("恭喜玩家将雷全部扫出\n");
		}
	}
	
}
//雷的数目计算,雷1 无雷0,所以把周围一圈(包括中心也可)相加,得数是几就有几个雷
//但是Board中存放的是字符
//'1'-'0'=1   '3'-'0'=3 因为‘0’的ASCII值是48 ‘1’是49 ‘3’是51,字符相减就是ASCII值相减

void game()
{
	srand((unsigned int)time(NULL));
	//放置雷的棋盘
	char Board_Bomb[ROWS][COLS] = {'0'};
	//将排出来的雷显示出来的棋盘
	char Show_Bomb[ROWS][COLS] = {'0'};
	InitBoard(Board_Bomb,ROWS,COLS,'0');
	InitBoard(Show_Bomb, ROWS, COLS,'*');
	//打印棋盘
	Displayboard(Board_Bomb, ROW, COL);
	Displayboard(Show_Bomb, ROW, COL);	
	//布置雷
	Bomb_set(Board_Bomb, ROW, COL);
	FindBomb(Board_Bomb,Show_Bomb,ROW,COL);
	printf("扫雷\n");
}

main_saolei.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game_saolei.h"
void test()
{
	int input=0;
	do
	{
		
		memu();
		printf("请选择>\n");
		scanf("%d",&input);
		switch (input)
		{
		case 0:
		{
			printf("退出游戏>\n");
				break;
		}
		case 1:
		{
			game();
			break;
		}
		default:
		{
			printf("输入错误,请重新输入\n");
		}
		}
	} while(input);
}
int main()
{
	test();
	return 0;
}

验证扫雷成功的条件时,埋了80个雷(一共81个),来验证是否能判断出扫雷成功
能计算出目标位置附近的雷数:
在这里插入图片描述
并且 在踩到雷后给出失败信息以及雷的分布
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值