扫雷(用C语言实现)

前言:

相信大家很多人都玩过扫雷,下面我将通过用C语言来实现简单的扫雷程序。

分析:

1.首先我们需要设置两个二维数组mine_board和show_board,这两个数组分别为埋雷数组和展示面板数组,同时都设置为12 *12的数组,其次我们要对数组初始化。但我们要明白一点,虽然我们设置为12 *12的数组,但是我们只用10 *10的空间,设为12 *12的目的是因为我们每下一步都要计算当前这步的周围埋雷个数,当计算四个角和边的时候不方便计算,所以设置为12 *12的数组。

2.mine_board和show_board数组分别初始化为全0和全*

3.mine_board数组中0代表无地雷,1代表有雷

4.我们要求最后要是玩家输了将要展示mine_board面板,以验证正确性

5.在进行函数实现时要注意下标的应用,面板中我们的下标应为1~10

多文件编程:(三个文件)

main.c //主函数
mine.c //放函数的实现
mine.h //放函数的声明

效果图:

提供玩家选择的界面:1代表玩游戏    2代表退出游戏
这个就是show_board也就是展示面板
此处为游戏输了之后显示的mine_board

具体实现:

mine.h头文件:

#ifndef _MINE_H_                         
#define _MINE_H_

#include<stdio.h>                    //这些都为库函数
#include<windows.h>
#include<string.h>
#include<time.h>

#pragma warning(disable:4996)
#define ROW 12        //行
#define COL 12          //列
#define MINES 12        //我们设置埋雷个数20个

void Menu();                    //菜单函数,提供玩家进行选择
void Game();
void SetMine(char mine_board[][COL], int row, int col);          //埋雷函数
void ShowBoard(char show_bord[][COL], int row, int col);      //显示面板函数
void PlayGame(char show_bord[][COL], char mine_board[][COL], int row, int col); 
int GetMineNum(char mine_board[][COL], int i, int j);         //得到每步的周围雷的个数

#endif

mine.c源文件:

#include "mine.h"
void Menu()                     //提供玩家进行选择的函数
{
	 printf("***************************\n");
	 printf("******    1.Play     ******\n");
	 printf("******    2.Exit     ******\n");
	 printf("***************************\n");
}

static int GetIndex(int start, int end)         //static定义的函数只能在本文件进行使用
{
	 return rand() % (end - start + 1) + start;        //产生的随机坐标为1-10    rand()产生随机数函数
}


void SetMine(char mine_board[][COL], int row, int col)       //埋雷函数
{
 	srand((unsigned long)time(NULL));             //使用rand()函数生成随机数必须有这个随机数种子
	 int mine_num = MINES;
	 while (mine_num)           //循环20次,设置20个雷
	 {
 		 int i_index = GetIndex(1, col - 2);          //雷的行坐标
  		int j_index = GetIndex(1, col - 2);         //雷的纵坐标
 	 	if (mine_board[i_index][j_index] == '0')          //为0说明此处可以附雷
	 	 {
   		mine_board[i_index][j_index] = '1';
   		mine_num--;                    
 		 }
	 }
}

int GetMineNum(char mine_board[][COL], int i, int j)        //得到每步周围雷的个数的函数
{
	 return  mine_board[i - 1][j - 1] + mine_board[i - 1][j] + \               //共8个位置
 	 mine_board[i - 1][j + 1] + mine_board[i][j - 1] + \
 	 mine_board[i][j + 1] + mine_board[i + 1][j - 1] + \
  	mine_board[i + 1][j] + mine_board[i][j + 1] - 8 * '0';
}


void Game()                   //玩游戏函数
{
	 char mine_board[ROW][COL];
	 char show_board[ROW][COL];
	 memset(mine_board, '0', sizeof(mine_board));               //初始化mine_board
	 memset(show_board, '*', sizeof(show_board));                //初始化show_board
	 SetMine(mine_board, ROW, COL);   
	 PlayGame(show_board, mine_board, ROW, COL);        //开始玩游戏了
}

void ShowBoard(char show_board[][COL], int row, int col)            //显示面板函数
{
 	int i = 1, j = 1;
	 printf("    ");
	 for (i; i <= col - 2; i++)           //第一行显示1-10个数字
	 {
		  printf("%d   ", i);
	 }
	 printf("\n");
	 for (i = 1; i < col - 2; i++)           //显示下划线
 		 printf("-----");
 	printf("\n");
	 for (i = 1; i <= row - 2; i++)
	 {
 		 printf("%2d|", i);
  		for (j = 1; j <= col - 2; j++)
 		 {
		 	  printf(" %c |", show_board[i][j]);
  		}
  		printf("\n");
  		int k = 1;
		for (k; k< col - 2; k++)
		 	  printf("-----");	
 	 printf("\n");
	 }
}


void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col)
{
	 int i = 0, j = 0;
	 int total = (ROW - 2)*(COL - 2);       //总共100个空间
	 while (1)
	 {
		 ShowBoard(show_board, row, col);
	 	 printf("Please enter Pos(x,y):");         //输入所下的位置
		  scanf("%d %d", &i, &j);
		  if (i >= 1 && i <= row - 2 && j >= 1 && j <= col - 2)       //合法下标
		  {
   			if (mine_board[i][j] == '0')             //此位置没有地雷
  	 		{
   				 int num = GetMineNum(mine_board, i, j);      //计算周围雷的个数
  				  show_board[i][j] = num + '0';             //在此位置显示周围雷的个数
  	 			 total--;          
 			  }
 	  		else
 	 		 {
   				 ShowBoard(mine_board, row, col);        //显示雷的面板
    				printf("You Lose!\n");                   //只要碰到雷就算输
  				  break;
 			  }
 		 }
 		 else
 			 {
  			 printf("Enter Error!Please Again\n");             //输入的位置不合适
 			  continue;
 			 }
 	 if (total == MINES)                 //最后刚好只剩20个全部都为雷则获胜
	  {
   		printf("You Win!\n");
  		 break;
	  }
     }
}

main.c头文件:

#include "mine.h"
int main()
{
	 int select = 0, quiz = 0;
	 while (!quiz)
	 {
		  Menu();                //提供玩家进行选择的函数:1玩游戏,2退出游戏
		  printf("Plese select:>");
		  scanf("%d", &select);
 		 switch (select)
	 	 {
	 	 case 1:
  			 	Game();
  				 break;
		  case 2:
 				  quiz = 1;
	  			 printf("Exit\n");
	 		 	 break;
 		 default:
 	  			printf("Select error!Please again\n");
 	  			break;
 		 }
	 }
	return 0;
}

总结:

拿到问题要进行分析,懂得函数的功能模块化,然后去不断调用并实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值