使用工具:VS2017
代码分为三部分 game.h(函数声明) game.c(实现函数功能) test.c(main函数)
规则:
1.第一次输入坐标不会踩雷,如果是雷,这颗雷被移走
2.如果周围有雷则显示雷的数量
3.所有不是雷的坐标被排除,玩家胜利
4.排雷过程中踩到雷,玩家失败
mine_arr[ROLS][ROWS] 为雷阵 ,1为雷 0不是雷
face_arr[ROL][ROW] 界面
mine_arr[ROLS][ROWS] 和 face_arr[ROL][ROW] 建立关系,玩家看到的是face_arr[ROL][ROW] ,验证玩家输入的x y,是mine_arr[ROLS][ROWS]。
这个程序中 face_arr[ROL][ROW] 是 10*10的数组,而mine_arr[ROLS][ROWS]中是12*12的数组,之所以比faxe_arr多两行两列,是因为统计周围雷个数的时候避免数字越界,程序可以不在mine_arr[ROLS][ROWS数组的最外圈布雷。
game.h部分
#ifndef __GAME2_H__
#define __GAME2_H__
#define ROL 10 //行
#define ROW 10 //列
#define ROLS ROL+2 //行
#define ROWS ROW+2 //列
#define NUMMINE 10//雷的各数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu(void);//打印菜单
void init_mine_arr(char mine_arr[ROLS][ROWS]);//初始化雷盘
void init_face(char face_arr[ROL][ROW]);
int game(char face_arr[ROL][ROW],char mine_arr[ROLS][ROWS],int x, int y, int *first);//界面
void pirnt_face(char face_arr[ROL][ROW], char mine_arr[ROLS][ROWS],int x,int y);//打印界面
void first_protect_game(char mine_arr[ROLS][ROWS], int x, int y); //第一次输入坐标保护
#endif
game.c部分
#define _CRT_SECURE_NO_WARNINGS
#include "game_2.h"
int num_mine = ROL*ROW - NUMMINE; //记录剩余雷的个数 当num==0时,玩家胜利
void menu(void)//打印菜单
{
printf("**********************\n");
printf("***欢迎来到扫雷游戏***\n");
printf("**********************\n");
printf("*** 1.开始 0.结束 ***\n");
printf("**********************\n");
}
void init_mine_arr(char mine_arr[ROLS][ROWS])//初始化棋盘(布雷)
{
int num = 0;
int i = 0;
int j = 0;
int x = 0;
int y = 0;
num = NUMMINE;
for (i = 0; i < ROLS; i++)
{
for (j = 0; j < ROWS; j++)
{
mine_arr[i][j] = '0';
}
}
while (num > 0)
{
x = rand() % (ROLS); //ROLS 为ROL+2 所以需要加括号
y = rand() % (ROWS);
if ((mine_arr[x][y] == '0') && (x > 0) && (y > 0) && (x<=10) && (y<=10))
{
mine_arr[x][y] = '1';
num--;
}
}
}
void init_face(char face_arr[ROL][ROW])//初始化界面
{
int i = 0;
int j = 0;
for (i = 0; i < ROL; i++)
{
//加行数
for (j = 0; j < ROW; j++)
{
face_arr[i][j] = '@';
}
//加列数
}
}
int game(char face_arr[ROL][ROW],char mine_arr[ROLS][ROWS],int x,int y,int *first)//游戏
{
int count = 0;
count = (((mine_arr[x - 1][y - 1]) == '1') + ((mine_arr[x - 1][y]) == '1') + ((mine_arr[x - 1][y + 1]) == '1')
+ ((mine_arr[x][y + 1]) == '1') + ((mine_arr[x + 1][y + 1]) == '1') + ((mine_arr[x + 1][y]) == '1')
+ ((mine_arr[x + 1][y - 1]) == '1') + ((mine_arr[x][y - 1]) == '1'));
if((face_arr[x - 1][y - 1] != ' ') && (x >= 1) && (x <= ROL) && (y >= 1) && (y <= ROW))
//如果 x y 在 1~10 之间 并且在face_arr[ROL][ROW]中 x y 对应的左边之前没有被选择过
{
if (*first == 1)
{//第一次输入坐标保护
*first = 0;
first_protect_game(mine_arr, x, y, &num_mine);
}
if (count == 0)
{
face_arr[x - 1][y - 1] = ' ';
--num_mine;
}
else
{
face_arr[x - 1][y - 1] = count + 48;
--num_mine;
}
if (mine_arr[x][y] == '0')
{
//count_minr_game(face_arr[ROL][ROW], mine_arr[ROLS][ROWS], x, y);//扫描周围雷的个数
//face_arr[x - 1][y - 1] = ' ';
if ( num_mine == 0)
//如果有100个格子,10个雷,那么num_mine==90,当num_mine==0时,玩家胜利
{
return 2;// 返回2 为玩家胜利
}
return 1;//返回1 游戏继续
}
else
{
printf("你踩雷了!\n");
return 0; //返回0 游戏结束
}
}
else if (face_arr[x - 1][y - 1] == ' ')
{
//输入坐标对应的内容为 空格,说明之前已经输入过,坐标无效重新输入
printf("坐标无效!\n");
return 1;
}
else
{
//输入的坐标不在棋盘范围内,则输入错误,重新输入
printf("输入错误!\n");
return 1;
}
}
void pirnt_face(char face_arr[ROL][ROW], char mine_arr[ROLS][ROWS], int x, int y)//打印界面
{
int i = 0;
int j = 0;
printf(" ");
for (j = 1; j <= ROW; j++) //输出第一排 数字123456789
{
printf("%2d", j);
}
printf("\n");
for (i = 0; i < ROL; i++)
{
printf("%2d", i+1);
for (j = 0; j < ROW; j++)
{
printf("%2c",face_arr[i][j]);
}
printf("\n");
}
}
void first_protect_game(char mine_arr[ROLS][ROWS],int x,int y,int* num_mine) //第一次输入坐标保护
{
int i = -1;
int j = -1;
*num_mine--;
if (mine_arr[x][y] == '1')
{
mine_arr[x][y] = '0';
while (1)
{
i = rand() % (ROL+1);
j = rand() % (ROW+1);
if ((i > 0) && (i <= ROL) && (j > 0) && (j < ROW) && (i != x) && (j != y) && mine_arr[i][j] == '0')
{
mine_arr[i][j] = '1';
break;
}
}
}
}
test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include "game_2.h"
int main()
{
int i = 0;
int j = 0;
int x = 0;//玩家输入横坐标
int y = 0;//玩家数入纵坐标
int sta = 0;
int a = 0;
char mine_arr[ROLS][ROWS] = { 0 }; //雷阵
char face_arr[ROL][ROW] = { 0 }; //显示的棋盘
srand((unsigned int)time(NULL));
menu(); //打印菜单
printf("是否开始游戏(1/0):>");
do
{
scanf("%d", &sta);
switch (sta)
{
case 1:
system("cls");
printf("游戏开始!\n");
init_mine_arr(mine_arr);//初始化雷盘
init_face(face_arr);//初始化界面
pirnt_face(face_arr, mine_arr, x, y);//打印界面
int first = 1; //第一次输入坐标保护,即第一次输入坐标,如果踩雷,则雷被移走,不会结束游戏
do
{
printf("请输入坐标:>"); //玩家开始输入
scanf("%d%d", &x, &y);
system("cls");
a = game(face_arr, mine_arr,x,y,&first);//
if (a == 2)
{
printf("恭喜玩家胜利!\n\n");
printf("雷阵如下:\n");
for (i = 1; i < ROLS - 1; i++) //打印雷阵
{
for (j = 1; j < ROWS - 1; j++)
{
printf("%2c ", mine_arr[i][j]);
}
printf("\n");
}
system("pause");
break;
}
pirnt_face(face_arr, mine_arr, x, y);//打印界面
} while (a);
//
/*}*/
printf("是否再次游戏?(1/0)\n");
break;
case 0:
printf("游戏已经退出!\n");
system("pause");
return 0;
default:
printf("输入错误,请重新输入!(1/0)\n");
printf("请输入:>");
break;
}
} while (sta != 0);
system("pause");
return 0;
}
游戏开始界面
打印游戏界面
开始游戏,输入坐标