求帮我编个扫雷的游戏模式

调试模式我编完了,但是编游戏模式我就卡住了。

只用帮我编第一个 gamemode 的function就行了。
编完后应该是这样的。

这个4是输入进去的。

‘()’代表 雷。
‘ 01,02 ’ 是代表周围一圈有几个雷,如果一片空白就是周围没有雷。
‘ ## ’就代表不知道是不是雷。

img

img

编个大概就行。
我编到这里就不会了。

//这个是要创建的游戏界面的function。

void gamemode(int minefield[][SIZE], Point point[]) 
{
    int i = 0;
    while (i < 10)
    {
        int j = 0;
        while (j < 10)
        {
            if (j == 1 || j == 10) {
                printf("-------------------------");
            }
            if (i > 1 && j == 1) {
                printf(" |");
            }
            if (i > 1 && j == 10) {
                printf("| ");
            }
            if (i == 0) {
                printf("0%d",j);
            }
            if (j == 0) {
                printf("0%d",i);
            }
}
//这个是主程序
int main(void)
{
    int minefield[SIZE][SIZE];
    int number;
    printf("Welcome to minesweeper!\n");
    printf("How many mines? ");
    scanf("%d", &number);
 
    Point point[SIZE];
    printf("Enter pairs:\n");
    int i = 0;
    while (number > i)
    {
        scanf("%d%d", &point[i].y, &point[i].x);
        i++;
    }
 
    init_field(minefield, point, number);
 
    printf("Game Started\n");
    print_minefield(minefield);
    int a,b,c,d;
    int r = 0;
    int z = 0;
    while (scanf("%d",&a) != EOF) {
        if ((a == 1 || a == 2) && r >= 3) {
            scanf("%d%d%d",&b,&c,&d);
            printf("Help already used\n");
        } else if (a == 1) {
            scanf("%d%d%d",&b,&c,&d);
            first_is_1(b,c,d,point,number);
            r++;
        } else if (a == 2) {
            scanf("%d%d%d",&b,&c,&d);
            first_is_2(b,c,d,point,number);
            r++;
        }
        if (a == 3) {
            scanf("%d%d",&b,&c);
            first_is_3(b,c,point,number,minefield);
        }
        if (a == 4){
            if (z%2 == 0){
            printf("Gameplay mode activated\n");
            printf(". .\n");
            printf("\/\n");
            gamemode(minefield, point);
        }
            if (z%2 == 1){
              printf("Debug mode activated\n");
              debugmode();
            }
            z++;
            }
        if (a == 1 || a == 2 || (z%2 == 1 && a == 3)) {
            print_minefield(minefield);
        }
    }
 
    return 0;
}

下面是其他代码。

#include <stdio.h>
#include <stdlib.h>
// 格子的定义
#define VISIBLE_SAFE    0
#define HIDDEN_SAFE     1
#define HIDDEN_MINE     2

//地图尺寸
#define SIZE              8

、、下面是其他的function
typedef struct _point
{
    int x;
    int y;
} Point;
void first_is_1(int b,int c,int d,Point point[],int number);
void first_is_2(int b,int c,int d,Point point[],int number);
void first_is_3(int b,int c,Point point[],int number,int minefield[][SIZE]);
void init_field(int minefield[][SIZE], Point point[], int number);
void print_minefield(int minefield[][SIZE]);
void gamemode(int minefield[][SIZE], Point point[]);
void debugmode(int minefield[][SIZE], Point point[]);


void init_field(int minefield[][SIZE], Point point[], int number) 
{
    int i = 0;
    while (i < SIZE)
    {
        int j = 0;
        while (j < SIZE)
        {
            minefield[i][j] = HIDDEN_SAFE;
            j++;
        }
        i++;
    }
    i = 0;
    while (i < number)
    {
        if (point[i].y < SIZE && point[i].x < SIZE && point[i].x >= 0 && point[i].y >= 0) {
            minefield[point[i].y][point[i].x] = HIDDEN_MINE;}
            i++;
    }

}
 
void print_minefield(int minefield[][SIZE])
{
    int i = 0;
    while (i < SIZE)
    {
        int j = 0;
        while (j < SIZE)
        {
            printf("%d ", minefield[i][j]);
            j++;
        }
            i++;
        printf("\n");
    }
}
 

使用gamemode_print函数输出,修改的地方比较多,你对照看一下。

img

//这个是主程序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 格子的定义
#define VISIBLE_SAFE 0
#define HIDDEN_SAFE 1
#define HIDDEN_MINE 2

//地图尺寸
#define SIZE 8

//下面是其他的function
typedef struct _point
{
    int x;
    int y;
} Point;

void first_is_1(int b, int c, int d, Point point[], int number);
void first_is_2(int b, int c, int d, Point point[], int number);
void first_is_3(int b, int c, Point point[], int number, int minefield[][SIZE]);
void init_field(int minefield[][SIZE], Point point[], int number);
void print_minefield(int minefield[][SIZE]);
void gamemode(int minefield[][SIZE], Point point[]);
void debugmode(int minefield[][SIZE], Point point[]);
void gamemode_print(int minefield[][SIZE]); //输出游戏界面

void init_field(int minefield[][SIZE], Point point[], int number)
{
    int i = 0;
    while (i < SIZE)
    {
        int j = 0;
        while (j < SIZE)
        {
            minefield[i][j] = HIDDEN_SAFE;
            j++;
        }
        i++;
    }
    i = 0;
    while (i < number)
    {
        //if (point[i].y < SIZE && point[i].x < SIZE && point[i].x >= 0 && point[i].y >= 0)
        //{
        minefield[point[i].y][point[i].x] = HIDDEN_MINE;
        //}
        i++;
    }
}
void print_minefield(int minefield[][SIZE])
{
    int i = 0;
    while (i < SIZE)
    {
        int j = 0;
        while (j < SIZE)
        {
            printf("%2d ", minefield[i][j]);
            j++;
        }
        i++;
        printf("\n");
    }
}

//随机生成num个雷,重复则重新生成
void init_mine(Point *p, int num)
{
    srand((unsigned int)time(NULL));
    int j, i = 0, isHave = 0;
    while (i < num)
    {
        (p + i)->x = rand() % SIZE;
        (p + i)->y = rand() % SIZE;
        isHave = j = 0;
        while (j < i)
        {
            if ((p + i)->x == (p + j)->x && (p + i)->y == (p + j)->x)
            {
                isHave = 1;
                break;
            }
            j++;
        }
        if (!isHave)
        {
            i++;
        }
    }
}

int main(void)
{
    int minefield[SIZE][SIZE];
    int number;
    printf("Welcome to minesweeper!\n");
    printf("How many mines? ");
    scanf("%d", &number);
    //根据输入动态生成数组
    Point *point = (Point *)calloc(number, sizeof(Point)); //Point point[SIZE];
    if (point == NULL)
    {
        printf("memory wrong!\n");
        return -1;
    }
    /*
    printf("Enter pairs:\n");
    int i = 0;
    while (number > i)
    {

        scanf("%d%d", &point[i].y, &point[i].x);
        i++;
    }
    */
    init_mine(point, number);

    init_field(minefield, point, number);

    printf("Game Started\n");
    print_minefield(minefield);

    int a, b, c, d;
    int r = 0;
    int z = 0;
    while (scanf("%d", &a) != EOF)
    {
        if ((a == 1 || a == 2) && r >= 3)
        {
            scanf("%d%d%d", &b, &c, &d);
            printf("Help already used\n");
        }
        else if (a == 1)
        {
            scanf("%d%d%d", &b, &c, &d);
            //first_is_1(b, c, d, point, number);
            r++;
        }
        else if (a == 2)
        {
            scanf("%d%d%d", &b, &c, &d);
            //first_is_2(b, c, d, point, number);
            r++;
        }
        if (a == 3)
        {
            scanf("%d%d", &b, &c);
            //first_is_3(b, c, point, number, minefield);
        }
        if (a == 4)
        {
            if (z % 2 == 0)
            {
                printf("Gameplay mode activated\n");
                printf(". .\n");
                printf("\\/\n");
                gamemode_print(minefield);
                //gamemode(minefield, point);
            }
            if (z % 2 == 1)
            {
                printf("Debug mode activated\n");
                //debugmode();
            }
            z++;
        }
        if (a == 1 || a == 2 || (z % 2 == 1 && a == 3))
        {
            print_minefield(minefield);
        }
    }
    return 0;
}

void gamemode(int minefield[][SIZE], Point point[])
{

    printf("\ninput x,y:\n");
    printf("\n");
    gamemode_print(minefield);
}

enum mineStatu //用来表示当前位置的状态
{
    SAFE = 0,
    VIEW = -1,
    MINE = -2
};

inline int getxyMine(int mineStatu)
{
    return mineStatu == HIDDEN_MINE ? 1 : 0;
}

//返回i,j坐标处周围有几个雷
int getstatus(int mine[][SIZE], int i, int j)
{
    int sum = 0;
    if (mine[i][j] == HIDDEN_MINE)
        return MINE;
    if (i == 0)//处理四角的特殊情况
    {
        if (j == 0)
        {
            sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j + 1]) + getxyMine(mine[i][j + 1]);
        }
        else if (j == SIZE - 1)
        {
            sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i][j - 1]);
        }
        else
        {
            sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i + 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]);
        }
    }
    else if (i == SIZE - 1)
    {
        if (j == 0)
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]);
        }
        else if (j == SIZE - 1)
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i][j - 1]);
        }
        else
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]);
        }
    }
    else
    {
        if (j == 0)
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j + 1]);
        }
        else if (j == SIZE - 1)
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i][j - 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]);
        }
        else
        {
            sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i + 1][j + 1]);
        }
    }

    return sum;
}

//这个是要创建的游戏界面的function。
void gamemode_print(int minefield[][SIZE])
{
    int i, j, s;
    printf("    ");
    for (j = 0; j < SIZE; j++)
    {
        printf("%02d ", j);
    }
    printf("\n    -----------------------\n");

    for (i = 0; i < SIZE; i++)
    {
        printf("%02d |", i);
        for (j = 0; j < SIZE; j++)
        {
            s = getstatus(minefield, i, j);
            if (s == MINE)
                printf("%s ", "()");
            else if (s == SAFE)
                printf("%s ", "##");
            else
                printf("%02d ", s);
        }

        printf("|\n");
    }
    printf("    -----------------------\n");
}

真的谢谢你了