🛫大家好,我今天学习了一个用C语言写的小游戏,迫不急待的要分享给大家。🛫
🛫想必大家都玩过扫雷,扫雷是一个益智类小游戏。通过排查坐标上是否有雷来获取胜利,越玩越上瘾。今天的这个扫雷是简单版本,他不会爆炸式的展开,只能一个一个坐标去排查,这也是一个缺点。我会去学习这部分知识,然后去写一篇优化的文章,欢迎您大家多多支持我呀!🛫
🏫游戏介绍
我们在玩扫雷的时候,输入要排查雷的坐标,然后通过程序判断是否是雷,如果是雷,游戏结束,不是雷游戏继续。这个功能是由Find()函数实现的,这里是关键。
🏫源文件和头文件
💖game.h 放置函数的声明和一些#define定义的变量。
💖game.c 函数的实现,所有函数功能的实现都在这个文件里。
💖test.c 主函数所在源文件。
🏫代码实现:
🏫game.h
💖函数的声明,定义的常量和包含的头文件
#pragma once //定义常量 #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define EASY_COUNT 80 //头文件的引用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //函数的声明 //初始化棋盘的函数 void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch); //打印棋盘的函数 void PrintBoard(char board[ROWS][COLS], int rows, int cols); //放置雷的函数 void SetMine(char mine[ROWS][COLS], int row, int col); //排查雷 void Find(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); //发现坐标周围有几颗雷的函数 int FindMine(char mine[ROWS][COLS], int row, int col);
🏫test.c
💖通过menu函数打印菜单,game函数进行游戏功能的整合。
#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, '*'); //打印棋盘的函数 //PrintBoard(mine, ROW, COL); PrintBoard(show, ROW, COL); //设置雷的函数 SetMine(mine, ROW, COL); //排查雷的函数 Find(mine, show, ROW, COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); //菜单函数 printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("玩游戏!\n"); game(); break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return 0; }
🏫game.c
💖用for循环遍历二维数组,进行初始化
//初始化棋盘的函数 void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ch; } } }
💖用for循环打印数组中的每个元素。
void PrintBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("*************** 扫雷 **************\n"); for (i = 0; i <= col; i++) { printf("%d ", i); } 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"); }
💖 使用随机数进行随机坐标的生成,需要注意的是余数不可能大于除数。数组元素等于字符0就布置雷,也就是把这个元素赋值成字符1。
void SetMine(char mine[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = EASY_COUNT; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } //PrintBoard(mine, ROW, COL); }
💖发现已排查雷周围雷的个数,需要注意'0'+1 ='1'或者’1‘-’0‘ = 1
//发现一个坐标周围有几个雷的函数 int FindMine(char mine[ROWS][COLS], int row, int col) { int x = row; int y = col; return (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] + mine[x - 1][y - 1]- 8 * '0'); }
💖 排查雷需要判断输入的坐标是否合法,要排查的坐标是否已经被排查,判断输赢。我们可以使用if语句的嵌套来完成这三件事的判断。前两者都满足,证明输入的坐标没有问题,才可以进行下一步操作。
//排查雷 void Find(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] == '*') { if (mine[x][y] == '1') { printf("很遗憾,你被炸死了!\n"); PrintBoard(mine, ROW, COL); break; } else { //不是雷统计该坐标周围有几个雷。 int count = FindMine(mine,x,y); show[x][y] = count + '0'; PrintBoard(show, ROW, COL); win++; } } else { printf("坐标占用,请重新输入!"); } } else { printf("输入坐标错误,请重新输入!\n"); } if (win == row * col - EASY_COUNT) { printf("排雷结束!\n"); } } }
🏫结语:以上就是今天我所学到的内容,💖感谢大家的支持。💖今天是2023年1月17日,快要过春节了,💖祝大家来年心想事成,学业有成。💖最后谢谢大家的支持!💖
代码仓库: