扫雷游戏
我们可以用3个文件分别来实现,分别是game.c和game.h来创建实现的函数。然后saolei.c来实现游戏的基本逻辑。
1:要实现这个游戏,首先我们可以用结构化的编程思想,先把游戏的基本逻辑写出来,代码如下:
int main()
{
int a = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择->\n");
scanf("%d", &a);
switch (a) {
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("请重新输入:\n");
break;
}
} while (a);
return 0;
}
这里面最重要的就是game函数啦,我们需要2个二维数组来存放信息,
因为9*9的边缘,排雷的时候会显示不全周围的8个位置是否有雷,所以我们可以扩大一圈,默认最外圈是0,这样就不会出现信息不准确的情况,代码如下:
void initboard(char mine[ROWS][COLS], int rows, int cols,int ret) {
int i = 0;
for (i = 0; i < rows; i++) {
int j = 0;
for (j = 0; j < cols; j++)
{
mine[i][j] = ret;
}
}
}
默认初始化里面的信息都是0和*。
然后我们可以写一个打印函数出来看看,代码如下:
void displayboard(char board[ROWS][COLS], int row, int col) {
int i = 0;
int j = 0;
printf("==========================\n");
for (i = 0; i <= col; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <=row; i++) {
printf("%d ", i);
for (j = 1; j <=col; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("==========================\n");
}
接下来我们需要把雷给布置在mine数组里面,不让玩家看见我们布置的雷:
void setboard(char mine[ROWS][COLS], int row, int col) {
int a = easy_count;
while (a) {
int x = rand() % 10;
int y = rand() % 10;
int i, j;
for (i = 1; i <= x; i++) {
for (j = 1; j <= y; j++) {
if (mine[x][y] == '0') {
mine[x][y] = '1';
a--;
}
}
}
}
}
最后一个函数用来实现查找雷的功能,把每一次选的坐标周围有多少雷打印出来,代码如下:
int set_count(char mine[ROWS][COLS],int x, int y) {
return (mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] +
mine[x - 1][y + 1] + mine[x - 1][y]) - 8 * '0';
}
void found_board(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int count = 0;//排查不是雷的个数
while (count<row*col-easy_count) {
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) {
if (mine[x][y] != '*') {
if (mine[x][y] != '1') {
int ret = set_count(mine, x, y);
show[x][y] = ret + '0';
count++;
displayboard(show, ROW, COL);
}
else {
printf("非常抱歉,你被炸死了!\n");
displayboard(mine, ROW, COL);
break;
}
}
else {
printf("这个坐标已经查找过了!\n");
}
}else {
printf("坐标错误,请重新输入:\n");
break;
}
}
if (count == row * col - easy_count) {
printf("恭喜你,扫雷成功!\n");
}
}
这样以来整个扫雷游戏就完成了,完整的代码如下:需要的小伙伴可以自取哦!
#include<stdio.h>
#include<Time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define easy_count 80
void menu(){
printf("----------------------\n");
printf("---- 1:开始游戏 ----\n");
printf("------0:退出游戏------\n");
printf("----------------------\n");
}
void initboard(char board[ROWS][COLS],int rows,int cols,char ret){
int i=0;
int j=0;
for(i=1;i<=ROW;i++){
for(j=1;j<=COL;j++){
board[i][j]=ret;
}
}
}
void printboard(char board[ROWS][COLS],int row,int col){
int i=0;
int j=0;
printf("==============扫雷============\n");
for(j=0;j<=col;j++){
printf("%d ",j);
}
printf("\n");
for(i=1;i<=row;i++){
printf("%d ",i);
for(j=1;j<=col;j++){
printf("%c ",board[i][j]);
}
printf("\n");
}
printf("==============扫雷============\n");
}
void setmine(char board[ROWS][COLS],int row,int col){
int count=easy_count;
while(count){
int a=rand()%row+1;//随机布置0-9的雷
int b=rand()%col+1;
if(board[a][b]=='0'){
board[a][b]='1';
count--;
}
}
}
int get_mine_count(char board[ROWS][COLS],int x,int y){
return (board[x-1][y]+board[x-1][y-1]
+board[x][y-1]
+board[x+1][y-1]
+board[x+1][y]
+board[x+1][y+1]
+board[x][y+1]
+board[x-1][y+1] - 8 * '0');
}
void find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){
int x = 0;
int y = 0;
int win=0;//排查出来的不是雷的个数
while(win<row*col-easy_count){
printf("请输入坐标排雷:");
scanf("%d %d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=col){
if(show[x][y]!='*'){
printf("不好意思,该坐标已经被排查过了,不能重复排查!");
}
else
{
if(mine[x][y] == '1'){
printf("很遗憾,你被炸死了!!\n");
printboard(mine,ROW,COL);//打印棋盘
break;
}
else{
win++;
int count = get_mine_count(mine,x,y);
show[x][y] = count + '0';//普通数字加上'0'就变成字符型
printboard(show,ROW,COL);//打印棋盘
}
}
}
else{
printf("你输入的坐标有误,请重新输入");
}
}
if(win==row*col-easy_count){
printf("恭喜你,排雷成功!\n");
printboard(mine,ROW,COL);//打印棋盘1
}
}
void game(){
char mine[ROWS][COLS]={0};//记录布雷的信息
char show[ROWS][COLS]={0};//记录显示雷的信息
initboard(mine,ROWS,COLS,'0'); //初始化棋盘为'0'
initboard(show,ROWS,COLS,'*');//初始化棋盘为'*'
//设置雷
setmine(mine,ROW,COL);
printboard(mine,ROW,COL);//打印棋盘
printboard(show,ROW,COL);//打印棋盘
//排查雷
find_mine(mine,show,ROW,COL); //排查雷
}
int main(){
srand((unsigned int)time(NULL));//利用时间戳生成随机数
int a=0;
do{
menu();
printf("请选择->");
scanf("%d",&a);
switch(a){
case 1:
game();
break;
case 0:
printf("游戏已经退出\n");
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}while(a);
return 0;
}