扫雷小游戏在C语言数组学习完成后就可以去进行编写了.
首先就是 创建一个二维数组来表示地图.
每一个格子要表示的信息:
1.未翻开的状态(草地),已翻开状态(数字).
2.该格子是地雷或者不是地雷.(#表示是地雷,0表示不是)
使用两个二维数组来分别表示以上的两组状态.
第一个二维数组,
char showMap[9][9];表示每个格子的翻开和未翻开的状态.
*表示未翻开, 字符’0’-'8’表示已翻开的数字.
第二个二位数字.
char mineMap;表示每个格子是否是地雷.
'#'表示是地雷,'0’表示不是地雷
游戏流程:
1.创建地图 并 初始化~
针对showMap 来说,初始化成全是*.
针对mineMap 来说,先把整个数组都初始化成全’0’,随机生成10个位置,作为地雷,设为’1’.
2.打印地图. 只打印showMap
3.让玩家输入坐标,表示要翻开的位置.
4.判定是否踩雷.
5.更新showMap,在翻开位置显示周围有多少个地雷.
6.判定玩家是否翻开了所有的位置~
(2-6进行循环)
(在我们编写代码前一定要先理解清楚需求~)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]){
//mem => memory 内存
//set:设置,集合
//memset的功能就是把一段内存上的每个字节都设置成一个具体的值
//二维数组的每个元素都是在一个连续的内存空间上布局的
memset(showMap,'*',MAX_ROW * MAX_COL);
memset(mineMap,'0',MAX_ROW * MAX_COL);
//设置随机种子
srand((unsigned int)time(0));
//随机产生十个位置作为地雷.
int mineCount = 0;
while(mineCount < MINE_COUNT){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if(mineMap[row][col] == '#'){
continue;
}
mineMap[row][col] = '#';
mineCount++;
}
}
//用着一个函数同事具备打印两种地图的功能
//取决于实参填什么
void print(char theMap[MAX_ROW][MAX_COL]){
for(int row = 0; row < MAX_ROW ;row++){
for(int col = 0; col < MAX_COL;col++){
printf("%c ",theMap[row][col]);
}
printf("\n");
}
}
void update(char showMap[MAX_ROW][MAX_COL],char mineMap[MAX_ROW][MAX_COL],
int row,int col){
// 表示周围地雷个数
int count = 0;
for(int r = row - 1; r <= row + 1;r++){
for(int c = col - 1; c<= col + 1;c++){
if(r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL){
//此时r,c坐标超出棋盘范围,直接跳出
continue;
}
if(r == row && c == col){
// 中间位置 不需要判断,直接下次循环
continue;
}
if(mineMap[r][c] == '#'){
count++;
}
}
}
//如果直接赋值的话,此时假设count是2,
//当前row col未知的元素就被设置成了ASCII 值为2的字符
//而不是'2'
//类似于这样的转换,只是c中这么写
showMap[row][col] = '0' + count;
}
int main(){
//1.创建地图并初始化
char showMap[MAX_ROW][MAX_COL] = { 0 };
char mineMap[MAX_ROW][MAX_COL] = { 0 };
init(showMap,mineMap);
int openedCount = 0;
while(1){
system("cls");
//2.打印地图
print(showMap);
//3.玩家输入坐标
int row = 0;
int col = 0;
printf("请输入坐标(row col):");
scanf("%d %d",&row,&col);
//进行合法性判定
if(row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
printf("您的输入有误!请重新输入!\n");
Sleep(1000);
continue;
}
if(showMap[row][col] != '*'){
printf("您输入的位置上已经翻开了! 请重新输入!\n");
Sleep(1000);
continue;
}
// 4.判定是否踩雷
if(mineMap[row][col] == '#'){
printf("您踩雷了!!游戏结束!!\n");
printf("地雷分布图:");
print(mineMap);
break;
}
//5.更新showMap ,显示当前位置 周围有多少雷
update(showMap,mineMap,row,col);
openedCount++;
//6.进行游戏胜利的判定,统计当前一共翻开了多少个格子
if(openedCount == MAX_ROW * MAX_COL - MINE_COUNT){
printf("恭喜你 获胜了!\n");
}
}
return 0;
}
谈到每个类型占几个字节,需加上一个前提:
在32位windos系统下~
char ,short 一般没有争议~
long 32位windows下 4, 64位windows 4, 64位linux 8
int 32位windows下 4, 64位windows 4, 64位linux 4. 16位系统下 2.
没有争议的还有 float 4 douoble 8