1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【C语言】简易版扫雷游戏(play game)

【C语言】简易版扫雷游戏(play game)

时间:2021-01-09 04:33:37

相关推荐

【C语言】简易版扫雷游戏(play game)

目录

扫雷游戏💥初始化数组和打印🍓布置雷🍎排查雷的信息,判断输赢🍊完整代码💦

扫雷游戏💥

如下图所示的9*9的扫雷棋盘游戏界面,要玩扫雷这个游戏首先必须有一个如下图所示的棋盘,扫雷游戏是怎么玩的呢?如图,假设我要点画圈的位置,如果它不是雷的话,那它就会显示一个数字,数字上标的大小就说明了画圈的那个数的周围8个位置含雷的数量。如果它是雷,玩家就输了。那要怎么实现呢,首先要布置十个雷上去,然后要把这些雷储存起来,这里就要创建一个布置雷的数组,而玩家一开始玩的时候,点击一个坐标要显示周围一圈雷的个数,这里就需要再创建一个排查出雷的信息的数组。但是在游戏的过程中不需要显示布置雷的数组,而应该给玩家展现排查雷的信息。

初始化数组和打印🍓

如下图,左边是布置雷的数组,右边是排查雷的数组。排查雷的数组我们初始化为字符’*’,那么它就是一个字符数组,所以左边我们可以初始化为字符’0’,雷为字符’1’。而当玩家在玩的时候选择棋盘边上的坐标的话,统计它周围有多少雷的时候就会造成数组越界访问,所以我们为了防止越界访问,把数组都初始化为11 *11的棋盘。要看到我们初始化数组是否成功,创建一个打印棋盘的函数。而我们打印的时候只需要打印出9 *9的棋盘。如下图二所示,但是玩游戏的时候只要显示排雷信息的界面,不用显示布置雷的界面。

函数部分如下:

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set){int i = 0;int j = 0;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){board[i][j] = set;}}}void Displayboard(char board[ROWS][COLS], int row, int col){int i = 0;int j = 0;printf("--------扫雷游戏-------\n");for (j = 0; j <= col; j++){printf("%d ", j);}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");}

实现效果:

布置雷🍎

布置雷的话需要确定布置的范围,是9 *9,设置简单模式埋十个雷。按坐标来布置雷,坐标这里是1~9。可以通过随机生成横纵坐标。需要判断当坐标放的是’0’时,可以设置雷。

部分代码如下:

```cppvoid SetMine(char board[ROWS][COLS], int row, int col){int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}

实现效果:

排查雷的信息,判断输赢🍊

要完成排查雷的动作,需要这两个数组,选中一个位置的坐标,如果是雷的话,就炸死了,如果不是雷,统计周围所有的雷的个数显示在选中位置。坐标不能超出范围。注意:棋盘放的是字符,不能简简单单计算。我们知道,‘1’ - ‘0’->1,‘0’ - ‘0’->0。把周围的数字都加起来再一起减去个数*‘0’,得到的数是几周围就有几个雷。判断输赢让棋盘格子的数量减去雷的个数,当我们把所有的雷都找到,则可以判定玩家胜利!这里要注意不能输入重复坐标的情况。

部分代码如下:

int get_mine_count(char board[ROWS][COLS], int x, int y){return (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] +board[x - 1][y + 1] - 8 * '0');}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;//找到非雷的个数while (win < row * col - EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");Displayboard(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';//转换成数字字符Displayboard(show, ROW, COL);}}}else{printf("输入的坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");Displayboard(mine, ROW, COL);}}

实现效果:

完整代码💦

游戏代码的声明:

#include<stdio.h>#include<time.h>#include<stdlib.h>#define ROW 9#define COL 9#define ROWS 11#define COLS 11#define EASY_COUNT 10void Initboard(char board[ROWS][COLS], int rows, int cols,char set);void Displayboard(char board[ROWS][COLS],int row, int col);void SetMine(char board[ROWS][COLS], int row, int col);void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col);

游戏代码的实现:

#include "game2.h"void InitBoard(char board[ROWS][COLS], int rows, int cols,char set){int i = 0;int j = 0;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){board[i][j] = set;}}}void Displayboard(char board[ROWS][COLS], int row, int col){int i = 0;int j = 0;printf("------扫雷游戏-----\n");for (j = 0; j <= col; j++){printf("%d ", j);}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");}void SetMine(char board[ROWS][COLS], int row, int col){int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}int get_mine_count(char board[ROWS][COLS], int x, int y){return (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] +board[x - 1][y + 1] - 8 * '0');}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;//找到非雷的个数while (win < row * col - EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");Displayboard(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';//转换成数字字符Displayboard(show, ROW, COL);}}}else{printf("输入的坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");Displayboard(mine, ROW, COL);}}

测试游戏代码:

#include "game2.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 };//存放排查出雷的信息//初始化mineInitBoard(mine, ROWS, COLS,'0');//初始化showInitBoard(show, ROWS, COLS,'*');//打印数组//设置雷SetMine(mine, ROW, COL);Displayboard(show, ROW, COL);//Displayboard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}int main(){int input = 0;srand((unsigned int)time(NULL));do {menu();printf("请选择:>\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;fault:printf("选择错误\n");break;}} while (input);return 0;}

写在最后🍎:码字不易,如果对你有帮助的话,给个三连或者关注一下吧🍰,感谢支持!📣

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