У меня проблема с оптимизацией игры, в которую входят 2 игрока.
Таким образом, мы имеем неориентированный связный граф с множеством ребер и несколькими вершинами.
Каждый игрок должен удалить ребра, и если вершина изолирована, его счет увеличивается на
один, а затем вы должны удалить другой край. График представлен в так называемом
«матрица смежности». Для каждого в массиве существует связь между двумя вершинами. Например, если у нас есть треугольник, у нас есть следующий массив:
0 1 1 первый ряд
1 0 1 второй ряд
1 1 0 третий ряд
строки соответствуют вершинам, а столбцы соответствуют возможным связям с другими вершинами. Мы назначены использовать рекурсивную функцию для применения
Грубая сила. Я много думал о написании кода для этой функции. я
реализовал некоторый код и скомпилировал и запустил его. Я понятия не имею, почему это не так
функция. Мой код для этой функции:
class Matrix {
public:
int berekenZet (bool** array, bool player);
int berekenScore (bool** array, int rij, int kolom);
bool checkRij (bool** array, int rij);
void setGetal (int nummer) {getal = nummer;};
Matrix ();private:
int getal;int maxScoreA;
int huidigScore;
int maxverschil;
int maxScoreB;
int tellerHuidig;
Matrix :: Matrix () {
huidigScore = 0;
maxScoreA = 0;
maxScoreB = 0;
}
bool Matrix::checkRij (bool** array, int rij) {for (int i=0; i<getal; i++) {
if (array[rij][i] == true)
return false;
}
return true;
}
int Matrix::berekenScore (bool** Array, int rij, int kolom) {
if (checkRij (Array, rij) == true )
huidigScore ++;
if (checkRij (Array, kolom) == true)
huidigScore ++;
return huidigScore;
}
int Matrix::berekenZet (bool** array, bool player) {
int score = 0;
int bestescore = -5;
int slechtstescore = 5;
int something;
something = 0;
for(int i = 0; i < getal; i++){
for(int j = i + 1; j <getal; j++){
huidigScore = 0;
if(array[i][j]){
something++;
array[i][j] = false;
array[j][i] = false;
score = 0;
if(player == true){
score = score + berekenScore(array, i ,j );
}
else{
score = score - berekenScore(array, i, j);
}
cout << "player" << player << endl;
cout << "score" << score << endl;if(huidigScore == 0)
score = score + berekenZet(array, !player);
else
score = score + berekenZet(array, player);if(player == true && score > bestescore)
bestescore = score;
else if(player == false && score < slechtstescore)
slechtstescore = score;array[i][j] == true;
array[j][i] == true;
} //if
}//for
}//forif(player == true && something != 0){
cout << "bestescore" << bestescore << endl;
return bestescore;
}// if outside of double for loop
else if(player == false && something != 0){
cout << "slechtstescore" << slechtstescore << endl;
return slechtstescore;
} // else if outside of double for loop
else if(something = 0){
cout << "bestescore" << bestescore << endl;
return 0;
} // determine whether array was empty when function was called
bestescore и slechtstescore — лучшие и худшие.
berekenScore корректирует количество очков, заработанных после преимущества
удаляется и сохраняет его в huidigScore. Так что в основном 0, 1 или 2.
Я вызываю эту функцию в int main:
cout << "Aantal takken: " << takken << endl;
a = matrix.berekenZet(Array, player);
Я запустил его, используя следующую матрицу смежности:
5
0 1 1 1 1
1 0 1 0 0
1 1 0 0 0
1 0 0 0 0
1 0 0 0 0
Он выводит «Score» всего 5 раз, так что кажется, что он игнорирует циклы for в функции,
Кроме того, bestescore однажды установлен в несколько миллионов значение, а затем установлено в 5. Я не
очень опытный программист, так что я мог бы что-то пропустить .. ??
В вашем примере у вас всего 5 ребер, и, таким образом, результат выводится всего пять раз. Вложенный цикл
для (int i = 0; i < getal; я ++)
для (int j = i + 1; j < getal; j ++)
перебирает все возможные ребра и условия, если (array [i] [j]) отфильтровывает истинные ребра, поэтому цикл будет выполнять только | E | раз.
Кроме того, в цикле вы устанавливаете
array[i][j] = false; array[j][i] = false;
а потом
array[i][j] == true; array[j][i] == true;
и, таким образом, только один край удаляется за один раз. Возможно, вам нужен еще один цикл, который удаляет несколько ребер за раз, чтобы получить грубую реализацию.
Изменить: Вы, кажется, не сбрасывает huidigScore при каждом вызове. Я бы порекомендовал изменить ваши вспомогательные функции следующим образом:
int Matrix::berekenScore (bool** Array, int rij, int kolom) { int huidigScore = 0; if (checkRij (Array, rij) == true ) huidigScore ++; if (checkRij (Array, kolom) == true) huidigScore ++; return huidigScore; }
Вышеупомянутая функция имеет huidigScore в качестве закрытой переменной. Теперь вместо следующего фрагмента кода:
if(player == true){ score = score + berekenScore(array, i ,j ); } else{ score = score - berekenScore(array, i, j); } cout << "player" << player << endl; cout << "score" << score << endl;
вы можете иметь
int huidigScore = berekenScore(array, i ,j ) if(player == true){ score = score + huidigScore; } else{ score = score - huidigScore; } cout << "player" << player << endl; cout << "score" << score << endl;
Общий совет: по возможности избегайте использования публичных переменных. Они затрудняют рассуждение и отладку программ.
Других решений пока нет …