扫雷游戏从windows系统诞生,就出现在了我们的电脑中。 其实微软公司开发扫雷游戏的目的是帮助用户适应鼠标的使用。
同一类游戏还有蜘蛛纸牌。小学时上微机课,玩扫雷和蜘蛛纸牌都能玩一节课。 不禁感叹新事物带给人的新鲜感。
突发奇想,既然是编程语言,那么C语言是不是也可以来开发一款扫雷游戏。 在了解扫雷规则后,着手开始编写程序。
虽然有些潦草,但是仿佛又回到了小学时的机房,开心依旧。
扫雷规则大致是,找出所有的地雷,并且不能踩到雷。 显示的数字是周围8个格子内的地雷数,玩家可以根据提示来避开地雷。
大致逻辑为:①布雷 ②找雷 ③判断雷是否被全部找到
定义两个二维数组,mine是雷区的数组。show是给玩家显示的数组。
若是只定义一个数组,雷区可以让玩家看到,这样子的扫雷可能会毁童年!!
为了是编写是方便一点,自己定义一个头文件,里面包含了所有所要调用的函数,以及宏。
#ifndef ___GAME_H___
#define ___GAME_H___
#include <stdio.h>
#include <windows.h>
#include <time.h>
#pragma warning(disable: 4996)
#define ROW 10
#define COL 10
void menu();
int findMine(char show[ROW+2][COL+2], char mine[ROW+2][COL + 2], int row, int col, int x, int y); //找雷
void setMine(char mine[ROW][COL ], int row, int col); //布雷
void display(char show[ROW][COL ], int row, int col);
void game();
#endif //!___GAME H___
main函数,用来让玩家选择进入游戏还是退出。
#include "game.h"
void menu()
{
printf("##################################\n");
printf("###########1.Play#################\n");
printf("###########2.Exit#################\n");
}
int main()
{
int c = 0;
menu();
do{
printf("Please Choose Play Or Exit\n");
scanf("%d", &c);
switch (c)
{
case 1:
game(); //游戏函数
break;
case 2:
exit(0);
default:
printf("Select Error!!\n ");
}
} while (1); //使用循环,玩家输入1和2以外的数字,则提示输入错误。
system("pause");
return 0;
}
如图所示,提示玩家选择。
游戏函数,里面包含了布雷,找雷,以及判断是否胜利。
#include "game.h"
void display(char show[ROW+2][COL+2], int row, int col)
{
int i, j;
for (i = 1; i <= row-1; i++)
{
printf(" %d", i);
for (j = 1; j <= col-1; j++)
{
printf("| %c ", show[i][j]);
}
printf("\n");
}
}
游戏的主界面,有些马赛克画质。
布雷函数:
void setMine(char mine[ROW+2][COL+2], int row, int col)
{
srand((unsigned long)time(NULL)); //随机数种子
int n, k,i;
i = 10;
do{
n = rand() % 10; //使地雷必须在数组内
k = rand() % 10;
if (mine[n][k] == '*') //如果数组元素不是地雷,则布雷,防止重复
{
mine[n][k] = 'o';
i--;
}
} while (i>0);
}
找雷函数:
int findMine( char mine[ROW+2][COL+2] , int x, int y) //根据玩家输入的位置,显示周围地雷的数量。
{
int count=0 ;
if (mine[x - 1][y - 1] == 'o')
{
count ++;
}
if (mine[x - 1][y] == 'o')
{
count ++;
}
if (mine[x][y - 1] == 'o')
{
count++;
}
if (mine[x + 1][y] == 'o')
{
count++;
}
if (mine[x][y + 1] == 'o')
{
count++;
}
if (mine[x + 1][y + 1] == 'o')
{
count++;
}
if (mine[x + 1][y - 1] == 'o')
{
count++;
}
if (mine[x - 1][y + 1] == 'o')
{
count++;
}
return count;
}
void game()
{
char mine[ROW+2][COL+2];
char show[ROW+2][COL+2];
memset(mine, '*', (ROW+2)*(COL+2)); //对数组整体进行初始化
memset(show, '*', (ROW+2)*(COL+2));
setMine(mine, ROW, COL); //布雷操作
do{
display(show, ROW, COL);
int x, y;
printf("Please Enter <x,y>\n"); //玩家开始找雷
scanf("%d%d", &x, &y);
system("cls");
if ((x >= 0) && (x <10) && (y>=0) && (y <10))
{
if (mine[x][y] == '*')
{
int win=0;
int count = findMine( mine, x, y);
show[x][y] = count+'0';
win++;
if (win == ROW*COL-10) //玩家将不是雷的地方全部找到,则说明雷区也已经找到,胜利了!
{
printf("Good.You Win!\n");
}
}
else if (mine[x][y] == 'o') //踩到雷,则失败
{
printf("Game Over\n");
system("cls");
display(mine, ROW, COL);
}
}
else
{
printf("Error! Enter Again\n"); //这里表示玩家输入的位置不存在。
}
} while (1);
}
到这里,一个简单粗糙有趣的扫雷游戏已经完成。 可能这个游戏太无趣,让人嫌弃。但是,anyway,编程的生涯,一直在路上。
若能指教,不胜感激!!