Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中带递归函数的扫雷舰问题_C_Recursion_Minesweeper - Fatal编程技术网

C语言中带递归函数的扫雷舰问题

C语言中带递归函数的扫雷舰问题,c,recursion,minesweeper,C,Recursion,Minesweeper,我试图用C语言为编程类创建一个终端版本的扫雷游戏。我只是完成了项目的一部分,遇到了一个似乎无法解决的问题。我试图创建一个函数,当一个位置出现时,它会发现这个正方形,然后递归地调用它自己来发现任何不包含地雷的相邻正方形。这个功能似乎很有效,只是有时会隐藏一个没有地雷包围的广场 这是一个问题的例子,在这种情况下,似乎只有当地雷数量非常少时才会出现问题4: 这是我的源代码,如果不是最好的,请原谅,我只是在学习C // // main.c // Minesweeper // // #incl

我试图用C语言为编程类创建一个终端版本的扫雷游戏。我只是完成了项目的一部分,遇到了一个似乎无法解决的问题。我试图创建一个函数,当一个位置出现时,它会发现这个正方形,然后递归地调用它自己来发现任何不包含地雷的相邻正方形。这个功能似乎很有效,只是有时会隐藏一个没有地雷包围的广场

这是一个问题的例子,在这种情况下,似乎只有当地雷数量非常少时才会出现问题4:

这是我的源代码,如果不是最好的,请原谅,我只是在学习C

//
//  main.c
//  Minesweeper
//
//  

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "game.h"
#include "io.h"

int X=20;
int Y=20;
int M=4;

int main(int argc,char **argv)
{
    time_t t;
    srand((unsigned) time(&t));

    int **intboard = allocateBoard(X,Y,M); // initalizes board X by Y and randomly places M mines.

    numberBoard(intboard, X, Y); // assigns numbers of mines around each square.

    char **charboard = allocateVisableBoard(X,Y); // allocates a board which keeps track of what is visable and what is not. '-' = not visible ' ' = visable

    display(intboard, charboard, X, Y); // function which displays values that are visable

    system("clear");

    int **checkboard = initCheckboard(X,Y); // board which is used by reveal function so it knows which squares have already been checked

    int status = reveal(intboard, charboard,checkboard, X, Y, 5, 5,0); // reveals the value at 5,5 and recursively reveals squares as necessary

    display(intboard, charboard, X, Y);

    if (status == 1) //displays loosing screen if mine is chosen
        boom();

    if ( 1 == endofgame(intboard, charboard, X, Y))
        printf("you win!");

    return 0;
}

//
//game.c
//Minesweeper
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "game.h"

#define MVALUE -1 //minevalue
#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KYEL  "\x1B[33m"
#define KBLU  "\x1B[34m"
#define KMAG  "\x1B[35m"
#define KCYN  "\x1B[36m"
#define KWHT  "\x1B[37m"
#define BOARD  "\x1B[37;44m"
#define RESET   "\033[0m"

int **allocateBoard(int X, int Y, int M) /* Allocates board X by Y with M mines  */
{
    /* Check if allocation succeeded. (check for NULL pointer) */
    int i,j,x,y,**board;

    board = malloc(X*sizeof(int *));
    for(i = 0 ; i < X ; i++)
        board[i] = malloc(Y*sizeof(int));

    /*int modulo = (X*Y)/(double) M;    

    printf("modulo: %d\n", modulo);
    */

   for(i = 0 ; i < X ; i++)
        for(j = 0 ; j < Y ; j++)
            board[i][j] = 0;

    int r = (rand() % (X*Y));
    for(i = 0; i < M;)
    {
        y = r/Y;
        x = r %X;
        if(board[x][y] == 0)
        {
            board[x][y] = MVALUE;
            i++;
        }

        r =rand() % (X*Y);
    }
    return board;
}

int adjacentMines(int **board,int X, int Y, int x, int y)
{
    int count = 0;
    if(x < X-1)
        if(board[y][x+1]== MVALUE)
            count++;
    if(x > 0)
        if(board[y][x-1] == MVALUE)
            count++;
    if(y < Y-1)
        if(board[y+1][x]== MVALUE)
            count++;
    if(y > 0)
        if(board[y-1][x]== MVALUE)
            count++;
    if(x < X-1 && y < Y-1)
        if(board[y+1][x+1]== MVALUE)
            count++;
    if(x > 0 && y < Y-1)
        if(board[y+1][x-1]== MVALUE)
            count++;
    if(x < X-1 && y > 0)
        if(board[y-1][x+1]== MVALUE)
            count++;
    if(x > 0 && y > 0)
        if(board[y-1][x-1]== MVALUE)
            count++;

    // TESTING CODE
    /*
    printf("x:%d y:%d mines adjacent:%d\n",x,y,count);    
    */
    return count;
}

