一、扫雷游戏分析
1、游戏界面
初始界面 排查雷界面 排雷失败
2.游戏分析
< 1 > 棋盘设计
扫雷游戏,我们需要在9*9(或者更多)的棋盘上去布置雷和排查雷,所布置的雷与排查雷的信息都需要进行记录,所以用两个二维数组来记录这些信息;如用mine数组来记录布置的雷的信息---‘0’代表不是雷,‘1’代表是雷;用show数组来记录所排查的雷的信息,刚开始,用‘*’来展示,由于会排查边缘是否为雷,并统计周围8个位置雷的信息,所以就把数组大小设置成11*11;
mine(雷)
show(排查雷)
<2> 布置雷的信息
布置雷其实就是生成一个或多个随机的坐标,将这些坐标的位置布置成雷,用代码实现就是将mine这个数组数组中生产随机坐标处的值改为‘1’;
rand函数:这里就要用到随机生成数字rand函数
rand函数头文件<stdlib.h>;
rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。使用rand生成0--9的随机数:
int x; x = rand() % 9;
srand()用来设置rand()产生随机数时的随机数种子。为了让rand每次生成的随机数不相同,就需要用到srand,srand((unsigned int)time(NULL));
srand((unsigned int)time(NULL)); int x; x = rand() % 9 ;
此时就会用到time函数,头文件<time.h>;
布置雷的过程中还需注意:本次所生成的随机坐标处是不是‘1’,可以增加一处判断。
<3>排查雷的信息
排查雷,即输入一个坐标,判断此处是不是雷;如果是,则游戏结束;如果不是,则游戏继续,并输出该坐标周围8个位置雷的个数。
因为游戏需要重复输入,可以用while循环来编写代码
判断: 首先,要判断输入的坐标合不合理,如果合理才继续进行(不合理则重新输入)
根据输入的坐标,判断mine数组中这个坐标处是不是‘1’,是‘1’则游戏结束;
如果不是‘1’,就要统计这个坐标周围8个位置雷的个数,这里写一个函数COUNT_Mine来实现;
COUNT_Mine函数:
show数组是一个字符数组,这里就要用到字符‘0’转化为0:只需‘0’-0即可;
统计完成数目后在转换为字符存入数组show中,+‘0’即可;
统计坐标周围8个位置的雷的个数
根据图析,可以看出周围8个坐标的规律,因为‘1’代表雷,‘0’不是雷;所以,只用将周围8个位置的值相加,并减去8*‘0’即可。
(当然,也可以使用循环去解决,代码如下:)
int i = 0; int sum = 0; for (i = -1; i <= 1; i++) { int j = 0; for (j = -1; j <= 1; j++) { sum += mine[i][j] - '0'; } }
二、游戏代码实现
1、game.h
#pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #define MINE 10 #define LINE 9 //行 #define ROW 9 //列 #define LINES LINE+2 #define ROWS ROW+2 //初始化 void csh(char arr[LINE][ROWS], int line, int row, char set); //输出 void Printf(char arr[LINE][ROWS], int line, int row); //布置雷 void set_Mine(char arr[LINES][ROWS], int line, int row); //查找雷 void find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS] , int line, int row);
2、game.c
#include "game.h" //初始化 void csh(char arr[LINE][ROWS], int lines, int rows, char set) { int i = 0; for (i = 0; i < lines; i++) { int j = 0; for (j = 0; j < rows; j++) { arr[i][j] = set; } } } //输出 void Printf(char arr[LINE][ROWS], int line, int row) { int i = 0; printf("-----扫雷游戏-----\n"); for (i = 0; i <=row; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= line; i++) { printf("%d ", i); int j = 0; for (j = 1; j <= row; j++) { printf("%c ", arr[i][j]); } printf("\n"); } } //布置雷 void set_Mine(char arr[LINES][ROWS], int line, int row) { int count = MINE; int x = 0; int y = 0; while (count) { x = rand() % line + 1; y = rand() % row + 1; if (arr[x][y] != '1') { arr[x][y] = '1'; count--; } } } //查找雷 int COUNT(char mine[LINES][ROWS], int x, int y) { /*int i = 0; int sum = 0; for (i = -1; i <= 1; i++) { int j = 0; for (j = -1; j <= 1; j++) { sum += mine[i][j] - '0'; } } return sum;*/ 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 find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS], int line, int row) { int x, y; int times = 0; while (times<LINE*ROW - MINE) { printf("输入要查找的坐标\n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (mine[x][y] == '1') { printf("game over !\n 菜!就多练!!!\n"); Printf(mine, LINE, ROW); break; } else { show[x][y] = COUNT(mine, x, y)+'0'; times++; Printf(show, LINE, ROW); } } else { printf("输入错误,重新输入\n"); } } if (times == LINE * ROW - MINE) { printf("恭喜 ,geme win!\n"); } }
3、test.c
#include "game.h" void test() { printf("*****************************\n"); printf("***********1. 开始***********\n"); printf("***********0. 结束***********\n"); printf("*****************************\n"); printf("---请选择---\n"); int a; char mine[LINES][ROWS] = { '0' }; char show[LINES][ROWS] = { '*' }; srand((unsigned int)time(NULL)); do { scanf("%d", &a); switch (a) { case 1: //初始化 csh(mine, LINES, ROWS, '0'); csh(show, LINES, ROWS, '*'); //输出 //Printf(mine, LINE, ROW); Printf(show, LINE, ROW); //随机生成雷 set_Mine(mine, LINE, ROW); //Printf(mine, LINE, ROW); //查找雷 find_Mine(mine, show, LINE, ROW); break; case 0: printf("game over"); break; default: printf("输入错误 重新输入\n"); break; } } while (a); } int main() { test(); return 0; }
三、扫雷游戏进阶
扩展:选择挑战难度9*9/20*20等;
如果排查位置周围不是雷,显示一片区域;
等等