Rotoshift Source Code

<canvas id = "ctx" width = "350" height = "400" style = "border:3px solid #000000;"></canvas>

<script type = "text/javascript">
var ctx = document.getElementById("ctx").getContext("2d");

function clearScreen()
{
ctx.fillStyle= "white";
ctx.fillRect(0, 0, 350, 400);
}

function square(col, row, type/* colour*/)
{
this.row = row;
this.col = col;
this.type = type;
}

square.prototype.draw = function()
{
var sqCol;

switch(this.type)
{
default:

sqCol = "white";
break;

case 0:

sqCol = "white";

break;
case 1:

sqCol = "red";

break;
case 2:

sqCol = "blue";

break;
case 3:

sqCol = "green";

break;
case 4:

sqCol = "purple";

break;
case 5:

sqCol = "black";

break;


}
ctx.beginPath();
ctx.lineWidth = "2";
ctx.strokeStyle = "black";
ctx.rect(50*this.col, 50*this.row, 50, 50);
ctx.fillStyle = sqCol;
ctx.fillRect(50*this.col, 50*this.row, 50, 50);
ctx.stroke();
}

square.prototype.changeTo = function(type)
{
this.type = type;
}

square.prototype.flip = function()
{
if(this.type < 5 && this.type > 0)
{
clickCount ++;
updateClick();

if(this.type == 1)
{
this.type = 2;
}
else if(this.type == 2)
{
this.type = 1;
}
else if(this.type == 3)
{
this.type = 4;
}
else if(this.type == 4)
{
this.type = 3;
}
}
}

square.prototype.getType = function()
{
return this.type;
}



function getMousePos(ctx, evt)
{
var rect = document.getElementById("ctx").getBoundingClientRect();

return{ x: evt.clientX-rect.left, y: evt.clientY - rect.top };

}


document.getElementById("ctx").addEventListener('click', function(evt)
{
var mousePos = getMousePos(ctx, evt);

if(victoryOn == true)
{
victoryOn = false;
Menu();
}
else
{
if(gameOn == true)
{
var Col = Math.floor(mousePos.x/50);
var Row = Math.floor(mousePos.y/50);
if(Col > 4 && Row > 6)
{
gameOn = false;
clearInterval(gameLoop);
Menu();
}
else if(Col >= 0 && Row < 7)
{
grid[Col][Row].flip()

drawGrid();
}
}
else
{
var Col = Math.floor(mousePos.x/175);
var Row = Math.floor((mousePos.y-250)/30);

if(Col == 1 && Row == 4)
{
//alert("Highscores!");
}
else
{
levelNum = (Row * 2 + Col) + 1;
level = levelNum;
//alert("Clicked in Col " + Col + ", Row " + Row);
//alert("Level " + levelNum);
if(levelNum > 0 && levelNum < 10)
{
gameOn = true;
clearScreen();
NewGame(levelNum);
}
}
}
}
}, false);

function createGrid()
{

for(var i = 0; i < 7; i ++)
{
for(var j = 0; j < 7; j ++)
{
sq = new square(i, j, 0);

//sq.draw();

grid[i][j] = sq;


/*ctx.fillStyle = "#000000";
ctx.lineWidth= "4";
ctx.strokeStyle = "blue";
ctx.fillRect(50*sq.row, 50*sq.col, 50, 50);
ctx.stroke();*/

}
}
}

function drawGrid()
{
for(var i = 0; i < 7; i ++)
{
for(var j = 0; j < 7; j ++)
{
grid[i][j].draw();
}
}
}

function x_shift()
{
var shift = 0;

for(var i = 0; i < 7; i ++)
{
for(var j = 0; j < 7; j ++)
{
if(grid[i][j].getType() == 1)
{
if(i < pos[0])
{
shift ++;
}
else if(i > pos[0])
{
shift --;
}
}
else if(grid[i][j].getType() == 2)
{
if(i < pos[0])
{
shift --;
}
else if(i > pos[0])
{
shift ++;
}
}
else if(grid[i][j].getType() == 3)
{
if(j < pos[1])
{
shift --;
}
else if(j > pos[1])
{
shift ++;
}
}
else if(grid[i][j].getType() == 4)
{
if(j < pos[1])
{
shift ++;
}
else if(j > pos[1])
{
shift --;
}
}
}
}

return shift;
}

