2017-01-07 5 views
1

Dies ist mein erstes Mal eine Frage in diesem Forum zu stellen, also hier geht es. Ich erstelle ein Tic-Tac-Toe-Spiel für die Praxis und verwende Enumeratoren und Rekursion, weil ich nie wirklich Aufzählung gemacht habe und immer ein paar Rekursionspraktiken machen konnte. Nun, ich habe gerade damit fertig gemacht, den Player2 nach dem Zufallsprinzip zu bewegen Ungefähr 3 Umdrehungen gibt es einen Segmentierungsfehler und ich kann nicht herausfinden, warum ... Ich hoffe, Sie können es herausfinden und danken Ihnen!Segmentierungsfehler: 11 C++ Fehler

#include <iostream> 
#include <string> 
#include <cstdlib> 

const int size = 3; 

enum play {none,X,O}; 

void NPC(play (&board)[size][size],play player2) { 
    srand(time(NULL)); 
    int tempx = rand() % 3; 
    int tempy = rand() % 3; 
    if(board[tempx][tempy] == none) 
    board[tempx][tempy] = player2; 
    else 
    NPC(board,player2); 
} 

void getBoardState(play (&board)[size][size],int y,int x) { 
    if(board[x][y] == none) std::cout << " "; 
    else if(board[x][y] == X) std::cout << "X"; 
    else std::cout << "O"; 
} 

void printboard(play (&board)[size][size]){ 
    int length = 4 * size - 1; 
    for(int i = 1; i <= length; i++) { 
    for(int j = 1; j <= length; j++) { 
     if(i % 4 == 0 && j % 4 == 0) std::cout << "+"; 
     else if(i % 4 == 0) std::cout << "-"; 
     else if(j % 4 == 0) std::cout << "|"; 
     else if(i % 2 == 0 && j % 2 == 0) getBoardState(board,(i - 2)/4,(j - 2)/4); 
     else std::cout << " "; 
    } 
    std::cout << std::endl; 
    } 
} 

int main() { 
    play player = O, player2 = X; 
    bool over = false; 
    play board[size][size]; 
    for(int i = 0; i < size; i++) { 
    for(int j = 0; j < size; j++) { 
     board[i][j] = none; 
    } 
    } 
    std::string player1 = ""; 
    std::cout << "What would You like to be? An X or an O?" << std::endl; 
    while(((player1 != "X") + (player1 != "O")) == 2) { 
    std::cin >> player1; 
    if(((player1 != "X") + (player1 != "O")) == 2) 
     std::cout << "Invalid entry! Please enter X or an 0!" << std::endl; 
    } 
    if(player1 == "X") { 
    player2 = O; 
    player = X;} 
    int tempx,tempy; 
    while(!over) { 
    std::cout << "Please enter an x and then a y (1 to " << size << ")" << std::endl; 
    std::cin >> tempx; 
    std::cin >> tempy; 
    while(tempx > size || tempy > size || board[tempx-1][tempy-1] != none) { 
     std::cout << "Invalid entry! Try again!" << std::endl; 
     std::cin >> tempx; 
     std::cin >> tempy; 
    } 
    board[tempx-1][tempy-1] = player; 
    NPC(board,player2); 
    printboard(board); 
    } 
    return 0; 
} 
+0

Sie müssen beenden, wenn die Karte voll ist, sonst wird die NPC-Funktion für immer rekrutieren. –

+0

Mögliches Duplikat der [rand-Funktion gibt die gleichen Werte zurück, wenn sie innerhalb einer einzigen Funktion C++ aufgerufen wird (http://stackoverflow.com/questions/6729214/rand-function-returns-same-values-when-called-within-a-single) -Funktion-c) –

Antwort

1

Sie laufen in Ihrem Rekursion aus Stapelspeicherplatz, weil Sie srand(time(NULL)) jedes Mal anrufen. Der Zufallszahlengenerator sollte nur einmal in main und nicht in NPC gesetzt werden. time(NULL) gibt eine Anzahl von Sekunden zurück, so dass es sich selten ändert (im Vergleich dazu, wie schnell Ihre rekursiven Funktionsaufrufe erfolgen), wodurch der gesamte verfügbare Stapelspeicherplatz belegt wird.

+0

Auch mit Ihrer Änderung stürzt es ab, wenn das Board voll ist. Es gibt keine abschließende Bedingung. –

+0

Danke! Du bist unglaublich! – Brandon

+0

Und noch etwas. Ich weiß, dass es abstürzt, wenn das Board voll ist. Ich war gerade dabei, die Funktion zu beenden, bemerkte aber dieses Problem und wollte es beheben, bevor ich fortfuhr. Danke nochmal Jungs. – Brandon

Verwandte Themen