Skip to content

Instantly share code, notes, and snippets.

@tatewake
Last active March 14, 2017 02:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tatewake/d402ac3dddac4a587334e030936aad84 to your computer and use it in GitHub Desktop.
Save tatewake/d402ac3dddac4a587334e030936aad84 to your computer and use it in GitHub Desktop.
public class TicTacToe
{
protected enum StateType
{
kUninitialized,
kDestroyed,
kEnd,
kOsTurn,
kXsTurn,
};
protected StateType mState = StateType.kUninitialized;
protected boolean EnterAskPlayAgain()
{
}
protected void EnterClearBoard()
{
}
protected void EnterDestroyed()
{
}
protected boolean EnterDidAnyoneWin()
{
}
protected boolean EnterDidXWin()
{
}
protected void EnterEnd()
{
}
protected boolean EnterIsBoardFull()
{
}
protected void EnterOsTurn()
{
}
protected void EnterPrintDraw()
{
}
protected void EnterPrintXWon()
{
}
protected void EnterPrintYWon()
{
}
protected void EnterStart()
{
}
protected boolean EnterWillXStart()
{
}
protected boolean EnterXPlaysNext()
{
}
protected void EnterXsTurn()
{
}
protected void OnConstruct()
{
assert(mState == StateType.kUninitialized);
if (mState == StateType.kUninitialized)
{
EnterStart();
EnterClearBoard();
if (EnterWillXStart())
{
mState = StateType.kXsTurn;
EnterXsTurn();
}
else
{
mState = StateType.kOsTurn;
EnterOsTurn();
}
}
}
protected void OnDestruct()
{
assert(mState == StateType.kEnd || mState == StateType.kOsTurn || mState == StateType.kXsTurn);
switch (mState)
{
case kEnd:
case kOsTurn:
case kXsTurn:
mState = StateType.kDestroyed;
EnterDestroyed();
break;
default:
break;
}
}
protected void OnPickSquare()
{
assert(mState == StateType.kOsTurn || mState == StateType.kXsTurn);
switch (mState)
{
case kOsTurn:
if (EnterDidAnyoneWin())
{
if (EnterDidXWin())
{
EnterPrintXWon();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
mState = StateType.kXsTurn;
EnterXsTurn();
}
else
{
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
else
{
EnterPrintYWon();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
mState = StateType.kXsTurn;
EnterXsTurn();
}
else
{
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
}
else
{
if (EnterIsBoardFull())
{
EnterPrintDraw();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
mState = StateType.kXsTurn;
EnterXsTurn();
}
else
{
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
else
{
if (EnterXPlaysNext())
{
mState = StateType.kXsTurn;
EnterXsTurn();
}
else
{
EnterOsTurn();
}
}
}
break;
case kXsTurn:
if (EnterDidAnyoneWin())
{
if (EnterDidXWin())
{
EnterPrintXWon();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
EnterXsTurn();
}
else
{
mState = StateType.kOsTurn;
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
else
{
EnterPrintYWon();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
EnterXsTurn();
}
else
{
mState = StateType.kOsTurn;
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
}
else
{
if (EnterIsBoardFull())
{
EnterPrintDraw();
if (EnterAskPlayAgain())
{
EnterClearBoard();
if (EnterWillXStart())
{
EnterXsTurn();
}
else
{
mState = StateType.kOsTurn;
EnterOsTurn();
}
}
else
{
mState = StateType.kEnd;
EnterEnd();
}
}
else
{
if (EnterXPlaysNext())
{
EnterXsTurn();
}
else
{
mState = StateType.kOsTurn;
EnterOsTurn();
}
}
}
break;
default:
break;
}
}
public TicTacToe()
{
mState = StateType.kUninitialized;
OnConstruct();
}
public void finalize() throws Throwable
{
OnDestruct();
super.finalize();
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment