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

C语言扫雷游戏(简易版)

时间:2023-05-27 11:25:04

相关推荐

C语言扫雷游戏(简易版)

前言

经过学习数组、函数、循环语句、选择语句等C语言的一些基础知识后,我想借助编写扫雷小游戏来对所学知识进行一个巩固。游戏只会实现一些基本的功能,展开、标记雷、取消雷等不实现(还不会)。

1.游戏编写思路

分模块进行代码书写:测试模块(test.c) 游戏模块(game.c 和 game.h)

实现游戏菜单

创建两个扫雷棋盘并初始化棋盘

打印棋盘

布置雷区

查找雷

1.分模块书写代码

创建测试模块用于代码的测试。创建游戏模块的game.c源文件用于实现游戏部分的内容。创建game.h头文件用于存放引用库函数的头文件、自定义函数声明、定义#define常量,我们只要在源文件中引用game.h就可以了。分模块编写代码方便我们进行维护以及隐藏部分函数。

3.实现游戏菜单

下面我们在测试模块中实现简易版游戏菜单:

//测试模块 test.c//这里引用的是我创建的头文件,里面存放了引用库函数的头文件名#include"game.h"//基础菜单函数void menu(){printf("*********************************\n");printf("************* 1.play ************\n");printf("************* 0.exit ************\n");printf("*********************************\n");}//游戏函数void game(){printf("扫雷游戏\n");}//测试函数void test(){int input = 0;//这里程序运行至少会进入一次菜单界面,所以我们使用do while循环do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default:printf("输入不合法,请重试\n");break;case 1:game();break;case 0:printf("退出游戏\n");break;}} while (input);}//主函数int main(){test();return 0;}

我们按control+f5让代码跑起来:

可以看到游戏菜单模块的基本逻辑已经实现,下面就是游戏模块的编写了。

3.扫雷棋盘的创建并初始化,打印扫雷棋盘

首先是一些关于棋盘创建的一些思路

游戏是在9*9棋盘上进行,但是实际需要一个11*11的二维数组用法游戏模块的实现。我们将mine棋盘初始化全是'0' ,show棋盘初始化成全是'*'。

接下来是三个文件的代码以及对数组初始化值的验证

//game.h#include<stdio.h>//游戏的行和列值#define ROW 9#define COL 9//实际的行和列值#define ROWS ROW+2#define COLS COL+2//函数的声明void Init(char board[ROWS][COLS], int rows, int cols, char set);void DisplayBoard(char board[ROWS][COLS], int rows, int cols);

//game.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//初始化棋盘函数void Init(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 DisplayBoard(char board[ROWS][COLS], int row, int col){printf("-----------扫雷-----------\n");int i = 0;int j = 0;for (j = 0; j <=col; j++){printf("%d ", j);//打印列号}printf("\n");for (i = 1; i <= row; i++){printf("%d ",i+1);//打印行号for (j = 1; j <= col; j++){printf("%c ",board[i][j]);}printf("\n");}printf("--------------------------\n");}

//test.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void game(){char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化两个数组Init(mine, ROWS, COLS, '0');Init(show, ROWS, COLS, '*');//打印棋盘信息DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);}

代码书写到这里,让程序跑起来验证一下

可以看到我们实现了两个棋盘的创建并初始化棋盘,打印棋盘信息。

4.布置雷区

实现思路:创建#define常量控制设置雷的个数,通过随机数来生成下标,生成后进行判断是否重复。将生成的雷的过程放入循环中,通过count变量控制循环进行。

//game.h#define MINENUM 10//game.c//布置雷void SetMine(char board[ROWS][COLS],int row,int col){int count = MINENUM;int x = 0;int y = 0;while (count){ //在test.c的test函数内声明srand((unsigned int)time(NULL))//注意这里的time函数返回值为time_t,所以需要进行一个强制转换。x = rand() % 9 + 1;y = rand() % 9 + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}

5.查找雷

