当前位置:首页 » 《休闲阅读》 » 正文

重生之我在C语言玩扫雷

15 人参与  2024年05月04日 08:35  分类 : 《休闲阅读》  评论

点击全文阅读


思路

实现扫雷小游戏的设计,首先要有两个棋盘(一大一小,用数组实现),一个隐藏雷的位置,一个给玩家看(没有任何提示价值,不会影响游戏的公正性),两个数组同时存在但同时之只展示一种,若玩家未踩雷,则只展示隐藏雷的数组,已扫的位置置为0,若玩家踩雷,则显示已踩雷,游戏结束并显示所有雷的分布;然后要初始棋盘;再生成十个雷的位置;扫雷,若扫中则本局游戏结束,若没扫中则扫的地方的符号变成相邻地方有雷的数量。

注:文章末有该游戏全代码

1.创建文件

此次扫雷游戏需要创建三个文件分别为game.h , game.c , text.c

头文件game.c用于对函数的声明

源文件text.c用于游戏主函数及游戏测试

源文件game.c用于功能的具体实现

2.菜单的打印

在text.c文件中创建一个menu函数用于打印菜单内容。

创建test函数用于实现菜单功能的实现。

该功能的实现运用了do while循环与switch语句,通过用户的输入进入对应的功能实现不同的效果。

此代码的缺点是用户只能输入数字,无法输入字母等其他符号。

3.游戏逻辑

当用户输入1时将进入game函数,game函数功能的实现分为图中四个部分。

3.1初始化棋盘

该扫雷游戏是9*9大小的棋盘

ps1 首先game()函数中创建两个数组mine,show分别为存放雷的信息,存放被查出的雷的信息。

ps2 在头文件game.h中定义ROW,COL,ROWS,COLS的值,便于后续更改棋盘的大小。

9*9的棋盘却要创建11*11的ROWS*COLS是为了便于后续统计边缘上非雷棋子周围雷的个数

棋盘的初始化

创建一个Initboard函数分别初始化两个棋盘

最终用户看到的只是Initboard(show,ROWS,COLS,'*')函数展示出的棋盘

在头文件game.h中对该函数进行声明

在源文件game.c中对Initboard函数的功能具体化实现

通过两个for循环初始化棋盘

3.2打印棋盘

初始化棋盘之后需要进行打印棋盘

在头文件game.h中对该函数进行声明

在源文件game.c中将该函数进行具体化实现 

此时我们可以给棋盘加上坐标,将函数改为如图

3.3布置雷

在game()函数中创建setmine()函数

在源文件game.h中对该函数进行声明

声明过后在game.c中对该函数进行实现

此处用到了随机数,需在源文件text.c中的text()函数中添加

srand((unsigned)time(NULL)) 以及在头文件game.h中添加#include<time.h>

此时如果想查看随机生成雷的位置,

需要将函数DispalyBoard(mine, ROW, COL)挪动到函数setmine(mine,ROW,COL)之后

3.4排查雷

在源文件text.c中的game()函数中创建Findmine()函数

在头文件game.h中对该函数进行声明

在game.c中对该函数进行具体实现

统计周围雷的个数

至此该游戏已经完成

缺点:该代码只实现了最基本的扫雷,无法做到传统扫雷的计时,插旗以及扫到的坐标周围雷的数量为0时空出一片无雷区的功能。

4.全代码

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"mine.h"//初始化棋盘void Initboard(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;}}}//打印棋盘void DispalyBoard(char board[ROWS][COLS], int row, int col){int i = 0;for (i = 0; i <=row; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++)//因为展现给用户9*9的棋盘即可,所以i=1,i<=row(9){printf("%d ",i);int j = 0;for (j = 1; j <= col; j++)//和上述解释相同{printf("%c ", board[i][j]);}printf("\n");//换行}}//布置雷是在棋盘上随机找十个坐标void setmine(char mine[ROWS][COLS], int row, int col){int count = EASY_COUNT;//雷的个数int x = 0;int y = 0;while (count){//利用随机数生成雷的坐标x = rand()%row+1;//范围1-9y = rand()%col+1;//范围1-9if (mine[x][y] != '1')//如果随机的位置没有雷即不为1 布置一个雷{mine[x][y] = '1';count--;          //布置一个雷之后,雷的个数-1 直到-为0后不再进行循环}}}//排查雷int get_mine_count(char mine[ROWS][COLS], int x,int y){return mine[x - 1][y - 1] +mine[x - 1][y] + 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 Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int win = 0;int x = 0;int y = 0;while (1){printf("请输入你要排查的坐标》");scanf("%d %d",&x,&y);                                          if (x>=1 &&x<=row&&y>=1&&y<=col)//判断坐标是否越界{if (mine[x][y] == '1')//判断这个位置是不是雷 //如果是雷,就炸死,游戏结束{printf("很遗憾你被炸死了");DispalyBoard(mine, ROW, COL);//死亡之后,打印雷的分布图break;}else //如果不是,就统计这个位置周围的雷的个数,直到获胜或炸死             {int count = get_mine_count(mine, x, y);show[x][y] = count + '0';DispalyBoard(show, ROW, COL);//获胜之后,打印雷的分布图win++;}}else{printf("输入的坐标有误");}}if (win == row * col - EASY_COUNT){printf("恭喜你排雷成功\n");DispalyBoard(mine, ROW, COL);}}

text.c

#define _CRT_SECURE_NO_WARNINGS 1#include"mine.h"void menu()//目录{printf("   <欢迎来到扫雷游戏>   \n");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, '*');//打印棋盘DispalyBoard(show, ROW, COL);//布置雷setmine(mine,ROW,COL);DispalyBoard(mine, ROW, COL);//排查雷Findmine(mine, show, ROW, COL);}void test(){//打印目录int sel = 0;srand((unsigned)time(NULL));do{menu();scanf("%d", &sel);switch (sel){case(1):printf("欢迎来到扫雷游戏!\n");game();break;case(0):printf("退出扫雷游戏\n");break;default:printf("输入错误请重新输入\n");break;}} while (sel);return 0;}int main(){test();return 0;}

game.h

#pragma once#include<stdio.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10#include<time.h>//初始化棋盘void Initboard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘void DispalyBoard(char board[ROWS][COLS],int row,int col);//布置雷void setmine(char mine[ROWS][COLS], int row, int col);//排查雷void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);


点击全文阅读


本文链接:http://zhangshiyu.com/post/103374.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1