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 deep-sea-green felt-table memory game where you flip glowing naturalist-illustration cards to match eight of nature's weirdest creatures.
<!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 {
font-family: Georgia, "Times New Roman", serif;
background: radial-gradient(ellipse at 50% 30%, #14433a 0%, #0a2b25 55%, #051a16 100%);
color: #e8dcc0;
display: flex;
flex-direction: column;
align-items: center;
height: 100dvh;
user-select: none;
}
body.has-table {
background-image: url("art/table.png");
background-size: cover;
background-position: center;
}
header {
display: flex;
align-items: center;
justify-content: center;
gap: 2.2em;
flex-wrap: wrap;
padding: 10px 12px 4px;
width: 100%;
}
h1 {
font-size: clamp(15px, 2.6vmin, 26px);
letter-spacing: 0.22em;
color: #f0d98a;
text-shadow: 0 2px 6px rgba(0,0,0,.6);
font-weight: normal;
}
.stats {
display: flex;
gap: 1.4em;
font-size: clamp(12px, 2vmin, 18px);
color: #cfe6d8;
}
.stats b { color: #f0d98a; font-weight: normal; }
button {
font-family: inherit;
font-size: clamp(12px, 2vmin, 17px);
letter-spacing: 0.08em;
color: #0a2b25;
background: linear-gradient(#f0d98a, #c9a94f);
border: 1px solid #8a7431;
border-radius: 8px;
padding: 6px 18px;
cursor: pointer;
box-shadow: 0 3px 8px rgba(0,0,0,.45);
}
button:active { transform: translateY(1px); }
#fact {
min-height: 2.4em;
max-width: 720px;
width: 94%;
text-align: center;
font-style: italic;
font-size: clamp(11px, 1.9vmin, 16px);
color: #ffe9a8;
padding: 4px 10px;
text-shadow: 0 1px 4px rgba(0,0,0,.7);
transition: opacity .4s;
opacity: 0;
}
#fact.show { opacity: 1; }
#board {
width: min(94vw, calc(100dvh - 118px));
aspect-ratio: 1 / 1;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: min(1.4vw, 12px);
margin: auto;
padding-bottom: 8px;
}
.card { perspective: 900px; cursor: pointer; }
.card.matched { cursor: default; }
.inner {
position: relative;
width: 100%; height: 100%;
transform-style: preserve-3d;
transition: transform .45s ease;
}
.card.up .inner { transform: rotateY(180deg); }
.face {
position: absolute;
inset: 0;
backface-visibility: hidden;
border-radius: 9%;
overflow: hidden;
box-shadow: 0 4px 10px rgba(0,0,0,.5);
border: 2px solid #3d6b5c;
}
.face.back {
background-color: #000;
background-image: url("art/cards.png");
background-size: 300% 300%;
background-position: 100% 100%;
}
.face.front {
transform: rotateY(180deg);
background-color: #000;
background-size: 300% 300%;
background-repeat: no-repeat;
display: flex;
align-items: center;
justify-content: center;
}
.card.matched .face.front {
border-color: #f0d98a;
box-shadow: 0 0 14px rgba(240,217,138,.55);
}
.fallback {
display: none;
flex-direction: column;
align-items: center;
gap: 6%;
width: 100%; height: 100%;
justify-content: center;
background: #101c18;
padding: 6%;
text-align: center;
}
body.noart .face.front { background-image: none !important; }
body.noart .face.back { background-image: none !important; background: repeating-linear-gradient(45deg,#12352c,#12352c 10px,#0d2a23 10px,#0d2a23 20px); }
body.noart .fallback { display: flex; }
.shape {
width: 42%;
aspect-ratio: 1;
transform: rotate(45deg);
border-radius: 18%;
box-shadow: 0 0 12px rgba(255,255,255,.25) inset;
}
.fallback span {
font-size: clamp(8px, 1.7vmin, 14px);
color: #e8dcc0;
letter-spacing: 0.05em;
}
#win {
position: fixed;
inset: 0;
background: rgba(4, 18, 15, .82);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
z-index: 10;
text-align: center;
padding: 20px;
}
#win h2 {
font-size: clamp(22px, 5vmin, 44px);
color: #f0d98a;
letter-spacing: 0.15em;
font-weight: normal;
}
#win p { font-size: clamp(13px, 2.4vmin, 20px); color: #cfe6d8; font-style: italic; }
</style>
</head>
<body>
<header>
<h1>TURN TWO CARDS</h1>
<div class="stats">
<span>Moves: <b id="moves">0</b></span>
<span>Pairs left: <b id="pairs">8</b></span>
</div>
<button id="newgame">New game</button>
</header>
<div id="fact"></div>
<div id="board"></div>
<div id="win" hidden>
<h2>YOU WIN</h2>
<p id="wintext"></p>
</div>
<script>
(function () {
"use strict";
var ANIMALS = [
{ id: "axolotl", name: "Axolotl", cell: 0, color: "#e88ab0",
fact: "It regrows lost limbs, jaws, spinal cord and even parts of its heart, all without scarring." },
{ id: "pangolin", name: "Pangolin", cell: 1, color: "#c9a94f",
fact: "The only mammal truly covered in scales; it rolls into an armored ball when threatened." },
{ id: "mantis", name: "Mantis Shrimp", cell: 2, color: "#4fd0a0",
fact: "Its club strikes so fast that the water around it briefly boils, smashing through crab shells." },
{ id: "tardigrade",name: "Tardigrade", cell: 3, color: "#9ab8d8",
fact: "This micro-animal survives vacuum of space, intense radiation and temperatures near absolute zero." },
{ id: "narwhal", name: "Narwhal", cell: 4, color: "#7fb4e0",
fact: "Its spiral tusk is actually a tooth that can grow up to 3 metres long." },
{ id: "platypus", name: "Platypus", cell: 5, color: "#a8794f",
fact: "Males carry venomous ankle spurs, and it hunts underwater by sensing electric fields." },
{ id: "seadragon", name: "Leafy Seadragon", cell: 6, color: "#d8b84f",
fact: "Males brood the eggs, and its leaf-like fins disguise it as drifting seaweed." },
{ id: "beetle", name: "Bombardier Beetle", cell: 7, color: "#e06a3f",
fact: "It sprays a boiling, noxious chemical jet from its abdomen with an audible pop." }
];
var board = document.getElementById("board");
var movesEl = document.getElementById("moves");
var pairsEl = document.getElementById("pairs");
var factEl = document.getElementById("fact");
var winEl = document.getElementById("win");
var winText = document.getElementById("wintext");
var first = null, lock = false, moves = 0, pairsLeft = 8;
var artReady = false;
// --- artwork loading ---
var probe = new Image();
probe.onload = function () {
artReady = true;
document.body.classList.remove("noart");
var faces = board.querySelectorAll(".face.front");
for (var i = 0; i < faces.length; i++) applyArt(faces[i]);
var backs = board.querySelectorAll(".face.back");
for (var j = 0; j < backs.length; j++) backs[j].style.backgroundImage = "url('art/cards.png')";
};
probe.onerror = function () {
artReady = false;
document.body.classList.add("noart");
};
probe.src = "art/cards.png";
// optional table decoration
var tableProbe = new Image();
tableProbe.onload = function () { document.body.classList.add("has-table"); };
tableProbe.src = "art/table.png";
function cellPos(cell) {
var col = cell % 3, row = Math.floor(cell / 3);
return (col * 50) + "% " + (row * 50) + "%";
}
function applyArt(frontEl) {
if (!artReady) return;
var cell = parseInt(frontEl.getAttribute("data-cell"), 10);
frontEl.style.backgroundImage = "url('art/cards.png')";
frontEl.style.backgroundPosition = cellPos(cell);
}
// --- tiny Web Audio blips ---
var actx = null;
function blip(freq, dur) {
try {
if (!actx) actx = new (window.AudioContext || window.webkitAudioContext)();
var o = actx.createOscillator(), g = actx.createGain();
o.type = "sine"; o.frequency.value = freq;
g.gain.setValueAtTime(0.08, actx.currentTime);
g.gain.exponentialRampToValueAtTime(0.0001, actx.currentTime + dur);
o.connect(g); g.connect(actx.destination);
o.start(); o.stop(actx.currentTime + dur);
} catch (e) { /* audio is optional */ }
}
// --- game setup ---
function shuffle(arr) {
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
return arr;
}
function newGame() {
first = null; lock = false; moves = 0; pairsLeft = 8;
movesEl.textContent = "0";
pairsEl.textContent = "8";
factEl.classList.remove("show");
factEl.textContent = "";
winEl.hidden = true;
board.innerHTML = "";
var demo = location.hash === "#demo";
var deck = [];
ANIMALS.forEach(function (a, idx) {
deck.push({ animal: a, animalIdx: idx });
deck.push({ animal: a, animalIdx: idx });
});
shuffle(deck);
var leftover = Math.floor(Math.random() * 8); // the one unmatched pair in demo
deck.forEach(function (entry) {
var card = document.createElement("div");
card.className = "card";
var inner = document.createElement("div");
inner.className = "inner";
var back = document.createElement("div");
back.className = "face back";
var front = document.createElement("div");
front.className = "face front";
front.setAttribute("data-cell", entry.animal.cell);
if (artReady) applyArt(front);
var fb = document.createElement("div");
fb.className = "fallback";
var shape = document.createElement("div");
shape.className = "shape";
shape.style.background = entry.animal.color;
var label = document.createElement("span");
label.textContent = entry.animal.name;
fb.appendChild(shape);
fb.appendChild(label);
front.appendChild(fb);
inner.appendChild(back);
inner.appendChild(front);
card.appendChild(inner);
if (demo && entry.animalIdx !== leftover) {
card.classList.add("up", "matched");
pairsLeft = 1;
}
card.addEventListener("click", function () { onCard(card, entry.animal); });
board.appendChild(card);
});
if (demo) pairsEl.textContent = "1";
}
function onCard(card, animal) {
if (lock) return;
if (card.classList.contains("up") || card.classList.contains("matched")) return;
card.classList.add("up");
blip(440, 0.12);
if (!first) {
first = { card: card, animal: animal };
return;
}
moves++;
movesEl.textContent = String(moves);
var a = first;
first = null;
if (a.animal.id === animal.id) {
a.card.classList.add("matched");
card.classList.add("matched");
pairsLeft--;
pairsEl.textContent = String(pairsLeft);
factEl.textContent = animal.name + ": " + animal.fact;
factEl.classList.add("show");
blip(660, 0.25);
if (pairsLeft === 0) {
setTimeout(function () {
winText.textContent = "All 8 pairs found in " + moves + " move" + (moves === 1 ? "" : "s") + ". The weird animal kingdom salutes you.";
winEl.hidden = false;
blip(880, 0.5);
}, 500);
}
} else {
lock = true;
setTimeout(function () {
a.card.classList.remove("up");
card.classList.remove("up");
lock = false;
}, 900);
}
}
document.getElementById("newgame").addEventListener("click", function () {
if (location.hash === "#demo") {
history.replaceState(null, "", location.pathname + location.search);
}
newGame();
});
newGame();
})();
</script>
</body>
</html>
{
"game": { "name": "TURN TWO CARDS" },
"sheet": {
"style": "Vintage naturalist plate illustration with a modern glow: gouache and ink on black, each subject centered and lit by soft bioluminescent rim light in teal and gold, rich jewel-tone palette of deep greens, amber, coral and moonlight blue, fine confident ink linework with subtle stipple shading, flat black background, identical scale and framing across all cells so the nine images read as one cohesive card deck.",
"cells": [
{
"cell": 0,
"id": "axolotl",
"name": "Axolotl",
"role": "animal",
"prompt": "A smiling pink axolotl with feathery external gills, floating gently, viewed three-quarters from the front.",
"fact": "It regrows lost limbs, jaws, spinal cord and even parts of its heart, all without scarring."
},
{
"cell": 1,
"id": "pangolin",
"name": "Pangolin",
"role": "animal",
"prompt": "A pangolin half-curled into its armored ball, overlapping keratin scales catching golden rim light.",
"fact": "The only mammal truly covered in scales; it rolls into an armored ball when threatened."
},
{
"cell": 2,
"id": "mantis",
"name": "Mantis Shrimp",
"role": "animal",
"prompt": "A peacock mantis shrimp rearing up with raptorial clubs raised, iridescent rainbow shell, eyes gleaming.",
"fact": "Its club strikes so fast that the water around it briefly boils, smashing through crab shells."
},
{
"cell": 3,
"id": "tardigrade",
"name": "Tardigrade",
"role": "animal",
"prompt": "A chubby eight-legged tardigrade (water bear) drifting like a tiny astronaut, stubby claws out, softly glowing.",
"fact": "This micro-animal survives vacuum of space, intense radiation and temperatures near absolute zero."
},
{
"cell": 4,
"id": "narwhal",
"name": "Narwhal",
"role": "animal",
"prompt": "A narwhal in profile with its long spiral tusk forward, pale mottled blue-grey skin, faint arctic light.",
"fact": "Its spiral tusk is actually a tooth that can grow up to 3 metres long."
},
{
"cell": 5,
"id": "platypus",
"name": "Platypus",
"role": "animal",
"prompt": "A platypus swimming toward the viewer, duck bill forward, dense brown fur, small bubbles trailing.",
"fact": "Males carry venomous ankle spurs, and it hunts underwater by sensing electric fields."
},
{
"cell": 6,
"id": "seadragon",
"name": "Leafy Seadragon",
"role": "animal",
"prompt": "A leafy seadragon in profile, elaborate leaf-shaped fins drifting like seaweed, long pipefish snout.",
"fact": "Males brood the eggs, and its leaf-like fins disguise it as drifting seaweed."
},
{
"cell": 7,
"id": "beetle",
"name": "Bombardier Beetle",
"role": "animal",
"prompt": "A bombardier beetle rearing up, abdomen tip raised and spraying a small glowing burst of hot chemical mist.",
"fact": "It sprays a boiling, noxious chemical jet from its abdomen with an audible pop."
},
{
"cell": 8,
"id": "back",
"name": "Card back",
"role": "back",
"prompt": "Symmetrical card-back design: an ornate gold oval frame containing a curled fern frond and a small crescent moon, on deep green-black, with fine corner flourishes, perfectly centered."
}
]
},
"extras": [
{
"id": "table",
"aspect": "16:9",
"prompt": "A dim vintage card table surface: deep green felt with subtle vignette, faint candlelight from above, worn edges, no objects, suitable as a full-page background behind a card game."
}
]
}
art/cards.png with an Image object; on failure it adds a noart class and every face shows a styled placeholder — a colored diamond in the animal's signature hue plus the animal's name — so the game remains fully playable. The card back falls back to a striped pattern.