欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

简易版扫雷(C语言实现)

时间:2023-06-01

想要做出这个游戏,我们需要先了解游戏的玩法。就是在一个棋盘上面有若干个雷(隐藏的),当点击棋盘空格区域时,会显示相邻1格的雷的个数,若点中了雷,则游戏结束。

接下来让我们看看该如何做到这个扫雷游戏的实现。

还是一样,我们把这游戏的代码分成三个文件来完成,一个game.h用来存放游戏实现的各种函数声明以及头文件,game.c用来放游戏的实现函数定义,test.c用来存放游戏的界面打印和运行过程代码。

首先我们需要打印出游戏菜单来让玩家选择,代码如下:

void menu(){printf("***************************n");printf("******* 1.play **********n");//选择1进行游戏printf("******* 0.exit **********n");//0退出游戏printf("***************************n");}

然后让我们看一下主函数的代码:
 

int main(){int in = 0;srand((unsigned int)time(NULL));//设置随机数do {menu();//打印菜单printf("请选择n");scanf_s("%d", &in);switch (in)//接收输入的数,进行判断{case 1:printf("开始游戏n");game();break;case 0:printf("退出游戏n");break;default:printf("输入错误");break;}} while (in);//循环,只要不选择退出游戏就可以一直玩return 0;}

然后给大家看一下game.h中的代码

接下来就是这个游戏的核心部分,game.c的代码该如何设置:
首先我们来分析一下该如何做,先我们需要一个棋盘来设置雷,但是我们又不能够将雷直接放给玩家看,所以我们需要在设置一个棋盘,展示给玩家看,让他们进行扫雷。我们将设置雷的棋盘上全部放上 0 ,然后雷设置为 1 ,展示给玩家的棋盘全部设为 * ,让玩家进行扫雷,下面是代码:
 

char mine[ROWS][COLS] = { 0 };//定义的设置雷的棋盘char show[ROWS][COLS] = { 0 };//玩游戏的棋盘InitBoard(mine, ROWS, COLS, '0');//将棋盘中放上 0 InitBoard(show, ROWS, COLS, '*');//将棋盘全部放上 *

void InitBoard(char board[ROWS][COLS], int rs, int cs,char set)//这个函数是给棋盘赋上值{int i, j;for (i = 0; i < rs; i++){for (j = 0; j < cs; j++){board[i][j] = set;}}}

接下来打印展示的游戏棋盘,同时为了美观和游戏体验,我们将棋盘设置成大两行的数列,便于操作,并在棋盘上下划线便于区分:
 

void show_board(char board[ROWS][COLS], int r, int c){int i, j;printf("-----------扫雷-----------n");for (i = 0; i <= c; i++)//这一步是将每一列的列数打印出来{printf("%d ", i);}printf("n");for (i = 1; i <= r;i++){printf("%d ", i);//将每一行的行数打印出来for (j = 1; j <= c; j++){printf("%c ", board[i][j]);}printf("n");}printf("-----------扫雷-----------n");}

然后就是布置雷了,这里我们要用到rand函数,随机设置雷的分布,并要注意不能重复设置:
 

void set_mine(char board[ROWS][COLS], int r, int c){int x, y;int count = COUNT;//雷的个数while (count)//当雷不为0时进入循环{x = rand() % r + 1;//在1到r中取随机数坐标y = rand() % r + 1;if (board[x][y] == '0')//当没有设置过雷时才能进入设置雷,否则重新循环{board[x][y] = '1';count--;//当设置了一个雷后,雷的数量减一}}}

接下来让我们开始扫雷:

int get_mine_count(char mine[ROWS][COLS], int x, int y){return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0';//返回附近八个坐标中雷的数量}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c){int x, y, win = 0;//win为排查非雷的个数while (win < r * c - COUNT){printf("请输入要排查的坐标:n");scanf_s("%d%d", &x, &y);if (x >= 1 && x <= r && y >= 1 && y <= c){if (mine[x][y] == '1')//如果输入的坐标有雷,进入{printf("很遗憾,被炸死了。n");show_board(mine, ROW, COL);//将设置雷的棋盘打印出来break;}else{int count = get_mine_count(mine, x, y);//将排查的非雷坐标附近的八个坐标的雷的数量打印出来show[x][y] = count + '0';show_board(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入n");}}if (win == r * c - COUNT)//当非雷数与棋盘的格数减去雷数相等时,则游戏胜利{printf("恭喜你,排雷成功n");show_board(mine, ROW, COL);}}

然后这游戏的主要代码已经写完了,给你们整合一下game.h和test.c的代码:

game.h

#pragma once#include#include#include#define COL 9#define ROW 9#define ROWS 11#define COLS 11#define COUNT 10void InitBoard(char board[ROWS][COLS], int r, int c,char set);void show_board(char board[ROWS][COLS],int r,int c);void find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c);void set_mine(char board[ROWS][COLS], int r, int c);

test.c

#include"game.h"void menu(){printf("***************************n");printf("******* 1.play **********n");printf("******* 0.exit **********n");printf("***************************n");}void game(){char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');set_mine(mine, ROW, COL);show_board(show, ROW, COL);find_mine(mine, show, ROW, COL);}int main(){int in = 0;srand((unsigned int)time(NULL));do {menu();printf("请选择n");scanf_s("%d", &in);switch (in){case 1:printf("开始游戏n");game();break;case 0:printf("退出游戏n");break;default:printf("输入错误");break;}} while (in);return 0;}

好了,这一次的扫雷游戏就结束了,快点写完去玩两把吧,自己做到游戏玩起来可是有不同的成就感哦!

看到这里了还不三连吗!!!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。