Magiske kvadrater
Magiske kvadrater
Alle rader og kolonner skal ha samme sum
Klikk på to fargede ruter så bytter de plass
Det er tre involverte processing-filer:
_sketch.js
/* 4X4 magisk kvadrat */ var ruteKant=40; var fontBig=25; var rettFarge,galFarge,markertFarge; var rutene; //4x4 brettet var radSumRuter; // kolonne til høyre var kolSumRuter; // rad under var valg1; // har klikket denne var melding; // når problemet er løst function setup(){ var canvas = createCanvas(ruteKant*7.5,ruteKant*7.5); canvas.parent('canvasHere'); rettFarge=color(255,255,255); galFarge=color(200,200,255); markertFarge=color(255,200,200); valg1=null; melding=""; setOppRutene(); } function draw(){ background(230); visMelding(); for(var r =0;r<4;r++) for(var k =0;k<4;k++){ rutene[r][k].tegn(); } for(var i =0;i<4;i++){ radSumRuter[i].tegnTall(); kolSumRuter[i].tegnTall(); } stroke(0); line(5.5*ruteKant,ruteKant,5.5*ruteKant,ruteKant+6*ruteKant); line(ruteKant,5.5*ruteKant,7*ruteKant,5.5*ruteKant) } function visMelding(){ push(), fill(255,0,0); textAlign(CENTER,CENTER); textFont('Arial',fontBig-3); text(melding,width/2,ruteKant/2); pop(); } function nyttBrett(){ melding=""; setOppRutene(); } function mousePressed() { for(var r=0; r<4; r++) for(var k=0; k<4; k++){ if(rutene[r][k].valgt()){ if(valg1!=null){ byttInnhold(r,k,valg1.getRad(),valg1.getKolonne()); valg1.markerIkkeValgt(); valg1=null; oppdaterSummer(); if(erViFerdig()){ melding="Gratulerer, problemet løst !"; } } else{ valg1=rutene[r][k]; valg1.markerValgt(); return; } } } }
og
_kvadrater.js
function tilfeldigTall(min,max){ return Math.floor(Math.random()*(max-min+1)+min); } function byttInnhold(r1,k1,r2,k2){ var tmp=rutene[r2][k2].getVerdi(); rutene[r2][k2].setVerdi(rutene[r1][k1].getVerdi()); rutene[r1][k1].setVerdi(tmp); } function setOppRutene(){ var vals; var select=tilfeldigTall(1,7); switch (select){ case 1: vals=[ [4, 5,12,13], [14,3,9, 8], [15,10,2,7], [1,16,11,6]]; break; case 2: vals=[[1,8,9,16], [15,3,14,2], [12,13,4,5], [6,10,7,11]]; break; case 3: vals=[[4,5,10,15], [8,12,11,3], [9,16,7,2], [13,1,6,14]]; break; case 4: vals=[[4,8,9,13], [14,3,7,10], [15,11,2,6], [1,12,16,5]]; break; case 5: vals=[[1,8,10,15], [16,13,3,2], [11,4,14,5], [6,9,7,12]]; break; case 6: vals=[[1,8,14,11], [16,2,3,13], [10,15,5,4], [7,9,12,6]]; break; default:vals=[ [4,9,10,11], [3,8,7,16], [14,2,12,6], [13,15,5,1]]; } rutene = new Array(4); for (var i = 0; i < 4; i++) { rutene[i] = new Array(4); } for(var r =0;r<4;r++) for(var k =0;k<4;k++) rutene[r][k]=new rute(r,k, ruteKant*(k+1),ruteKant*(r+1),vals[r][k]); // set opp kolonne med radsummer radSumRuter= new Array(4); for(var r=0;r < 4; r++) radSumRuter[r]=new rute(r,0, ruteKant*(6),ruteKant*(r+1),0); // set opp rad med kolonnesummer kolSumRuter= new Array(4); for(var k=0;k < 4; k++) kolSumRuter[k]=new rute(0,k, ruteKant*(k+1),ruteKant*(6),0); oppdaterSummer(); // flytt om intil vi er sikre på at vi ikke har en løsning while(recalculateSquares()) { var swaps=tilfeldigTall(4,20); for(var ix=0; ix<swaps; ix++) { byttInnhold( tilfeldigTall(0,3),tilfeldigTall(0,3), tilfeldigTall(0,3),tilfeldigTall(0,3)); } } } function oppdaterSummer(){ for(var r=0; r < 4; r++){ radSumRuter[r].setVerdi(rutene[r][0].getVerdi()+ rutene[r][1].getVerdi()+ rutene[r][2].getVerdi()+ rutene[r][3].getVerdi()); } for(var k=0; k < 4; k++){ kolSumRuter[k].setVerdi(rutene[0][k].getVerdi()+ rutene[1][k].getVerdi()+ rutene[2][k].getVerdi()+ rutene[3][k].getVerdi()); } } function recalculateSquares() { //true hvis alle summene er 34 oppdaterSummer() for(var i=0; i< 4; i++){ if(radSumRuter[i].getVerdi()!=34) return false if(kolSumRuter[i].getVerdi()!=34) return false } return true; } function erViFerdig(){ return recalculateSquares(); }
og
_rute.js
function rute(rad,kol,left,top,verdi){ this.rad=rad; this.kol=kol; this.top=top; this.left=left; this.verdi=verdi; this.rettVerdi=verdi; this.markert=false; this.getRad=function(){ return this.rad; } this.getKolonne=function(){ return this.kol; } this.markerValgt=function(){ this.markert=true; } this.markerIkkeValgt=function(){ this.markert=false; } this.setVerdi=function(v){ this.verdi=v; } this.getVerdi=function(){ return this.verdi; } this.setTargetVerdi=function(v){ this.rettVerdi=v; } this.getTargetVerdi=function(){ return this.rettVerdi; } this.valgt=function(){ if(this.verdi==this.rettVerdi) return false; return (mouseX > this.left) && (mouseX < this.left+ruteKant) && (mouseY > this.top) && (mouseY < this.top+ruteKant); } this.tegnTall=function(){ push(); translate(this.left,this.top); textFont('Arial',fontBig); textAlign(CENTER,CENTER); text(""+this.verdi, ruteKant/2,ruteKant/2) pop(); } this.tegn=function(){ push(); translate(this.left,this.top); if(this.markert) fill(markertFarge); else if(this.verdi==this.rettVerdi) fill(rettFarge); else fill(galFarge); stroke(0); rect(0,0,ruteKant,ruteKant); fill(0); textFont('Arial',fontBig); textAlign(CENTER,CENTER); text(""+this.verdi, ruteKant/2,ruteKant/2) pop(); } }
Du kan inspisere denne strukturen på denne enklere siden:
test.html
https://borres.hiof.no/wep/proc/p5js/kvadrater/test.html