2017-05-24 20 views
-3

私はC++で単純な戦艦ゲームを書いています。ゲームのいくつかの反復の後、 "Player"オブジェクト内の文字列の1つが変更されます。この変更は、いくつかのヌル文字が文字列の最後に追加されます。それ以外の場合、オブジェクトの残りの部分は変更されません。たとえば、プレーヤーの種類が「cpu」の場合、プレーヤーの種類は「cpu \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」に切り替わります。ここで文字列にヌル文字をランダムに追加C++

currPlayer->getStrategy().getNextAttack(nextPlayer->getBoard(1)); 

はgetNextAttack(のコードです):私は、問題を引き起こしたコードの行があると信じて

int Strategy::getNextAttack(Board enemyBoard) { 
    //clear prob board 
    for(int i = 0; i < 100; i++) { 
     probBoard[i] = 0; 
    } 

    //reset largest ship 
    largestShip = 0; 

    //assign largest ship 
    for(int i = 0; i < 100; i++) { 
     Ship currShip = enemyBoard.getShipByCoord(i); 
     if(!currShip.isSunk()) { //if ship is still afloat 
      if(currShip.getSize() > largestShip) { largestShip = currShip.getSize(); } //reassign largest ship on board 
     } 
    } 

    //assign base prob 
    std::vector<int> allPossible; 
    //for all horiz coords 
    for(int i = 0; i < 10; i++) { 
     for(int j = 0; j < (10 - largestShip +1); j++) { 
      for(int k = 0; k < (largestShip); k++) { 
       if(!enemyBoard.beenHit((i*10) + j + k) || (enemyBoard.beenHit((i*10) + j + k) && !enemyBoard.getShipByCoord((i*10) + j + k).isSunk())) { //if not hit or if hit but contains a ship that is not sunk 
        allPossible.push_back((i*10) + j + k); 
       } 
       else { 
        for(int m = 0; m < k; m++) { 
         allPossible.pop_back(); //should delete last element 
        } 
        break; 
       } 
      } 
      //for all vert coords 
      for(int z = 0; z < (largestShip); z++) { 
       if(!enemyBoard.beenHit(((j+z)*10) + i)) { 
        allPossible.push_back(((j+z)*10) + i); 
       } 
       else { 
        for(int m = 0; m < z; m++) { 
         allPossible.pop_back(); //should delete last element 
        } 
        break; 
       } 
      } 
     } 
    } 

    for(int p = 0; p < allPossible.size(); p++) { 
     probBoard[allPossible[p]] += 1; 
    } 


    //add improvements based on hits 
    for(int i = 0; i < 10; i++) { 
     for(int k = 0; k < 10; k++) { 
      int currCoord = (i*10) + k; 
      int leftCoord = (i*10) + k-1; 
      int rightCoord = (i*10) + k+1; 
      int upCoord = ((i-1)*10) + k; 
      int downCoord = ((i+1)*10) + k; 
      if(enemyBoard.beenHit(currCoord) && (enemyBoard.getShipByCoord(currCoord).getName() != "") && !enemyBoard.getShipByCoord(currCoord).isSunk()) { //currCoord is a coordinate that has been hit, contains a ship and is not sunk 
       if((enemyBoard.beenHit(leftCoord) || enemyBoard.beenHit(rightCoord)) && (enemyBoard.getShipByCoord(leftCoord) == enemyBoard.getShipByCoord(currCoord) || enemyBoard.getShipByCoord(rightCoord) == enemyBoard.getShipByCoord(currCoord))) { //if space to left or right is hit and the same ship 
        //increment only the left and right 
        if(!enemyBoard.getShipByCoord(currCoord).isSunk()) { //ship cannot be sunk as well 
         probBoard[leftCoord] += 25; 
         probBoard[rightCoord] += 25; 
        } 
       } 

       else if((enemyBoard.beenHit(upCoord) || enemyBoard.beenHit(downCoord)) && (enemyBoard.getShipByCoord(upCoord) == enemyBoard.getShipByCoord(currCoord) || enemyBoard.getShipByCoord(downCoord) == enemyBoard.getShipByCoord(currCoord))) { //if space on top or bottom is hit and the same ship and not sunk 
        //increment only the top and bottom 
        if(!enemyBoard.getShipByCoord(currCoord).isSunk()) { //ship cannot be sunk as well 
         probBoard[upCoord] += 25; 
         probBoard[downCoord] += 25; 
        } 
       } 

       //if no direct spaces in any direction to hit coord, increment top, bot, left, and right equally 
       else { 
        probBoard[upCoord] += 20; 
        probBoard[downCoord] += 20; 
        probBoard[leftCoord] += 20; 
        probBoard[rightCoord] += 20; 
       } 
      } 
     } 
    } 

    //marks odds at 0 if already fired upon 
    for(int n = 0; n < 100; n++) { 
     if(enemyBoard.beenHit(n)) { 
      probBoard[n] = 0; 
     } 
    } 

    //find next best attack coord based on prob board 
    int highestValue = 0; 
    std::vector<int> highestSpaces; 
    for(int j = 0; j < 100; j++) { 
     if(probBoard[j] > highestValue) { highestValue = probBoard[j]; } 
    } 
    for(int r = 0; r < 100; r++) { 
     if(probBoard[r] == highestValue) { 
      highestSpaces.push_back(r); 
     } 
    } 
    srand(static_cast<unsigned int>(time(NULL))); 
    int randNum = rand() % highestSpaces.size(); 
    return highestSpaces[randNum]; 
} 

は読書と任意の助けをありがとう!

+0

それが小さい場合には、あなたが実際に、誰かが示されたコードを理解することを期待ください明らかにはるかに大きなプログラムの一部であり、表示されていないクラスやメソッドも参照しています。 –

+0

私はそうは思わない。文字列にnull文字が追加されてしまうという問題が、いくつかの助けに十分であることを期待していました。また、私はすべてのコードを投稿した場合、私は燃えているだろうと思った?私はそれを仮定して間違っていますか?私は最も関連性があると思ったものを投稿しようとしていただけですが、私は悲惨に失敗したと思います。 – Carl

+1

コメント者が正しく、問題をデバッグするのに十分な情報がありません。しかし、それはあなた自身でデバッグすることはできません - あなたのプレーヤータイプの文字列が変更されるたびに実行が一時停止するようにデバッガを使用してウォッチポイントを設定し、現在のスタックトレースをチェックしてそれを行うことができない場合は、現在のプレーヤータイプの文字列を表示する関数を作成し、コードの周りにその関数の呼び出しを振りかけることで、それを偽造することができます。値が変更されたときに正確にstdout出力からその原因を突き止めることができます。 –

答えて

0

行または列が0または9であるとき、それはエッジで配列境界の外に行くようにこれが見えます:

probBoard[upCoord] += 20; 
probBoard[downCoord] += 20; 
probBoard[leftCoord] += 20; 
probBoard[rightCoord] += 20; 
+0

これは私の問題を解決しました。本当にありがとうございました!!! – Carl

+0

あなたは大歓迎ですが、上記のデバッグに関するコメントに注意してください - コードをデバッグすることはあなたに魚を渡す人よりもはるかに便利です:) ...すべての場所でエッジケースを確認してくださいあなたは上/下/左/右を使用しています。 –

関連する問題