2017-01-07 4 views
1

このフォーラムで質問をするのは初めてです。私は実践のためにチック・タック・トゥ・ゲームを作成しています。列挙子と再帰を使用しています。列挙を実際に行ったことがなく、常に再帰の練習を得ることができたからです。約3ターン、それはセグメンテーションの失敗をもたらし、なぜ私は理解できません...皆さんがそれを理解していただきありがとうと祈っています!あなたは毎回srand(time(NULL))を呼び出すためセグメンテーションフォールト:11 C++エラー

#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

ボードがいっぱいになると終了する必要があります。そうしないと、NPC機能が永久に再開します。 –

+0

[rand関数の可能な重複は、単一の関数内で呼び出されたときに同じ値を返します。C++](http://stackoverflow.com/questions/6729214/rand-function-returns-same-values-when-called-within-a-single -function-c) –

答えて

1

はあなたの再帰でスタック領域が不足しています。乱数ジェネレータは、メインで1回だけ播種し、NPCには播種しないでください。 time(NULL)は秒数を返しますので、頻繁に変更されることはありません(再帰関数呼び出しがどのくらい速く行われるかに比べて)。これは使用可能なすべてのスタック領域を消費します。

+0

変更しても、ボードがいっぱいになるとクラッシュします。終了条件はありません。 –

+0

ありがとうございます!あなたは素晴らしいです! – Brandon

+0

さらにもう1つ。私はボードがいっぱいになるとクラッシュすることを知っています。私はまだ機能を仕上げている段階にありましたが、この問題に気づき、続行する前に修正したいと思っていました。もう一度ありがとう。 – Brandon

関連する問題