369 lines
9.1 KiB
JavaScript

class GridCell {
constructor(_id, xpos, ypos) {
this.id = _id;
this.x = xpos;
this.y = ypos;
this.passed = false;
this.text = 0;
this.step = true;
this.motionDetector = false;
this.motionID = -2;
}
startTimer(interval) {
var dOld = new Date();
var nOld;
if (this.motionID == globalMotionID){
nOld = globalMotionTime;
}
else{
nOld = dOld.getTime();
}
var x = this.x;
var y = this.y;
var mid = this.motionID;
var counter = setInterval(function(){
var dNow = new Date();
var nNow = dNow.getTime();
var ntime = Math.round(((interval*1000) - (nNow - nOld))/10) / 100;
if(globalx != x){
clearInterval(counter);
globalMotionID = mid;
globalMotionTime = nOld;
if (grid[globalx][globaly].motionDetector == true){
grid[globalx][globaly].startTimer(5);
}
else{
globalMotionID = -1;
globalMotionTime = 0;
document.getElementById("timer").innerHTML = 0.00;
isFirtHardCellClick = true;
}
}
else if (ntime <= 0){
clearInterval(counter);
document.getElementById("timer").innerHTML = 0.00;
state = "endOfGame";
}
else{
document.getElementById("timer").innerHTML = ntime;
}
if (document.getElementById("timer").innerHTML == "0"){
document.getElementById("timer").innerHTML = "0.00";
}
}, 1);
}
}
var width = 0;
var height = 0;
var state;
var cnt = 1;
var grid = [];
var running = false;
var globalx;
var globaly;
var globalMotionID = -1;
var globalMotionTime = 0;
var steps = 0;
var startx = 0;
var starty = 0;
var areas = 0;
var sizes = [];
var isFirtHardCellClick = true;
var hardSizes = [];
var hardCenters = [];
function distance(a, b) {
const dx = a[0] - b[0];
const dy = a[1] - b[1];
return(Math.sqrt(dx*dx + dy*dy)); //Math.hypot(dx, dy)
}
function start() {
if (!running) {
running = true;
generate();
if (document.getElementById("hard").checked == true)
{
document.getElementById("timer").innerHTML = "0.0";
areas = Math.floor(height*width/20);
for (let i = 0; i < areas && i < 4; i++)
{
sizes.push(3 + i * 2);
}
hardMode();
}
}
}
function time() {
var dOld = new Date();
var nOld = dOld.getTime();
if (state != "endOfGame") {
var counter = setInterval(function(){
var dNow = new Date();
var nNow = dNow.getTime();
timeElasped = Math.floor((nNow-nOld) / 1000);
document.getElementById("counter").innerHTML = timeElasped;
if(state == "endOfGame"){
clearInterval(counter);
if (cnt == width * height + 1) {
result = circleSolution();
if (result) {
alert("GG! Ön egy körútvonalat talált!!! Noice!");
reset();
}
else{
alert("Nyertél!");
reset();
}
}
else {
alert("Vesztettél!");
reset();
}
}
}, 10);
}
}
function generate() {
width = parseInt(document.getElementById("width").value);
height = parseInt(document.getElementById("height").value);
id = 0;
if (width >= 5 && height >= 5) {
table = document.getElementById("table");
for (let i = 0; i < height; i++) {
row = table.insertRow(-1);
grid.push([]);
for (let j = 0; j < width; j++) {
grid[i].push(new GridCell(id, i, j));
cell = row.insertCell(-1);
cell.setAttribute("class", "cell");
cell.setAttribute("id", id);
cell.setAttribute("onclick", "cellClick(" + id + ", " + i + ", " + j + ")");
id += 1;
}
}
}
else {
state = "endOfGame";
alert("Rossz adat!");
}
}
function cellClick(id, i, j) {
if (grid[i][j].step)
{
document.getElementById(grid[i][j].id).classList.toggle("currentCell", true);
grid[i][j].passed = true;
grid[i][j].text = cnt;
if (cnt == 1) {
time();
startx = j;
starty = i;
for (let k = 0; k < height; k++)
{
for (let l = 0; l < width; l++)
{
document.getElementById(grid[k][l].id).classList.toggle("cell", false);
}
}
}
else {
document.getElementById(grid[globalx][globaly].id).classList.toggle("currentCell", false);
document.getElementById(grid[globalx][globaly].id).classList.toggle("passedCell", true);
}
globalx = i;
globaly = j;
cnt += 1;
document.getElementById(id).innerHTML = grid[i][j].text;
search();
if (isFirtHardCellClick && grid[i][j].motionDetector == true){
if (grid[i][j].motionDetector == true){
grid[i][j].startTimer(5);
}
else{
globalMotionID = -1;
globalMotionTime = 0;
document.getElementById("timer").innerHTML = 0.00;
}
isFirtHardCellClick = false;
}
}
}
function search() {
steps = 0;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
grid[i][j].step = false;
document.getElementById(grid[i][j].id).classList.toggle("stepCell", false);
}
}
cellCheck(globalx+2, globaly-1);
cellCheck(globalx+2, globaly+1);
cellCheck(globalx-2, globaly-1);
cellCheck(globalx-2, globaly+1);
cellCheck(globalx-1, globaly-2);
cellCheck(globalx-1, globaly+2);
cellCheck(globalx+1, globaly-2);
cellCheck(globalx+1, globaly+2);
if (steps == 0)
{
running = false;
state = "endOfGame";
}
}
function cellCheck(targetx, targety) {
if (grid[targetx] != undefined)
{
if (grid[targetx][targety] != undefined)
{
if (grid[targetx][targety].text == 0)
{
grid[targetx][targety].step = true;
document.getElementById(grid[targetx][targety].id).classList.toggle("stepCell", true);
steps++;
}
}
}
}
function circleSolution(){
if (globalx - 1 == startx && globaly - 2 == starty) {
return true;
}
else if (globalx + 1 == startx && globaly - 2 == starty) {
return true;
}
else if (globalx - 2 == startx && globaly - 1 == starty) {
return true;
}
else if (globalx - 2 == startx && globaly + 1 == starty) {
return true;
}
else if (globalx + 2 == startx && globaly - 1 == starty) {
return true;
}
else if (globalx + 1 == startx && globaly + 1 == starty) {
return true;
}
else if (globalx - 1 == startx && globaly + 2 == starty) {
return true;
}
else if (globalx + 1 == startx && globaly + 2 == starty) {
return true;
}
else{
return false;
}
}
var hc = 0;
function hardMode() {
for (let i = 0; i < areas; i++)
{
var centers = [];
hardSizes.push(sizes[Math.floor(Math.random()*sizes.length)]);
var circle = false;
for (let j = 0; j < grid.length; j++){
for (let k = 0; k < grid[j].length; k++){
var result = isAway([j, k]);
if (result){
centers.push([j, k]);
circle = true;
}
}
}
if (circle){
hardCenters.push(centers[Math.floor(Math.random() * centers.length)]);
createCircle(hardSizes[i], hardCenters[i], i);
}
else{
hardCenters.push([-1000, -1000]);
hc++;
}
}
console.log(hc);
}
function isAway(o) {
for (let i = 0; i < hardCenters.length; i++) {
if (distance(o, hardCenters[i]) < (hardSizes[i] - 1) / 2 + (hardSizes[hardSizes.length -1] - 1) / 2 + 1.5)
{
return false;
}
}
return true;
}
function createCircle(size, pos, id) {
hardCells(pos[0], pos[1]);
for (var i = 0; i < (size - 1) / 2; i++) {
hardCells(pos[0] + i + 1, pos[1], id);
hardCells(pos[0] - (i + 1), pos[1], id);
hardCells(pos[0], pos[1] + i + 1, id);
hardCells(pos[0], pos[1] - (i + 1), id);
}
if (Math.random() < 0.5){
for (var i = 0; i < (size - 1) / 2 - 1; i++) {
for (var j = 0; j < (size - 1) / 2 - i ; j++) {
hardCells(pos[0] - (i + 1), pos[1] - j, id);
hardCells(pos[0] + (i + 1), pos[1] - j, id);
hardCells(pos[0] - (i + 1), pos[1] + j, id);
hardCells(pos[0] + (i + 1), pos[1] + j, id);
}
}
}
else{
for (var i = 0; i < (size - 1) / 2; i++) {
for (var j = 0; j < (size - 1) / 2 - (i - 1); j++) {
hardCells(pos[0] - (i + 1), pos[1] - j, id);
hardCells(pos[0] + (i + 1), pos[1] - j, id);
hardCells(pos[0] - (i + 1), pos[1] + j, id);
hardCells(pos[0] + (i + 1), pos[1] + j, id);
}
}
}
}
function hardCells(targetx, targety, id) {
if (grid[targetx] != undefined)
{
if (grid[targetx][targety] != undefined)
{
document.getElementById(grid[targetx][targety].id).classList.toggle("hardCell", true);
grid[targetx][targety].motionDetector = true;
grid[targetx][targety].motionID = id;
}
}
}
function reset(){
width = 0;
height = 0;
state = null;
cnt = 1;
grid = [];
running = false;
globalx = 0;
globaly = 0;
steps = 0;
startx = 0;
starty = 0;
areas = 0;
globalMotionID = -1;
globalMotionTime = 0;
document.getElementById("counter").innerHTML = "0";
document.getElementById("timer").innerHTML = "0.00";
document.getElementById("table").innerHTML = "";
}