声明:本文章为本人学习感悟等,如有谬误,请指正,不胜感激。
0 作为非雷,1作为雷
棋盘9*9 (实际上你需要11*11的,因为位于边框的格子进行附近位置的雷扫描时需要)
玩家看到的 9*9 的棋盘,未选中的地方是 * 字符
需要:俩棋盘,一个存储0 和 1 ;一个给玩家看(展示是否踩雷,以及没踩雷时该位置周围八格有多少雷
使用:char类型的2维数组(方便数字和符号共存,即’0’和’*’)
需要写的函数:
1.初始化俩二维数组;mine初始化先全为’0’,show初始化全为’*’
2.随机埋下雷,雷的个数自己决定
3.打印棋盘
4.玩家输入坐标,如果没踩到雷,显示该坐标周围八格里面有几颗雷
初步思考时不明白的地方:
- 如何随机生成位置
- 除了暴力探测周围八格的方法外,是否有更好的方法进行探测
学习得知:
- (1)用rand和srand进行伪随机
最简单的方法就是利用系统时间了(几乎所有的人都这么做),因为时间的数值随时间变化而变化,运行两次,一般不会出现前一次和后一次相同的局面,time(NULL)会返回一个表示当前系统时间的整数(它在time.h中
- 可能有人知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。我们可以自己编一个在·
- 还是暴力好
- 通过坐标的加减,探测选中坐标周围八格是否有雷
- 把坐标周围格子里的数字加起来,得到几就是几个雷
Tips:可以用循环,也可以单纯暴力的加上周围的八个数字
game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9 //要改扫雷游戏大小,只需要改ROW COL就可以了 (方便更改)
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINENUM 20
void initialization(char show[ROWS][COLS]);
void plantingbombs(char mine[ROWS][COLS]);
void showmap(char show[ROWS][COLS]);
int detectbombs(char mine[ROWS][COLS], int x, int y);
game.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("---------------\n");
printf("---开始游戏----\n");
printf("---游玩请按1---\n");
printf("---退出请按2---\n");
printf("---------------\n");
}
void initialization(char show[ROWS][COLS],char mine[ROWS][COLS]) //初始化show数组
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
show[i][j] = '*';
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
mine[i][j] = '0';
}
}
}
void plantingbombs(char mine[ROWS][COLS]) //放置炸弹
{
srand((unsigned int)time(0));
int count = MINENUM;
while (count)
{
int i = rand() % 10;
int j = rand() % 10;
if (i>=1&&i<=ROW&&j>=1&&j<=COL)
if (mine[i][j] == '0') //防止在同一位置布置雷
{
mine[i][j] = '1';
}
else
mine[i][j] = '0';
count--;
}
}
void showmap(char show[ROWS][COLS]) //显示局面
{
printf("-----MINESWEEPER-----\n");
for (int o = 0; o < ROWS-1; o++)
{
printf("%d ", o);
}
printf("\n");
for (int i = 1; i <= ROW; i++)
{
printf("%d ", i);
for (int j = 1; j <= COL; j++)
{
printf("%c ", show[i][j]);
}
printf("\n");
}
}
int detectbombs(char mine[ROWS][COLS], int x, int y) //检测玩家选中位置周围八格炸弹数
{
int counter = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
counter +=( mine[i][j] - '0'); //'1'-'0'=1 字符1减去字符0 得到数字1
}
}
return counter;
}
void game()
{
//用char 数组的原因: 方便存储‘0’和‘*’
char mine[ROWS][COLS] = { 0 }; //实际上存储雷区与非雷区的二维数组
char show[ROWS][COLS] = { 0 }; //给玩家看的二维数组
int countee = MINENUM;
initialization(show,mine);
plantingbombs(mine);
//showmap(mine); 测试用
showmap(show);
while (countee)
{
int x = 0;
int y = 0;
int won = (ROW*COL) - MINENUM;
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);
if (mine[x][y] == '1')
{
printf("game over ,you lost\n");
break;
}
if (mine[x][y] != '1')
{
int a = detectbombs(mine, x, y);
show[x][y] = (a+'0');
showmap(show);
won--;
}
if (won == 0)
{
printf("congratulations!\n");
break;
}
}
}
start.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu();
void game();
void initialization(char show[ROWS][COLS]);
void plantingbombs(char mine[ROWS][COLS]);
void showmap(char show[ROWS][COLS]);
int detectbombs(char mine[ROWS][COLS], int x, int y);
int main()
{
menu();
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
break;
}
system("pause");
return 0;
}