我用两个数组来表示,一个数组面相玩家,另外一个数组记录雷的位置,玩具操作里数组,输入坐标然后便利坐标周围8个坐标,将雷(数字1)的数量显示在外数组,过程中,因为记录输入坐标周围雷数量的变量add是int型,而外数组是chart型,不能用add直接替换外数组中的元素,故我了解到了sprintf函数,可以将int型转化为chart型,现在判断胜利条件还是有问题,不过还是收货颇多,更理解数组的概念,c语言函数的声明和引用等等
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 10
#define COL 10
//计算雷
char num (char board[ROW][COL], int x, int y) {
int a = 0;
if(board[x - 1][y - 1]=='1')
a++;
if(board[x][y - 1]=='1')
a++;
if(board[x + 1][y - 1]=='1')
a++;
if(board[x + 1][y]=='1')
a++;
if(board[x + 1][y + 1]=='1')
a++;
if(board[x][y + 1]=='1')
a++;
if(board[x - 1][y + 1]=='1')
a++;
if(board[x - 1][y]=='1')
a++;
char add =a;
return add;
}
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col, char set) {
int i = 0;
int j = 0;
for (i = 0; i <= row; i++) {
for (j = 0; j <= col; j++) {
board[i][j]=set;
}
}
}
//打印棋盘
void DisPlay(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i =1 ; i < row; i++) {
for (j = 1; j < col; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//判断是否踩到雷
int FindMa(char board[ROW][COL], int row, int col, int x, int y) {
int add;
if (board[x][y] == '1') {
return 0;
}
return 1;
}
//遍历看是否排查完
int over(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 1; i < row; i++) {
for (j = 1; j < col; j++) {
if (board[i][j] == '0') {
return 1;
break;
}
}
}
return 0;
}
//布置雷
void SetMa(char board[ROW][COL], int row, int col) {
int count = 10;
while (count) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '1') {
continue;
}
if (board[x][y] == '0') {
board[x][y] = '1';
count--;
}
}
}
void game () {
int add;
int bdd;
int x;
int y;
char mine[ROW][COL] = {0};
char show[ROW][COL] = {0};
InitBoard(mine, ROW, COL, '0');
InitBoard(show, ROW, COL, '*');
SetMa(mine, ROW, COL);
DisPlay(show,ROW,COL);
while(1){
int bdd = over(mine,ROW,COL);
if(bdd==0){
printf("游戏胜利\n\a");
}
else{
printf("输入坐标\n\a");
scanf("%d",&x);
scanf("%d",&y);
if(x>=1&&x<=ROW&&y>=1&&y<=COL){
add=FindMa(mine,ROW,COL,x,y);
if(add==0){
printf("你被炸死了\n");
DisPlay(mine,ROW,COL);
break;
}
else{
char str[1];
add=num(mine,x,y);
sprintf(str,"%d",add);//将add转化为字符型替换show数组中的位置
show[x][y]=str[0];
DisPlay(show,ROW,COL);
continue;
}
}
else{
printf("输入坐标错误");
break;
}
}
}
}
void menu() { //菜单
printf("___________________\n");
printf("______1 play_______\n");
printf("______0 exit_______\n");
printf("___________________\n");
}
void test() { //开始逻辑
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input) {
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("再见\n");
break;
default:
printf("选择有误,重新选择\n");
break;
}
} while (input != 0);
}
int main () {
test();
}