实现思路:首先我们要明白排查的过程是一个重复的过程,只有两种情况会跳出这个重复的过程,踩雷或把所有不是雷的位置全部排查了。所以我们需要一个循环来实现,循环的判断条件就是未排查的非雷位置的个数。我们还需要判断输入合法性以及判断是否重复排查同一坐标。当我们排查到了个非雷坐标,则显示周围雷的数量。

//统计周围雷个数int MineCount(char mine[ROWS][COLS], int x, int y){//通过返回的ASC值加上'0'就是改坐标附近雷的个数return (mine[x-1][y-1]+ mine[x - 1][y ]+ mine[x - 1][y + 1]+mine[x ][y - 1] + mine[x][y+1] +mine[x+1][y-1] + mine[x+1][y] + mine[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 goal = 0;//存放排查次数//当排查完所有非雷坐标后结束循环while (goal < row * col - MINENUM){printf("请输入排查的坐标:>");scanf("%d %d",&x,&y);if (show[x][y] != '*')//判断是否重复排查{printf("改坐标已经排查过了\n");continue;}//判断输入合法性if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾你被炸死了\n");DisplayBoard(mine,row,col);break;}else{int n = MineCount(mine,x,y);show[x][y] = '0' + n;DisplayBoard(show, row, col);goal++;}}else{printf("输入坐标不合法\n");}}//终止循环后判断扫雷成功的条件if (goal == row * col - MINENUM){printf("恭喜你扫雷成功");}}

6.完整代码以及测试

//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 };//初始化两个数组Init(mine, ROWS, COLS, '0');Init(show, ROWS, COLS, '*');//打印棋盘信息DisplayBoard(show, ROW, COL);//布置雷SetMine(mine);//排查雷FindMine(mine,show,ROW,COL);}void test(){srand((unsigned int)time(NULL));//通过时间戳来生成一个随机数int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default:printf("输入不合法,请重试\n");break;case 1:game();break;case 0:printf("退出游戏\n");break;}} while (input);}int main(){test();return 0;}

//game.c#include"game.h"void Init(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 DisplayBoard(char board[ROWS][COLS], int row, int col){printf("-----------扫雷-----------\n");int i = 0;int j = 0;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 count = MINENUM;int x = 0;int y = 0;while (count){x = rand() % 9 + 1;y = rand() % 9 + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}//统计周围雷个数int MineCount(char mine[ROWS][COLS], int x, int y){return (mine[x-1][y-1]+ mine[x - 1][y ]+ mine[x - 1][y + 1]+mine[x ][y - 1] + mine[x][y+1] +mine[x+1][y-1] + mine[x+1][y] + mine[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 goal = 0;while (goal < row * col - MINENUM){printf("请输入排查的坐标:>");scanf("%d %d",&x,&y);if (show[x][y] != '*'){printf("改坐标已经排查过了\n");continue;}if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾你被炸死了\n");DisplayBoard(mine,row,col);break;}else{int n = MineCount(mine,x,y);show[x][y] = '0' + n;DisplayBoard(show, row, col);goal++;}}else{printf("输入坐标不合法\n");}}if (goal == row * col - MINENUM){printf("恭喜你扫雷成功");}}

//game.h#pragma once#include<stdio.h>#include<stdlib.h>#include<time.h> //游戏的行和列值#define ROW 9#define COL 9//实际的行和列值#define ROWS ROW+2#define COLS COL+2//雷的个数#define MINENUM 10//函数声明void Init(char board[ROWS][COLS], int rows, int cols, char set);void DisplayBoard(char board[ROWS][COLS], int rows, int cols);void SetMine(char board[ROWS][COLS]);void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

这里测试我将雷的个数设置成79个并输出雷的坐标来进行程序的逻辑测试:

总结

本文章分享的仅仅是扫雷小游戏的基础框架以及基本的程序逻辑,文中代码仅供参考,如有错误请指正。等完善其他的一些小功能后,会再次与你分享。希望我们一起进步。

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