void printIntBoard(int **board,int X,int Y)
{
    int i,j;
    system("clear");
    printf("       ");
    for(i=0; i < X; i++)
        printf("[%.3d] ",i);
    printf("\n\n ");

    for(i=0;i < Y; i++)
    {
        printf("[%.3d] ",i);

        for(j=0; j < X; j++)
        {
            if(board[i][j] == -1)
            {
                printf("  *  ");
            }
            else
                printf("  %d  ",board[i][j]);
                printf(" ");
        }
        printf("\n\n ");

    }
}

void printCharBoard(char **board,int X,int Y)
{
    int i,j;

    printf("       ");

    for(i = 0; i < X; i++)
        printf("[%.3d] ",i);

    printf("\n\n ");

    for(i=0;i < Y; i++)
    {
        printf("[%.3d] ",i);

        for(j = 0; j < X; j++)
        {
            printf("  %c  ",board[i][j]);
            printf(" ");
        }
        printf("\n\n ");

    }
}

void numberBoard(int **board,int X, int Y)
{
    int i,j;
    for (i = 0; i < X; i++) {
        for (j = 0; j < Y ; j++)
        {
            if(board[j][i]!= -1)
                board[j][i]=adjacentMines(board, X, Y, i, j);
        }
    }
}

char **allocateVisableBoard(int X, int Y) /* Allocates Visable board X by Y completely hidden */
{
    int i,j;
    char **board;

    board = malloc(X*sizeof(char *));
    for(i = 0 ; i < X ; i++)
        board[i] = malloc(Y*sizeof(char));

    for(i = 0 ; i < X ; i++)
        for(j = 0 ; j < Y ; j++)
            board[i][j] = '-';

    return board;
}

void showBoard(int **iboard, char **cboard,int X, int Y)
{
    int i,j;

    for(i = 0; i < X; i++)
        {
            for (j=0; j<Y; j++) {
                printf("  %c  ",cboard[j][i]);
            }
            printf("\n");
        }
}

int **initCheckboard(int X,int Y)
{
    int i,j, **checkboard;

    checkboard = malloc(X *sizeof(int *));
    for (i = 0; i < X; i++) {
        checkboard[i]= malloc(Y *sizeof(int));
    }

    for(i = 0 ; i < X ; i++)
        for(j = 0 ; j < Y ; j++)
            checkboard[i][j] = 0;

    return checkboard;
}


int reveal(int **iboard,char **cboard,int **checkboard, int X, int Y, int x, int y,int count)
{
    if(count == 0 && iboard[x][y]== MVALUE)
    {
        cboard[x][y] = ' ';
        checkboard[x][y] = 1;
        return 1;
    }


    if (iboard[y][x] > 0)
    {
        cboard[y][x] = ' ';
        checkboard[y][x] = 1;
        return 0;
    }

    else if(iboard[y][x] == 0)
    {
        checkboard[y][x] = 1;
        count ++;

        if(x < X-1 && checkboard[y][x+1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y][x+1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x+1, y,count);
        }
        if(y < Y-1 && checkboard[y+1][x] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y+1][x] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x, y+1,count);
        }
        if(x > 0 && checkboard[y][x-1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y][x-1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x-1, y,count);
        }
        if(y > 0 && checkboard[y-1][x] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y-1][x] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x, y-1,count);
        }
        if(x < X-1 && y < Y-1 && checkboard[y+1][x+1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y+1][x+1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x+1, y+1,count);
        }
        if(x < X-1 && y > 0 && checkboard[y-1][x+1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y-1][x+1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x+1, y-1,count);
        }
        if(x > 0 && y > 0 && checkboard[y-1][x-1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y-1][x-1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x-1, y-1,count);
        }
        if(x > 0 && y < Y-1 && checkboard[y+1][x-1] == 0)
        {
            cboard[y][x]= ' ';
            checkboard[y+1][x-1] = 1;
            reveal(iboard, cboard, checkboard, X, Y, x-1, y+1,count);
        }

    }
        return 0;
}

int endofgame(int **iboard,char **cboard,int X,int Y)
{
    int i,j;
    int count = 0;

    for (i = 0; i < Y; i++)
    {
        for (j = 0; j < X; j++)
        {
            if(cboard[i][j] == '-')
            {
                if (iboard[i][j] != MVALUE)
                    count++;
            }
        }
    }
    if (count == 0)
        return 1; // win

    else
        return 0; // keep going
}

