扫雷

来源:互联网 发布:光谷数据 编辑:程序博客网 时间:2024/06/06 02:53

程序分为两个文件:

all.h文件和SL.c文件

all.h文件
#ifndef _Game_H_#define _Game_H_#define ROW 10#define ROWS ROW+2#define COL 10#define COLS COL+2#define MineNum 10 //地雷数量void menu();//打印菜单void Game();//游戏void InitBoard(char board[ROWS][COLS],int row,int col,char flag);//初始化void DisplayBoard(char board[ROWS][COLS],int row,int col);//打印void SetMine(char board[ROWS][COLS],int row,int col,int count);//布雷void Sweep(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y,int *Num);//排雷int GetCount(char board[ROWS][COLS],int x,int y);//计算坐标周围雷数void sign(char board[ROWS][COLS],int x,int y);//标记地雷void unsign(char board[ROWS][COLS],int x,int y);//取消标记#endif

SL.c文件
#include<stdio.h>#include<string.h>#include<time.h>#include"ALL.h"void menu(){printf("************************************\n");printf("*             五子棋               *\n");printf("*                                  *\n");printf("*             1.开始               *\n");printf("*             0.退出               *\n");printf("************************************\n");}void Game(){char mine[ROWS][COLS]={0};char show[ROWS][COLS]={0};int SafeNum=0;//安全区数量int Option=0;//选项int x=0;int y=0;InitBoard(mine,ROWS,COLS,'0');//初始化InitBoard(show,ROWS,COLS,'*');//初始化DisplayBoard(show,ROW,COL);// 打印SetMine(mine,ROW,COL,MineNum);//布雷while(SafeNum<(ROW*COL-MineNum)){printf("+---------------------------------+\n");printf("| 1.排雷 2.标记 3.取消标记 0.退出 |\n");printf("+---------------------------------+\n");printf("请选择:");scanf("%d",&Option);if(Option==1){printf("请输入坐标:");scanf("%d%d",&x,&y);if(x>=1 && x<=ROW && y>=1 && y<=COL)//判断坐标是否正确{if(mine[x][y]=='1')//判断是否有雷{if(SafeNum==0)//判断是否为第一次排雷{mine[x][y]='0';SetMine(mine,ROW,COL,1);Sweep(mine,show,x,y,&SafeNum);}else{printf("很遗憾,你被炸死了!\n");DisplayBoard(mine,ROW,COL);return;}}else{Sweep(mine,show,x,y,&SafeNum);//排雷}DisplayBoard(show,ROW,COL);}elseprintf("输入错误,请重新输入!\n");}else if(Option==2)//标记{printf("请输入坐标:");scanf("%d %d",&x,&y);sign(show,x,y);DisplayBoard(show,ROW,COL);}else if(Option==3)//取消标记{printf("请输入坐标:");scanf("%d %d",&x,&y);unsign(show,x,y);DisplayBoard(show,ROW,COL);}else if(Option==0)//退出return;elseprintf("输入错误,请重新输入!\n");}printf("恭喜你,扫雷成功!\n");return;}void InitBoard(char board[ROWS][COLS],int row,int col,char flag)//初始化{memset(board,flag,row*col*sizeof(board[0][0]));}void DisplayBoard(char board[ROWS][COLS],int row,int col)//打印{int i=0;int j=0;printf("  ");for(i=1;i<=col;i++)printf("%d ",i);printf("\n");for(i=1;i<=row;i++){printf("%-2d",i);for(j=1;j<=col;j++){printf("%c ",board[i][j]);}printf("\n");}}void SetMine(char board[ROWS][COLS],int row,int col,int count)//布雷{int x=0;int y=0;while(count){x=rand()%row+1;y=rand()%col+1;if(board[x][y]=='0')//保证产生互不相同的随机雷区{board[x][y]='1';count--;}}}void Sweep(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y,int *count)//排雷{int i=0;int j=0;int AroundCount=0;if(board2[x][y]=='*'){(*count)++;AroundCount=GetCount(board1,x,y);if(AroundCount!=0){board2[x][y]='0'+AroundCount;}else{board2[x][y]='0';for(i=-1;i<=1;i++){for(j=-1;j<=1;j++){if(x+i>=1 && x+i<=ROW && y+j>=1 && y+j<=COL){if(i!=0 || j!=0){Sweep(board1,board2,x+i,y+j,count);}}}}}}}int GetCount(char board[ROWS][COLS],int x,int y)//计算周围雷数{return board[x-1][y-1]+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]-8*'0';}void sign(char board[ROWS][COLS],int x,int y)//标记地雷{if(board[x][y]=='*'){board[x][y]='@';}}void unsign(char board[ROWS][COLS],int x,int y)//取消标记{if(board[x][y]=='@'){board[x][y]='*';}}int main(){int input=1;while(input){menu();printf("请选择:");scanf("%d",&input);switch(input){case 1:Game();break;case 0:break;default:printf("输入错误!\n");break;}}return 0;}



原创粉丝点击