/*Note that the column of the matrix is row of the tetris board and vice versa,
So going left to right ----> in this matrix would be the same as going top
to bottom in the actual tetris board*/
var a = [
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
];
//Generates random integer between given range
function getRandomInteger(min, max) {
return Math.round(Math.random() * (max - min)) + min;
}
function getColor() {
//an array of red, blue ,green, yellow, orange, purple and salmon color
var colorArray = ["#C0392B" ,"#2980B9", "#27AE60", "#F1C40F", "#E67E22", "#8E44AD", "#FFA07A"]
return colorArray[getRandomInteger(0, 7)];
}
//Creates a random set of block on the top
function createBlocks() {
var i = getRandomInteger(0, 9);
blockHeight = getRandomInteger(2, 4);
var blockColor = getColor();
for (var j= 0; j<blockHeight; j++)
{
a[i][j] = 1;
nthBoxToColor =i+10*j+1;
document.querySelector('td:nth-of-type('+nthBoxToColor+')').style.backgroundColor = blockColor;
}
};
//Moves the set of block one step down
function moveOneStepDown() {
//For testing, to be removed later
console.log(a[i]);
for (var i = 0; i < 10; i++) {
a[i].pop();
a[i].unshift(0);
//For testing, to be removed later
console.log(a[i]);
};
//For testing, to be removed later
console.log("-------------------------------------");
};
/*the setInterval function of javascript executes the code infinite number of
times, so a new function is defined to carry it out finite no of times*/
function setIntervalX(callback, delay, repetitions) {
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
};
}, delay);
};
//Code execution
createBlocks();
setIntervalX(moveOneStepDown, 100, a[0].length-blockHeight);
gameContainer {
margin-left: 10vw;
width: 80vw;
background-color: blue;
}
.tetris-board {
margin-left: 30vw;
width: 20vw;
}
td {
height: 2vw;
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link type="text/css" rel="stylesheet" href="assets\css\style.css"></link>
<script type="text/javascript" src="assets\js\jquery-3.3.1.slim.min.js"></script>
<script type="text/javascript" src="assets\js\bootstrap.min.js"></script>
<script type="text/javascript" src="assets\js\popper.min.js"></script>
</head>
<body>
<div class="gameContainer">
<table class="table table-bordered table-dark tetris-board">
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
</table>
</div>
</body>
<script type="text/javascript" src="assets\js\script.js"></script>
</body>
</html>
I have an integer variable nthBoxToColor
whose value changes along with the loop. And I want to color some specific table blocks according to the current value of nthBoxToColor
.
So I tried the following code by concatenating strings with the variable:
document.querySelector('td:nth-of-type(' + nthBoxToColor + ')').style.backgroundColor = "blue";
But I got an error:
Uncaught TypeError: Cannot read property 'style' of null
at createBlocks (script.js:39)
at script.js:74
createBlocks @ script.js:39
(anonymous) @ script.js:74
What went wrong? What is the right code to do it?
Edit:
The loop I ran the code inside is:
for (var j= 0; j<blockHeight; j++)
{
a[i][j] = 1;
var nthBoxToColor =i+10*j+1;
document.querySelector('td:nth-of-type(' + nthBoxToColor + ')').style.backgroundColor = blockColor;
}
Where i
is a random integer between 0 and 9 and blockHeight
is also a random integer between 2 and 4.