-
Notifications
You must be signed in to change notification settings - Fork 0
/
editor.js
199 lines (182 loc) · 5.58 KB
/
editor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// Function for the EntroPipe's Puzzle Editor
// Autor: Z80ST-Software
// z80st.software@gmail.com
// January 2013: First version
// Modify by Alfonso Saavedra "Son Link" and license under the GPL 3 license.
var W = 8; // Width
var H = 6; // Heigth
var aPlantilla = new Array(W*H); // Array con la plantilla del puzzle
// Draw the puzzle grid
function writePlantilla() {
var casilla = 0;
var table='';
for ( y = 0 ; y < H ; y++ ) {
table += "<tr>";
for ( x = 0 ; x < W ; x++ ) {
//table += '<td><img id="c'+(casilla++)+'" src="'+imArray[0].src+'" onClick="setCasilla(this);return true;" /></td>';
table += '<td><div id="c'+(casilla++)+'" onClick="setCasilla(this);return true;" class="p0"/></td>';
}
table += "</tr>";
}
document.getElementById('plantilla').innerHTML = table;
}
// Init the puzzle grid
function initPlantilla() {
for ( x = 0 ; x < W*H ; x++ ) {
aPlantilla[x]=0;
}
calcEntropy();
}
// Convert the grid to string of hexadecimal values
function valoresPlantilla() {
cadena = ''
for ( x = 0 ; x < W*H ; x=x+2 ) {
cadena = cadena + aPlantilla[x] + aPlantilla[x+1];
}
return ( cadena );
}
// Load a string of hexadecimal values to grid
function lPuzzle() {
var aux = new Array(W*H);
var cargados = 0;
loading = document.getElementById("loadArea");
for ( x = 0 ; (x < loading.value.length) && (cargados < W*H) ; x++ ) {
c = loading.value.substr(x,1);
if ( ( c >= "0" && c <= "9" ) || ( c >= "A" && c<="F" ) ) {
aux[cargados] = c;
cargados++;
}
}
if ( cargados == W*H ) {
aPlantilla = aux;
calcEntropy();
alert ( "load complete" );
} else {
alert ( "load failure "+cargados );
}
loading.value = "";
}
function mod(x,y) {
while ( x >= y ) { x = x - y }
while ( x < 0 ) { x = x + y }
return ( x );
}
// Whole move grid to up
function shiftUp() {
var aux = new Array(W);
for ( x = 0 ; x < W ; x++ ) {
aux[x]=aPlantilla[x];
}
for ( x = 0 ; x < W*(H-1) ; x++ ) {
aPlantilla[x] = aPlantilla[mod(x+W,W*H)];
}
for ( x = 0 ; x < W ; x++ ) {
aPlantilla[x+(W*(H-1))] = aux[x];
}
calcEntropy();
}
// Whole move grid to down
function shiftDown() {
var aux = new Array(W);
for ( x = 0 ; x < W ; x++ ) {
aux[x]=aPlantilla[x+(W*(H-1))];
}
for ( x = W*H-1 ; x >= W ; x-- ) {
aPlantilla[x] = aPlantilla[mod(x-W,W*H)];
}
for ( x = 0 ; x < W ; x++ ) {
aPlantilla[x] = aux[x];
}
calcEntropy();
}
// Whole move grid to left
function shiftLeft() {
var aux = new Array(H);
for ( x = 0 ; x < H ; x++ ) {
aux[x]=aPlantilla[x*W];
}
for ( x = 0 ; x < W*H ; x++ ){
if ( mod(x,W) < W-1 ) {
aPlantilla[x] = aPlantilla[x+1];
}
}
for ( x = 0 ; x < H ; x++ ){
aPlantilla[x*W+(W-1)] = aux[x];
}
calcEntropy();
}
// Whole move template to right
function shiftRight() {
var aux = new Array(H);
for ( x = 0 ; x < H ; x++ ) {
aux[x]=aPlantilla[x*W+(W-1)];
}
for ( x = W*H-1 ; x > 0 ; x-- ) {
if ( mod(x,W) > 0 ) {
aPlantilla[x] = aPlantilla[x-1];
}
}
for ( x = 0 ; x < H ; x++ ) {
aPlantilla[x*W] = aux[x];
}
calcEntropy();
}
// Update one box
function setCasilla(casilla) {
aPlantilla[casilla.id.substring(1,casilla.id.length)]=currentTile;
casilla.className = '';
casilla.classList.add('p'+currentTile);
calcEntropy();
}
// Select a tile
function selectTile(tile) {
document.querySelector("#t"+currentTile + ' > div').classList.remove('selected');
actualTile = document.getElementById(tile.id)
document.querySelector('#'+tile.id + ' > div').classList.add('selected');
currentTile=tile.id.substring(1,tile.id.length);
}
// Function for check in the four directions
function checkUp(tile) { return ( "13579BDF".match(tile) ); }
function checkDown(tile) { return ( "4567CDEF".match(tile) ); }
function checkRight(tile) { return ( "2367ABEF".match(tile) ); }
function checkLeft(tile) { return ( "89ABCDEF".match(tile) ); }
// Update and redraw the grid
function calcEntropy() {
// Calculate the puzzle entropy
var entropy = 0;
var entropyLocal;
for ( y = 0 ; y < H ; y++ ) {
for ( x = 0 ; x < W ; x++ ) {
entropyLocal = 0;
if ( ( checkUp(aPlantilla[y*W+x]) ) && ( ( y == 0 ) || ( !checkDown(aPlantilla[(y-1)*W+x]) ) ) ) { entropyLocal++ }
if ( ( checkDown(aPlantilla[y*W+x]) ) && ( ( y == H-1 ) || ( !checkUp(aPlantilla[(y+1)*W+x]) ) ) ) { entropyLocal++ }
if ( ( checkRight(aPlantilla[y*W+x]) ) && ( ( x == W-1 ) || ( !checkLeft(aPlantilla[y*W+x+1]) ) ) ) { entropyLocal++ }
if ( ( checkLeft(aPlantilla[y*W+x]) ) && ( ( x == 0 ) || ( !checkRight(aPlantilla[y*W+x-1]) ) ) ) { entropyLocal++ }
entropy += entropyLocal;
}
}
// actualizamos la cadena con la entropía del puzzle
var spn = document.getElementById("entropy");
spn.innerHTML = "<b>Puzzle Entropy: " + entropy + "</b>";
// actualizamos la cadena con el contenido del array
var spn = document.getElementById("final");
spn.value = valoresPlantilla();
}
// Change the grid size and init all variables and redraw
function gridSize(){
// change the game grid size
v = document.getElementById('gridsize').value.split('x');
W = parseInt(v[0]);
H = parseInt(v[1]);
aPlantilla = new Array(W*H);
currentTile = 0; // Indicamos que el tile seleccionado es el 0
writePlantilla()
initPlantilla(); // Inicializamos el array con la plantilla
//tileSelector(); // Cambiamos el color del borde de todos los tiles seleccionables
selectTile(document.getElementById('t0')); // Seleccionamos graficamente el tile 0
setCasilla(document.getElementById('c0')); // inicializamos la cadena del puzzle
document.getElementById("final").value = valoresPlantilla()
}
document.addEventListener('DOMContentLoaded', function(){
gridSize()
}, false);