C语言实现扫雷游戏

简易版扫雷,之后在修改

game.h

#ifndef  _GAME_H_
#define  _GAME_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

enum PlayGame{

	EXIT,            //第一个枚举成员的默认值为整形的0,后续枚举成员在第一个加1
	PLAY
};

#define  ROWS  12                              //行12
#define  COLS  12                         //列12 
#define  ThunderNumber  19                    //雷总数


void  Set_Play(char Mine[ROWS][COLS], char Show[ROWS][COLS]);        //玩家的棋盘

void  InitCheckerBoard(char Mine[ROWS][COLS], char Show[ROWS][COLS]);      //初始化棋盘

void  PrintBoard(char Show[ROWS][COLS]);                                    //打印棋盘

void  Sweep(char Mine[ROWS][COLS],char Show[ROWS][COLS]);                     //扫雷

int  JudgeRayNumber(char Mine[ROWS][COLS], int x, int y);                     //判断雷的个数

#endif

game.c

#include "game.h"


int GetRandNum(int x,int y){

	return rand() % (y - x + 1) + x;           //求出x-y之间的随机数

}
void Init_Mine(char mine[ROWS][COLS]){                //初始化雷

	int x = 0;
	int y = 0;
	int i = ThunderNumber;             //棋盘中总雷的个数
	srand((unsigned)time(NULL));

	while (i){                                 //如果雷不等于0
		x = GetRandNum(1,9);           //求一个随机数x
		y = GetRandNum(1,9);             //求一个随机数y

		if (mine[x][y]=='0'){
			
			mine[x][y] = '1';              //给此处赋一个雷

			i--;
		}
	}
}

void InitCheckerBoard(char Mine[ROWS][COLS], char Show[ROWS][COLS]){

	memset(Mine, '0', ROWS*COLS*sizeof(char));       //初始化我的棋盘
	Init_Mine(Mine);                    //初始化雷
	memset(Show, '*', ROWS*COLS*sizeof(char));            //初始化玩家的棋盘

}

void PrintBoard(char Show[ROWS][COLS]){            //打印棋盘char Mine[ROWS][COLS], 
	int i = 0;
	int j = 0;
	
	for (int i = 1; i < ROWS - 1; i++){             //玩家棋盘
		for (int j = 1; j < COLS - 1; j++){
			
			printf("%4c", Show[i][j]);
		}
		printf("\n");
	}
}

int  JudgeRayNumber(char Mine[ROWS][COLS], int x, int y){       //判断附近雷的个数

	int count = 0;
	if (Mine[x-1][y-1]=='1'){
		count++;
	}
	if (Mine[x][y - 1] == '1'){
		count++;
	}
	if (Mine[x+1][y - 1] == '1'){
		count++;
	}
	if (Mine[x-1][y] == '1'){
		count++;
	}
	if (Mine[x+1][y] == '1'){
		count++;
	}
	if (Mine[x-1][y + 1] == '1'){
		count++;
	}
	if (Mine[x][y + 1] == '1'){
		count++;
	}
	if (Mine[x+1][y + 1] == '1'){
		count++;
	}

	return count;

}

void  Sweep(char Mine[ROWS][COLS], char Show[ROWS][COLS]){               //扫雷
	int x = 0; 
	int y = 0;
	int i = (ROWS - 2)*(COLS - 2) - ThunderNumber;               //雷的个数
	while (i){
		
		printf("请输入坐标:");
		scanf_s("%d%d", &x, &y);                               //获取输入坐标
		int ret = JudgeRayNumber(Mine, x, y);                       //判断附近有几个雷

		if (((x > 0) && (x < ROWS - 1)) && ((y>0) && (x < COLS - 1))){         //输入坐标必须满足在棋盘内

			if (Mine[x][y] == '1'){

				printf("很遗憾,你被炸死了\n");
				return;

			}else{

				Show[x][y] = ret+'0';                //将雷的个数赋值给棋盘    
				PrintBoard(Show);               //打印雷的棋盘
				i--;
			}

		}
		else{
			printf("坐标输入错误");
		}
	}
	printf("你赢了,撒花撒花\n");
	 
}

test.c

#include"game.h"

void  play_game(){
	char Mine[ROWS][COLS] = {0};
	char Show[ROWS][COLS] = {0};

	InitCheckerBoard(Mine,Show);            //初始化棋盘
	PrintBoard(Show);                       //打印棋盘
	Sweep(Mine, Show);                         //扫雷

}
void menu(){
	printf("*************************\n");
	printf("*******1:PLAY************\n");
	printf("*******0:EXIT************\n");
	printf("*************************\n");
}
void game(){
	menu();
	char input = 0;
	printf("请输入选项->:");

	scanf_s("%d",&input);

	do{

		switch (input){
		case PLAY:
			play_game();
			break;
		case EXIT:
			break;
		default:

			printf("输入错误,请重新输入");
		}

	}while (input);

}

int main(){
	game();
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值