void resetcheck(int **checkboard,int X, int Y)
{
    int i,j;
    for(i = 0 ; i < X ; i++)
        for(j = 0 ; j < Y ; j++)
            checkboard[i][j] = 0;


}

//
//  io.c
//  Minesweeper
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "game.h"
#include "scanner.h"

void boom(void)
{
    system("clear");
    printf("Boom!");                                                                                                                                                                                                        

}

void display(int **iboard, char **cboard,int X,int Y)
{
    int i,j;

    printf("      ");
    for (i =0 ;i < X; i++)
        printf("[%.3d]",i);

    printf("\n\n");

    for (i = 0; i < Y; i++) {
        printf("[%.3d]",i);
        for (j = 0; j < X; j++) {
            if (cboard[i][j]==' ') {
                if (iboard[i][j] == -1)
                    printf("  *  ");

                //else if(iboard[i][j] == 0)
                //printf("      ");

                else
                    printf("  %d  ",iboard[i][j]);
            }
            else
                printf("  %c  ",cboard[i][j]);
        }
        printf("\n\n");
    }

}

//
//  mine.h
//  Minesweeper
//

extern int **allocateBoard(int X, int Y, int M);
extern int adjacentMines(int **board,int X, int Y, int x, int y);
extern void printIntBoard(int **board,int X,int Y);
extern void numberBoard(int **board,int X, int Y);
extern char **allocateVisableBoard(int X, int Y);
extern void printCharBoard(char **board,int X,int Y);
extern int **initCheckboard(int X,int Y);
extern int reveal(int **iboard,char **cboard,int **checkboard, int X, int Y, int x, int y,int count);
extern int endofgame(int **iboard,char **cboard,int X,int Y);
extern void resetcheck(int **checkboard,int X, int Y);
extern void showBoard(int **iboard, char **cboard,int X, int Y);

//
//  io.h
//  Minesweeper
//

extern void display(int **iboard, char **cboard,int X,int Y);
extern void boom(void);
//
//main.c
//扫雷艇
//
//  
#包括
#包括
#包括
#包括“game.h”
#包括“io.h”
int X=20;
int Y=20;
int M=4;
int main(int argc,字符**argv)
{
时间;
srand((未签名)时间(&t));
int**intboard=allocateBoard(X,Y,M);//按Y初始化板X并随机放置M个地雷。
numberBoard(intboard,X,Y);//指定每个方块周围的地雷数量。
char**charboard=allocateVisableBoard(X,Y);//分配一块跟踪哪些是可见的,哪些是不可见的板。“-”=不可见“”=可见
display(intboard,charboard,X,Y);//显示可见值的函数
系统(“清除”);
int**checkboard=initCheckboard(X,Y);//显示函数使用的板,以便它知道哪些方块已经被检查过
int status=reveal(intboard,charboard,checkboard,X,Y,5,5,0);//显示5,5处的值,并根据需要递归显示正方形
显示器(内板、字符板、X、Y);
if(status==1)//如果选择了我的,则显示松开屏幕
吊杆();
if(1==endofgame(intboard,charboard,X,Y))
printf(“你赢了!”);
返回0;
}
//
//游戏c
//扫雷艇
//
#包括
#包括
#包括
#包括“game.h”
#定义MVALUE-1//minevalue
#定义KNRM“\x1B[0m”
#定义KRED“\x1B[31m”
#定义KGRN“\x1B[32m”
#定义Kyle“\x1B[33m”
#定义KBLU“\x1B[34m”
#定义KMAG“\x1B[35m”
#定义KCYN“\x1B[36m”
#定义KWHT“\x1B[37m”
#定义板“\x1B[37;44m”
#定义重置“\033[0m”
int**分配板(int X,int Y,int M)/*按Y分配板X和M*/
{
/*检查分配是否成功。(检查空指针)*/
int i,j,x,y,**板;
board=malloc(X*sizeof(int*);
对于(i=0;i0)
if(电路板[y][x-1]==M值)
计数++;
if(y0)
if(电路板[y-1][x]==M值)
计数++;
if(x0&&y0)
如果(电路板[y-1][x+1]==M值)
计数++;
如果(x>0&&y>0)
if(电路板[y-1][x-1]==M值)
计数++;
//测试代码
/*
printf(“x:%d y:%d:%d\n”,x,y,计数);
*/
返回计数;
}
无效打印输入板(输入**板,输入X,输入Y)
{
int i,j;
系统(“清除”);
printf(“”);
对于(i=0;i0&&checkbo