前言:
学习很苦,游戏来补,扫雷游戏想必大家都玩过,今天为大家带来一款低配版扫雷游戏
网页版扫雷游戏:http://www.minesweeper.cn/
目录:
一、扫雷游戏规则介绍二、扫雷游戏设计思路1.文件夹创建2.功能说明3.分析设计 三、扫雷游戏的实现(1) test.c(2) game.h(3) game.c(4) 执行结果
一、扫雷游戏规则介绍
扫雷游戏规则很简单,只要排查出所有的雷,即为成功。游戏界面由许多方格组成,而部分方格中存放着地雷。而随着游戏难度的提高,它的方格数量和雷区数量也会随之提升。初级难度一般是9*9的方格,存放10颗雷。
**玩法:**当玩家点击一个方格,他会出现两种结果,要么是被雷炸死,要么他就会出现一个数字,这个数字代表的是他周围雷的个数。如果什么都没有,则周围没有雷。
eg: 这个数字是2,则它的周围就有2个雷
二、扫雷游戏设计思路
1.文件夹创建
首先咱们要创建3个文件夹:
test.c----游戏测试逻辑game.c----游戏中函数的实现game.h----游戏需要的数据类型和函数声明2.功能说明
要在界面上打印“开始游戏”和“退出游戏”;开始游戏后,就要出现游戏界面,咱们打印的是9*9的棋盘,然后布置10个雷;排查雷:如果这个位置不是雷,则要出现周围雷的个数;如果是雷,则结束游戏,当10个雷全部排查完,则游戏结束3.分析设计
扫雷过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要一定的数据结构来存储这些信息。
(1)我们需要创建两个二维i数组,一个存放布置好的雷(“1”为雷,“0”为非雷),一个存放排查出的雷的信息这样可以避免产生混淆和打印上的困难;
(2)因为我们需要99的棋盘,所以数组要打印成1111的,防止越界
三、扫雷游戏的实现
(1) test.c
#define _CRT_SECURE_NO_WARNINGS#include"game.h"void menu(){printf("********************\n");printf("***** 1. play ****\n");printf("***** 0. exit ****\n");printf("********************\n");}void game(){char mine[ROWS][COLS];//存放布置好的雷char show[ROWS][COLS];//存放排查出的雷的信息//初始化棋盘//mine数组最开始全部是‘0’//show数组最开始全都是‘*’InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘//DisplayBoard(mine,ROW,COL);DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine,ROW,COL);//排查雷FindMine(mine, show, ROW, COL);}int main(){int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");}} while (input);return 0;}
(2) 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#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 cols);//布置雷void SetMine(char board[ROWS][COLS], int row, int col);//排查雷void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);;
(3) game.c
#define _CRT_SECURE_NO_WARNINGS#pragma once#include"game.h"void InitBoard(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){int i = 0;printf("-------扫雷游戏-------\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("\n");}void SetMine(char board[ROWS][COLS], int row, int col){//布置10个雷//生成随机坐标,布置雷int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}int GetMineCount(char mine[ROWS][COLS], int x, int y){return (mine[x - 1][y] + mine[x - 1][y - 1] + 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] - 8 * '0');}void FindMine(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 (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{//这个坐标是否被排查if (show[x][y] == '*'){//该位置不是雷,就统计这个坐标周围有几个雷int count = GetMineCount(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}else{printf("该坐标被排查过,请重新排查\n");}}}else{printf("非法坐标,重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}}
(4) 执行结果
总结:
OK啊,今天的扫雷游戏就写到这里了,毕竟是低配版。感觉写得不错的佬们,别忘了留下你们的关注和三连哦!!!大佬们的支持就是博主前进的动力,一起加油呀!!!