From dba6a72ba4e5f7dc316a44653cbcea27aa1206e7 Mon Sep 17 00:00:00 2001 From: Matthias Bruch Date: Sat, 17 Feb 2024 04:25:32 +0100 Subject: [PATCH] Neighbour fields and start tile discovery. --- scripts/gameStage.js | 11 ++++- scripts/gameTile.js | 13 ++++-- scripts/mapHelper.js | 108 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 121 insertions(+), 11 deletions(-) diff --git a/scripts/gameStage.js b/scripts/gameStage.js index e012264..487052a 100644 --- a/scripts/gameStage.js +++ b/scripts/gameStage.js @@ -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) { @@ -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) { diff --git a/scripts/gameTile.js b/scripts/gameTile.js index 5eb1ce3..11cbcde 100644 --- a/scripts/gameTile.js +++ b/scripts/gameTile.js @@ -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') { @@ -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); @@ -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'; diff --git a/scripts/mapHelper.js b/scripts/mapHelper.js index 2e595c9..97980ae 100644 --- a/scripts/mapHelper.js +++ b/scripts/mapHelper.js @@ -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) { @@ -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 } }(); \ No newline at end of file