Jump to content
  • Advertisement
Sign in to follow this  
tnutty

Problem with scoring system in tic-tac-toe

This topic is 3498 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have everything working. The problem is exactly when this sequence occurs. Player 1 wins, and then Player1 looses. When this happens, the winning percentage does not output correctly. But when I debug it with Microsoft express it outputs fine. I am using c++/opengl/glut. Any clues on why this might be happening? And say, if its a draw or a lost first and a win or whatever next, then the program works fine. Any ideas on why or how this might be caused?

Share this post


Link to post
Share on other sites
Advertisement
I thought there might be a common mistake.

Here is the code for the winning percentage :
Note this code makes some assumptions like the player wont play more than 1000 games.


GLvoid Player::PrintWinprctg()
{


float total = 0;
//check if there is a division by 0.
if(Player1.NumberOfLosses+Player1.NumberOfWins == 0.0f)
{
Player1.winPrctg[0] = 0;
Player1.winPrctg[1] = Player1.winPrctg[2] = 0;
strcpy(Player1.Rating,"INVALID");
return;

}
else
total = Player1.NumberOfWins/(Player1.NumberOfLosses+Player1.NumberOfWins);



//if there are no loss then there is 100% win rate
if(total == 1)
{
Player1.winPrctg[0] = 1;
Player1.winPrctg[1] = Player1.winPrctg[2] = 0;
strcpy(Player1.Rating,"PERFECT");
return;
}

total*= 1000;

int copyTot = total;



//Take each integer and convert it into a char and put it into winPercentage array
for(int i=0;i<5;i++)
{
Player1.winPrctg = copyTot % 10 + '0';
copyTot/=10;

}


int cntr=0;

//reverse the order
for(int i=4;i>=0;i--)
{
if(Player1.winPrctg == '0' && Player1.winPrctg[i+1] != '0' && i<=4) ++cntr;
cout<<"res["<<i<<"]"<<" = "<< Player1.winPrctg<<endl;

}

if(cntr==2 || cntr == 1) //assumption made here, win percentage are over 1 percent
Player1.winPrctg[3] = '.';

for(int i=4;i>=0;i--)
{
cout<<"Player1.winPrctg["<<i<<"]"<<" = "<< Player1.winPrctg<<endl;
}


}

Share this post


Link to post
Share on other sites
You are really complicating your code. You appear to be mixing C and C++. In C++, we use std::string for text, not strcpy and char arrays. We also use library functions to convert between numbers and strings.

Here is a sample implementation. Note how the winPrctg isn't stored explicitly, we just use

#include <string>
#include <sstream>

class Player
{
std::string rating;
// ...
};

// Why GLvoid and not simply "void"?
void Player::PrintWinprctg()
{
// Why are we referencing a *particular* player here?
// Why not the object the function was called on?
// Is the function "static"?
int wins = Player1.NumberOfWins;
int totalGames = wins + Player1.NumberOfLosses;


if(totalGames == 0)
{
Player1.rating = "INVALID";
}
else if(wins == totalGames)
{
Player1.rating = "PERFECT";
}
else
{
float percentage = (100.0f * wins) / totalGames;
std::stringstream stream;
stream << "WINS: " << percentage;
Player1.rating = stream.str();
}
}


The standard library type "stringstream" converts data to and from a string. You can access it by including <sstream>. It acts like any other stream you are used to (std::cin and std::cout), but it also has the handy "str()" function, which returns the current contents as a std::string instance (it can also be used to set the current contents).

Share this post


Link to post
Share on other sites
I will look into sstream but for now, If I change the code it will complicate things. Here is the code for incrementing PlayerNumberWins. Its basically hard coded way to check for win.

bool MainGame::checkPlayerWin()
{
if(Won[0] && Won[1] && Won[2]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check win top row across
if(Won[0] && Won[3] && Won[6]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check win top left row down
if(Won[0] && Won[4] && Won[8]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check top left diagonally

if(Won[1] && Won[4] && Won[7]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check middle row down
if(Won[2] && Won[5] && Won[8]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check Top right doing down
if(Won[2] && Won[4] && Won[6]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check right Diagnonal

if(Won[3] && Won[4] && Won[5]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} else//Check middle right
if(Won[6] && Won[7] && Won[8]) {Player1.NumberOfWins++; whichState = stateEnd; p1Win = true; return true;} //Check down right

return false;

}



Share this post


Link to post
Share on other sites
NumberOfLosses and NumberOfWins don't happen to be integers, do they? Do you know what happens when you divide an integer by another integer?

Share this post


Link to post
Share on other sites
If there is a tie the I have this function :

bool MainGame::checkIfGameisDraw(bool gameBrd[])
{
int cntr = 0;
int i=0;

while(i<9) //check if the game board is full
{
if(cGame.gameBoard == Player1.playerChoice ||
cGame.gameBoard == cAI.AI_ID)
cntr++;
else break;
++i;
}
if(cntr == 9) //if everyhing is filled in the gameBorad.

if(!(cGame.checkCompWin(gameBrd) || cGame.checkPlayerWin() )) //check if player or comp has won
{
DrawGame = true;
whichState = stateEnd;
Player1.NumberOfDrawGames++;
return true;
}

return false;
}






quote : NumberOfLosses and NumberOfWins don't happen to be integers, do they? Do you know what happens when you divide an integer by another integer?

Not sure what you are saying, but it gets truncated, if thats what you mean.

Share this post


Link to post
Share on other sites
Thanks. I found the problem. For some reason the code was not updating the
winning percentage. Not sure why because it in correct order. Whatever. Thanks
guys.Almost done!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!