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.Odd Kin is a gilt-edged concentration game: eight improbable animals, painted like a pocket wunderkammer, on a dark museum table.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Odd Kin</title>
<style>
:root {
--bg: #12100e;
--ink: #e8dfd0;
--muted: #9a8d78;
--gold: #d4b36a;
--line: #3a342c;
--card: #1c1814;
--chrome: 8.6rem;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: var(--bg);
color: var(--ink);
font: 16px/1.3 Palatino, "Palatino Linotype", "Book Antiqua", Georgia, serif;
}
html { font-size: clamp(12px, 2.05vmin, 18px); }
body {
background:
radial-gradient(ellipse at 50% 30%, #2a241c 0%, #12100e 70%);
background-size: cover;
background-position: center;
}
body.has-felt {
background-color: #12100e;
background-size: cover;
background-position: center;
}
.app {
height: 100%;
display: flex;
flex-direction: column;
padding: 0.55rem 0.7rem 0.45rem;
gap: 0.35rem;
}
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
flex-shrink: 0;
min-height: 2.6rem;
}
.brand { min-width: 0; }
h1 {
margin: 0;
font-size: clamp(1.05rem, 3.4vmin, 1.7rem);
letter-spacing: 0.14em;
font-weight: 600;
text-transform: uppercase;
color: var(--gold);
white-space: nowrap;
}
.tag {
margin: 0.05rem 0 0;
font-size: 0.68rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
white-space: nowrap;
}
.stats {
display: flex;
gap: 0.7rem;
flex: 1;
justify-content: center;
}
.stat {
text-align: center;
min-width: 4.2rem;
}
.stat b {
display: block;
font-size: 1.25rem;
color: var(--ink);
font-variant-numeric: tabular-nums;
}
.stat span {
display: block;
font-size: 0.62rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
}
#new {
appearance: none;
border: 1px solid var(--gold);
background: transparent;
color: var(--gold);
font: inherit;
font-size: 0.78rem;
letter-spacing: 0.12em;
text-transform: uppercase;
padding: 0.4rem 0.7rem;
cursor: pointer;
border-radius: 2px;
white-space: nowrap;
}
#new:hover { background: rgba(212, 179, 106, 0.12); }
#new:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.stage {
flex: 1;
min-height: 0;
display: flex;
align-items: center;
justify-content: center;
}
.board {
width: min(calc(100vw - 1.4rem), calc(100vh - var(--chrome)));
height: min(calc(100vw - 1.4rem), calc(100vh - var(--chrome)));
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 2.4%;
padding: 2.6%;
background: rgba(0, 0, 0, 0.28);
border: 1px solid var(--line);
border-radius: 3%;
}
.board.is-locked { pointer-events: none; }
.card {
position: relative;
padding: 0;
border: 0;
background: transparent;
cursor: pointer;
perspective: 900px;
min-width: 0;
min-height: 0;
}
.card:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.card.is-matched { cursor: default; }
.inner {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: transform 0.42s ease;
}
.card.is-up .inner,
.card.is-matched .inner { transform: rotateY(180deg); }
.face {
position: absolute;
inset: 0;
border-radius: 9%;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
overflow: hidden;
border: 2px solid #b8954a;
}
.face-back {
background-color: #161310;
background-image:
radial-gradient(circle at 50% 50%, #4a4030 0 18%, transparent 19%),
repeating-conic-gradient(from 0deg, #1b1713 0deg 12deg, #241f19 12deg 24deg);
}
.face-front {
transform: rotateY(180deg);
background-color: var(--card);
display: flex;
align-items: center;
justify-content: center;
}
.card.is-matched .face-front { box-shadow: inset 0 0 0 2px rgba(212, 179, 106, 0.55); }
.fallback {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.28rem;
padding: 0.2rem;
width: 100%;
height: 100%;
color: var(--ink);
}
.has-art .fallback { display: none; }
.mark {
width: 42%;
height: 42%;
flex-shrink: 0;
}
.mark-axolotl { background: #e3a3a8; border-radius: 60% 60% 45% 45%; }
.mark-tardigrade { background: #b9a89a; border-radius: 40%; }
.mark-platypus { background: #8a6a48; border-radius: 50% 20% 50% 20%; }
.mark-mantis {
background: #2f8f86;
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
}
.mark-ayeaye { background: #5c4638; border-radius: 50%; box-shadow: inset -0.15em -0.15em 0 #c47a2a; }
.mark-immortal {
background: transparent;
border: 0.28em solid #b43a3a;
border-radius: 50%;
}
.mark-pistol {
background: #c4a06a;
clip-path: polygon(50% 0, 100% 100%, 0 100%);
}
.mark-starnose {
background: #d08a86;
clip-path: polygon(50% 0, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}
.fname {
font-size: clamp(0.42rem, 1.7vmin, 0.72rem);
letter-spacing: 0.04em;
text-align: center;
line-height: 1.15;
max-width: 96%;
}
footer {
flex-shrink: 0;
min-height: 2.7rem;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: 0 0.4rem;
}
#status {
margin: 0;
max-width: 46rem;
font-size: clamp(0.72rem, 2vmin, 0.98rem);
color: var(--muted);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
#status strong { color: var(--gold); font-weight: 600; }
body.is-won #status {
color: var(--gold);
letter-spacing: 0.04em;
}
@media (prefers-reduced-motion: reduce) {
.inner { transition: none; }
}
</style>
</head>
<body>
<div class="app">
<header>
<div class="brand">
<h1>Odd Kin</h1>
<p class="tag">Fascinating animals</p>
</div>
<div class="stats">
<div class="stat"><b id="moves">0</b><span>Moves</span></div>
<div class="stat"><b id="left">8</b><span>Pairs left</span></div>
</div>
<button id="new" type="button">New game</button>
</header>
<div class="stage">
<div class="board" id="board" role="grid" aria-label="Memory board"></div>
</div>
<footer>
<p id="status">Turn two cards. A match reveals a fact.</p>
</footer>
</div>
<script>
(function () {
var SHEET = "art/cards.png";
var ANIMALS = [
{ id: "axolotl", name: "Axolotl", fact: "It regenerates whole limbs, its spinal cord, and parts of its brain without forming scar tissue." },
{ id: "tardigrade", name: "Tardigrade", fact: "It can survive the vacuum of space, intense radiation, and years completely dried out." },
{ id: "platypus", name: "Platypus", fact: "Males have a venomous ankle spur, making the platypus one of the few venomous mammals." },
{ id: "mantis", name: "Mantis shrimp", fact: "Its club strike hits like a bullet and collapses a bubble hot enough to flash light." },
{ id: "ayeaye", name: "Aye-aye", fact: "It taps wood with a thin middle finger, then hooks grubs out through the hole." },
{ id: "immortal", name: "Immortal jellyfish", fact: "It can revert from adult medusa to a polyp, restarting its life cycle again and again." },
{ id: "pistol", name: "Pistol shrimp", fact: "Its claw snap is among the loudest sounds in the ocean and can stun or kill small prey." },
{ id: "starnose", name: "Star-nosed mole", fact: "It can identify and eat prey in about 120 milliseconds using 22 fleshy nose rays." }
];
var DELAY = 800;
var board = document.getElementById("board");
var movesEl = document.getElementById("moves");
var leftEl = document.getElementById("left");
var statusEl = document.getElementById("status");
var artReady = false;
var open = [];
var locked = false;
var moves = 0;
var found = 0;
var flipTimer = 0;
var audioCtx = null;
function paint(el, cell) {
if (!artReady) return;
var col = cell % 3;
var row = Math.floor(cell / 3);
el.style.backgroundImage = "url(\"" + SHEET + "\")";
el.style.backgroundSize = "300% 300%";
el.style.backgroundPosition = (col * 50) + "% " + (row * 50) + "%";
el.style.backgroundColor = "#000";
}
function paintAll() {
var nodes = board.querySelectorAll(".js-sheet");
for (var i = 0; i < nodes.length; i++) {
paint(nodes[i], parseInt(nodes[i].getAttribute("data-cell"), 10));
}
}
var probe = new Image();
probe.onload = function () {
artReady = true;
document.body.classList.add("has-art");
paintAll();
};
probe.onerror = function () { artReady = false; };
probe.src = SHEET;
var felt = new Image();
felt.onload = function () {
document.body.classList.add("has-felt");
document.body.style.backgroundImage = "url(\"art/felt.png\")";
};
felt.src = "art/felt.png";
function ensureAudio() {
var AC = window.AudioContext || window.webkitAudioContext;
if (!AC) return null;
if (!audioCtx) audioCtx = new AC();
if (audioCtx.state === "suspended") audioCtx.resume();
return audioCtx;
}
function tone(freq, when, dur, type, gain) {
var ctx = ensureAudio();
if (!ctx) return;
var o = ctx.createOscillator();
var g = ctx.createGain();
o.type = type || "sine";
o.frequency.value = freq;
var t0 = ctx.currentTime + when;
g.gain.setValueAtTime(0.0001, t0);
g.gain.exponentialRampToValueAtTime(gain || 0.05, t0 + 0.012);
g.gain.exponentialRampToValueAtTime(0.0001, t0 + dur);
o.connect(g);
g.connect(ctx.destination);
o.start(t0);
o.stop(t0 + dur + 0.03);
}
function shuffle(arr) {
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
function isDemo() {
return location.hash.replace(/^#/, "") === "demo";
}
function setLock(on) {
locked = on;
board.classList.toggle("is-locked", on);
}
function updateHud() {
movesEl.textContent = String(moves);
leftEl.textContent = String(8 - found);
}
function labelCard(btn) {
var up = btn.classList.contains("is-up") || btn.classList.contains("is-matched");
var a = ANIMALS[parseInt(btn.getAttribute("data-animal"), 10)];
btn.setAttribute("aria-label", up ? a.name : "Face-down card");
}
function makeCard(animalIndex) {
var a = ANIMALS[animalIndex];
var btn = document.createElement("button");
btn.type = "button";
btn.className = "card";
btn.setAttribute("data-animal", String(animalIndex));
btn.setAttribute("aria-label", "Face-down card");
btn.innerHTML =
"<span class=\"inner\">" +
"<span class=\"face face-back js-sheet\" data-cell=\"8\"></span>" +
"<span class=\"face face-front js-sheet\" data-cell=\"" + animalIndex + "\">" +
"<span class=\"fallback\">" +
"<span class=\"mark mark-" + a.id + "\"></span>" +
"<span class=\"fname\">" + a.name + "</span>" +
"</span>" +
"</span>" +
"</span>";
btn.addEventListener("click", function () { onCard(btn); });
return btn;
}
function win() {
document.body.classList.add("is-won");
statusEl.innerHTML = "You found every pair in <strong>" + moves + "</strong> moves.";
tone(523, 0, 0.16, "triangle", 0.05);
tone(659, 0.12, 0.16, "triangle", 0.05);
tone(784, 0.24, 0.18, "triangle", 0.05);
tone(1046, 0.38, 0.32, "sine", 0.045);
}
function onCard(btn) {
if (locked) return;
if (btn.classList.contains("is-up") || btn.classList.contains("is-matched")) return;
ensureAudio();
btn.classList.add("is-up");
labelCard(btn);
open.push(btn);
tone(480 + open.length * 70, 0, 0.06, "triangle", 0.035);
if (open.length < 2) return;
moves += 1;
updateHud();
var a = parseInt(open[0].getAttribute("data-animal"), 10);
var b = parseInt(open[1].getAttribute("data-animal"), 10);
if (a === b) {
open[0].classList.add("is-matched");
open[1].classList.add("is-matched");
found += 1;
updateHud();
var animal = ANIMALS[a];
statusEl.innerHTML = "<strong>" + animal.name + ".</strong> " + animal.fact;
tone(660, 0, 0.1, "sine", 0.045);
tone(880, 0.09, 0.14, "sine", 0.04);
open = [];
if (found === 8) win();
return;
}
setLock(true);
flipTimer = window.setTimeout(function () {
open[0].classList.remove("is-up");
open[1].classList.remove("is-up");
labelCard(open[0]);
labelCard(open[1]);
open = [];
setLock(false);
}, DELAY);
}
function start() {
window.clearTimeout(flipTimer);
setLock(false);
open = [];
moves = 0;
found = 0;
document.body.classList.remove("is-won");
statusEl.textContent = "Turn two cards. A match reveals a fact.";
var ids = [];
for (var i = 0; i < 8; i++) ids.push(i, i);
shuffle(ids);
var keep = -1;
if (isDemo()) {
keep = ids[Math.floor(Math.random() * ids.length)];
found = 7;
moves = 7;
}
board.innerHTML = "";
for (var s = 0; s < ids.length; s++) {
var card = makeCard(ids[s]);
if (keep !== -1 && ids[s] !== keep) {
card.classList.add("is-up", "is-matched");
labelCard(card);
}
board.appendChild(card);
}
updateHud();
if (artReady) paintAll();
}
document.getElementById("new").addEventListener("click", start);
window.addEventListener("hashchange", start);
start();
})();
</script>
</body>
</html>
{
"game": { "name": "ODD KIN" },
"sheet": {
"style": "Cabinet-of-curiosities gouache on a perfectly flat black field. One subject centered in the square, same visual weight in every cell so the nine images read as one deck. Crisp dark ink contours, velvety pigment, a restrained palette of antique gold, teal, rose, cream, and warm gray. Soft rim light from the upper left. No letters, numbers, frames, drop shadows, or ground plane.",
"cells": [
{
"cell": 0,
"id": "axolotl",
"name": "Axolotl",
"role": "animal",
"prompt": "A pale rose axolotl in three-quarter view, feathery external gills fanned wide, dark wet eyes, slight smile, the whole animal centered and filling most of the cell as a specimen portrait.",
"fact": "It regenerates whole limbs, its spinal cord, and parts of its brain without forming scar tissue."
},
{
"cell": 1,
"id": "tardigrade",
"name": "Tardigrade",
"role": "animal",
"prompt": "A plump tardigrade facing slightly left, eight stubby clawed legs, translucent rose-gray segmented body, drawn at portrait scale filling most of the cell, not microscopic.",
"fact": "It can survive the vacuum of space, intense radiation, and years completely dried out."
},
{
"cell": 2,
"id": "platypus",
"name": "Platypus",
"role": "animal",
"prompt": "A platypus in a calm side-on swimming pose, duck bill, dense walnut fur, paddle tail and webbed feet visible, the whole animal centered and filling most of the cell.",
"fact": "Males have a venomous ankle spur, making the platypus one of the few venomous mammals."
},
{
"cell": 3,
"id": "mantis",
"name": "Mantis shrimp",
"role": "animal",
"prompt": "A peacock mantis shrimp in strict side view, smashing clubs folded, carapace banded teal rust and cream, stalked eyes, the whole animal centered and filling most of the cell.",
"fact": "Its club strike hits like a bullet and collapses a bubble hot enough to flash light."
},
{
"cell": 4,
"id": "ayeaye",
"name": "Aye-aye",
"role": "animal",
"prompt": "An aye-aye facing forward, huge amber eyes, bat-like ears, one extremely thin middle finger raised, dark shaggy fur, the whole animal centered and filling most of the cell.",
"fact": "It taps wood with a thin middle finger, then hooks grubs out through the hole."
},
{
"cell": 5,
"id": "immortal",
"name": "Immortal jellyfish",
"role": "animal",
"prompt": "An immortal jellyfish, translucent bell with a bright crimson four-part stomach, fine trailing tentacles, centered like a wet-plate specimen and filling most of the cell.",
"fact": "It can revert from adult medusa to a polyp, restarting its life cycle again and again."
},
{
"cell": 6,
"id": "pistol",
"name": "Pistol shrimp",
"role": "animal",
"prompt": "A snapping pistol shrimp in side view, one enormous asymmetric claw held open, sand-and-teal banded body, long antennae, the whole animal centered and filling most of the cell.",
"fact": "Its claw snap is among the loudest sounds in the ocean and can stun or kill small prey."
},
{
"cell": 7,
"id": "starnose",
"name": "Star-nosed mole",
"role": "animal",
"prompt": "A star-nosed mole facing the viewer, twenty-two pink fleshy rays spread in a star around the snout, velvety black fur, oversized digging claws, the whole animal centered and filling most of the cell.",
"fact": "It can identify and eat prey in about 120 milliseconds using 22 fleshy nose rays."
},
{
"cell": 8,
"id": "back",
"name": "Card back",
"role": "back",
"prompt": "A circular antique-gold and teal knot-work medallion with eight-fold symmetry, a thin inner ring of tiny dots, no animals and no text, centered and filling most of the cell."
}
]
},
"extras": [
{
"id": "felt",
"aspect": "16:9",
"prompt": "Seamless dark museum tabletop of worn charcoal-brown wool felt, faint gold threads in the weave, soft vignette toward the edges, even quiet lighting, no objects and no text."
}
]
}