17:31Testing Gemini 3.8 Flash on Real Coding Challenges (vs. other models)
Sep 2, 2026 · YouTube
17:37Tencent Hy4 Preview Tested: Is It Really Better Than Kimi K3 and GLM 5.3?
Aug 28, 2026 · YouTube
23:58Qwen 3.8 Flash Tested: UI, Coding, Physics & more - compared to Opus 5, Sol Pro, Grok
Aug 27, 2026 · YouTube
Build a memory game — also called concentration or pairs — as one self-contained HTML page.
The theme is fascinating animals. You choose the eight animals and the art style.
The player must be able to see how many moves they have made and how many pairs are left.
When a pair is matched, show that animal's fact.
When the game is won, say so clearly.
Clicking a card is the main interaction.
You may add exactly one button: New game.
Do not add:
Choose 8 animals that are genuinely fascinating — something about each one is strange, extreme, or surprising.
For each animal, provide:
The facts must be true. They will be checked.
Do not use the eight most obvious zoo animals. Lion, tiger, elephant, giraffe, panda, penguin, dolphin and zebra are all forbidden.
You do not create the artwork yourself. You write the prompts, and an image model draws them afterwards.
The art is delivered as one PNG:
art/cards.png
The file is a 2048×2048 3×3 contact sheet:
The grid layout, numbering, and background are fixed. Your job is to specify what belongs in each cell.
The path art/cards.png must appear exactly once in your HTML.
You may slice it with CSS background positioning, a canvas, clipped elements, or another technique.
Because the PNG has a black background, make sure the artwork sits properly on your card design.
The game must be playable before art/cards.png exists.
If the image cannot be loaded, each face-up card must show a readable fallback — the animal's name, a drawn shape, or a styled placeholder. Blank cards are not acceptable, because a memory game with blank faces cannot be played at all.
You may request one additional image, such as a table surface or background.
It must use the form art/<id>.png and it must be optional decoration — the page must look finished without it.
The page must support one URL mode.
#demoDeal a board where 7 of the 8 pairs are already matched and only one pair is left to find.
This exists so the win can be filmed without playing a whole game.
It must be a real board state that the normal game logic plays out — not a fake animation.
The game must be a single HTML file.
It must:
art/ filesDo not use:
localStoragesessionStorageindexedDBThe page must have no scrollbars at any window size. The board should scale to fit whatever space it is given.
Sound is optional. If you add any, generate it with the Web Audio API — no audio files.
Your response must contain exactly these four sections.
One line: what the game is called and what it looks like.
Provide exactly one fenced html code block containing the complete HTML page and nothing else.
Provide exactly one fenced json code block using this structure:
{
"game": { "name": "TURN TWO CARDS" },
"sheet": {
"style": "One paragraph, appended to every cell prompt below: medium, palette, lighting, line quality. This is what makes nine separate images look like one deck.",
"cells": [
{
"cell": 0,
"id": "axolotl",
"name": "Axolotl",
"role": "animal",
"prompt": "What to draw in this cell. One animal.",
"fact": "It regrows lost limbs, and even parts of its brain, without scarring."
},
{ "cell": 8, "id": "back", "name": "Card back", "role": "back", "prompt": "The pattern on the back of every card." }
]
},
"extras": [{ "id": "table", "aspect": "16:9", "prompt": "..." }]
}
Rules:
cells contains exactly 9 entries.cell values are 0–8 with no gaps or duplicates."role": "animal" and a fact."role": "back" and no fact.id is a single lowercase token and is unique.fact is 120 characters or fewer.extras may contain at most one entry, or be left out.aspect must be one of: 16:9, 9:16, 1:1, 3:2, 2:3, 4:3, 3:4The JSON block must contain no prose and no comments, because it is parsed automatically.
Four bullets:
art/cards.png is unavailable.Turn Two Cards — a moody, neon-glow memory deck of eight bizarre animals, painted like bioluminescent portraits on black, with a live fact strip that rewards every match.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Turn Two Cards</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; overflow: hidden; }
body {
background: radial-gradient(circle at 50% 30%, #101826 0%, #05070c 70%);
font-family: Georgia, 'Times New Roman', serif;
color: #e8ecf4;
display: flex; flex-direction: column; align-items: center; justify-content: center;
user-select: none;
}
header { text-align: center; padding: 1vmin 2vmin; }
h1 {
font-size: clamp(16px, 3.4vmin, 34px);
letter-spacing: .35em; font-weight: normal;
color: #8fd8ff; text-shadow: 0 0 18px rgba(80,180,255,.6);
}
#hud {
display: flex; gap: 4vmin; align-items: center; justify-content: center;
padding: .8vmin 2vmin; font-size: clamp(12px, 2.2vmin, 20px);
color: #9aa7bd; font-style: italic;
}
#hud b { color: #ffd27f; font-style: normal; }
#table { flex: 1; min-height: 0; width: 100%; display: flex; align-items: center; justify-content: center; padding: 1vmin; }
#board {
display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(4, 1fr);
gap: 1.2vmin;
width: min(72vmin, 92vw); height: min(72vmin, 92vw);
max-height: calc(100vh - 24vmin);
max-width: calc(100vh - 24vmin);
}
.card { perspective: 900px; cursor: pointer; position: relative; }
.inner {
position: absolute; inset: 0;
transform-style: preserve-3d;
transition: transform .45s cubic-bezier(.3,1.4,.5,1);
}
.card.up .inner { transform: rotateY(180deg); }
.face {
position: absolute; inset: 0; border-radius: 8%;
backface-visibility: hidden; -webkit-backface-visibility: hidden;
overflow: hidden; background: #000;
box-shadow: 0 4px 14px rgba(0,0,0,.7), inset 0 0 0 1px rgba(143,216,255,.15);
}
.face .art {
position: absolute; inset: 6%;
background-image: url('art/cards.png');
background-size: 300% 300%;
background-repeat: no-repeat;
border-radius: 8%;
}
.face.back-side { }
.face.front-side { transform: rotateY(180deg); display: flex; align-items: flex-end; justify-content: center; }
.card.matched .front-side { box-shadow: 0 0 22px rgba(255,210,127,.55), inset 0 0 0 2px #ffd27f; }
.fallback {
position: absolute; inset: 6%; display: none;
align-items: center; justify-content: center; text-align: center;
padding: 6%; border-radius: 8%;
background: radial-gradient(circle, #16233a 0%, #0a1120 100%);
border: 1px solid rgba(143,216,255,.35);
color: #8fd8ff; font-size: clamp(9px, 1.9vmin, 16px);
letter-spacing: .08em; line-height: 1.25;
}
.noart .fallback { display: flex; }
.noart .front-side .art, .noart .back-side .art { display: none; }
.noart .back-side { background: repeating-linear-gradient(45deg, #0b1424, #0b1424 6px, #12203a 6px, #12203a 12px); }
.card:not(.up):not(.matched):hover .inner { transform: rotateY(12deg); }
#factbar {
min-height: 3.4em; max-width: 92vw;
display: flex; align-items: center; justify-content: center; text-align: center;
padding: .6vmin 3vmin 2vmin; font-size: clamp(12px, 2.3vmin, 21px);
color: #c9d6ea; font-style: italic;
}
#factbar b { color: #ffd27f; font-style: normal; letter-spacing: .1em; }
#newgame {
margin-left: 2vmin; background: transparent; color: #8fd8ff;
border: 1px solid #8fd8ff; border-radius: 999px;
font-family: inherit; font-size: clamp(11px, 2vmin, 17px);
padding: .4em 1.2em; cursor: pointer; letter-spacing: .12em;
}
#newgame:hover { background: rgba(143,216,255,.15); }
.win h1 { animation: glow 1.2s ease-in-out infinite alternate; }
@keyframes glow { to { text-shadow: 0 0 30px rgba(255,210,127,.9); color: #ffd27f; } }
</style>
</head>
<body>
<header><h1>TURN TWO CARDS</h1></header>
<div id="hud">
<span>Moves: <b id="moves">0</b></span>
<span>Pairs left: <b id="pairs">8</b></span>
<button id="newgame" type="button">NEW GAME</button>
</div>
<div id="table"><div id="board"></div></div>
<div id="factbar">Find the pairs. Every match reveals a strange truth.</div>
<script>
(function () {
var ANIMALS = [
{ id: 'axolotl', name: 'Axolotl', fact: 'It regrows lost limbs, and even parts of its brain, without scarring.' },
{ id: 'tardigrade', name: 'Tardigrade', fact: 'It survives the vacuum of space by drying into a near-dead speck, then reviving.' },
{ id: 'mantisshrimp', name: 'Mantis Shrimp', fact: 'Its punch accelerates like a bullet, briefly heating water to near the sun\u2019s surface.' },
{ id: 'jellyfish', name: 'Immortal Jellyfish', fact: 'When injured or old, it can revert to a polyp and begin life again.' },
{ id: 'platypus', name: 'Platypus', fact: 'It lays eggs, sweats milk, and its bill senses the electric fields of prey.' },
{ id: 'mole', name: 'Star-Nosed Mole', fact: 'Its 22-fingered nose makes it the fastest-eating mammal on Earth.' },
{ id: 'glassfrog', name: 'Glass Frog', fact: 'Its belly is transparent \u2014 you can watch its heart beat and eggs develop.' },
{ id: 'ayeaye', name: 'Aye-Aye', fact: 'It taps wood with a bony middle finger, listening for hollow grubs inside.' }
];
var board = document.getElementById('board');
var movesEl = document.getElementById('moves');
var pairsEl = document.getElementById('pairs');
var factbar = document.getElementById('factbar');
var first = null, lock = false, moves = 0, matched = 0;
var IMG_OK = false;
var img = new Image();
img.onload = function () { IMG_OK = true; };
img.src = 'art/cards.png';
if (!img.complete) { document.body.classList.add('noart'); }
function cellPos(i) {
var c = i % 3, r = Math.floor(i / 3);
return (c * 50) + '% ' + (r * 50) + '%';
}
function buildCard(animal, cellIndex) {
var card = document.createElement('div');
card.className = 'card';
card.dataset.id = animal ? animal.id : '';
var inner = document.createElement('div');
inner.className = 'inner';
var back = document.createElement('div');
back.className = 'face back-side';
var bArt = document.createElement('div');
bArt.className = 'art';
bArt.style.backgroundPosition = cellPos(8);
back.appendChild(bArt);
var front = document.createElement('div');
front.className = 'face front-side';
var fArt = document.createElement('div');
fArt.className = 'art';
fArt.style.backgroundPosition = cellPos(cellIndex);
front.appendChild(fArt);
var fb = document.createElement('div');
fb.className = 'fallback';
fb.textContent = animal.name;
front.appendChild(fb);
inner.appendChild(back);
inner.appendChild(front);
card.appendChild(inner);
card.addEventListener('click', function () { flip(card); });
return card;
}
function shuffle(a) {
for (var i = a.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = a[i]; a[i] = a[j]; a[j] = t;
}
return a;
}
function newGame() {
board.innerHTML = '';
first = null; lock = false; moves = 0; matched = 0;
document.body.classList.remove('win');
factbar.textContent = 'Find the pairs. Every match reveals a strange truth.';
movesEl.textContent = '0';
var demo = location.hash === '#demo';
var pairCount = demo ? 1 : 8;
var pool = shuffle(ANIMALS.slice());
var deck = [];
for (var i = 0; i < pairCount; i++) {
deck.push({ a: pool[i], cell: ANIMALS.indexOf(pool[i]) });
deck.push({ a: pool[i], cell: ANIMALS.indexOf(pool[i]) });
}
shuffle(deck);
deck.forEach(function (d) { board.appendChild(buildCard(d.a, d.cell)); });
if (demo) {
// Seven pairs already found: real matched state, played out by normal logic.
matched = 7;
factbar.innerHTML = '<b>DEMO:</b> seven pairs found. One pair remains.';
var hiddenIds = {};
deck.forEach(function (d) { hiddenIds[d.a.id] = (hiddenIds[d.a.id] || 0) + 1; });
var shown = 0;
ANIMALS.forEach(function (an, ci) {
if (!hiddenIds[an.id]) {
var c1 = buildCard(an, ci), c2 = buildCard(an, ci);
c1.classList.add('up', 'matched'); c2.classList.add('up', 'matched');
board.appendChild(c1); board.appendChild(c2);
shown++;
}
});
}
pairsEl.textContent = String(8 - matched);
}
function flip(card) {
if (lock || card.classList.contains('up')) return;
card.classList.add('up');
if (!first) { first = card; return; }
moves++;
movesEl.textContent = String(moves);
var a = first, b = card;
first = null;
if (a.dataset.id === b.dataset.id) {
a.classList.add('matched'); b.classList.add('matched');
matched++;
pairsEl.textContent = String(8 - matched);
var an = null;
for (var i = 0; i < ANIMALS.length; i++) if (ANIMALS[i].id === a.dataset.id) an = ANIMALS[i];
factbar.innerHTML = '<b>' + an.name.toUpperCase() + '</b> \u2014 ' + an.fact;
if (matched === 8) {
document.body.classList.add('win');
factbar.innerHTML = '<b>YOU WIN!</b> All 8 pairs found in ' + moves + ' moves.';
}
} else {
lock = true;
setTimeout(function () {
a.classList.remove('up'); b.classList.remove('up');
lock = false;
}, 950);
}
}
document.getElementById('newgame').addEventListener('click', newGame);
newGame();
})();
</script>
</body>
</html>
{
"game": { "name": "TURN TWO CARDS" },
"sheet": {
"style": "Digital painting of a single animal portrait centered in the cell, head and shoulders or full small body, facing slightly toward viewer, on a flat pure black background. Bioluminescent color palette: cyan, teal, amber and violet glows against deep shadow. Soft rim lighting from the upper left, subtle underglow from below. Smooth painterly brushwork with fine detail on eyes and skin texture, no outlines, no text, no borders. All subjects rendered at the same scale, filling about 60 percent of the cell height.",
"cells": [
{ "cell": 0, "id": "axolotl", "name": "Axolotl", "role": "animal", "prompt": "A pale pink axolotl with feathery external gills glowing soft coral red, gentle smile, facing viewer.", "fact": "It regrows lost limbs, and even parts of its brain, without scarring." },
{ "cell": 1, "id": "tardigrade", "name": "Tardigrade", "role": "animal", "prompt": "A plump translucent tardigrade water bear with eight stubby clawed legs, drifting as if in space, glowing faint teal.", "fact": "It survives the vacuum of space by drying into a near-dead speck, then reviving." },
{ "cell": 2, "id": "mantisshrimp", "name": "Mantis Shrimp", "role": "animal", "prompt": "A peacock mantis shrimp, vividly striped in teal, orange and violet, clubbed raptorial arms raised, stalked eyes glinting.", "fact": "Its punch accelerates like a bullet, briefly heating water to near the sun's surface." },
{ "cell": 3, "id": "jellyfish", "name": "Immortal Jellyfish", "role": "animal", "prompt": "A tiny translucent Turritopsis jellyfish, bell glowing warm amber with a bright red center, fine tentacles trailing.", "fact": "When injured or old, it can revert to a polyp and begin life again." },
{ "cell": 4, "id": "platypus", "name": "Platypus", "role": "animal", "prompt": "A platypus swimming upward, dark velvety fur, broad duck bill outlined by faint electric-blue sensory sparks.", "fact": "It lays eggs, sweats milk, and its bill senses the electric fields of prey." },
{ "cell": 5, "id": "mole", "name": "Star-Nosed Mole", "role": "animal", "prompt": "A star-nosed mole emerging from darkness, its 22 pink fleshy nose rays spread like a glowing starburst.", "fact": "Its 22-fingered nose makes it the fastest-eating mammal on Earth." },
{ "cell": 6, "id": "glassfrog", "name": "Glass Frog", "role": "animal", "prompt": "A small lime-green glass frog clinging to nothing, belly translucent showing a faintly glowing heart, huge golden eyes.", "fact": "Its belly is transparent \u2014 you can watch its heart beat and eggs develop." },
{ "cell": 7, "id": "ayeaye", "name": "Aye-Aye", "role": "animal", "prompt": "An aye-aye lemur with huge amber eyes and bat-like ears, one long skeletal middle finger raised mid-tap.", "fact": "It taps wood with a bony middle finger, listening for hollow grubs inside." },
{ "cell": 8, "id": "back", "name": "Card back", "role": "back", "prompt": "An ornate symmetrical card-back emblem: a stylized ouroboros-like ring of tiny glowing animal footprints around a crescent moon, thin cyan and amber linework on flat black, centered, elegant, no text." }
]
}
}
art/cards.png; until it loads, the body gets a noart class and every face-up card shows a styled dark panel with the animal's name in glowing lettering, and face-down cards show a diagonal hatch pattern — fully playable with no image at all.