add .next to fieldStream to calculate liveNeighbors of each Cell
This commit is contained in:
parent
bf239fe656
commit
9c52a320eb
4 changed files with 147 additions and 19 deletions
|
@ -31,9 +31,15 @@ class CellStream extends Stream {
|
||||||
get living() {
|
get living() {
|
||||||
return this.head.living;
|
return this.head.living;
|
||||||
}
|
}
|
||||||
|
get liveNeighbors() {
|
||||||
|
return this.head.liveNeighbors;
|
||||||
|
}
|
||||||
set liveNeighbors(liveNeighbors) {
|
set liveNeighbors(liveNeighbors) {
|
||||||
this.head.liveNeighbors = liveNeighbors;
|
this.head.liveNeighbors = liveNeighbors;
|
||||||
}
|
}
|
||||||
|
addLiveNeighbor() {
|
||||||
|
this.head.addLiveNeighbor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const cellStream = (living = false, liveNeighbors = 0) => {
|
const cellStream = (living = false, liveNeighbors = 0) => {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const { cellStream } = require("./Cell");
|
const { cellStream } = require("./Cell");
|
||||||
const { Stream } = require("../utils");
|
const { Stream, getNeighbors } = require("../utils");
|
||||||
|
|
||||||
class GameField {
|
class GameField {
|
||||||
constructor({ fieldArray = [], fieldMap = {} }) {
|
constructor({ fieldArray = [], fieldMap = {} }) {
|
||||||
|
@ -8,7 +8,7 @@ class GameField {
|
||||||
fieldArray.forEach((subArray, majorIndex) =>
|
fieldArray.forEach((subArray, majorIndex) =>
|
||||||
subArray.forEach((value, minorIndex) => {
|
subArray.forEach((value, minorIndex) => {
|
||||||
if (value > 0) {
|
if (value > 0) {
|
||||||
this.map[`${majorIndex}-${minorIndex}`] = cellStream(true, 0);
|
this.map[`${majorIndex},${minorIndex}`] = cellStream(true, 0);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
@ -27,18 +27,26 @@ class FieldStream extends Stream {
|
||||||
get map() {
|
get map() {
|
||||||
return this.head.map;
|
return this.head.map;
|
||||||
}
|
}
|
||||||
|
addLiveNeighbor(key) {
|
||||||
|
if (this.map[key] === undefined) {
|
||||||
|
this.map[key] = new cellStream(false);
|
||||||
|
}
|
||||||
|
this.map[key].addLiveNeighbor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const fieldStream = ({ fieldArray, fieldMap }) => {
|
const fieldStream = ({ fieldArray, fieldMap }) => {
|
||||||
return new FieldStream(new GameField({ fieldArray, fieldMap }), function () {
|
return new FieldStream(new GameField({ fieldArray, fieldMap }), function () {
|
||||||
// calculate liveNeighbors for all cells on first next call
|
// calculate liveNeighbors for all cells on first next call
|
||||||
|
for (const key in this.map) {
|
||||||
new FieldStream({}, function () {
|
getNeighbors(key).forEach((neighbor) => this.addLiveNeighbor(neighbor));
|
||||||
|
}
|
||||||
|
this.tail = function () {
|
||||||
// call .next on all Cells on second next call
|
// call .next on all Cells on second next call
|
||||||
});
|
};
|
||||||
|
return this;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// as a stream -> fieldStream => Stream(GameField, () => Stream(fieldStream.computeNeighbors(), () => Stream(fieldStream.setLiving()))
|
// as a stream -> fieldStream => Stream(GameField, () => Stream(fieldStream.computeNeighbors(), () => Stream(fieldStream.setLiving()))
|
||||||
|
|
||||||
// instantiate table (orientation of major and minor axis dependent on viewport)
|
// instantiate table (orientation of major and minor axis dependent on viewport)
|
||||||
|
|
|
@ -1,23 +1,22 @@
|
||||||
import { GameField, fieldStream } from "../components/GameField";
|
import { GameField, fieldStream } from "../components/GameField";
|
||||||
|
|
||||||
|
describe("Game Field seeds living Cells with array", () => {
|
||||||
const fieldArray = [
|
const fieldArray = [
|
||||||
[0, 1, 0],
|
[0, 1, 0],
|
||||||
[1, 0, 1],
|
[1, 0, 1],
|
||||||
];
|
];
|
||||||
|
|
||||||
const fieldMap = {
|
const fieldMap = {
|
||||||
"0-0": true,
|
"0,0": true,
|
||||||
"0-2": true,
|
"0,2": true,
|
||||||
"1-1": true,
|
"1,1": true,
|
||||||
};
|
};
|
||||||
|
|
||||||
describe("Game Field seeds living Cells with array", () => {
|
|
||||||
const gameArraySeed = new GameField({ fieldArray });
|
const gameArraySeed = new GameField({ fieldArray });
|
||||||
const gameMapSeed = new GameField({ fieldMap });
|
const gameMapSeed = new GameField({ fieldMap });
|
||||||
const streamArraySeed = fieldStream({ fieldArray });
|
const streamArraySeed = fieldStream({ fieldArray });
|
||||||
const streamMapSeed = fieldStream({ fieldMap });
|
const streamMapSeed = fieldStream({ fieldMap });
|
||||||
|
|
||||||
["0-1", "1-0", "1-2"].forEach((key) => {
|
["0,1", "1,0", "1,2"].forEach((key) => {
|
||||||
test(`Array seed: ${key} should equal living Cell`, () => {
|
test(`Array seed: ${key} should equal living Cell`, () => {
|
||||||
expect(gameArraySeed.map[key].living).toEqual(true);
|
expect(gameArraySeed.map[key].living).toEqual(true);
|
||||||
});
|
});
|
||||||
|
@ -35,7 +34,7 @@ describe("Game Field seeds living Cells with array", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
["0-0", "0-2", "1-1"].forEach((key) => {
|
["0,0", "0,2", "1,1"].forEach((key) => {
|
||||||
test(`Array seed: ${key} should equal undefined`, () => {
|
test(`Array seed: ${key} should equal undefined`, () => {
|
||||||
expect(gameArraySeed.map[key]).toEqual(undefined);
|
expect(gameArraySeed.map[key]).toEqual(undefined);
|
||||||
});
|
});
|
||||||
|
@ -53,3 +52,103 @@ describe("Game Field seeds living Cells with array", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("fieldStream.next calculates liveNeighbors", () => {
|
||||||
|
const fieldArray = [
|
||||||
|
[0, 1, 0],
|
||||||
|
[1, 0, 1],
|
||||||
|
];
|
||||||
|
const testStream = fieldStream({ fieldArray });
|
||||||
|
[
|
||||||
|
["-1,0", 1],
|
||||||
|
["-1,1", 1],
|
||||||
|
["-1,2", 1],
|
||||||
|
["0,-1", 1],
|
||||||
|
["0,0", 2],
|
||||||
|
["0,1", 2],
|
||||||
|
["0,2", 2],
|
||||||
|
["0,3", 1],
|
||||||
|
["1,-1", 1],
|
||||||
|
["1,0", 1],
|
||||||
|
["1,1", 3],
|
||||||
|
["1,2", 1],
|
||||||
|
["1,3", 1],
|
||||||
|
["2,-1", 1],
|
||||||
|
["2,0", 1],
|
||||||
|
["2,1", 2],
|
||||||
|
["2,2", 1],
|
||||||
|
["2,3", 1],
|
||||||
|
].forEach(([key, liveNeighbors]) => {
|
||||||
|
test(`after .next ${key} in 1st should have ${liveNeighbors} liveNeighbors`, () => {
|
||||||
|
expect(testStream.next.map[key].liveNeighbors).toEqual(liveNeighbors);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const fieldMap = {
|
||||||
|
"0,1": true,
|
||||||
|
"0,2": true,
|
||||||
|
"1,0": true,
|
||||||
|
"1,1": true,
|
||||||
|
"1,3": true,
|
||||||
|
"2,1": true,
|
||||||
|
"2,2": true,
|
||||||
|
};
|
||||||
|
const testStream2 = fieldStream({ fieldMap });
|
||||||
|
[
|
||||||
|
["-1,0", 1],
|
||||||
|
["-1,1", 2],
|
||||||
|
["-1,2", 2],
|
||||||
|
["-1,3", 1],
|
||||||
|
["0,-1", 1],
|
||||||
|
["0,0", 3],
|
||||||
|
["0,1", 3],
|
||||||
|
["0,2", 3],
|
||||||
|
["0,3", 2],
|
||||||
|
["0,4", 1],
|
||||||
|
["1,-1", 1],
|
||||||
|
["1,0", 3],
|
||||||
|
["1,1", 5],
|
||||||
|
["1,2", 6],
|
||||||
|
["1,3", 2],
|
||||||
|
["1,4", 1],
|
||||||
|
["2,-1", 1],
|
||||||
|
["2,0", 3],
|
||||||
|
["2,1", 3],
|
||||||
|
["2,2", 3],
|
||||||
|
["2,3", 2],
|
||||||
|
["2,4", 1],
|
||||||
|
["3,0", 1],
|
||||||
|
["3,1", 2],
|
||||||
|
["3,2", 2],
|
||||||
|
["3,3", 1],
|
||||||
|
].forEach(([key, liveNeighbors]) => {
|
||||||
|
test(`after .next ${key} in 2nd should have ${liveNeighbors} liveNeighbors`, () => {
|
||||||
|
expect(testStream2.next.map[key].liveNeighbors).toEqual(liveNeighbors);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe.skip("fieldStream.next tests still lifes", () => {
|
||||||
|
const blockArray = [
|
||||||
|
[1, 1],
|
||||||
|
[1, 1],
|
||||||
|
];
|
||||||
|
|
||||||
|
streamBlock = fieldStream({ fieldArray: blockArray });
|
||||||
|
["0,0", "0,1", "1,0", "1,1"].forEach((key) => {});
|
||||||
|
|
||||||
|
const beehiveMap = {
|
||||||
|
"0,1": true,
|
||||||
|
"0,2": true,
|
||||||
|
"1,0": true,
|
||||||
|
"1,3": true,
|
||||||
|
"2,1": true,
|
||||||
|
"2,2": true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const boatArray = [
|
||||||
|
[1, 1, 0],
|
||||||
|
[1, 0, 1],
|
||||||
|
[0, 1, 0],
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
|
@ -13,6 +13,21 @@ class Stream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getNeighbors = (key) => {
|
||||||
|
const [x, y] = key.split(",").map((str) => parseInt(str));
|
||||||
|
return [
|
||||||
|
[x - 1, y - 1],
|
||||||
|
[x - 1, y],
|
||||||
|
[x - 1, y + 1],
|
||||||
|
[x, y - 1],
|
||||||
|
[x, y + 1],
|
||||||
|
[x + 1, y - 1],
|
||||||
|
[x + 1, y],
|
||||||
|
[x + 1, y + 1],
|
||||||
|
].map((arr) => arr.join(","));
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
Stream,
|
Stream,
|
||||||
|
getNeighbors,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue