From 33354ef7e2ac273a04fdfa9287e706e344d2db57 Mon Sep 17 00:00:00 2001 From: Roman Konoval Date: Sun, 17 Feb 2013 12:27:34 +0200 Subject: [PATCH 1/8] Added possibility to push jellies --- src/index.html | 3 +-- src/jelly.coffee | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/index.html b/src/index.html index b65b8b7..74538ea 100644 --- a/src/index.html +++ b/src/index.html @@ -118,7 +118,7 @@

jelly

- + @@ -133,7 +133,6 @@

jelly

Here's the source. To be implemented:

    -
  1. Pushing of blocks (necessary for level 3).
  2. A "you win" screen when you win.

diff --git a/src/jelly.coffee b/src/jelly.coffee index c442517..506e1a4 100644 --- a/src/jelly.coffee +++ b/src/jelly.coffee @@ -61,6 +61,11 @@ levels = [ CELL_SIZE = 48 +Array::unique = -> + output = {} + output[@[key]] = @[key] for key in [0...@length] + value for key, value of output + moveToCell = (dom, x, y) -> dom.style.left = x * CELL_SIZE + 'px' dom.style.top = y * CELL_SIZE + 'px' @@ -131,8 +136,16 @@ class Stage cell.style[attr] = border unless other and other.tagName == 'TD' return - trySlide: (jelly, dir) -> - return if @checkFilled(jelly, dir, 0) + canSlide: (jelly, dir) -> + obstacles = @checkFilled(jelly, dir, 0) + for obstacle in obstacles + return false unless @canSlide(obstacle, dir) + return true + + slide: (jelly, dir) -> + obstacles = @checkFilled(jelly, dir, 0) + for obstacle in obstacles + @slide(obstacle, dir) @busy = true @move(jelly, jelly.x + dir, jelly.y) jelly.slide dir, () => @@ -140,6 +153,10 @@ class Stage @checkForMerges() @busy = false + trySlide: (jelly, dir) -> + return unless @canSlide(jelly, dir) + @slide(jelly, dir) + move: (jelly, targetX, targetY) -> @cells[y][x] = null for [x, y] in jelly.cellCoords() jelly.updatePosition(targetX, targetY) @@ -147,17 +164,19 @@ class Stage return checkFilled: (jelly, dx, dy) -> + obstacles = [] for [x, y] in jelly.cellCoords() next = @cells[y + dy][x + dx] - return next if next and next != jelly - return false + if next and next != jelly + obstacles.push next + return obstacles.unique() checkFall: -> moved = true while moved moved = false for jelly in @jellies - if not @checkFilled(jelly, 0, 1) + if @checkFilled(jelly, 0, 1).length == 0 @move(jelly, jelly.x, jelly.y + 1) moved = true return From 3a1e8701b78eba42a1767a53b2f249184f601dab Mon Sep 17 00:00:00 2001 From: Roman Konoval Date: Fri, 22 Feb 2013 13:22:02 +0200 Subject: [PATCH 5/8] Added tests --- .gitignore | 1 + src/index.html | 1 + src/jelly.coffee | 31 ++++++---- test/jellyTest.coffee | 112 ++++++++++++++++++++++++++++++++++++ test/test.html | 130 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 263 insertions(+), 12 deletions(-) create mode 100644 test/jellyTest.coffee create mode 100644 test/test.html diff --git a/.gitignore b/.gitignore index 722cb3e..f15aebb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /src/jelly.js +/test/jellyTest.js diff --git a/src/index.html b/src/index.html index 74538ea..2d5ef10 100644 --- a/src/index.html +++ b/src/index.html @@ -140,5 +140,6 @@

jelly

don't have the patience to test on other browsers.

+ diff --git a/src/jelly.coffee b/src/jelly.coffee index 506e1a4..6ec52dc 100644 --- a/src/jelly.coffee +++ b/src/jelly.coffee @@ -270,15 +270,22 @@ class Jelly cell.dom.style.borderTop = 'none' return -level = parseInt(location.search.substr(1), 10) or 0 -stage = new Stage(document.getElementById('map'), levels[level]) -window.stage = stage - -levelPicker = document.getElementById('level') -levelPicker.value = level -levelPicker.addEventListener 'change', () -> - location.search = '?' + levelPicker.value - -document.getElementById('reset').addEventListener 'click', -> - stage.dom.innerHTML = '' - stage = new Stage(stage.dom, levels[level]) +run = -> + level = parseInt(location.search.substr(1), 10) or 0 + stage = new Stage(document.getElementById('map'), levels[level]) + window.stage = stage + + levelPicker = document.getElementById('level') + levelPicker.value = level + levelPicker.addEventListener 'change', () -> + location.search = '?' + levelPicker.value + + document.getElementById('reset').addEventListener 'click', -> + stage.dom.innerHTML = '' + stage = new Stage(stage.dom, levels[level]) + +global = exports ? this +global.run = run +global.Stage = Stage +global.Jelly = Jelly + diff --git a/test/jellyTest.coffee b/test/jellyTest.coffee new file mode 100644 index 0000000..fc82c09 --- /dev/null +++ b/test/jellyTest.coffee @@ -0,0 +1,112 @@ + +global = exports ? this + +left=-1 +right=1 + +tests = [ + name: "move left single jelly to empty block" + action: + move: left + row: 1 + col: 2 + input: [ + "xxxx", + "x rx", + "xxxx", ] + result: [ + "xxxx", + "xr x", + "xxxx", ] + , + name: "move left with adjacent jelly" + action: + move: left + row: 1 + col: 3 + input: [ "xxxxx", + "x rgx", + "xxxxx", ] + result: [ "xxxxx", + "xrg x", + "xxxxx", ] + , + name: "move left pushing several jellies" + action: + move: left + row: 1 + col: 4 + input: [ "xxxxxx", + "x rgbx", + "xxxxxx", ] + result: [ "xxxxxx", + "xrgb x", + "xxxxxx", ] + , + name: "move left a tower pushing tower of several jellies" + action: + move: left + row: 2 + col: 3 + input: [ "xxxxx", + "x bgx", + "x rgx", + "xxxxx", ] + result: [ "xxxxx", + "xbg x", + "xrg x", + "xxxxx", ] + , +] + +runTest = (test) -> + testsDiv = document.getElementById('tests') + testDiv = document.createElement('div') + testsDiv.appendChild(testDiv) + stage = createStage(testDiv, test.input) + stage.trySlide(stage.cells[test.action.row][test.action.col], test.action.move) + + actual = [] + for y in [0...stage.cells.length] + row = "" + for x in [0...stage.cells[0].length] + cell = stage.cells[y][x] + if cell + if cell instanceof global.Jelly + r = cell.color[0] + else + r = "x" + else + r = " " + row += r + actual.push row + return actual + +addStageToResult = (resultDiv, className, stage) -> + div = document.createElement('div') + div.className = 'stage ' + className + resultDiv.appendChild(div) + new createStage(div, stage) + +addName = (resultDiv, name) -> + div = document.createElement('div') + resultDiv.appendChild(div) + div.innerHTML = name + +createStage = (dom, stage) -> + stage = new global.Stage(dom, stage) + stage.showCongrats = -> + return stage + +addResult = (test, actual) -> + resultsDiv = document.getElementById('results') + resultDiv = document.createElement('div') + resultDiv.className = if ("#{actual}" is "#{test.result}") then 'success' else 'failure' + resultsDiv.appendChild(resultDiv) + addName(resultDiv, test.name) + addStageToResult(resultDiv, 'initial', test.input) + addStageToResult(resultDiv, 'actual', actual) + addStageToResult(resultDiv, 'expected', test.result) + +for test in tests + addResult(test, runTest(test)) diff --git a/test/test.html b/test/test.html new file mode 100644 index 0000000..e226891 --- /dev/null +++ b/test/test.html @@ -0,0 +1,130 @@ + + + +jelly no puzzle tests + + + + +

Tests

+ +
+ +
+ + + + + + From e6ce14cda5713ebffc2292d027b4bb24fb190427 Mon Sep 17 00:00:00 2001 From: Roman Konoval Date: Fri, 22 Feb 2013 23:07:38 +0200 Subject: [PATCH 6/8] Added tests --- test/jellyTest.coffee | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/jellyTest.coffee b/test/jellyTest.coffee index fc82c09..79b5daf 100644 --- a/test/jellyTest.coffee +++ b/test/jellyTest.coffee @@ -57,6 +57,20 @@ tests = [ "xrg x", "xxxxx", ] , + name: "move left a tower pushing tower of several jellies" + action: + move: left + row: 1 + col: 3 + input: [ "xxxxx", + "x bgx", + "x rgx", + "xxxxx", ] + result: [ "xxxxx", + "xbg x", + "xrg x", + "xxxxx", ] + , ] runTest = (test) -> From bc7ef4fd78ce4f9cc57eceac82102c10522707c9 Mon Sep 17 00:00:00 2001 From: Roman Konoval Date: Fri, 22 Feb 2013 23:09:14 +0200 Subject: [PATCH 7/8] Added tests --- src/jelly.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/jelly.coffee b/src/jelly.coffee index 6ec52dc..6f7a180 100644 --- a/src/jelly.coffee +++ b/src/jelly.coffee @@ -144,8 +144,7 @@ class Stage slide: (jelly, dir) -> obstacles = @checkFilled(jelly, dir, 0) - for obstacle in obstacles - @slide(obstacle, dir) + @slide(obstacle, dir) for obstacle in obstacles @busy = true @move(jelly, jelly.x + dir, jelly.y) jelly.slide dir, () => From c44cc406bb8ecf956ef21a62141ef09e94d55fdf Mon Sep 17 00:00:00 2001 From: Roman Konoval Date: Fri, 22 Feb 2013 23:37:22 +0200 Subject: [PATCH 8/8] adde *.js to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e69de29..a6c7c28 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +*.js