代码在一个项目里完成,分成三个.c.h文件(game.c,game.h,main.c) 在Clion软件中通过运行调试。

/大概想法/ 主函数main.c里是大框架(菜单,扫雷棋盘初始化,随机函数生成雷,玩家扫雷) game.h函数声明(除main函数和游戏函数外的一些函数声明) game.c函数实现(除main函数和游戏函数外的一些函数实现)

/game.c实现/

①先对扫雷棋盘进行初始化(使用两个大小一样的字符数组作为扫雷棋盘 1.存储雷 2.展示给玩家的扫雷棋盘。为了避免在遍历中出现越界访问,棋盘尺寸设置为11*11,在9*9的尺寸里布置雷,展示给玩家的也是9*9的尺寸。相当于隐藏了第一行和最后一行,第一列和最后一列。) 1棋盘初始化为0 2棋盘初始化为*

②初始化完棋盘,显示棋盘 ③随机函数生成雷存储到第一个字符数组里 ④玩家扫雷实现包括 :玩家输入坐标位置是否是雷。坐标不是雷情况下周围一圈是否有雷。该坐标不是雷且周围也没有雷的情况下利用递归显示这些坐标为空。

以下是部分函数实现:

//判断周围多少雷(除输入坐标外一圈的八个位置获取雷数信息。 对于字符,某个字符-'0’就是整数.八个坐标减去八个’0’就是八个坐标里有几个雷)

//判断周围多少雷,返回雷数

int BombNumber(char mine[ROWS][COLS],int row,int col){

return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \

mine[row][col-1] + mine[row][col+1] + \

mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';

}

本来在玩家输入的坐标不是雷,且周围八个坐标不是雷的情况下,想在函数里列举把九个坐标存为空再显示出来的。但是在学习视频里提到可以利用递归呈现出一片空白的棋盘。在网上查阅别人的代码学习到了如何使用递归呈现一片棋盘。

//假设是3*3的棋盘

show[row - 1][col - 1] = ' ';//第一行

show[row - 1][col] = ' ';

show[row - 1][col + 1] = ' ';

show[row][col - 1] = ' ';//第二行

show[row][col] = ' ';

show[row][col + 1] = ' ';

show[row + 1][col - 1] = ' ';//第三行

show[row + 1][col] = ' ';

show[row + 1][col + 1] = ' ';

递归呈现一片棋盘 //在这个代码里递归思想是1.该坐标不是雷 2.周围的八个坐标也不是雷 对玩家输入的坐标进行九次循环 判断每个坐标是否合法且没有雷也没有展示给玩家 坐标满足条件以后就调用判断一圈是否有雷的函数 假如循环中的某个坐标一圈没有雷就再次进入递归函数 再将该坐标的一圈坐标进行循环遍历 继续以上过程 假如坐标不满足条件时会结束递归 进入else语句 直到九次循环完事。

void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){

int i=0,j=0,flag=0;

show[row][col] = ' ';

for(i=row-1;i<=row+1;i++) {

for (j = col-1; j <=col+1; j++) {

if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {

flag = BombNumber(mine, i, j);//判断一圈是否是雷,返回的是雷的数量

if(!flag)

BlankBoard(mine,show,i,j);//递归

else

show[i][j]=flag+'0';//将得到的非0的雷数放到展示给玩家的棋盘里

}

}

}

}

//玩家进行游戏的核心操作

void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)

{

char array[5]="\0";//使用字符串接收玩家输入的信息

int x,y,flag=0,win=0;

while(win<(row*col-Bomb))

//展示给玩家的坐标数量<整个棋盘的非雷坐标数就进入循环

//直到玩家看到的非*坐标数量已经是所有非雷坐标

{

printf("玩家输入坐标,坐标形式为:x,y\n");

gets(array);

x=array[0]-'0';//字符-'0'为整数

y=array[2]-'0';

if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*')//坐标合法且没有显示给玩家

{

if(mine[x][y]=='1')//在存储雷的棋盘中'1'代表是雷

{

printf("很遗憾,该坐标中放了雷,玩家被炸死");

printf("雷分布如下:\n");

Display(mine,ROW,COL);//显示存储雷的棋盘

break;}

else{

flag=BombNumber(mine, x, y);//判断该坐标周围一圈是否是雷

if(flag>0){//周围一圈有雷

show[x][y]=flag+'0';

Display(show,ROW,COL);}

else{

BlankBoard(mine,show,x,y);

Display(show,ROW,COL);}

winwin=Showboard(show,ROW,COL);}//判断展示给玩家的坐标数

}

else

printf("坐标无效,请重新输入\n");

}

if(win==(row*col-Bomb)){

printf("恭喜玩家排雷成功!\n");

Display(mine,ROW,COL);

}

}

//以下是完整代码(本人没玩过正常的扫雷游戏,对扫雷游戏的输赢理解可能不太对,但大概思路没啥问题)

