Witajcie, mam za zadanie napisać grę typu lights out. Wymagane w zadaniu jest aby po wciśnięciu przycisku "pomoc", "podpowiedzi" czy "help" (nieistotne) program pokazywał jak wciskać klawisze aby rozwiązać dany schemat. Sam core programu napisałem i wygląda to tak:

screenshot-20201114151109.png

Problem mam z tym jak uzyskac te podpowiedzi - jakiego algorytmu użyć. Będę wdzięczny za jakąkolwiek pomoc :3

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="author" content="Remigiusz Drobinski">
        <title>Lights Out</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="style.css">
        <script type="text/javascript"  src="script.js" charset="utf-8" defer></script>
    </head>
    <body onload="generateButtons(defaultRowSize, defaultColumnSize); randomizeLights(); addControls();">

        <footer>
            Autor: Remigiusz Drobinski
        </footer>
    </body>
</html>
[defaultRowSize, defaultColumnSize] = [9, 9];

function generateButtons(rowSize, columnSize) {
	var rowId, columnId;
	var buttonObject;
	for(rowId = 0; rowId < rowSize; rowId++) {
		for(columnId = 0; columnId < columnSize; columnId++) {
			buttonObject = document.createElement("input");
			buttonObject["type"] = "button";
			buttonObject["id"] = rowId*columnSize + columnId;
			buttonObject["className"] = "lightOn";
			buttonObject.addEventListener("click", function(){clickButton(parseInt(this.id))});
			document.body.appendChild(buttonObject);
		}
		document.body.appendChild(document.createElement("br"));
	}
}

function deleteButtons(rowSize, columnSize) {
	for(var i=0; i < rowSize*(1+columnSize); i++)
		document.body.removeChild(document.body.lastChild);
}

function clickButton(buttonId) {
	var adjacentObjectArray = [document.getElementById(buttonId)];
	var leftId = buttonId - 1;
	var rightId = buttonId + 1;
	var upId = buttonId - defaultColumnSize;
	var downId = buttonId + defaultColumnSize;
	if((leftId+1)%defaultColumnSize != 0)
		adjacentObjectArray.push(document.getElementById(leftId));
	if(rightId%defaultColumnSize != 0)
		adjacentObjectArray.push(document.getElementById(rightId));
	if(upId >= 0)
		adjacentObjectArray.push(document.getElementById(upId));
	if(downId < defaultRowSize * defaultColumnSize)
		adjacentObjectArray.push(document.getElementById(downId));
	for(let adjacentObject of adjacentObjectArray)
		adjacentObject["className"] = (adjacentObject["className"] == "lightOn") ? "lightOff" : "lightOn";
}

function randomizeLights() {
	for(var i=0; i<defaultRowSize*defaultColumnSize; i++)
		clickButton(Math.floor(Math.random()*defaultRowSize*defaultColumnSize));
}

function addControls() {
	document.body.addEventListener("keydown", 
		function(e) {
			if(e.key == "r" || e.key == "R") randomizeLights();
		}
	);
}
input[type="button"] {
	width: 80;
	height: 80;
}

.lightOn {
	background-color: white;
}

.lightOff {
	background-color: black;
}