Skip to content

Commit

Permalink
Neighbour fields and start tile discovery.
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthias Bruch committed Feb 17, 2024
1 parent 61a8845 commit dba6a72
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 11 deletions.
11 changes: 9 additions & 2 deletions scripts/gameStage.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ var gameStage = function() {
appInstance.stage.addChild(map[tileKey].sprite);
}
}

markStartTile();
}

function markStartTile() {
var emptyTile = mapHelper.getRandomEmptyTile();

emptyTile.markStartTile();
}

function handleTileMouseDown(mapTile, mouseEvent) {
Expand Down Expand Up @@ -113,8 +121,7 @@ var gameStage = function() {
});
}
else if (mapTile.tileType === 'empty') {
var emptyFields = mapHelper.getAttachedTilesOfType('empty', mapTile.xPos, mapTile.yPos);
var emptyAndNumberFields = mapHelper.extendByOne(emptyFields);
let emptyAndNumberFields = mapHelper.getTilesToReveal({}, mapTile.xPos, mapTile.yPos);

var revealedFields = 0;
for (var tileKey in emptyAndNumberFields) {
Expand Down
13 changes: 10 additions & 3 deletions scripts/gameTile.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,17 @@ var gameTile = function(mapTile, config) {
container.addChild(skullSprite);
}

function createLabel() {
function createLabel(overwriteText, overwriteColor) {
if (textElement) {
textElement.destroy();
textElement = null;
}

let label = null;
if (mapTile.tileType == 'number') {
if (overwriteText) {
label = overwriteText;
}
else if (mapTile.tileType == 'number') {
label = mapTile.bombCount + '';
}
else if (mapTile.tileType == 'bomb') {
Expand All @@ -61,7 +64,7 @@ var gameTile = function(mapTile, config) {
if (label !== null) {
textElement = new PIXI.Text(
label,
labelHelper.getConfigForTileLabel(labelHelper.getColorForLabel(label), true)
labelHelper.getConfigForTileLabel(overwriteColor ? overwriteColor : labelHelper.getColorForLabel(label), true)
);

textElement.x = config.tileWidthAndHeight / 2 - ((mapTile.tileType == 'bomb') ? 10 : 5);
Expand Down Expand Up @@ -183,6 +186,10 @@ var gameTile = function(mapTile, config) {
}
}

mapTile.markStartTile = function() {
createLabel('X', '#000000');
}

container = new PIXI.Container();
container.eventMode = 'static';
container.cursor = 'pointer';
Expand Down
108 changes: 102 additions & 6 deletions scripts/mapHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,13 +153,24 @@ var mapHelper = function() {
for (var tileKey in tileList) {
var loopedTile = tileList[tileKey];

addFieldIfExists(resultList, loopedTile.xPos, loopedTile.yPos - 1);
addFieldIfExists(resultList, loopedTile.xPos - 1, loopedTile.yPos);
addFieldIfExists(resultList, loopedTile.xPos + 1, loopedTile.yPos);
addFieldIfExists(resultList, loopedTile.xPos, loopedTile.yPos + 1);
addFieldIfExists(resultList, loopedTile.xPos - 1, loopedTile.yPos - 1);
addFieldIfExists(resultList, loopedTile.xPos, loopedTile.yPos - 1);
addFieldIfExists(resultList, loopedTile.xPos + 1, loopedTile.yPos - 1);
addFieldIfExists(resultList, loopedTile.xPos - 1, loopedTile.yPos);
// addFieldIfExists(resultList, loopedTile.xPos, loopedTile.yPos);
addFieldIfExists(resultList, loopedTile.xPos + 1, loopedTile.yPos);
addFieldIfExists(resultList, loopedTile.xPos - 1, loopedTile.yPos + 1);
addFieldIfExists(resultList, loopedTile.xPos, loopedTile.yPos + 1);
addFieldIfExists(resultList, loopedTile.xPos + 1, loopedTile.yPos + 1);
}

return {...tileList, ...resultList};
let addedTileKeys = getAddedTileKeys(tileList, resultList);
resultList = {...tileList, ...resultList};

return {
resultList: resultList,
groupedTiles: getGroupedTiles(addedTileKeys)
}
}

function addFieldIfExists(resultList, x, y) {
Expand All @@ -170,11 +181,96 @@ var mapHelper = function() {
}
}

function getGroupedTiles(tileKeyList) {
var info = {
'empty': [],
'bomb': [],
'number': []
};

for (var tileKeyIdx = 0; tileKeyIdx < tileKeyList.length; tileKeyIdx++) {
var tileKey = tileKeyList[tileKeyIdx];

info[map[tileKey].tileType].push(map[tileKey]);
}

return info;
}

function getAddedTileKeys(oldList, newList) {
var addedList = [];

for (var prop in newList) {
if (!oldList.hasOwnProperty(prop)) {
addedList.push(prop);
}
}

return addedList;
}

function getRandomTile() {
var randomX = Math.floor(Math.random() * config.columns);
var randomY = Math.floor(Math.random() * config.rows);

var tileKey = randomX + '_' + randomY;
return map[tileKey];
}

function getRandomEmptyTile() {
let randomTile = null;

do
{
randomTile = getRandomTile();
}
while (randomTile.tileType != 'empty');

return randomTile;
}

function getTilesToReveal(tileList, xPos, yPos) {

var tileKey = xPos + '_' + yPos;
var mapTile = map[tileKey];

if (mapTile.tileType === 'empty')
{
// If empty, discover all neighbour fields.
var emptyFields = mapHelper.getAttachedTilesOfType('empty', mapTile.xPos, mapTile.yPos);

// Add the new tiles to the existing list if new ones were discovered.
if (getAddedTileKeys(tileList, emptyFields).length) {
tileList = Object.assign(tileList, emptyFields);

// If we have new empty tiles, extend the revealed area by 1.
var extensionResult = mapHelper.extendByOne(emptyFields);

// Add the extension to the summary.
tileList = Object.assign(tileList, extensionResult.resultList);

// If new empty tiles have been discovered...
if (extensionResult.groupedTiles.empty.length) {
// Do the same logic for each newly discovered empty field.
for (var i = 0; i < extensionResult.groupedTiles.empty.length; i++) {
var emptyTileInExtension = extensionResult.groupedTiles.empty[i];
getTilesToReveal(tileList, emptyTileInExtension.xPos, emptyTileInExtension.yPos);
}
}

}
}

return tileList;
}

return {
generateMap: generateMap,
getBatchTiles: getBatchTiles,
getAttachedTilesOfType: getAttachedTilesOfType,
extendByOne: extendByOne,
getRowTiles: getRowTiles
getRowTiles: getRowTiles,
getRandomEmptyTile: getRandomEmptyTile,
getTilesToReveal: getTilesToReveal
}
}();

0 comments on commit dba6a72

Please sign in to comment.