Залейте игру, вылетите после некоторых попыток - PullRequest
0 голосов
/ 19 мая 2018

Задача состоит в том, чтобы создать игру с флудом в игре 20х60, начиная с верхнего левого угла.Числа используются вместо цветов для простоты.Таким образом, код работает нормально до одной точки.Но после определенного количества раундов игрок играет, а затем просто вылетает («... перестало работать») сообщение.Вот код:

#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 голосов
/ 19 мая 2018

В вашей функции Change нет проверки границ.

Когда k = 0 и l = 0 это условие (в строке 50) if(A[k-1][l]==y){ обращается к A[-1][0], который находится вне выделенной памяти.

Таким образом вы можете проверить недопустимые значения k и l.(Я не совсем уверен, что ваш код работает правильно, но он больше не падает при следующих изменениях.)

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 за предложение проверки границ для правой и нижней границ.

...