2017-12-05 3 views
-4

So konvertiere ich ein Python-Skript für einen Computer zu spielen Tic Tac Toe nach C++ und jede Funktion hat bisher funktioniert, außer für meine rekursive Funktion. Ich habe es mehrmals überprüft und es funktioniert immer noch nicht wie vorgesehen. Alle anderen Funktionen funktionieren und erzeugen das richtige Ergebnis, so dass es ein Problem mit dieser Funktion sein muss. Was noch seltsamer ist, wenn ich an diesem einen Punkt am Ende etwas ausmache, ändert sich das Ergebnis der rekursiven Funktion und ich bin mir nicht sicher warum. Ich benutze c9 zum code, wenn das irgendetwas bedeutet.Drucken etwas ändert die rekursive Funktion Ergebnisse

int* AI::get_ratio(string player, Board board_copy, int piece){ 

board_copy.place_piece(piece, player); 

static int rwin[4]={1,0,0, true}; 
static int rloss[4]={0,1,0,false}; 
static int rtie[4]={0,0,1, false}; 

string symbol=get_symbol(); 

string winner=board_copy.check_game_over(); 
if(winner==symbol) 
    return rwin; 
else if(winner==othersymbol) 
    return rloss; 
else if(winner=="TIE") 
    return rtie; 

int win, loss, tie; 
win=0; 
loss=0; 
tie=0; 
vector<int> moves; 
bool p_win=false; 

vector<int> pmoves=board_copy.get_pmoves(); 
for(int i=0; i<pmoves.size(); i++){ 
    int *temp; 
    if(player==othersymbol) 
     temp=get_ratio(symbol, board_copy, pmoves[i]); 
    else 
     temp=get_ratio(othersymbol, board_copy, pmoves[i]); 

    if(equal(temp, rloss)){ 
     if(player==symbol) 
      return rloss; 
     else 
      continue; 
    } 
    else if(equal(temp,rwin)){ 
     p_win=true; 
     if(player==othersymbol) 
      return rwin; 
     else 
      continue; 
    } 
    moves.push_back(pmoves[i]); 
    win+=temp[0]; 
    loss+=temp[1]; 
    tie+=temp[2]; 
} 

if(moves.size()==0 && player==othersymbol) 
    //cout << "loss\n"; this line changes the output for some reason 
    return rloss; 
if(moves.size()==0 && player==symbol) 
    return rwin; 
static int result[4]={win, loss, tie, p_win}; 
return result; 
} 
+0

Bitte geben Sie eine [mcve] –

+0

Zuerst erklären, was die Funktion versucht zu erreichen. Es hilft, wenn Sie erwartetes und tatsächliches Ergebnis zur Verfügung stellen können, indem Sie einen Beispielaufruf dieser Funktion machen – lamandy

+0

Keine Klammern auf diesem 'if', so das Hinzufügen des' cout' bedeutet, dass es immer zurückkehrt, wahrscheinlich an der falschen Stelle. Tatsächliches Problem, keine Ahnung auf den ersten Blick. – user4581301

Antwort

0

Die fragliche Zeile ändert die Ausgabe, weil Sie keine Klammern um den Körper Ihrer if Anweisung haben. Wenn Sie die Zeile Kommentar-, wird es im Wesentlichen:

if (moves.size == 0 && player == othersymbol) 
{ 
    cout << "loss\n"; 
} 
return rloss; // <- This always runs now, regardless of the if statement 

Aus diesem Grund sollten Sie immer Klammern um Codeblöcke verwenden in if Aussagen und while und for Schleifen, auch wenn sie eine einzige Zeile sind.