Use arrows to "move" the missing piece. You can also switch any two pieces by clicking them one after the other (these are not legal moves). Control click to hide\show the game piece. In the challenge mode you get a solvable board and you can only use legal moves (using the arrows, shift).
A fork of Mega 15 puzzle+ by 5tothe7thpower (5^7 = 78125)
xxxxxxxxxx
var puzzle;
var gridBoard;
var cellSize = 50;
var rows = 11;
var columns = 11;
var mainCanvas;
var boardLoc;
function setup() {
mainCanvas = createCanvas(windowWidth, windowHeight);
createUI();
setBoardSize(rows,columns);
}
function switchLastBlocks(puzzle){
var rows = puzzle.h;
var columns = puzzle.w;
if (rows*columns<=2)
return;
if (columns==1){
puzzle.quickSwitchCells([rows-2, 0], [rows-3, 0]);
return;
}
if (rows==1){
puzzle.quickSwitchCells([0, columns-2], [0, columns-3]);
return;
}
//at least 2 rows and 2 columns
if (columns==2){
puzzle.quickSwitchCells([rows-1, 0], [rows-2, columns-1]);
return;
}
puzzle.quickSwitchCells([rows-1, columns-2], [rows-1, columns-3]);
}
function setBoardSize(rows, columns){
gridBoard = new GridBoard(columns,rows);
puzzle = new PermutationPuzzle(columns,rows);
//switchLastBlocks(puzzle);
boardLoc = createVector((width-columns*cellSize)/2, (height-rows*cellSize)/2);
}
function draw() {
background(0);
translate(boardLoc.x, boardLoc.y);
gridBoard.draw();
puzzle.draw();
puzzle.update();
translate(-boardLoc.x, -boardLoc.y);
drawUI();
checkChallenge();
}
// ----------------------------------- mouse interface -----------------------------------------
var alternatingColors = false;
var lastImage = 0;
function keyPressed(){
if (key == '='){
puzzle.flipMissingActive();
return;
}
if (key == 'a'){
alternatingColors = !alternatingColors;
if (alternatingColors)
gridBoard.setColors([color(250,50,50), color(50,50,250)]);
else
gridBoard.setColors([color(180)]); //([color(220,220,100)]);
return;
}
if (key == 's'){
saveImage(
'15puzzle_'+String(lastImage).padStart(4, '0')+'.png',
boardLoc.x-boardBorder, boardLoc.y-boardBorder,
cellSize*puzzle.w+2*boardBorder, cellSize*puzzle.h+2*boardBorder);
lastImage++;
return;
}
puzzle.keyPressed();
}
function mousePressed(){
if (!challengeMode)
puzzle.mousePressed(mouseX - boardLoc.x, mouseY - boardLoc.y);
}
// ----------------------------------- user interface -----------------------------------------
var rowsSlider;
var columnsSlider;
var mazeSel;
var graphSel;
function createUI(){
//SliderLayout(label, minValue, maxValue, defaultValue, steps, posx, posy)
rowsSlider = new SliderLayout("Rows", 1, 10, rows, 1, 40, 40);
columnsSlider = new SliderLayout("Columns", 1, 10, columns, 1, 40, 90);
var orderButton = createButton('Reorder board');
orderButton.position(40, 140);
orderButton.mousePressed(reorderBoard);
var challengeButton = createButton('Challenge');
challengeButton.position(40, 190);
challengeButton.mousePressed(startChallenge);
}
function reorderBoard(){
var b = puzzle.getMissingActive();
puzzle.reorderBoard();
//switchLastBlocks(puzzle);
puzzle.setMissingActive(b);
challengeMode = false;
}
var challengeMode = false;
function drawUI(){
strokeWeight(2);
columnsSlider.display();
rowsSlider.display();
var newRows = rowsSlider.slider.value();
var newColumns = columnsSlider.slider.value();
if (newRows!=rows || newColumns!=columns){
rows = newRows;
columns = newColumns;
challengeMode = false;
setBoardSize(rows, columns);
}
}