Auto tetris
by Alex Deider
HTML
<div id="auto-tetris"></div>
<div class="description"><span class="results">Squares left: <span id="left">200</span></span><br/><br/>Test UI for tetris algorithm. Just 2 figures: 1x4 and 2x2. Just implement function getColumnNumberForLeftFigureSquare(w, h) that finds the best place for current figure (column number for left square). And wait for the results. Size of tetris: 10 x 20.<br/><br/><a href="http://habrahabr.ru/post/230229/">Post your code here</a></div>
CSS
.description {
float: left;
font-size: 12px;
text-style: italic;
margin: 10px;
width: 150px;
}
.results {
font-size: 18px;
}
#auto-tetris {
float: left;
width: 200px;
height: 400px;
position: relative;
border: 1px solid #333;
}
.fig {
position: absolute;
}
.fig.top {
top: 0;
left: 50%;
background: #333;
}
.fig-1-1 {
width: 80px;
height: 20px;
}
.fig-1-1.top {
margin-left: -40px;
}
.fig-1-2 {
width: 20px;
height: 80px;
}
.fig-1-2.top {
margin-left: -10px;
}
.fig-2-1, .fig-2-2 {
width: 40px;
height: 40px;
}
.fig-2-1.top, .fig-2-2.top {
margin-left: -20px;
}
JavaScript
// Function should return integer from 1 to 10. It is a number of column in which will be left square of figure.
var f = {14: 0, 41: 0, 22: 0};
function getColumnNumberForLeftFigureSquare(w, h) {
function check(col) {
var flag = true;
for(var k=0;k<w;k++)
flag &= (cols[col+k-1]+h)<=20;
return flag;
}
function end(col){
var it=0;
while(!check(col) && ++it<=11-w) {
col = it;
}
console.log(cols, col, w+'x'+h)
return col;
}
// You can use 3 vars: w, h (size of figure), cols
var col;
var d = w*10+h;
f[d]++;
switch(d) {
case 41:col = 1;break;
case 22:col = [5,7][f[d]%2];break;
case 14:col = [9,10][f[d]%2];break;
}
return end(col);
}
var interval,
cols = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // contains filled height for each column (10 columns)
left = 200,
speed = 30; // Score
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function getRandomColor() {
var hex = Math.floor(Math.random() * 0xFFFFFF);
return "#" + ("000000" + hex.toString(16)).substr(-6);
}
function createRandomFigure() {
var t = document.getElementById('auto-tetris'),
l = document.getElementById('left'),
f = getRandomInt(1, 3), // 1 - 1x4 or 2 - 2x2
o = getRandomInt(1, 3), // 1 - horizontal or 2 - vertical
c = 'top fig fig-' + f + '-' + o,
d = document.createElement('div'),
h = 2,
w = 2;
if (f == 1) {
if (o == 1) {
w = 4; h = 1;
} else {
w = 1; h = 4;
}
}
d.className = c;
t.appendChild(d);
setTimeout(function() {
var r = checkResults();
if (r) {
var cn = getColumnNumberForLeftFigureSquare(w, h),
newH = 0,
end = cn + w - 1,
wi = 0,
maxH = 0;
if (end >...