编程实现扫雷小游戏
- 头文件部分
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SANZIQI_H__
#define __SANZIQI_H__
#define ROW 10
#define COL 10
//初始化雷区
void Initboom(char boom[ROW][COL], int row, int col);
//初始化覆盖区
void Initbomb(char arr[ROW][COL], int row, int col);
//生成地雷
void makeboom(char boom[ROW][COL], int row, int col, int l);
//打印雷区
void OutPut(char boom[ROW][COL], int row, int col);
//打印显示区
int OutPu(char arr[ROW][COL], int row, int col, int x);
//输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
int is_boom(char boom[ROW][COL], char arr[ROW][COL], int row, int col);
//显示周围雷的个数
void OutBoom(char arr[ROW][COL],char boom[ROW][COL], int i, int j);
#endif
- 函数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "SAOLEI.h"
//初始化雷区
void Initboom(char boom[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
boom[i][j] = '0';
}
}
}
//初始化覆盖区
void Initbomb(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
arr[i][j] = '*';
}
}
}
//生成地雷
void makeboom(char boom[ROW][COL], int row, int col, int l)
{
int i = 0;
int j = 0;
int x = 0;
srand((unsigned int)time(NULL));
i = (rand()%(ROW-2))+1;
j = (rand()%(ROW-2))+1;
for(x=0; x<l; x++)
{
i = (rand()%(ROW-2))+1;
j = (rand()%(ROW-2))+1;
if(boom[i][j] == '0')
{
boom[i][j] = '1';
}
else
{
x--;
}
}
}
//打印雷区
void OutPut(char boom[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("%c ", boom[i][j]);
}
printf("\n");
}
}
//打印显示区
int OutPu(char arr[ROW][COL], int row, int col, int x)
{
int i = 0;
int j = 0;
int y = 1;
printf(" ");
for(y=1; y<row-1; y++)
{
printf("%d ",y);
}
printf("\n ---------------");
printf("\n");
for(i=0; i<row-2; i++)
{
printf("%d |",i+1);
for(j=0; j<col-2; j++)
{
printf("%c ", arr[i+1][j+1]);
//根据剩余雷区确定雷的个数
if(arr[i+1][j+1] == '*')
{
x++;
}
}
printf("\n");
}
return x;
}
//显示周围雷的个数
void OutBoom(char arr[ROW][COL],char boom[ROW][COL], int i, int j)
{
arr[i][j] = (boom[i-1][j-1]-'0'+boom[i-1][j]-'0'+boom[i-1][j+1]-'0'+
boom[i][j-1]-'0'+boom[i][j+1]-'0'+boom[i+1][j-1]-'0'
+boom[i+1][j]-'0'+boom[i+1][j+1]-'0')+'0';
}
//输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
int is_boom(char boom[ROW][COL], char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
while(1)
{
scanf("%d,%d",&i,&j);
if((1<=i && i<=9)&&(1<=j && j<=9))
{
if(boom[i][j] == '1')
{
return 0;
}
else
{
//显示雷的个数
OutBoom(arr, boom, i, j);
//如果这个数为0,说明周围没有雷,所以显示出周围每个数组周围的雷的个数
if(arr[i][j] == '0')
{
OutBoom(arr, boom, i-1, j-1);
OutBoom(arr, boom, i-1, j);
OutBoom(arr, boom, i-1, j+1);
OutBoom(arr, boom, i, j-1);
OutBoom(arr, boom, i, j+1);
OutBoom(arr, boom, i+1, j-1);
OutBoom(arr, boom, i+1, j);
OutBoom(arr, boom, i+1, j+1);
}
return 1;
}
}
else
{
printf("输入错误,请重新输入:\n");
}
}
}
- 主函数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "SAOLEI.h"
menu()
{
printf("+------------+\n");
printf(" 1.开始游戏 \n");
printf(" 0.退出游戏 \n");
printf("+------------+\n");
}
game()
{
char boom[ROW][COL];
char arr[ROW][COL];
int n = 0; //判定是否踩雷
int x = 0; //计算剩余雷区个数
int i = 0; //接收剩余雷区个数
int l = 0;
printf("请设置雷的个数\n");
scanf("%d",&l);
//初始化雷区
Initboom(boom, ROW, COL);
//初始化显示区
Initbomb(arr, ROW, COL);
//生成地雷
makeboom(boom, ROW, COL, l);
//打印雷区
//OutPut(boom, ROW, COL);
//打印显示区
OutPu(arr, ROW, COL, x);
printf("游戏开始:\n");
//输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
do
{
printf("游戏开始,请输入坐标\n");
n = is_boom(boom, arr, ROW, COL);
if(n == 0)
{
break;
}
else
{
i = OutPu(arr, ROW, COL, x);
}
//计算剩余雷的个数
printf("剩余未知区域个数%d\n",i);
}while(i>l);//剩余雷区个数等于雷个数则扫雷完成
if(n == 0)
{
printf("踩到雷了,游戏结束\n");
}
else
{
printf("恭喜扫雷完成\n");
}
}
int main()
{
int i = 0;
do
{
menu();
scanf("%d",&i);
switch(i)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
}while(i);
return 0;
}
- 编程结果
设置个简单的,设置雷数为1并开始。
逐步完成扫雷。