目录
扫雷效果展示
扫雷的功能实现
1、初始化棋盘格
2、 打印棋盘
3、布置雷
4、排查雷
完整代码展示
扫雷小游戏的代码实现分为三个文件,test.c(测试游戏功能)、game.h(头文件的包含和函数的声明)、game.c(实现函数功能)
后附三个文件完整代码
扫雷效果展示



扫雷的功能实现
设计两个数组,一个数组(mine)用来存放布置好的雷的信息,另一个数组(show)存放排查出的雷的信息
1、初始化棋盘格
mine数组初始化为‘0’,布置雷的时候改为‘1’
show数组初始化为‘*’,排除雷后,相应位置改为周围八个位置雷的总数量的数字字符,如‘2’
void InitBoard(char board[ROWS][COLS],int row,int col,char set)
{int i = 0;int j = 0;for (i = 0; i < row;i++){for (j = 0;j < col;j++){board[i][j] = set;}}
}
2、 打印棋盘
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");
}
3、布置雷
void SetMine(char board[ROWS][COLS],int row,int col)
{int count = MINEC;while(count){int i = rand() % row + 1;int j = rand() % col + 1;if (board[i][j] == '0'){board[i][j] = '1';count--;}}}
4、排查雷
int get_mine_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] + mine[x-1][y+1] + mine[x][y+1] + mine[x+1][y+1] - 8*'0';
}void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{//1、输入排查的坐标//2、检查坐标处是不是雷//(1)是雷 - 很遗憾炸死//(2)不是雷 - 统计坐标周围有几个雷 - 存储排查雷的信息到show数组,游戏继续int x = 0;int y = 0;int win = 0;while(win < row*col - MINEC){printf("请输入要排查的坐标:");scanf("%d %d",&x,&y);if (x>=1 && x<= row && y>=1 && y<=col){if(mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{int count = get_mine_count(mine,x,y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标不合法,请重新输入\n");}}if (win == row*col - MINEC){printf("成功\n");DisplayBoard(mine, ROW, COL);}}
完整代码展示
1、test.c
#include "game1.h"void menu()
{printf("***************************\n");printf("******* 1.play **********\n");printf("******* 0.exit **********\n");printf("***************************\n");
}void game()
{//存储数据 - 二维数组char board[ROW][COL] ;//初始化棋盘 - 初始化空格InitBoard(board,ROW,COL);//打印棋盘 - 本质是打印数组内容DisplayBoard(board,ROW,COL);char ret = 0;while(1){//玩家下棋PlayerMove(board,ROW,COL);DisplayBoard(board,ROW,COL);//判断玩家是否赢得游戏ret = IsWin(board,ROW,COL);if (ret != 'C')break;//电脑下棋ComputerMove(board,ROW,COL);DisplayBoard(board,ROW,COL);//判断电脑是否赢得游戏ret = IsWin(board,ROW,COL);if (ret != 'C')break;}if (ret == '*')printf("玩家赢了\n");else if (ret == '#')printf("电脑赢了\n");else printf("平局\n");DisplayBoard(board,ROW,COL);}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:");scanf("%d",&input);switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}}while(input);return 0;
}
2、game.h
#ifndef game1_h
#define game1_h#include <stdio.h>
#include <stdlib.h>
#include <time.h>//符号的定义
# define ROW 3
# define COL 3//函数的声明//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col);
//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col);
//电脑下棋
void ComputerMove(char board[ROW][COL],int row,int col);
/*
玩家赢 - ‘*’
电脑赢 - ‘#’
平局 - ‘Q’
游戏继续 - ‘C’
*/
char IsWin(char board[ROW][COL],int row,int col);#endif /* game1_h */
3、game.c
#include "game1.h"void InitBoard(char board[ROW][COL],int row,int col)
{int i = 0;int j = 0;for (i = 0;i<row;i++){for (j = 0;j < col ;j++){board[i][j] = ' ';}}
}void DisplayBoard(char board[ROW][COL],int row,int col)
{int i = 0;int j = 0;for (i = 0;i<row;i++){for (j = 0;j < col ;j++){printf(" %c ",board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (j = 0;j < col ;j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}void PlayerMove(char board[ROW][COL],int row,int col)
{int a = 0;int b = 0;printf("玩家走:\n");while(1){printf("请输入下棋的坐标:");scanf("%d %d",&a,&b);if (a>0 && a<=row && b>0 && b<=col){if (board[a-1][b-1] == ' '){board[a-1][b-1] = '*';break;}else{printf("坐标被占用,请重新输入\n");}}else{printf("坐标不合法,请重新输入\n");}}}void ComputerMove(char board[ROW][COL],int row,int col)
{printf("电脑走:\n");while(1){int x = rand()%row;int y = rand()%col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}int IsFull(char board[ROW][COL],int row,int col)
{int i = 0;int j = 0;for(i = 0;i < row;i++){for(j = 0;j < col;j++){if (board[i][j] == ' ')return 0;//没满}}return 1;//满了
}char IsWin(char board[ROW][COL],int row,int col)
{int i = 0;//判断三行for (i = 0;i < row;i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' '){return board[i][1];}}//判断三列for (i = 0;i < row;i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[1][i];}}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局//满1int ret = IsFull(board,ROW,COL);if (ret == 1)return 'Q';return 'C';
}


















