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: Strange Beasts — a 4×4 deck of luminous ink-and-gouache animal portraits on deep teal cards, dealt onto a dark table, with a fact ribbon that lights up whenever a pair meets its twin.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Turn Two Cards — Strange Beasts</title>
<style>
:root{
--sheet: url("art/cards.png");
--ink:#eaf3f2;
--card:#0e3a3c;
--card2:#12525a;
--gold:#e9c46a;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;overflow:hidden}
body{
background:#07100f;
color:var(--ink);
font-family:"Trebuchet MS",Verdana,Geneva,sans-serif;
display:flex;flex-direction:column;
-webkit-tap-highlight-color:transparent;
}
#table{
position:fixed;inset:0;z-index:-1;
background:
radial-gradient(ellipse at 50% 35%,#123033 0%,#07100f 70%),
url("art/table.png") center/cover no-repeat;
background-blend-mode:soft-light,normal;
opacity:.95;
}
header{
flex:0 0 auto;
display:flex;align-items:center;justify-content:center;
gap:clamp(8px,2vw,26px);
flex-wrap:wrap;
padding:clamp(6px,1.4vh,14px) 12px clamp(2px,.8vh,8px);
}
h1{
font-size:clamp(13px,2.1vh,20px);
letter-spacing:.22em;font-weight:700;
color:var(--gold);text-transform:uppercase;white-space:nowrap;
}
.stat{
font-size:clamp(11px,1.8vh,16px);
letter-spacing:.1em;text-transform:uppercase;opacity:.9;white-space:nowrap;
}
.stat b{color:#fff;font-size:1.15em}
button{
font:inherit;font-size:clamp(11px,1.7vh,15px);
letter-spacing:.14em;text-transform:uppercase;
color:#07100f;background:var(--gold);
border:0;border-radius:999px;
padding:.45em 1.2em;cursor:pointer;
}
button:hover{background:#f6dc9a}
#wrap{flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;padding:4px}
#board{
display:grid;
grid-template-columns:repeat(4,1fr);
grid-template-rows:repeat(4,1fr);
gap:clamp(4px,1vmin,12px);
}
.card{position:relative;perspective:900px;cursor:pointer}
.card.done,.card.up{cursor:default}
.inner{
position:absolute;inset:0;
transform-style:preserve-3d;
transition:transform .42s cubic-bezier(.4,.1,.3,1);
border-radius:9%;
}
.card.up .inner,.card.done .inner{transform:rotateY(180deg)}
.side{
position:absolute;inset:0;
backface-visibility:hidden;-webkit-backface-visibility:hidden;
border-radius:9%;
overflow:hidden;
box-shadow:0 3px 10px rgba(0,0,0,.55);
}
.back{
background-color:var(--card2);
background-image:var(--sheet);
background-size:300% 300%;
background-position:100% 100%;
border:2px solid #2b7c81;
}
body.no-art .back{
background-image:
repeating-linear-gradient(45deg,#12525a 0 8px,#0e3a3c 8px 16px);
}
.face{
transform:rotateY(180deg);
background-color:#000;
background-image:var(--sheet);
background-size:300% 300%;
background-repeat:no-repeat;
border:2px solid #3d8c86;
display:flex;align-items:flex-end;justify-content:center;
}
body.no-art .face{background-image:none;background-color:#0d2b30;align-items:center}
.label{
display:none;
width:100%;padding:6% 4%;
text-align:center;font-weight:700;
font-size:clamp(8px,1.6vmin,15px);
letter-spacing:.06em;text-transform:uppercase;
color:var(--gold);
text-shadow:0 1px 2px #000;
}
body.no-art .label{display:block}
.card.done .face{border-color:var(--gold);box-shadow:0 0 0 2px rgba(233,196,106,.45),0 3px 10px rgba(0,0,0,.55)}
footer{
flex:0 0 auto;
min-height:clamp(38px,7.5vh,72px);
display:flex;align-items:center;justify-content:center;
padding:4px clamp(10px,4vw,40px) clamp(8px,1.6vh,18px);
text-align:center;
}
#msg{
max-width:70ch;
font-size:clamp(11px,2vh,18px);
line-height:1.35;
}
#msg .who{color:var(--gold);font-weight:700;letter-spacing:.08em;text-transform:uppercase}
#msg.win{color:var(--gold);font-weight:700;letter-spacing:.1em;font-size:clamp(13px,2.6vh,24px)}
</style>
</head>
<body>
<div id="table" aria-hidden="true"></div>
<header>
<h1>Turn Two Cards</h1>
<div class="stat">Moves <b id="moves">0</b></div>
<div class="stat">Pairs left <b id="left">8</b></div>
<button id="new">New game</button>
</header>
<div id="wrap"><div id="board" role="grid" aria-label="Memory board"></div></div>
<footer><div id="msg">Turn over two cards. Find the eight strange beasts.</div></footer>
<script>
const ANIMALS=[
{cell:0,name:"Axolotl",fact:"It regrows lost limbs, and even parts of its brain, without leaving a scar."},
{cell:1,name:"Mantis Shrimp",fact:"Its club punches so fast the water briefly boils into collapsing bubbles."},
{cell:2,name:"Naked Mole-Rat",fact:"It can live 30 years and survive about 18 minutes with no oxygen at all."},
{cell:3,name:"Pangolin",fact:"The only mammal armoured in keratin scales; toothless, it laps up ants with a very long tongue."},
{cell:4,name:"Tardigrade",fact:"Dried almost water-free, it survives boiling, freezing, radiation and the vacuum of space."},
{cell:5,name:"Platypus",fact:"A venomous, egg-laying mammal that hunts with eyes shut, sensing prey's electric fields."},
{cell:6,name:"Immortal Jellyfish",fact:"Turritopsis dohrnii can rewind its life cycle, reverting to a polyp instead of dying."},
{cell:7,name:"Bombardier Beetle",fact:"It mixes chemicals in its abdomen and sprays a near-boiling, pulsing jet at attackers."}
];
const boardEl=document.getElementById('board'),
movesEl=document.getElementById('moves'),
leftEl=document.getElementById('left'),
msgEl=document.getElementById('msg'),
wrapEl=document.getElementById('wrap');
let deck=[],first=null,second=null,lock=false,moves=0,matched=0;
let audio=null;
function beep(freqs,dur){
try{
if(!audio) audio=new (window.AudioContext||window.webkitAudioContext)();
const t=audio.currentTime;
freqs.forEach((f,i)=>{
const o=audio.createOscillator(),g=audio.createGain();
o.type='triangle';o.frequency.value=f;
g.gain.setValueAtTime(0.0001,t+i*0.05);
g.gain.exponentialRampToValueAtTime(0.16,t+i*0.05+0.02);
g.gain.exponentialRampToValueAtTime(0.0001,t+i*0.05+dur);
o.connect(g).connect(audio.destination);
o.start(t+i*0.05);o.stop(t+i*0.05+dur+0.05);
});
}catch(e){}
}
function pos(cell){
const c=cell%3,r=Math.floor(cell/3);
return (c*50)+"% "+(r*50)+"%";
}
function shuffle(a){
for(let i=a.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[a[i],a[j]]=[a[j],a[i]];}
return a;
}
function build(demo){
deck=shuffle(ANIMALS.concat(ANIMALS).map(a=>({a})));
first=second=null;lock=false;moves=0;matched=0;
boardEl.innerHTML='';
msgEl.className='';
msgEl.textContent="Turn over two cards. Find the eight strange beasts.";
deck.forEach((card,i)=>{
const el=document.createElement('div');
el.className='card';el.setAttribute('role','gridcell');
el.dataset.i=i;
el.innerHTML='<div class="inner">'+
'<div class="side back"></div>'+
'<div class="side face" style="background-position:'+pos(card.a.cell)+'">'+
'<span class="label">'+card.a.name+'</span></div></div>';
el.addEventListener('click',()=>flip(i));
card.el=el;
boardEl.appendChild(el);
});
if(demo){
// a real board state: 7 pairs already found by normal rules
const hidden=ANIMALS[Math.floor(Math.random()*ANIMALS.length)];
deck.forEach(c=>{
if(c.a!==hidden){c.done=true;c.el.classList.add('done');}
});
matched=7;moves=11;
msgEl.innerHTML='<span class="who">Seven pairs down.</span> One pair left to find.';
}
update();
layout();
}
function update(){
movesEl.textContent=moves;
leftEl.textContent=8-matched;
}
function flip(i){
const c=deck[i];
if(lock||c.done||c===first) return;
if(second) return;
c.el.classList.add('up');
beep([520],0.09);
if(!first){first=c;return;}
second=c;moves++;update();
if(first.a===second.a){
const a=first.a;
setTimeout(()=>{
[first,second].forEach(x=>{x.done=true;x.el.classList.remove('up');x.el.classList.add('done');});
first=second=null;
matched++;update();
beep([660,880],0.16);
if(matched===8){
msgEl.className='win';
msgEl.textContent="You won! All eight pairs found in "+moves+" moves.";
beep([660,880,1100,1320],0.22);
}else{
msgEl.className='';
msgEl.innerHTML='<span class="who">'+a.name+'</span> — '+a.fact;
}
},260);
}else{
lock=true;
setTimeout(()=>{
[first,second].forEach(x=>x.el.classList.remove('up'));
first=second=null;lock=false;
},1100);
}
}
function layout(){
const w=wrapEl.clientWidth-8,h=wrapEl.clientHeight-8;
const s=Math.max(120,Math.min(w,h));
boardEl.style.width=s+'px';
boardEl.style.height=s+'px';
}
window.addEventListener('resize',layout);
document.getElementById('new').addEventListener('click',()=>{
history.replaceState(null,'',location.pathname+location.search);
build(false);
});
// artwork probe
const probe=new Image();
probe.onerror=()=>document.body.classList.add('no-art');
probe.src=getComputedStyle(document.documentElement)
.getPropertyValue('--sheet').trim().replace(/^url\(["']?/,'').replace(/["']?\)$/,'');
build(location.hash.toLowerCase()==='#demo');
</script>
</body>
</html>
{
"game": { "name": "TURN TWO CARDS" },
"sheet": {
"style": "Painted in luminous ink and gouache on a flat pure-black background: a single centered subject per cell, three-quarter view, full body inside the cell with generous margins, confident dark outlines with fine hatched detail, glowing rim light from the upper left, restrained palette of deep teal, jade, warm gold, coral and bone white, subtle bioluminescent accents, no text, no borders, no drop shadows, no ground plane, all nine subjects drawn at the same scale and same line weight so they read as one deck of cards.",
"cells": [
{
"cell": 0,
"id": "axolotl",
"name": "Axolotl",
"role": "animal",
"prompt": "A pale pink axolotl floating with feathery coral-red external gills fanned out, wide smiling mouth, tiny stubby legs, tail curved gently.",
"fact": "It regrows lost limbs, and even parts of its brain, without leaving a scar."
},
{
"cell": 1,
"id": "mantisshrimp",
"name": "Mantis Shrimp",
"role": "animal",
"prompt": "A peacock mantis shrimp in profile, iridescent teal and coral banded armour, stalked compound eyes raised, one raptorial club cocked to strike.",
"fact": "Its club punches so fast the water briefly boils into collapsing bubbles."
},
{
"cell": 2,
"id": "molerat",
"name": "Naked Mole-Rat",
"role": "animal",
"prompt": "A wrinkled hairless naked mole-rat, pinkish-grey loose skin, tiny eyes, two prominent protruding front incisors, whiskered snout, standing low.",
"fact": "It can live 30 years and survive about 18 minutes with no oxygen at all."
},
{
"cell": 3,
"id": "pangolin",
"name": "Pangolin",
"role": "animal",
"prompt": "A pangolin walking, body covered in overlapping bronze keratin scales, long tapered tail, small conical head, long sticky tongue extended slightly.",
"fact": "The only mammal armoured in keratin scales; toothless, it laps up ants with a very long tongue."
},
{
"cell": 4,
"id": "tardigrade",
"name": "Tardigrade",
"role": "animal",
"prompt": "A giant microscope-style tardigrade, plump segmented translucent body, eight stubby clawed legs, round puckered mouth, faint internal glow.",
"fact": "Dried almost water-free, it survives boiling, freezing, radiation and the vacuum of space."
},
{
"cell": 5,
"id": "platypus",
"name": "Platypus",
"role": "animal",
"prompt": "A platypus swimming, dark brown waterproof fur, broad soft duck-like bill, webbed forefeet, flat beaver-like tail, eyes closed.",
"fact": "A venomous, egg-laying mammal that hunts with eyes shut, sensing prey's electric fields."
},
{
"cell": 6,
"id": "jellyfish",
"name": "Immortal Jellyfish",
"role": "animal",
"prompt": "A tiny transparent Turritopsis jellyfish, bell-shaped dome with glowing red stomach, dozens of fine trailing tentacles, soft bioluminescent halo.",
"fact": "Turritopsis dohrnii can rewind its life cycle, reverting to a polyp instead of dying."
},
{
"cell": 7,
"id": "bombardier",
"name": "Bombardier Beetle",
"role": "animal",
"prompt": "A bombardier beetle in three-quarter view, glossy blue-black elytra, rust-orange head and legs, abdomen tip aimed back firing a small hot vapour jet.",
"fact": "It mixes chemicals in its abdomen and sprays a near-boiling, pulsing jet at attackers."
},
{
"cell": 8,
"id": "back",
"name": "Card back",
"role": "back",
"prompt": "A symmetrical card-back emblem: a gold ring of interlocking scale and tentacle motifs around a single stylised teal eye, filling the cell evenly on black."
}
]
},
"extras": [
{
"id": "table",
"aspect": "16:9",
"prompt": "A dark green baize tabletop lit softly from above, faint woven texture and a subtle vignette, no objects, no text, very low contrast so it works as background decoration."
}
]
}
Image probe on art/cards.png fails and adds a no-art class — face-up cards become deep teal panels with the animal's name in gold capitals, and card backs become a diagonal teal stripe pattern, so the game is fully playable.