1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 趣味C——如何用C语言编写扫雷小游戏

趣味C——如何用C语言编写扫雷小游戏

时间:2019-09-27 09:03:08

相关推荐

趣味C——如何用C语言编写扫雷小游戏

目录

游戏介绍

初步分析

代码实现

游戏介绍

不用多说,扫雷小游戏作为空闲时打发时间的经典小游戏,有初级、中级、高级三个难度,有时候让人根本停不下来。那么,如何运用C语言的知识来编写一个简单的扫雷小游戏呢。

上面就是一个初级难度的扫雷小游戏的面板,左上角显示有10个雷,在不点到有雷方格的情况下,根据方格数字的提示,把有雷的方格都找出来即游戏胜利。

初步分析

在用C 语言编写游戏功能实现之前,先分析游戏的逻辑和不同模块计划要实现的内容。

同样,和三子棋游戏一样,在编写好初始的菜单功能的前提下,用一个字符二维数组arr[][]来设置一个游戏棋盘,含雷显示1,不含雷显示为0,此外,可以再设置一个大小相同、可以显示周围含雷信息的字符二维数组brr[][],周围有几个雷就显示几。

之后,考虑如何在棋盘上进行雷的布置,由于每次游戏之前玩家对雷的布置应该保持未知,所以,可以利用rand()函数,在这个二维数组棋盘上实现随机布置n个雷,至于是否布置成功,可以随时打印arr[][]数组棋盘来观察。

最关键的一步,如何可以提示玩家进行排雷,直到游戏胜利。在这个模块里,玩家输入一个坐标,如果里面正好是‘1’,则提示游戏失败,进入主菜单选择是否开启下一次的游戏;如果玩家输入的坐标不是‘1’,即不是雷,就让这个坐标显示周围八个坐标的‘1’的个数,并在brr数组棋盘上显示出来,记排雷步数+1。(注意,在游戏过程中玩家只看到9*9的棋盘界面,而在这一步的判断过程中,为了不出现数组访问的越界,在初始设置棋盘数组arr[][]和信息数组brr[][]的时候均设置为11*11大小)

最后,设置游戏胜利的条件,假设布置了10个雷,那么当上面的排雷步数为(9*9-10)时,代表玩家已经将非雷坐标均找了出来,即为游戏胜利。

代码实现

相关代码如下:

test.c对代码逻辑进行测试:

//test.c#include<stdio.h>#include "game.h"void menu(){printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");}void game(){//布置两个数组,数据棋盘arr和信息棋盘brr(11*11)char arr[ROW1][COL1]={'0'};char brr[ROW1][COL1]={'0'};//初始化棋盘init(arr,ROW1,COL1,'0');init(brr,ROW1,COL1,'*');//打印棋盘print(arr,ROW1,COL1,ROW,COL);print(brr,ROW1,COL1,ROW,COL);//布置雷mine(arr,ROW1,COL1,ROW,COL);print(arr,ROW1,COL1,ROW,COL);//检验是否布置成功//排除雷find_mine(arr,brr,ROW1,COL1,ROW,COL);}int main(){//菜单int input=0;srand((unsigned int)time(NULL));menu();do{printf("是否开始游戏?(1/0)\n");scanf("%d",&input);switch(input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入:>");break;}}while(input);return 0;}

game.h是对test.c中函数功能的实现 :

#include "game.h"//game.c//初始化棋盘void init(char arr[ROW1][COL1], int row1, int col1, char set){int i=0;int j=0;for(i=0;i<row1;i++){for(j=0;j<col1;j++){arr[i][j]=set;}//printf("\n");}}//打印棋盘void print(char arr[ROW1][COL1],int row1, int col1, int row, int col){int i=0;int j=0;printf("------------------扫雷-------------------\n");printf(" ");for(i=1;i<=row;i++){printf("%d ",i);}printf("\n");for(i=1;i<=row;i++){printf("%d ",i);for(j=1;j<=col;j++){printf("%c ",arr[i][j]);}printf("\n");}printf("-------------------扫雷-------------------\n");}//布置雷void mine(char arr[ROW1][COL1], int row1, int col1, int row, int col){//int x=rand()%row;//int y=rand()%col;//放进循环里去int m=MINE;while(m>0){int x=rand()%row+1;int y=rand()%col+1;if(arr[x][y] == '0'){arr[x][y]='1';m--;}}}//排除雷void find_mine(char arr[ROW1][COL1], char brr[ROW1][COL1], int row1, int col1, int row, int col){int x=0;int y =0;int i=0;int j=0;int rem='0';int count=0;int win=0;while(win<row*col-MINE){printf("请输入要排查的坐标:>\n");scanf("%d %d",&x,&y);if(x>=1 && x<=row && y>=1 && x<=col ){if(arr[x][y]=='1'){printf("很抱歉,此处有雷,游戏结束!\n");print(arr,ROW1,COL1,ROW,COL);break;}else{rem=arr[x-1][y-1]+arr[x+1][y-1]+arr[x][y-1]+arr[x-1][y]+arr[x+1][y]+arr[x-1][y+1]+arr[x][y+1]+arr[x+1][y+1]-8*'0';brr[x][y]=rem+'0';print(brr,ROW1,COL1,ROW,COL);win++;}}else{printf("输入错误,请重新输入:>\n");}}if(win==row*col-MINE){printf("恭喜你,排雷成功!\n");}}

game.h对test.c中函数的定义:

//game.h#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROW 9#define COL 9#define ROW1 ROW+2#define COL1 COL+2#define MINE 10//初始化棋盘void init(char arr[ROW1][COL1], int row1, int col1, char set);//打印棋盘void print(char arr[ROW1][COL1], int row1, int col1, int row, int col);//布置雷void mine(char arr[ROW1][COL1], int row1, int col1, int row, int col);//排除雷void find_mine(char arr[ROW1][COL1], char brr[ROW1][COL1], int row1, int col1, int row, int col);

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