C语言扫雷游戏
牧瀬 紅莉栖 人气:0游戏界面展示:
一开始菜单界面:
选择 0 退出程序:
选择 1 开始游戏:
输入要排查雷的坐标:
会根据周围雷的个数,该坐标显示数字。
如果周围没有雷,输入的坐标显示 0
有雷,则显示周围雷的个数
如果输入坐标位置有雷,则被炸死游戏结束~
代码展示:
一共分三个文件。测试文件 test.c 。头文件game.h 。游戏功能文件game.c 。
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //优化 //1.如果不是雷,周围没有雷 -展开一片 -递归 //2.标记雷的位置 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, '*'); //打印一下棋盘 DisplayBoard(show, ROW, COL); //布置雷 SetMine(mine, ROW, COL); //排查雷,查看布置雷的数组mine,展示给用户看的数组show FindMine(mine, show, ROW, COL); } int main() { int input = 0; //设置随机数的时间戳 //返回值类型是longlong,需要强转 srand((unsigned)time(NULL)); do { //选择菜单 menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: //游戏功能 game(); break; case 0: printf("退出游戏~\n"); break; default: printf("输入错误,请重新输入~\n"); break; } //输入0游戏结束,同时退出循环 } while (input); return 0; }
game.h
//#pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> //雷的个数,棋盘大小快捷设置 #define EASY_COUNT 10 //简单模式的雷 #define ROW 9 #define COL 9 #define ROWS ROW+2 //mine数组设置大一圈,方便系统排查雷 #define COLS COL+2 //函数声明 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印棋盘 void DisplayBoard(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);
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //初始化棋盘,直接使用嵌套for循环赋值。 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } //打印棋盘到屏幕上 //嵌套for打印即可 void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("------------扫雷游戏------------\n"); //打印第一行的坐标号 //printf("%d ", 0); for (i = 0; i <= col; i++) { printf("%d ", i); } printf("\n"); //格式好看点 printf(" "); for (i = 1; i <= col; i++) { printf("--"); } printf("\n"); for (i = 1; i <= row; i++) { //打印每一列第一个坐标号 printf("%d|", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char mine[ROWS][COLS], int row, int col) { //布置10个雷 int count = EASY_COUNT; while (count) { //生成随机的下标[1,9] int x = rand() % row + 1; int y = rand() % col + 1; //如果没有雷,就放置雷。 if (mine[x][y] == '0') { mine[x][y] = '1'; count--; //放置一个减一 } } } //计算周围雷的个数 //八个坐标,有雷的位置是1,比0大。 //八个位置都加起来,减八个0,就知道有几个1. //static修饰的函数,只能在本文件中使用 static int get_mine_count(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) { //1.输入排查的坐标 //2.检查坐标处是不是雷 //1)是雷 -游戏结束 //2)不是雷 -统计坐标周围有几个雷 -游戏继续 int x = 0; int y = 0; int win = 0; //排雷一次,win++,直到全部雷别排掉。 while (win<row*col- EASY_COUNT) { printf("请输入要排查的坐标:>"); scanf("%d%d", &x, &y); //判断坐标合法性 if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,您被炸死了\n"); DisplayBoard(mine, row, col); break; } else { //不是雷,统计x,y坐标周围有几个雷 int count = get_mine_count(mine, x, y); //计算周围有几个雷,将数值赋值给show数组,然后输出。 show[x][y] = count + '0'; //显示排查出的信息 DisplayBoard(show, row, col); win++; } } else { printf("您输入的坐标不合法,请重新输入\n"); } } if (win == row * col - EASY_COUNT) { DisplayBoard(mine, row, col); printf("恭喜你排雷成功!\n"); } }
加载全部内容