diff --git a/cat.html b/cat.html index a7d729e..b052d25 100644 --- a/cat.html +++ b/cat.html @@ -17,6 +17,7 @@ var things = []; var myScore; var curpath = []; +var pathvalid = false; var MAXDIRS = 4; var DIRXMOD = [ 0, 1, 0, -1 ]; @@ -52,6 +53,26 @@ function getthingxy(x, y) { return null; } +function clearpath() { + curpath = []; + pathvalid = false; +} + +function addtopath(what) { + console.log("addpath() " + what.name); + + dumppath("addpath pre: ", curpath); + + curpath.push(what); + + pathvalid = true; + if (curpath.length == 1) { + console.log("Starting path with " + what.name); + } else { + dumppath("Cur path is: ",curpath); + } +} + function pathcontains(what) { var i; if (curpath == undefined) return false; @@ -64,6 +85,54 @@ function pathcontains(what) { return false; } +function isvalidpath(mypath) { + var valid = true; + + for (i = 0; i < mypath.length - 1; i++) { + var thisone,nextone; + thisone = mypath[i]; + /* + if (i == mypath.length - 1) { // last one + nextone = null; + } else { + nextone = mypath[i+1]; + } + */ + nextone = mypath[i+1]; + + if ((thisone.type == "cat") && nextone.type == "cat") { + // lines of cats are ok + } else if ((i == 0) && (thisone.type == "cat") && (nextone.type == "food")) { + // first cat -> food is ok + } else { + // not ok + valid = false; + break; + } + } + //var pr = "isvalidpath()? " + valid + " "; + //dumppath(pr, mypath); + return valid; +} + +// would adding 'overthing' to our existing path result in a valid path? +function canextendpath(overthing) { + if (!overthing) return false; + + if (overthing && + isadjacent(overthing, curpath[curpath.length-1]) && // adjacent to last thing in path? + !pathcontains(overthing) ) { // path doesn't already contain this? + // create a fake new path containing this. + var fakepath = curpath.slice(); + fakepath.push(overthing); + if (isvalidpath(fakepath)) { + return true; + } + } + + return false; +} + function isadjacent(thing1, thing2) { // is thing1 adjacent to thing2? var newgridx,newgridy; @@ -82,28 +151,22 @@ function isadjacent(thing1, thing2) { function startGame() { var x,y; - /* - myGamePiece = new thing(30, 30, "red", 10, 120); - myGamePiece.gravity = 0.05; - myScore = new thing("30px", "Consolas", "black", 280, 40, "text"); - */ - for (y = 0; y < GRIDH; y++) { for (x = 0; x < GRIDW; x++) { - things.push(new thing(x, y, getrandomname())); + things.push(new thing(x, y, "random")); } } myGameArea.start(); } -function dumppath() { +function dumppath(prefix,arr) { var str; str = ""; - for (i = 0; i < curpath.length; i++) { - str = str + " " + curpath[i].name; + for (i = 0; i < arr.length; i++) { + str = str + " " + arr[i].name; } - console.log("Cur path is: " + str); + console.log(prefix + str); } function thingsmoving() { @@ -164,14 +227,14 @@ var myGameArea = { // make sure nothing is moving if (thingsmoving()) return; - // clear current path - curpath = []; + // clear existing path + clearpath(); // did you click on an object? var onthing = getthingxy(event.pageX,event.pageY); if (onthing) { - curpath.push(onthing); - console.log("Starting path: " + onthing.name); +console.log("Initial click on " + onthing.name); + addtopath(onthing); } }, @@ -182,27 +245,49 @@ var myGameArea = { // existing path? if (curpath != undefined && curpath.length > 0) { var overthing = getthingxy(event.pageX,event.pageY); + var lastinpath; + if (curpath == undefined) { + lastinpath = null; + } else { + lastinpath = curpath[curpath.length-1]; + } - // is overthing adjacent to the last thing in the path? - if (overthing && isadjacent(overthing, curpath[curpath.length-1])) { + if (canextendpath(overthing)) { // add it to the path - curpath.push(overthing); - console.log("Adding to path: " + overthing.name); - dumppath(); + addtopath(overthing); + } else if (pathcontains(overthing)) { + pathvalid = true; + } else { + pathvalid = false; } } }, handlemouseup : function(event) { - // make sure nothing is moving - if (thingsmoving()) return; + var ok = true; + var overthing = getthingxy(event.pageX,event.pageY); + if (thingsmoving()) { + console.log("mouseup() - things are moving"); + ok = false; + } else if (!isvalidpath(curpath)) { + console.log("mouseup() - path isn't valid"); + ok = false; + } else if ((overthing == undefined) || !pathcontains(overthing)) { + console.log("mouseup() - not over something in path"); + ok = false; + } + + if (!ok) { + clearpath(); + return; + } // kill all in path while (curpath != undefined && curpath.length > 0) { curpath[0].kill(); curpath.splice(0, 1); } - curpath = null; + clearpath(); }, } @@ -218,19 +303,42 @@ function getrandomcolour() { function getrandomname() { var letters = '0123456789'; - var name = "cat-"; + var name = ""; for (var i = 0; i < 3; i++ ) { name += letters[Math.floor(Math.random() * 10)]; } return name; } -function thing(gridx, gridy, name) { - this.name = name; +function getrandomtype() { + var pct,type; + pct = Math.random() * 100; + if ( pct < 50) { + type = "cat"; + } else { + type = "food"; + } + return type; +} + +function thing(gridx, gridy, type) { this.width = THINGSIZE; this.height = THINGSIZE; - this.color = getrandomcolour(); + if (type == "random") { + type = getrandomtype(); + } + + this.type = type; + if (this.type == "cat") { + this.color = "#b5dea8"; + } else if (type == "food") { + this.color = "#d8db03"; + } else { + this.color = getrandomcolour(); + } + + this.name = type + "-" + getrandomname(); this.gridx = gridx; if (gridy == "top") { @@ -275,13 +383,23 @@ function thing(gridx, gridy, name) { if (inpath) { ctx.beginPath(); ctx.fillText("PATH", this.x + 10, this.y + (THINGSIZE/2) + 20); - ctx.strokeStyle = "red"; + if (pathvalid) { + ctx.strokeStyle = "green"; + } else { + ctx.strokeStyle = "red"; + } ctx.rect(this.x, this.y, this.width, this.height); ctx.stroke(); } } + this.issametype = function(otherthing) { + if (otherthing == undefined) return false; + if (otherthing.type == this.type) return true; + return false; + } + this.snaptogrid = function() { if (this.y % GRIDSIZE != 0) { this.y = this.gridy * GRIDSIZE; @@ -300,7 +418,7 @@ function thing(gridx, gridy, name) { this.kill = function() { // add a new cat above us - things.push(new thing(this.gridx, "top", getrandomname())); + things.push(new thing(this.gridx, "top", "random")); // kill ourselves var idx = things.indexOf(this); @@ -361,19 +479,6 @@ function updateGameArea() { myGameArea.clear(); myGameArea.draw(); myGameArea.frameNo += 1; - /* - if (myGameArea.frameNo == 1 || everyinterval(150)) { - x = myGameArea.canvas.width; - minHeight = 20; - maxHeight = 200; - height = Math.floor(Math.random()*(maxHeight-minHeight+1)+minHeight); - minGap = 50; - maxGap = 200; - gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap); - things.push(new thing(10, height, "green", x, 0)); - things.push(new thing(10, x - height - gap, "green", x, height + gap)); - } - */ for (i = 0; i < things.length; i += 1) { things[i].draw(); things[i].move(); diff --git a/todo b/todo index 031f52e..94c17d0 100644 --- a/todo +++ b/todo @@ -78,6 +78,7 @@ start: *drag across multi, all disappear, rest fall, new are generated *don't allow clicks until all grid locations are full -then change types of things +*allow cat->food or cat->...->cat +cat eating food should take its place