前言
这是我自己做的第一个小项目---扫雷游戏。后期我会继续制作其他小项目并开源至博客上。
geme.h文件
#define _CRT_SECURE_NO_WARNINGS #define ROW 9 #define LIN 9 #define ROWS ROW+2 #define LINS LIN+2 #define EASY_COUNT 10 #include <stdio.h> #include <stdlib.h> #include <time.h> void menu(); void game(); void make_map(char arr[ROWS][LINS], int rows, int lines, char set); void printf_map(char arr[ROWS][LINS], int rows, int lines); void set_mine(char arr[ROWS][LINS], int row, int lin); int get_mine_count(char mine[ROWS][LINS], int x, int y); void find_mine(char mine[ROWS][LINS], char show[ROWS][LINS], int row, int lin);
1. 在创立的头文件中,存放各种函数声明、宏定义、以及引入不同库函数。
2. 使用宏定义时,可以更加方便的修改整个游戏的参数,不需要一个个改变量。
test.c文件
#include "game.h" void menu()//打印菜单函数 { printf("**欢迎来到扫雷游戏~**\n"); printf("******( ̄▽ ̄~)~******\n"); printf("**********************\n"); printf("********1.PLAY********\n"); printf("********0.EXIT********\n"); printf("**********************\n"); } void game()//游戏主体函数 { char mine[ROWS][LINS] = { 0 };//准备布置地雷的数组 char show[ROWS][LINS] = { 0 };//准备展示地雷的数组 make_map(mine, ROWS, LINS,'0');//形成布置地雷的数组(全为'0')(失败看到) make_map(show, ROWS, LINS, '*');//形成展示地雷的数组(全为'*')(成功看到) printf_map(show, ROW, LIN);//打印展示地雷'*'数组 set_mine(mine, ROW, LIN);//随机生产地雷 find_mine(mine,show ,ROW, LIN);//搜查九宫格的地雷数量 } int main() { int input = 0; srand((unsigned int)time(NULL));//创立随机种子,为生成随机数做准备。 do { menu();//先打印菜单函数 printf("请选择:1或者0\n"); scanf("%d", &input);//让玩家选择玩不玩 switch (input) { case 1: printf("进入扫雷\n"); game();//开始游戏函数 break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新选择\n"); break; } } while (input);//如果是0则退出,如果1则进入游戏,如果是其他数字则再次循环重新选择。 return 0; }
game.c文件
#include "game.h" void make_map(char arr[ROWS][LINS],int rows,int lines,char set)//制作地图函数 { int i = 0; for (i = 0; i < rows; i++) { int j = 0; for (j = 0; j < lines; j++) { arr[i][j] = set; } } } void printf_map(char arr[ROWS][LINS], int rows, int lines) { int i = 0; printf("-------扫雷-------\n");//界面分开线 printf("0"); for (i = 1; i <= rows; i++) { printf(" %d", i); } //第一行的行标注数 printf("\n"); for (i = 1; i <= rows; i++) { int j = 0; printf("%d", i);//第一列的行标注数 for (j = 1; j <= lines; j++) { printf(" %c", arr[i][j]);//这一行全部'*'号 } printf("\n");//实现换行 } } void set_mine(char arr[ROWS][LINS], int row, int lin) { int count = EASY_COUNT;//确定地雷的数量 while (count) { int x = rand() % row + 1; int y = rand() % lin + 1;//保障产生地雷在规定范围之内 if (arr[x][y] == '0')//避免重复布雷 { arr[x][y] = '1';//'1'代表地雷 count--; } } } int get_mine_count(char mine[ROWS][LINS],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'); }//字符可以以ASCLL编码的形式进行加减。 void find_mine(char mine[ROWS][LINS], char show[ROWS][LINS], int row, int lin) //主要的操作函数 { int x = 0, y = 0,win =0; while (1) { printf("请输入你要排查的坐标\n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= lin)//确保输入范围正确 { if (mine[x][y] == '1')//中招了 { printf("Game Over\n~( ̄▽ ̄~)~\n"); printf("地雷图如下所示:\n"); printf_map(mine, ROW, LIN);//失败后打印'0 1'图 break; } else//成功 { int count = get_mine_count(mine, x, y); show[x][y] = (count + '0');//在'*'图上展示数字(九宫格地雷数) printf_map(show, ROW, LIN);//失败后打印'* num'图 win++; } } else { printf("请重新输入!\n"); } if (win == row * lin - EASY_COUNT) { printf("排雷成功!\n~( ̄▽ ̄~)~\n"); printf_map(mine, ROW, LIN); } } }
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!