1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】

时间:2024-05-30 03:05:30

相关推荐

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】

目录

一、扫雷游戏的运行逻辑二、代码逻辑讲解+源码1.打印一个简易的游戏开始菜单2.创建数组储存数据并初始化数组代码逻辑讲解源码3.布置雷代码逻辑讲解源码4.排雷代码逻辑源码三、结果展示完整源码链接

一、扫雷游戏的运行逻辑

1.鼠标点击进行扫雷

2.若此处没有雷则会显示周围相应的雷的数目

3.若踩雷则游戏失败

二、代码逻辑讲解+源码

这里我们以9*9规格来实现简易版扫雷的游戏代码

逻辑思维导图↓

注意:好的代码习惯——边写边调试,不要把错误累积到最后

1.打印一个简易的游戏开始菜单

#include "game.h"//所有需要用到的编译预处理命令放game.h头文件里,这里直接引用头文件//#include <stdio.h>void menu(){printf("***********1.star game***********\n");printf("*********************************\n");printf("***********0.quit game***********\n");}void game(){}int main(){int input = 0;do//循环体至少执行一次所以选用do while循环{menu();printf("请输入数字:");scanf("%d", &input);if (1 == input){printf("游戏开始\n");game();//游戏运行}else if (0 == input){printf("退出游戏\n");break;}else{printf("选择错误请重新输入\n");}} while (input);return 0;}

运行结果↓

2.创建数组储存数据并初始化数组

代码逻辑讲解

源码

//在头文件中定义二维二维数组的行和列,注意编译预处理命令后面没有;#define ROW 9//方便后期对数组的行和列进行修改#define COL 9#define ROWS ROW+2#define COLS COL+2//初始化数组void init_board(char board[ROWS][COLS], int rows, int cols, char symbol);//打印数组void print_board(char board[ROWS][COLS], int row, int col);

↑注意:编译预处理命令后面没有分号 ‘ ; ’

//test.cvoid game(){char mine[ROWS][COLS] = {0 };char show[ROWS][COLS] = {0 };//初始化数组init_board(mine, ROWS, COLS, '0');//0和‘0’不一样,如果数组里面元素都是0打印出来什么也不显示,所里这里也需要初始化init_board(show, ROWS, COLS, '*');//打印数组print_board(show, ROW, COL);print_board(mine, ROW, COL);}

↑对于书写初始化函数的注意:被指定的初始化的符号也属于函数参数(变量)之一

↑初始化函数和打印函数注意:被初始化的数组是原本创建的11/*11数组,但是打印的时候只需要打印9/*9的数组,两个函数传参传的不一样

//game.c//初始化数组void init_board(char board[ROWS][COLS], int rows, int cols, char symbol){int i = 0, j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = symbol;}}}//打印数组void print_board(char board[ROWS][COLS], int row, int col){int i = 0, j = 0;//打印一下列数printf("%d", i);//补齐空位for (i = 1; 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.布置雷

代码逻辑讲解

1.操作对象是mine数组

2.生成两个随机数(x,y)作为要布置雷的坐标

3.判断此处是否已经布过雷

4.用字符1来代表“有雷”

5.while循环这个过程

源码

//布雷(头文件函数声明void set_mine(char board[ROWS][COLS], int row, int col);#define MINE 10 //设置布雷的数目

//布雷(MINE)void set_mine(char board[ROWS][COLS], int row, int col){int count = 0;while (count < MINE){//这里要注意!!布雷的时候要防止布在重复(相同的坐标)所以要判断一下!!int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';//注意这里放的是字符‘1’count++;}}}

4.排雷

代码逻辑

源码

//game.cint mine_is(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][y + 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] - 8 * '0');}//排雷void clearance_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols){printf("开始排雷\n");int win = 0;while (win < ROW * COL - MINE)//只要雷没有排完就一直循环排雷的过程{printf("请输入要排雷的坐标:");int x = 0, y = 0;scanf("%d %d", &x, &y);//首先判断坐标是否合法if (x > 0 && x < rows - 2 && y>0 && y < cols - 2){//再判断坐标是否已经排过雷if (show[x][y] == '*'){if (mine[x][y] != '1')//此处不是雷,则用字符数字替换'*'{show[x][y] = (mine_is(mine, x, y) + '0');print_board(show, ROW, COL);win++;}else//如果踩雷{printf("很遗憾,你被炸死了,排雷失败\n");break;}}}else{printf("坐标非法请重新输入:");}}if (win == ROW * COL - MINE)//排雷成功跳出循环{printf("恭喜你排雷成功!\n");}}

三、结果展示

(真正玩游戏的时候不用打印mine数组)

完整源码链接

点击获取完整源码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。