function y_shift()
{
var shift = 0;

for(var i = 0; i < 7; i ++)
{
for(var j = 0; j < 7; j ++)
{
if(grid[i][j].getType() == 1)
{
if(j < pos[1])
{
shift ++;
}
else if(j > pos[1])
{
shift --;
}
}
else if(grid[i][j].getType() == 2)
{
if(j < pos[1])
{
shift --;
}
else if(j > pos[1])
{
shift ++;
}
}
else if(grid[i][j].getType() == 3)
{
if(i < pos[0])
{
shift ++;
}
else if(i > pos[0])
{
shift --;
}
}
else if(grid[i][j].getType() == 4)
{
if(i < pos[0])
{
shift --;
}
else if(i > pos[0])
{
shift ++;
}
}
}
}

return shift;
}

function move()
{
var x = pos[0] + x_shift();
var y = pos[1] + y_shift();

x = ((x%7)+7)%7;
y = ((y%7)+7)%7;

grid[pos[0]][pos[1]].changeTo(0);
grid[x][y].changeTo(5);

pos[0] = x;
pos[1] = y;
}

function checkClear()
{
var gridClear = true;

for(var i = 0; i < 7; i ++)
{
for(var j = 0; j < 7; j ++)
{
if(grid[i][j].getType() > 0 && grid[i][j].getType() < 5)
{
gridClear = false;
}
}
}

return gridClear;
}

function updateClick()
{
ctx.fillStyle = "white";
ctx.fillRect(3, 355, 200, 20);


ctx.font = "24px Calibri";
ctx.fillStyle = "black";
ctx.fillText("Clicks: " + clickCount, 5, 375);
}

function update()
{
if(checkClear() == true)
{
clearInterval(gameLoop);
//alert("Victory!" + "\nIn " + clickCount + " clicks!");


gameOn = false;
scores[level-1] = clickCount;
victoryOn = true;
clearScreen();





ctx.font = "24px Calibri";
ctx.fillStyle = "black";

ctx.fillText("Victory!", 45, 85);

if(clickCount == par[level-1])
{
ctx.fillText("Par!", 45, 105)
}
else if(clickCount < par[level-1])
{
ctx.fillText("You beat par!", 45, 105);
}
else
{
ctx.fillText("But you didn't meet par...", 45, 105);
}

ctx.fillText("Clicks: " + clickCount, 45, 125);


localStorage.setItem("scores", JSON.stringify(scores));


if(victoryOn == false)
{
Menu();
}


}
else
{
move();

drawGrid();
}
}

//sq = new square(0, 0/*, 6, #000000*/);

//ctx.fillRect(sq.row, sq.col, 50, 50);




function NewGame(nlvl)
{
pos[0] = 3;
pos[1] = 3;
clickCount = 0;

victoryOn = false;

createGrid();

grid[3][3].changeTo(5);

switch(nlvl)
{
case 1:

grid[0][3].changeTo(1);
grid[6][3].changeTo(1);

break;
case 2:

grid[0][3].changeTo(1);
grid[1][2].changeTo(2);
grid[2][3].changeTo(1);
grid[6][3].changeTo(3);
grid[4][5].changeTo(4);

break;
case 3:

grid[0][3].changeTo(1);
grid[6][3].changeTo(1);
grid[3][0].changeTo(4);
grid[3][6].changeTo(4);

break;
case 4:

grid[1][1].changeTo(3);
grid[5][5].changeTo(3);
grid[1][5].changeTo(2);
grid[5][1].changeTo(2);
grid[3][2].changeTo(1);
grid[3][4].changeTo(1);

break;
case 5:

grid[1][1].changeTo(1);
grid[1][3].changeTo(2);
grid[1][5].changeTo(1);
grid[5][1].changeTo(1);
grid[5][3].changeTo(2);
grid[5][5].changeTo(1);

break;
case 6:

grid[2][2].changeTo(3);
grid[4][4].changeTo(3);
grid[4][2].changeTo(4);
grid[2][4].changeTo(4);
grid[0][0].changeTo(1);
grid[0][6].changeTo(1);
grid[6][6].changeTo(1);
grid[6][6].changeTo(1);
grid[6][0].changeTo(1);

break;
case 7:

grid[2][2].changeTo(1);
grid[4][4].changeTo(1);
grid[4][2].changeTo(2);
grid[2][4].changeTo(2);
grid[0][0].changeTo(3);
grid[0][6].changeTo(3);
grid[6][6].changeTo(3);
grid[6][0].changeTo(3);

break;
case 8:

grid[2][2].changeTo(2);
grid[2][3].changeTo(2);
grid[2][4].changeTo(2);
grid[3][2].changeTo(2);
grid[3][4].changeTo(2);
grid[4][2].changeTo(2);
grid[4][3].changeTo(2);
grid[4][4].changeTo(2);

grid[0][3].changeTo(3);
grid[6][3].changeTo(3);
grid[3][0].changeTo(3);
grid[3][6].changeTo(3);

break;
case 9:

grid[0][0].changeTo(1);
grid[1][1].changeTo(3);
grid[2][2].changeTo(2);
grid[4][4].changeTo(2);
grid[5][5].changeTo(3);
grid[6][6].changeTo(1);
grid[0][6].changeTo(1);
grid[1][5].changeTo(3);
grid[2][4].changeTo(2);
grid[4][2].changeTo(2);
grid[5][1].changeTo(3);
grid[6][0].changeTo(1);

break;

}
drawGrid();

ctx.font = "24px Calibri";
ctx.fillStyle = "black";
ctx.fillText("Clicks: " + clickCount, 5, 375);
ctx.fillText("Par: " + par[level-1], 5, 395);
ctx.fillText("Menu", 285, 385);
gameLoop = setInterval(update, 500);
/*
if(checkClear() == true)
{
clearInterval(gameLoop);
alert("Victory in " + clickCount + " clicks!");
}
*/

}

