//////////////////////////////////////////////////////////////////// /// UI.js /// © 2007 Carl Johansen /// /// User Interface for Reversi game. //////////////////////////////////////////////////////////////////// function InitGame() { theBoard = GetInitializedBoard(); evalWeight = GetInitializedEvaluator(); UpdateScreenBoard(); document.getElementById("lblScore").innerHTML = "White: 2, Black: 2"; currPlayer = WhitePlayer; GetStartButton().onclick = StartGame; GetStartButton().disabled = false; GetResetButton().onclick = InitGame; GetResetButton().disabled = true; } function GetStartButton() { return document.getElementById("cmdStart"); } function GetResetButton() { return document.getElementById("cmdReset"); } //--------------------------------------------------------------------------------------- function StartGame() { var validMoves; var selWhite = document.getElementById("selWhite"); var selBlack = document.getElementById("selBlack"); document.getElementById("cmdStart").value = "Stop"; document.getElementById("cmdReset").disabled = true; document.getElementById("cmdStart").onclick = StopGame; ShowPlayerUp(); playerType[WhitePlayer] = selWhite.options[selWhite.selectedIndex].value; playerType[BlackPlayer] = selBlack.options[selBlack.selectedIndex].value; selWhite.disabled = true; selBlack.disabled = true; if(playerType[currPlayer] == ComputerPlayerType) ScheduleComputerMove(); else { validMoves = GetValidMoveList(theBoard, currPlayer); SetRolloversForValidMoves(validMoves); } } //--------------------------------------------------------------------------------------- function StopGame() { window.clearInterval(intCompMoveIntervalID); ClearRollovers(); ClearPlayerUpDisplay(); GetStartButton().value = "Start"; GetStartButton().onclick = StartGame; GetResetButton().disabled = false; var selWhite = document.getElementById("selWhite"); var selBlack = document.getElementById("selBlack"); selWhite.disabled = false; selBlack.disabled = false; } //--------------------------------------------------------------------------------------- function StopGameWithNoResume() { StopGame(); GetStartButton().disabled = true; } //--------------------------------------------------------------------------------------- function OnComputerMove() { window.clearInterval(intCompMoveIntervalID); var computerMove = ChooseMove(theBoard, currPlayer); if(computerMove.Row == -1) alert("Computer cannot move (this message should not normally appear!)"); else ApplyMoveAndSwitchPlayerUp(computerMove.Row, computerMove.Col); } //--------------------------------------------------------------------------------------- function OnPlayerMove(e) { var sourceElement = (e ? e.target : window.event.srcElement); var cellID = sourceElement.id; var theRow = parseInt(cellID.substr(3, 1)); var theCol = parseInt(cellID.substr(4, 1)); if(IsValidMove(theBoard, theRow, theCol, currPlayer)) ApplyMoveAndSwitchPlayerUp(theRow, theCol); } //--------------------------------------------------------------------------------------- function ApplyMoveAndSwitchPlayerUp(moveRow, moveCol) { //Applies the player's move (assumes it is valid), carries out post-move actions and switches the current player ClearRollovers(); ApplyMove(theBoard, moveRow, moveCol, currPlayer); UpdateScreenBoard(); //Update the scoreboard var squareCount = GetSquareCount(theBoard); document.getElementById("lblScore").innerHTML = "" + "White: " + squareCount.NumWhite + ", Black: " + squareCount.NumBlack + ""; //Check for game over if(squareCount.NumEmpty == 0) { alert("Game Over"); StopGameWithNoResume(); return; } //Switch current player. currPlayer = GetOpponent(currPlayer); ShowPlayerUp(); validMoves = GetValidMoveList(theBoard, currPlayer); //Check for new player forfeit. if(validMoves.NumValidMoves == 0) { var strMsg = (playerType[currPlayer] == ComputerPlayerType ? "Computer" : "Player"); strMsg += " (" + ColourName(currPlayer) + ") cannot move."; alert(strMsg); //Back to the other player. currPlayer = GetOpponent(currPlayer); ShowPlayerUp(); validMoves = GetValidMoveList(theBoard, currPlayer); if(validMoves.NumValidMoves == 0) { //Original player can't move either - it's all over. alert("Game Over (no moves left)."); StopGameWithNoResume(); return; } } if(playerType[currPlayer] == ComputerPlayerType) ScheduleComputerMove(); else SetRolloversForValidMoves(validMoves); } //--------------------------------------------------------------------------------------- function UpdateScreenBoard() { var currRow, currCol; for(currRow = 1; currRow <= BOARD_SIZE; currRow++) for(currCol = 1; currCol <= BOARD_SIZE; currCol++) { var currSquare = document.getElementById("img" + currRow + currCol); if(theBoard[currRow][currCol] == WhitePlayer) { if(currSquare.src != "whitesquare.gif") currSquare.src = "whitesquare.gif"; } else if(theBoard[currRow][currCol] == BlackPlayer) { if(currSquare.src != "blacksquare.gif") currSquare.src = "blacksquare.gif"; } else { if(currSquare.src != "emptysquare.gif") currSquare.src = "emptysquare.gif"; } } } //--------------------------------------------------------------------------------------- function HighlightSquareForPlayerMove(e) { var sourceElement = (e ? e.target : window.event.srcElement); var strHighlightGif = (currPlayer == WhitePlayer ? "whitesquare.gif" : "blacksquare.gif"); sourceElement.src = strHighlightGif; } //--------------------------------------------------------------------------------------- function UnhighlightSquare(e) { var sourceElement = (e ? e.target : window.event.srcElement); sourceElement.src = "emptysquare.gif"; } //--------------------------------------------------------------------------------------- function ClearRollovers() { var intRow, intCol; for(intRow = 1; intRow <= BOARD_SIZE; intRow++) for(intCol = 1; intCol <= BOARD_SIZE; intCol++) { var squareElement = document.getElementById("img" + intRow + intCol); squareElement.onmouseover = null; squareElement.onmouseout = null; squareElement.onclick = null; } } //--------------------------------------------------------------------------------------- function SetRolloversForValidMoves(validMoves) { ClearRollovers(); var i; for(i = 0; i < validMoves.NumValidMoves; i++) { intRow = validMoves.ValidMoves[0][i]; intCol = validMoves.ValidMoves[1][i]; var squareElement = document.getElementById("img" + intRow + intCol); squareElement.onmouseover = HighlightSquareForPlayerMove; squareElement.onmouseout = UnhighlightSquare; squareElement.onclick = OnPlayerMove; } } //--------------------------------------------------------------------------------------- function ColourName(playerColour) { return (playerColour == WhitePlayer ? "White" : "Black"); } //--------------------------------------------------------------------------------------- function ShowPlayerUp() { document.getElementById("lblPlayerUp").innerHTML = "" + ColourName(currPlayer) + " to move" + ""; } //--------------------------------------------------------------------------------------- function ClearPlayerUpDisplay() { document.getElementById("lblPlayerUp").innerHTML = ""; } //--------------------------------------------------------------------------------------- function ScheduleComputerMove() { //The computer moves so quickly that we need a delay to make it look like it's thinking... intCompMoveIntervalID = window.setInterval("OnComputerMove()", 350); }