泛滥它游戏,经过一些尝试后崩溃

时间:2018-05-19 08:42:07

标签: c flood-fill

任务是在20x60游戏中创建一个泛洪游戏,从左上角开始。为方便起见,使用数字代替颜色。 因此,代码似乎可以正常工作到一点。 但经过一定数量的回合后,玩家会玩,然后它就会崩溃(“......停止工作”)消息。 这是代码:

#include <stdio.h>
#include <stdlib.h>
int k=0,l=0;
void BoardMaking(int A[20][60]){
    int i,j;

    srand(time(0));
    for(i=0;i<20;i++){
        for(j=0;j<60;j++){
            A[i][j]=rand()%5 +1;    
        }
    }

}

void Print_Board(int A[20][60]){
    int i,j;
    for(i=0;i<20;i++){
        for(j=0;j<60;j++){
            printf("%d",A[i][j]);

        }
        printf("\n");
    }   

}

int Player(){
    int x;
    printf("\ngive a number between 1-5\n");
    scanf("%d",&x);  

    return x;
}

void Change(int A[20][60],int y,int x){
    A[k][l]=x;
    if(A[k][l+1]==y){
        A[k][l+1]=x;
        l++;
        Change(A,y,x);
    }
    if(A[k][l-1]==y){
        A[k][l-1]=x;
        l--;
        Change(A,y,x);
    }
    if(A[k-1][l]==y){
        A[k-1][l]=x;
        k--;
        Change(A,y,x);
    }
    if(A[k+1][l]==y){
        A[k+1][l]=x;
        k++;
        Change(A,y,x);
    }

    k=0;l=0;
}

int main(){
    int y,x;

    int A[20][60];
    BoardMaking(A);
    while(1){

        Print_Board(A);
        x=Player();
        if (x==A[0][0]){
            printf("give another number \n");
        }
        else if (x!=A[0][0])
        {
        y=A[0][0];
        Change(A,y,x);  
        }


    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

Change功能中没有绑定检查。

k = 0l = 0此条件(第50行)if(A[k-1][l]==y){访问超出已分配内存的A[-1][0]时。

这是检查kl的非法值的方法。 (我不完全确定您的代码是否正常工作,但不会因以下更改而崩溃。)

void Change(int A[20][60],int y,int x){ 
    A[k][l]=x;
    if(l < 59 && A[k][l+1]==y){
        A[k][l+1]=x;
        l++;
        Change(A,y,x);
    }   
    if(l > 0 && A[k][l-1]==y){
        A[k][l-1]=x;
        l--;
        Change(A,y,x);
    }   
    if(k > 0 && A[k-1][l]==y){
        A[k-1][l]=x;
        k--;
        Change(A,y,x);
    }    
    if(k < 19 && A[k+1][l]==y){
        A[k+1][l]=x;
        k++;
        Change(A,y,x);
    }   

    k=0;l=0;
}

谢谢@RuudHelderman建议绑定检查右边界和底边界。