//main.c

#include"game.h"

//初版扫雷

// 显示菜单

void menu(){

printf("*********1.game***0.退出*********\n");

printf("*********输入数字进行选择***********\n");

}

//游戏核心

//使用两个字符数组1->存放雷信息 2->用于输出到屏幕

//使用随机函数放置雷

//玩家排雷

void game() {

char Mine [ROWS][COLS]={0};

char Show [ROWS][COLS]={0};;

//数组初始化

Init(Mine,ROWS,COLS,'0');

Init(Show,ROWS,COLS,'*');

//显示

//Display(Mine,ROWS,COLS);//显示初始化的雷棋盘

Display(Show,ROWS,COLS);//显示玩家棋盘

SetBomb(Mine,ROW,COL);//随机生成雷

//Display(Mine,ROW,COL);//显示雷棋盘

StartBomb(Mine,Show,ROW,COL);//玩家进行扫雷

}

int main()

{

setbuf(stdout,NULL);//及时输出缓冲区内容

int number=0;

srand((unsigned int )time(NULL));//时间戳帮助生成棋盘上的随机坐标

do{

menu();

scanf("%d",&number);

getchar();//玩家输入的坐标使用字符串输入的,所以此时需要用getchar取走\n

switch(number)

{

case 1:

game();

break;

case 0:

printf("正在退出\n");

break;

default:

printf("选择错误,重新输入\n");

break;

}

}while(number);

}

//game.h

#include

#include

#include

#include

#define ROW 9

#define COL 9

#define ROWS (ROW+2)

#define COLS (COL+2)

#define Bomb 10

#ifndef TEXT1_GAME_H

#define TEXT1_GAME_H

void Init(char board[ROWS][COLS],int rows,int cols,char set);

void Display(char board[ROWS][COLS],int row,int col);

void SetBomb(char board[ROWS][COLS],int row,int col);

void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

int BombNumber(char mine[ROWS][COLS],int row,int col);

void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

int Showboard(char board[ROWS][COLS],int row,int col);

#endif

//game.c

#include"game.h"

//初始化

void Init(char board[ROWS][COLS],int rows,int cols,char set){

int i=0,j=0;

for(i=0;i

for(j=0;j

board[i][j]=set;

}

}

//显示函数

void Display(char board[ROWS][COLS],int row,int col)

{

int i=0,j=0;

//打印列数

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");

}

}

//放置炸弹

void SetBomb(char board[ROWS][COLS],int row,int col)

{

int numberBomb=1;

while(numberBomb<=Bomb)

{

int x=(rand()%ROW)+1;

int y=(rand()%COL)+1;

if(board[x][y]=='0') {

board[x][y] = '1';

numberBomb++;}

}

}

void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)

{

char array[5]="\0";

int x,y,flag=0,win=0;

while(win<(row*col-Bomb))

{

printf("玩家输入坐标,坐标形式为:x,y\n");

gets(array);

x=array[0]-'0';

y=array[2]-'0';

if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*')

{

if(mine[x][y]=='1')

{

printf("很遗憾,该坐标中放了雷,玩家被炸死");

printf("雷分布如下:\n");

Display(mine,ROW,COL);

break;}

else{

flag=BombNumber(mine, x, y);

if(flag>0){

show[x][y]=flag+'0';

Display(show,ROW,COL);

}

else{

BlankBoard(mine,show,x,y);

Display(show,ROW,COL);}

}

win=Showboard(show,ROW,COL);

}

else

printf("坐标无效,请重新输入\n");

}

if(win==(row*col-Bomb)){

printf("恭喜玩家排雷成功!\n");

Display(mine,ROW,COL);

}

}

//判断周围多少雷

int BombNumber(char mine[ROWS][COLS],int row,int col){

return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \

mine[row][col-1] + mine[row][col+1] + \

mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';

}

//1.该坐标不是雷 2.周围的八个坐标也不是雷

void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){

int i=0,j=0,flag=0;

show[row][col] = ' ';

for(i=row-1;i<=row+1;i++) {

for (j = col-1; j <=col+1; j++) {

if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {

flag = BombNumber(mine, i, j);

if(!flag)

BlankBoard(mine,show,i,j);

else

show[i][j]=flag+'0';

/* show[row - 1][col - 1] = ' ';

show[row - 1][col] = ' ';

show[row - 1][col + 1] = ' ';

show[row][col - 1] = ' ';

show[row][col] = ' ';

show[row][col + 1] = ' ';

show[row + 1][col - 1] = ' ';

show[row + 1][col] = ' ';

show[row + 1][col + 1] = ' ';*/

}

}

}

}

int Showboard(char board[ROWS][COLS],int row,int col){

int i=0,j=0,number=0;

for(i=1;i<=row;i++){

for(j=1;j<=col;j++){

if(board[i][j]!='*')

number++;

}

}

return number;

}

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: