私は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];
}
は読書と任意の助けをありがとう!
それが小さい場合には、あなたが実際に、誰かが示されたコードを理解することを期待ください明らかにはるかに大きなプログラムの一部であり、表示されていないクラスやメソッドも参照しています。 –
私はそうは思わない。文字列にnull文字が追加されてしまうという問題が、いくつかの助けに十分であることを期待していました。また、私はすべてのコードを投稿した場合、私は燃えているだろうと思った?私はそれを仮定して間違っていますか?私は最も関連性があると思ったものを投稿しようとしていただけですが、私は悲惨に失敗したと思います。 – Carl
コメント者が正しく、問題をデバッグするのに十分な情報がありません。しかし、それはあなた自身でデバッグすることはできません - あなたのプレーヤータイプの文字列が変更されるたびに実行が一時停止するようにデバッガを使用してウォッチポイントを設定し、現在のスタックトレースをチェックしてそれを行うことができない場合は、現在のプレーヤータイプの文字列を表示する関数を作成し、コードの周りにその関数の呼び出しを振りかけることで、それを偽造することができます。値が変更されたときに正確にstdout出力からその原因を突き止めることができます。 –