Everybody who is not a complete psychopath ๐ช or corpse ๐งโโ๏ธ likes emojis or at least uses them to some extent ๐ฅฐ. Emojis are pretty to look at ๐ฆ, yet invisible ๐ซฅ. I actually enjoy modern communication ๐ก; we use emoji reactions to show that we read a message ๐, without the necessity of firing up ๐ฅ our internal word processor ๐ง to formulate an actual response ๐ค. There are several problems, though ๐จ, such as how emojis are displayed differently on every device ๐ฒ and interpreted differently from person to person ๐คฆ๐ปโโ๏ธ. Or that many emojis are still missing ๐ซ, either completely (seahorse, microchip, water bottle) or just on specific systems ๐ต.
However โ๏ธ, these problems pale ๐ in comparison โ๏ธ with my biggest problem ๐ : how randomly ๐ฒ they are assigned to their respective groups ๐ฅ. For example, why are the cat faces (๐บ๐ธ๐น๐ป๐ผ๐ฝ๐๐ฟ๐พ) under โSmileys & Emotionโ but the monkey (๐ต๐๐๐) and sun/moon faces (๐๐๐๐๐) under โAnimals & Natureโ? Why is there a combined super group that includes emotions (๐คฃ๐๐ค), gestures (๐ค๐๐), body parts (๐ซ๐๐ฆฟ), professions (๐ฎ๐๐ต๏ธโโ๏ธ), minorities (๐ฌ๐ป๐จโ๐ฆผ๐งโโ๏ธ), as well as clothes (๐งฅ๐๐ฉ), while another group is dedicated to just flags (๐น๐ฉ ๐ง๐ณ ๐ช๐ช)? Unfortunately โน๏ธ, the search function ๐ is usually worthless ๐ due to how I interpret certain emojis ๐ differently than the developers ๐จโ๐ป and designers ๐ฉโ๐ป.
- Smileys & Emotion: ๐๐๐ญ๐๐ก
- People & Body: ๐๐๐๐๐ค
- Animals & Nature: ๐ถ๐ฑ๐ณ๐ธ๐ฆ
- Food & Drink: ๐๐๐๐บ๐ฐ
- Activities: ๐ฎโฝ๐จ๐ต๐
- Travel & Places: โ๏ธ๐๐ ๐ฝ๐๏ธ
- Objects: ๐ฑ๐ก๐โ๏ธ๐ฆ
- Symbols: โค๏ธโจโป๏ธโฎ๏ธโพ๏ธ
- Flags: ๐ฌ๐ง ๐บ๐ธ ๐ฏ๐ต ๐ซ๐ท ๐ฉ๐ช
Since I always wanted to create a game โฝ with emojis, I decided to make one that lets you train ๐ the emoji groups at least subconsciously ๐ตโ๐ซ. EmoToon is a tile-based arcade game ๐ฐ similar to Tetris ๐ชจ, Connect Four ๐๏ธ, and Candy Crush ๐ฌ (broad assumption since I never actually played the latter ๐). It is coded entirely in PyGame ๐ so you will not become addicted ๐ as it only runs on Windows computers ๐ป (for now โฐ). Despite its casualness ๐, EmoToon does have some addictive elements ๐ to it, such as starting a new grid ๐ฃ and being greeted by all the lovely emoji tiles ๐ป.
In a bombshell ๐ฐ, the game features a grid of 9-by-9 emoji tiles. You connect neighboring tiles of the same emoji group, and the longer the chain is ๐งถ, the higher the score you get ๐. The order within a chain does not matter, allowing you to backtrack ๐ and even pass through dead cells receiving just a tiny score malus โ. I even allowed diagonal โ๏ธ selection, which started as an accident ๐ฆบ but became a core feature ๐. No idea how other developers solve โ๏ธ the problem, but I did it by using octagonal ๐ instead of square colliders ๐ฅ, essentially allowing for dead spaces around the tile corners ๐ฝ. The controls ๐๏ธ are so simple I do not have to explain them: click the mouse ๐ฑ๏ธ, drag across all tiles you want to add to the chain ๐งฒ, and release ๐คฏ.
I quickly ๐ gathered that learning the nine different emoji groups by only looking ๐ at the emojis was too difficult ๐งฉ. Therefore, I deviated ๐ from my original goal ๐ฅ to make it a learning game ๐ and instead color-coded the tile background ๐งฎ. That way, the game is played much faster ๐, but the emojis themselves become less relevant ๐ฆ. My sister Marlene ๐ (aka NannoCloud ๐ฆ๏ธ) kindly helped with finding a harmonic ๐ช color palette and also contributed another great idea ๐ก for improvement, but more on that in a second โฑ๏ธ.

