上海网站建设信息网,网站营销方法有哪些内容,制作网站的主题,微信做淘宝客网站“少年气#xff0c;是历尽千帆举重若轻的沉淀#xff0c;也是乐观淡然笑对生活的豁达#xff01;” 今天我们学习一下扫雷游戏怎么用C语言来实现#xff01; 扫雷小游戏 1.游戏介绍2.游戏准备3.游戏实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2打印棋盘3.3布置雷…“少年气是历尽千帆举重若轻的沉淀也是乐观淡然笑对生活的豁达” 今天我们学习一下扫雷游戏怎么用C语言来实现 扫雷小游戏 1.游戏介绍2.游戏准备3.游戏实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2打印棋盘3.3布置雷3.4排查雷 4.扫雷游戏的详细代码 1.游戏介绍
一个扫雷盘面由许多方格cell组成方格中随机分布着一定数量的雷mine一个格子中至多只有1雷。胜利条件是打开所有安全格非雷格safe cell失败条件是打开了一个雷格踩雷。下面图片中是一个9*9的示例
2.游戏准备
和前面的三子棋一样这里我们也需要三个源文件来共同实现这个程序。 1头文件game.h头文件里是用来存放函数的声明#define常量的定义库函数的引用的。 2源文件test.c这个文件里面放的是游戏的测试逻辑。 3源文件game.c这个文件里面放的是游戏的实现逻辑函数实现。 3.游戏实现
3.1生成菜单
这里呢我们和三子棋一样还是通过switch语句给用户选择当用户输入不同的数字我们的程序就会给出不同的功能。
#define _CRT_SECURE_NO_WARNINGS 1
#include game.h
#include stdio.h
void menu()
{printf(******************************\n);printf(********* 1.play *********\n);printf(********* 0.exit *********\n);printf(******************************\n);
}
void game()
{}
int main()
{int input 0;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;
}大致的框架就出来了现在我们就需要看扫雷游戏的具体实现了。
3.2游戏的具体实现 这里我们简化游戏设置一个9*9的棋盘安置10个雷。 排查过程如下 1.如果这个位置是雷那么游戏结束。 2.如果把不是雷的位置都找出来了那么游戏结束。 3.如果这个位置不是雷就计算这个位置的周围的8个格子有几个雷并显示出雷的个数。 3.2.1初始化棋盘
我们这里的棋盘是9*9的可以和三子棋一样先将每个棋盘都初始化为0如下图所示然后有雷的地方填上1如下图所示 但是我们从游戏规则中知道当我们点到一个不是雷的格子的时候要返回它周围八个格子中雷的个数。如下图中如果我们点到了绿色1的那个格子那么该位置将返回1这个值此时这里的1就会和表示雷的1就混起来了。 同时当我们点到一个处于四边的格子的时候还会出现越界的问题 这个时候我们就可以考虑在排查雷的时候将棋盘扩展成11*11的棋盘。
同时我们可以将排查雷的9*9的格子里都初始化为*避免出现两个1意义不同混淆的情况。这样的话我们就得到两个11*11的棋盘。
//game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW2
#define COLS COL2
//初始化棋盘函数的声明
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set);//game.h*
//初始化棋盘的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include game.h
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{int i 0;for (i 0; i rows; i){int j 0;for (j 0; j cols; j){board[i][j] set;}}
}//test.c
void game()
{char assign[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };Init_Board(assign,ROWS,COLS,0);Init_Board(show, ROWS, COLS, *);
}初始化完成之后我们想要验证一下对不对呢这个时候我们就需要将棋盘打印出来。
3.2打印棋盘
虽然我们这里初始化的是11*11的棋盘但是用户需要的是中间区域的9*9因此我们只需要打印中间的9*9就可以了。
//game.h
//打印棋盘函数的声明
void Display_Board(char board[ROWS][COLS], int row, int col);//game.c
//打印棋盘函数的定义
//我们只需要打印出中间的9*9的格子
void Display_Board(char board[ROWS][COLS], int row, int col)
{int i 0;for (i 1; i row; i){int j 0;for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}
}//test.c
void game()
{Display_Board(assign, ROW, COL);
}这里我们需要把行号和列号也打印出来能够看的更清晰。代码进行这样的修改就好啦 再优化一下就如下图所示
3.3布置雷
我们希望的是在这个9*9的棋盘里随机生成10个雷这里我们就想到了能够产生随机数的函数rand()和srand()使用这两个函数需要添加头文件#include time.h和#include stdlib.h同时在主函数内还需要添加语句srand((unsigned int)time(NULL));来产生随机数的种子。
//game.h
#define Easy_Thunder 10
#include stdlib.h
#include time.h
//布置雷函数的声明
void Set_thunder(char board[ROWS][COLS], int row, int col);//game.c
//布置雷函数的定义
void Set_thunder(char board[ROWS][COLS], int row, int col)
{int count Easy_Thunder;while (count){int x rand() % row 1;//生成横坐标int y rand() % col 1;//生成纵坐标if (board[x][y] 0)//防止在同一个地方重复布雷{board[x][y] 1;count--;}}
}//test.c
void game()
{char assign[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };Init_Board(assign,ROWS,COLS,0);Init_Board(show, ROWS, COLS, *);Display_Board(assign, ROW, COL);Set_thunder(assign, ROW, COL);
}
int main()
{srand((unsigned int)time(NULL));return 0;
}那么代码写好了我们来验证一下这样是不是能够布置出十个雷呢
3.4排查雷
我们开始随机点一个格子当这个格子不是雷的时候可以计算它周围八个格子字符的ASCII码值减去8个0的ASCII码值就可以知道这个格子周围有多少个雷了然后我们加上0的ASCII码值就能在该处的格子上返回相应的字符。当我们把所有不是雷的格子找出来的时候给用户提示排雷成功。当我们踩到雷的时候也给出相应的提示给用户游戏结束。这里和三子棋一样我们可以添加清屏的操作system(cls);让我们的游戏面板不是那么的冗长。 //game.h
//排查雷函数的声明
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col);//game.c
int Getassign(char assign[ROWS][COLS], int row, int col)//查找不是雷的格子周围有几个雷
{return (assign[row - 1][col - 1]//字符0的ASCII值为48字符1的ASCII值为49 assign[row - 1][col] assign[row - 1][col 1] assign[row][col - 1] assign[row][col 1] assign[row 1][col - 1] assign[row 1][col] assign[row 1][col 1] - 8 * 0);
}
//排查雷函数的定义
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;//计算没有踩到雷的次数while (wincol*row-Easy_Thunder){printf(请输入坐标);scanf(%d%d, x, y);if (x 1 x row y 1 y col){if (assign[x][y] 1){printf(很遗憾你被炸死了\n);Display_Board(assign, ROW, COL);break;}else{//如果这个位置不是雷就统计周围八个格子雷的个数int c Getassign(assign, x, y);show[x][y] c 0;Display_Board(show, ROW, COL);system(cls);Display_Board(show, ROW, COL);win;}}else{printf(坐标非法请重新输入\n);}}if (win row * col - Easy_Thunder){printf(恭喜你排雷成功\n);Display_Board(assign, ROW, COL);}
}//test.c
void game()
{Find_thunder(assign, show, ROW, COL);//排雷函数的引用
}这里我们随机输入不用思考试一下踩到雷的结果 那么如果我们仔细思考看看当我们把所有不是雷的格子找出来的时候能不能成功
4.扫雷游戏的详细代码
//game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW2
#define COLS COL2
#define Easy_Thunder 10
#include stdlib.h
#include time.h
//初始化棋盘函数的声明
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘函数的声明
void Display_Board(char board[ROWS][COLS], int row, int col);
//布置雷函数的声明
void Set_thunder(char board[ROWS][COLS], int row, int col);
//排查雷函数的声明
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col);//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include game.h
//初始化棋盘的定义
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{int i 0;for (i 0; i rows; i){int j 0;for (j 0; j cols; j){board[i][j] set;}}
}
//打印棋盘函数的定义
//我们只需要打印出中间的9*9的格子
void Display_Board(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);}
}
//布置雷函数的定义
void Set_thunder(char board[ROWS][COLS], int row, int col)
{int count Easy_Thunder;//布置10个雷while (count){int x rand() % row 1;//生成横坐标int y rand() % col 1;//生成纵坐标if (board[x][y] 0)//防止在同一个地方重复布雷{board[x][y] 1;count--;}}
}
int Getassign(char assign[ROWS][COLS], int row, int col)//查找不是雷的格子周围有几个雷
{return (assign[row - 1][col - 1]//字符0的ASCII值为48字符1的ASCII值为49 assign[row - 1][col] assign[row - 1][col 1] assign[row][col - 1] assign[row][col 1] assign[row 1][col - 1] assign[row 1][col] assign[row 1][col 1] - 8 * 0);
}
//排查雷函数的定义
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;//计算没有踩到雷的次数while (wincol*row-Easy_Thunder){printf(请输入坐标);scanf(%d%d, x, y);if (x 1 x row y 1 y col){if (assign[x][y] 1){printf(很遗憾你被炸死了\n);Display_Board(assign, ROW, COL);break;}else{//如果这个位置不是雷就统计周围八个格子雷的个数int c Getassign(assign, x, y);show[x][y] c 0;Display_Board(show, ROW, COL);system(cls);//清屏操作Display_Board(show, ROW, COL);win;}}else{printf(坐标非法请重新输入\n);}}if (win row * col - Easy_Thunder){printf(恭喜你排雷成功\n);Display_Board(assign, ROW, COL);}
}//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include game.h
#include stdio.h
void menu()
{printf(******************************\n);printf(********* 1.play *********\n);printf(********* 0.exit *********\n);printf(******************************\n);
}
void game()
{char assign[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };Init_Board(assign,ROWS,COLS,0);Init_Board(show, ROWS, COLS, *);Display_Board(assign, ROW, COL);Set_thunder(assign, ROW, COL);Find_thunder(assign, show, ROW, COL);
}
int main()
{srand((unsigned int)time(NULL));int input 0;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;
}以上就是关于扫雷游戏的全部代码啦当然这个程序还是存在可优化的空间比如我们的游戏只能一个一个点但是不能像网页版的那样能展示一片这还有待思考欢迎大家在评论区交流优化代码。