m0_59696689 2021-07-11 16:09 采纳率: 70.6%
浏览 181
已结题

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

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

只用帮我编第一个 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");
    }
}
 
  • 写回答

2条回答 默认 最新

  • 浪客 2021-07-12 01:14
    关注

    使用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");
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月12日
  • 已采纳回答 7月12日
  • 创建了问题 7月11日

悬赏问题

  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 正弦信号发生器串并联电路电阻无法保持同步怎么办
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)