function Menu()
{

var loadScores = localStorage.getItem("scores");
loadScores = JSON.parse(loadScores);

for(var i = 0; i < 9; i ++)
{
scores[i] = loadScores[i];
}


level = 0;

clearScreen();

ctx.font = "40px Calibri";
ctx.fillStyle = "black";
ctx.fillText("Rotoshift", 45, 95);

for(var i = 4; i < 6; i ++)
{
for(var j = 2; j < 4; j ++)
{
ctx.beginPath();
ctx.lineWidth = "2";
ctx.strokeStyle = "black";
ctx.rect(50*i, 50*j, 50, 50);
if(i == 4 && j == 2)
{
ctx.fillStyle = "red";
}
else if(i == 4 && j == 3)
{
ctx.fillStyle = "green";
}
else if(i == 5 && j == 2)
{
ctx.fillStyle = "purple";
}
else if(i == 5 && j == 3)
{
ctx.fillStyle = "blue";
}

ctx.fillRect(50*i, 50*j, 50, 50);
ctx.stroke();
}
}

ctx.font = "10px Verdana";
ctx.fillStyle = "black";
ctx.fillText("A game by Josh Haxell", 200, 215);



for(var i = 0; i < 5; i ++)
{
for(var j = 0; j < 2; j ++)
{
level ++;
ctx.beginPath();
ctx.lineWidth = "2";
ctx.rect(175*j, 250+30*i, 175, 30);
ctx.stroke();
if(level < 10)
{

ctx.font = "15px Arial";
ctx.fillStyle = "black";
ctx.fillText("Level " + level, 175*j + 5, 270+30*i);
ctx.fillText("Par: " + par[level-1], 60+175*j, 270+30*i);

if(scores[level-1] != 0)
{
ctx.fillText("Best: " + scores[level-1], 115+ 175*j, 270+30*i);
}
else
{
ctx.fillText("Best: ", 115+ 175*j, 270+30*i);
}
}
/* else
{
ctx.font = "15px Arial";
ctx.fillStyle = "black";
ctx.fillText("Best Scores", 175*j + 5, 270+30*i);
}*/
}



}

}






var pos = [3, 3];

var clickCount = 0;

var scores = [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ];


if(localStorage.getItem("scores")=== null)
{
localStorage.setItem("scores", JSON.stringify(scores));
}


var par = [ 1, 7, 16, 16, 10, 16, 24, 22, 26 ];

var grid = new Array(7);

for(var i = 0; i < 7; i ++)
{
grid[i] = new Array(7);
}

var level = 0;
var gameOn = false;
var gameLoop = 0;
var victoryOn;
var sqType = 1;




clearScreen();

Menu();



</script>


No comments:

Post a Comment