As an active iOS user, I am familiar with the Apple emojis to a degree ๐ก๏ธ where I find most other emojis kind of ugly ๐ฆข (looking at you ๐, Facebook ๐). While the font Apple Color Emoji cannot be used on non-Apple devices, I quickly found a workaround by importing ๐ฆ the emojis as PNG images instead of a font file ๐. As the emoji tiles are small, the overhead ๐ in terms of file size and loading times โ remains bearable. I quickly found a repository ๐๏ธ of some 750 Apple emojis ๐ as image files, which was incomplete ๐ถ and a bit outdated ๐ผ but enough to keep me motivated throughout development ๐ตโโ๏ธ. Only after I realized that Apple does not permit free use ๐ฐ of their emojis for artistic projects ๐ธ, I started looking for alternatives โฉ๏ธ. Trying to switch to an emoji font instead of image files once more ๐, I tested Noto Emoji by Google and Segoe UI Emoji by Microsoft โจ๏ธ. However, I was immediately hit by more technical, licensing, and aesthetic issues ๐ชฒ.

Hence, I stuck with the image-based approach ๐ฉป and eventually stumbled upon OpenMoji ๐, which features open-source versions of all modern ๐๏ธ emojis in different sizes, in color as well as black and white, and as vectorized or rasterized graphics ๐งบ. The first results looked awful ๐คฎ, but my sister suggested re-colorizing the emojis using the palette of nine colors ๐จ we already developed. The rest is history ๐๏ธ: I quickly wrote a script ๐ that replaced all individual colors ๐ต with the nearest one ๐ถ of the proven nine, giving EmoToon a look both pleasant ๐ and original ๐ฎ. Since emojis are identified by unique hex codes ๐งโโ๏ธ, e.g. โ1F6ACโ for โsmoking symbolโ (๐ฌ) or, to showcase joined emojis, โ1F64D-200D-2640-FE0Fโ for โwoman frowningโ (๐โโ๏ธ), I could use this document to automatically ๐ค look up the respective emoji groups for each emoji image ๐ผ๏ธ. The resulting dataset ๐ contains 3,830 emojis in total and can easily be expanded ๐ก as new emojis are being developed ๐จโ๐ฌ.
Another decision I had to face early on was whether I wanted the emoji tiles to be affected by gravity ๐, similar to Tetris, or not. While non-gravity ๐ฐ๏ธ leads to empty tiles, which allows for some interesting chaining strategies, gravity ๐ช feels more exciting, also enabling you to quickly remove useless tiles ๐ฎ and cluster the remaining tiles to create extremely long chains ๐ฆฉ. Consequently, I implemented ๐จโ๐พ both modes and let the game switch back and forth ๐. Initially, one phase is 40 seconds long ๐, but becomes one second shorter each round, down to a minimum of 5 seconds ๐, which should install a sense of urgency ๐ in the player. As a sort of non-numeric timer โณ, a thin line moves around the grid, flashing to indicate imminent phase toggle ๐ธ. The feeling of urgency is further exacerbated by the fact that the bottom row falls ๐ through the floor at the end of each gravity phase, possibly removing tiles that are valuable ๐ to the player.

To distinguish the two phases at a glance ๐, I made the empty (or dead) tiles dark ๐ณ during gravity phase and bright ๐ฒ while gravity is disabled. Purely for aesthetic reasons and to instill a sense of mysticism ๐ชฌ in the player, dead cells are also filled with letters ๐ง from my own cipher font Caidoz ๐ต๏ธ, which I somehow manage to sneak ๐ฅท into all of my game projects ๐ณ.

