Программа внезапно имеет всплеск использования процессора и выглядит как будто она приостановлена - PullRequest
1 голос
/ 25 апреля 2019

Я добавил 2 функции:

int aiCheckScore(char arr[7][7], int inp, int height, Player player)

int aiFindMostRelevant(char arr[7][7], Player player)

Первый делает оценку для данной позиции в массиве 2D. Оценка равна количеству элементов одного вида, которые мы имели бы в ряду (по вертикали, горизонтали или диагонали, и он сохраняет лучший из этих 3), если бы мы добавили один в этой позиции (исключая тот, который мы добавили только сейчас)

Вторая функция проверяет 7 позиций за раз, находит ту, которая имеет лучший результат, и возвращает ее. Я попытался добавить немного случайности и сделать так, чтобы, если 2 позиции имели одинаковый счет, программа выбирала последнюю 30% времени (чтобы не всегда бралась первая).

Без бита, в который я добавляю случайность, код работает просто отлично. Как только я добавляю его, программа останавливается сразу после 12-го вызова первой функции. Кроме того, загрузка ЦП из программы внезапно возрастает и остается на уровне 50% ниже 5%, как это было раньше.

Я модифицировал код, который пару раз создавал случайность, но, похоже, ничего не изменилось. Я даже не могу понять, почему это вызвало бы такую ​​проблему.

Мои 2 функции:

int aiCheckScore(char arr[7][7], int inp, int height, Player player) {

    int i, j;
    int score[4] = { 0 };

    //check horizontal score
    for (i = inp - 1; i >= 0; i--) {        //everything left
        if (arr[height][i] != player.symb)
            break;

        ++score[0];
    }
    for (i = inp + 1; i <= 6; i) {          //everything right
        if (arr[height][i] != player.symb)
            break;

        ++score[0];
    }

    //check vertical score (we only have to check down)
    for (i = height + 1; i <= 6; i++) {
        if (arr[i][inp] != player.symb)
            break;

        ++score[1];
    }

    //check diagonal (which starts left and above and goes down and right)
    j = height - 1;
    for (i = inp - 1; i >= 0 && j >= 0; i--) {  //above and left        
        if (arr[j][i] != player.symb)
            break;

        ++score[2];
        --j;
    }
    j = height + 1;
    for (i = inp + 1; i <= 6 && j <= 6; i++) {  //down and right
        if (arr[j][i] != player.symb)
            break;

        ++score[2];
        ++j;
    }

    //check diagonal (which starts left and down and goes up and right)
    j = height + 1;
    for (i = inp - 1; i >= 0 && j <= 6; i--) {  //down and left     
        if (arr[j][i] != player.symb)
            break;

        ++score[3];
        ++j;
    }
    j = height - 1;
    for (i = inp + 1; i <= 6 && j >= 0; i++) {  //up and right
        if (arr[j][i] != player.symb)
            break;

        ++score[3];
        --j;
    }
    int bestscore = score[0];
    for (i = 0; i <= 3; i++) {
        if (score[i] > bestscore)
            bestscore = score[i];
    }
    printf("%d", bestscore);
    return bestscore;
}


int aiFindMostRelevant(char arr[7][7], Player player) {

    int i, height;

    int score[7] = { 0 };

    for (i = 0; i <= 6; i++) {
        height = findHeight(arr, i);

        if (height == -1) {//skip the columns that are full
            score[i] = -100;                            //and give them a very bad score
        }
        else {
            score[i] = aiCheckScore(arr, i, height, player);
        }       
    }

    int bestscore = score[0];
    int bestposition = 0;
    int num;

    for (i = 0; i <= 6; i++) {  
        num = (int)rand() % 10;

        if (score[i] == bestscore) {    //if 2 positions have the same score 

            if (num >= 7) {                 //there is a 30% chance the ai will take the new one to add some variety
                bestposition = i;
            }
        }

        if (score[i] > bestscore) { //always take the position with the best score
            bestscore = score[i];
            bestposition = i;
        }
    }

    return bestposition;
}

Любая помощь в решении этой проблемы будет принята с благодарностью, и любые предложения по улучшению моего кода приветствуются

1 Ответ

3 голосов
/ 25 апреля 2019

Похоже, в одном из циклов нет приращения. Изменения:

for (i = inp + 1; i <= 6; i) до for (i = inp + 1; i <= 6; ++i)

и посмотрите, поможет ли это.

...