// TT4DRow.java
/**
*
* @author Sean Bridges
* @version 1.0
*
* The row is how the game keeps track of the score.
*
* Each row listens to three TT4DSquares. When their contents change
* the row informs its stat object what to do.
*
* This class is where most of the logic for analyzing the boards state is.
* It really doesnt run an algorithm, its just an accounting method.
*
* The game
*/
public class TT4DRow implements TT4DSquareListener
{
//---------------------------------------------
//instance variables
private int xCount = 0; //the number of x's in this row
private int oCount = 0; //the number of o' in this row
private TT4DStats stats;
private TT4DSquare s1,s2,s3;
//---------------------------------------------
//construtor
/** Creates new TT4DRow
*
* s1,s2,s3 are the three squares that make up the row,
* the stats object is the object that the row informs of changes.
*
*/
public TT4DRow(TT4DSquare s1, TT4DSquare s2, TT4DSquare s3, TT4DStats stats) {
this.stats = stats;
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
s1.addListener(this);
s2.addListener(this);
s3.addListener(this);
}
//---------------------------------------------
//instance methods
//---------------------------------------------
//TT4DSquareListener methods
public void contentsChanged(String oldContents,String newContents)
{
//case 1, old = blank, new = x
if( oldContents == TT4DBoard.NULL_PLAYER_STRING &&
newContents == TT4DBoard.X_PLAYER_STRING )
{
//if we used to have some o's and no x's
//then we used to have a score for o, remove that
if(xCount == 0 && oCount != 0)
{
switch(oCount)
{
case 1: stats.decOWith1();
break;
case 2: stats.decOWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end switch
}//end if
//if we have no o's, we now have a better score for x
//remove the old score, add teh new score.
else if(oCount == 0)
{
switch(xCount)
{
case 0: stats.incXWith1();
break;
case 1: stats.incXWith2();
stats.decXWith1();
break;
case 2: stats.incXRows();
stats.decXWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end case
}//end if
xCount++;
}//end if old = null, new = x
//case 2, old = blank, new = o
else if( oldContents == TT4DBoard.NULL_PLAYER_STRING &&
newContents == TT4DBoard.O_PLAYER_STRING )
{
//if we used to have some x's and no o's
//then we used to have a score for o, remove that
if(oCount == 0 && xCount != 0)
{
switch(xCount)
{
case 1: stats.decXWith1();
break;
case 2: stats.decXWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end case
}//end if
//if we have no x's, we now have a better score for o
//remove the old score, add teh new score.
else if(xCount == 0)
{
switch(oCount)
{
case 0: stats.incOWith1();
break;
case 1: stats.incOWith2();
stats.decOWith1();
break;
case 2: stats.incORows();
stats.decOWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end case
}//end if
oCount++;
}//end if old = null, new = o
//case 3, old = x, new = null
else if( oldContents == TT4DBoard.X_PLAYER_STRING &&
newContents == TT4DBoard.NULL_PLAYER_STRING )
{
//if we have no o's, we had an x score, decrement it.
if(oCount == 0)
{
switch(xCount)
{
case 1: stats.decXWith1();
break;
case 2: stats.decXWith2();
stats.incXWith1();
break;
case 3: stats.decXRows();
stats.incXWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end switch
}//end if
//if we have 1 x and some y's increment the y score.
if(xCount == 1 && oCount != 0)
{
switch(oCount)
{
case 1: stats.incOWith1();
break;
case 2: stats.incOWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end switch
}//end if
xCount--;
}//end if old = x, new = null
//case 4, old = o, new = null
else if( oldContents == TT4DBoard.O_PLAYER_STRING &&
newContents == TT4DBoard.NULL_PLAYER_STRING )
{
//if we have no x's, we had an o score, decrement it.
if(xCount == 0)
{
switch(oCount)
{
case 1: stats.decOWith1();
break;
case 2: stats.decOWith2();
stats.incOWith1();
break;
case 3: stats.decORows();
stats.incOWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end switch
}//end if
//if we have 1 o and some x's increment the x score.
if(oCount == 1 && xCount != 0)
{
switch(xCount)
{
case 1: stats.incXWith1();
break;
case 2: stats.incXWith2();
break;
default : System.out.println("Invalid board stats state: " + toString());
Thread.dumpStack();
}//end switch
}//end if
oCount--;
}//end if old = x, new = null
}//end contentsChanged(...)
public String toString()
{
return "Row containg x:" + xCount + " o:" + oCount +
"\n" + s1 + "\n" + s2 + "\n" + s3;
}
}//end class TT4DRow