To spawn new ๐ cells, I used a simple yet highly effective method ๐: whenever a chain is released and cells are destroyed ๐งจ, all of the 9 columns are checked โ๏ธ individually. With K being the number of alive cells in a column, the chance for a new cell to spawn is random(0,1) > K/9
, meaning 0% if the column is full (K=9
) ๐ and 100% when entirely empty (K=0
) ๐ชซ. This keeps the total number of live cells balanced around a half-filled grid ๐, which the player can change by destroying ๐ฃ either few or many cells during each chain release. In case you wondered, individual emojis can never appear twice ๐ฏ on the same grid.
After I had the core loop โฐ up and running, I wanted to spice ๐ถ๏ธ things up by enabling the player to save ๐พ points for special events ๐ . These are accessible by a button ๐น๏ธ but limited to one use per round. While the individual events are determined uniform-randomly ๐ฅผ, they have different costs ๐ธ to account for their respective usefulness ๐ถ:
- ๐ New (1 ๐ช): start a fresh board with a new selection of 81 emojis
- ๐ฒ Shuffle (2 ๐ช): randomly rearrange all alive and dead cells across the grid
- ๐ Swap (4 ๐ช): randomly rearrange only alive cells
- ๐ฅ Add (8 ๐ช): insert up to 9 new tiles into random dead cells
- โณ Fill (16 ๐ช): fill all dead cells with new alive tiles
- โป๏ธ Revive (32 ๐ช): flip all previously dead cells back to alive
- ๐ Panem (64 ๐ช): keep 2 random groups and destroy the rest
- ๐ Eliminate (128 ๐ช): destroy tiles from the 4 least-populated groups
- ๐ Stock (256 ๐ช): convert tiles of the 4 least-populated groups into the 4 most-populated groups
- ๐ Sort (512 ๐ช): reorder cells by their group
Furthermore, what would a video game be without a compelling soundtrack ๐? As usual, my talented friend Lars-Ole Kremer provided one that fits the sci-fi theme well ๐ฝ. Some of the beta testers already complained that the core loop gets repetitive soon, calling for longer audio tracks ๐ฆ. Personally, I am leaning toward a more dynamic soundtrack that lets the player further distinguish gravity from non-gravity phase. Nonetheless, Ole did this one for free ๐, and I do not want to abuse his kindness ๐๐ผ. He even made eight different release sounds ๐ถ, each one more satisfying ๐คค than the next to account for different chain lengths. The release sounds are divided into two groups 2๏ธโฃ: unobtrusive sounds ๐ for chains of up to five tiles ๐ and exhilarating sounds ๐บ for longer chains ๐. Upon releasing a chain ๐ค, a sound is then picked randomly ๐ from the respective group, allowing for some variety ๐ณ๏ธโโง๏ธ (as opposed to associating one sound with one specific chain length, which becomes repetitive fast ๐).
While the game is quite playable in its current โก form, it still lacks a sophisticated high score system that forces players to combat ๐ช each other, aiming ๐ฏ for higher and higher scores. As of right now, the game features a session score as well as an overall level that is saved for future sessions ๐ฎ. Not a scientifically proven model ๐ฌ, but the score is calculated ๐ป as 2 to the power of N, with N being the length of a chain of selected tiles that share the same emoji group. In other words, the score is doubled with every additional tile โ, thereby growing exponentially ๐งซ. Selecting tiles of different groups interrupts the chain, whereas adding dead cells ๐ to the chain only decreases the score slightly (-1 for one dead cell, -2 for a second dead cell, etc. โพ๏ธ). Since exponential growth is much stronger ๐ฆพ, selecting dead cells to form the longest chains possible ๐ฆ is always advisable โ๏ธ.
On a side note ๐: while I did not implement a global scoreboard yet, I managed to hash and save the score using SHA-256 ๐ค. This makes it a bit more difficult to temper with the local files keeping track of your score ๐งฑ. Cheating is still far from impossible, so do what you must โ๏ธโ๐ฅ. My games shall not punish cheaters but encourage them ๐น.
Eventually, I developed my own strategy to quickly raise the score to display-breaking widths ๐ฅ๏ธ. But who knows, maybe you will come up with an even better playing style because EmoToon permits many different ones ๐. Of course, the game contains many details and tiny animations I could not mention in this post ๐ฅฑ. You can find out about all of them by playing โฏ๏ธ the game prototype, which I published on itch.io ๐ฆ .
Admittedly, a gameplay video ๐ฅ would help to bring the game across โฆ๏ธ. But as of 2025 ๐๏ธ, I do not know how (or am too lazy ๐ฆฅ / uncommitted ๐) to make one ๐. Can you imagine that I originally intended to write this post ๐ฅ without emojis ๐? Cheers ๐ป.
Nanno
i ๐ง๐ผโโ๏ธliked โค๏ธ this ๐๐ผ piece ๐ง of ๐ต writing ๐ very โ๏ธmuch ๐ฅ