Skip to content
Turtle
Instagram

20,000 times out of my league

svelte, grid, 20482 min read

This project took way longer than I intended...

Today we'll explore building 2048 with svelte and CSS grid layout. This post is short, so jump down to the resources to get started on your own!

Svelte is a front end framework promising less boilerplate code. Less is more, so less try it out.

npx degit sveltejs/template 2048
cd 2048
yarn
yarn dev

Once up and running, let's navigate to localhost:5000. Once there, let's add a 4x4 grid. When working with CSS grid, we set the container to display:grid, as well as other grid properties. Finally, let's set the properties of the cell (height, width, and how we will display the content). See the minimal example below:

.grid {
display: grid;
grid-gap: 10px;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-auto-rows: 1fr;
}
.cell {
width: 48px;
height: 48px;
display: flex;
justify-content: center;
align-items: center;
}

Once the layout is setup, we write some code to handle the key/touch events since we want to support both mobile and desktop. We use the swiped-events repo to detect mobile swipes. Neat...

const mobileKeyMap = {
'swiped-up': 'ArrowUp',
'swiped-down': 'ArrowDown',
'swiped-left': 'ArrowLeft',
'swiped-right': 'ArrowRight',
}
const mobileKeys = Object.keys(mobileKeyMap);
const setupMobile = () => {
mobileKeys.forEach(eventName => {
document.addEventListener(eventName, (event) => {
event.key = mobileKeyMap[event.type];
handleInput(event);
});
})
}
setupMobile();
const handleInput = (event) => {
switch (event.key) {
case 'ArrowUp':
case 'ArrowDown':
case 'ArrowLeft':
case 'ArrowRight':
game.handleInput(event.key);
game.grid = game.grid;
return;
default:
return;
}
};

And with a lot of help from Rosetta Code, we create a separate game.js class to handle the game logic. Finally, we create a separate svelte component to make it rain when the player wins:

Game Won!

Resources


Quaerite Et Invenietis