简易版扫雷的原理:在10x10的方格中存入1和0,1(即雷)由电脑随机产生并放入,玩家进行判断并输入<x,y>(x为列,y为行),若方格中为1,则玩家踩中雷,输出“Game Over”,若为0,则未踩中雷,显示周围的雷的数量并循环,直至判断出所有的0,玩家胜利.
首先,我们需引入头文件:
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#pragma warning(disable:4996)
void setMine();
void display();
void getMine();
int getMineNum();
void game();
#define ROW 10
#define COL 10
#define MINE_NUM 20
#endif
其次,主函数
#include"game.h"
void menu()
{
printf("##### 欢迎来到扫雷游戏 ####\n");//菜单(提示玩家进行选择)
printf("###################################\n");
printf("##### 1.play 2.exit ####\n");
printf("###################################\n");
printf("please select:\n");
}
int main()
{
do {
int select = 0;
menu();
scanf("%d", &select);
switch(select){
case 1:
game();
break;
case 2:
exit(0);
default:
printf("Enter error,try again!\n");
break;
}
} while (1);
system("pause");
return 0;
}
实现游戏的函数 game.c
#include"game.h"
int getRandomNum(int start, int end)//获得放雷位置的随机数
{
return rand() % (end - start + 1) + start;
}
在表格的随机位置放置'1'(雷),完成布雷
void setMine(char mine[][COL+2], int row, int col)
{
int count = MINE_NUM;
srand((unsigned long)time(NULL));
do {
int x = getRandomNum(1, ROW);
int y = getRandomNum(1, COL);
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
} while (count );
}
打印并展示表格
static void display(char board[][COL+2], int row, int col)
{
int i = 1;
printf(" ");
for (;i <= COL;i++)
{
printf("%3d", i);
}
printf("\n");
for (i = 0;i <= COL;i++)
{
printf("---");
}
printf("\n");
for (i=1;i <= ROW;i++)
{
printf("%2d|",i);
int j = 1;
for (;j <= COL;j++)
{
printf("%2c|",board[i][j]);
}
printf("\n");
}
}
获得周围有雷的个数
int getMineNum(char mine[][COL+2],int row,int col, int x, int y)
{
return((mine[x - 1][y - 1] - '0') + (mine[x][y - 1] - '0')\
+ (mine[x + 1][y - 1] - '0') + (mine[x - 1][y] - '0') \
+(mine[x + 1][y] - '0') + (mine[x - 1][y + 1] - '0') \
+(mine[x][y + 1] - '0') + (mine[x + 1][y + 1] - '0'));\
}
void game()//实现扫雷的整个思路
{
char mine[ROW + 2][COL + 2];//定义两个表格,一个用来展示给玩家,一个用来后台实现扫雷
char show[ROW + 2][COL + 2];
memset(show, '*', (ROW + 2)*(COL + 2));//展示表格全部赋上'*'
memset(mine, '0', (ROW + 2)*(COL + 2));
setMine(mine, ROW + 2, COL + 2);
int win = 0;
do {
int x = 0, y = 0;
display(show, ROW + 2, COL + 2);
printf("please enter <x,y>: \n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (mine[x][y] == '1')
{
printf("Game Over!\n");
display(mine, ROW + 2, COL + 2);
break;
}
else
{
int ret = getMineNum(mine, ROW + 2, COL + 2, x, y);
show[x][y] = ret + '0';
win++;
if (win == ROW * COL - MINE_NUM)
{
printf("Congratulation,you win!\n");
display(mine, ROW + 2, COL + 2);
break;
}
}
}
else
{
printf("Enter error,try again!\n");
}
} while (1);
}
待完善,未加入展开函数和难度选择