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 naturalist's memory game on deep green felt: cream-framed cards with flat ochre-and-terracotta animal portraits that flip in 3D, and a "field notes" strip that reveals a true fact about each animal the moment its pair is found.
<!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>
:root{
--felt:#132119; --felt-deep:#0c1710;
--cream:#efe6d3; --ink:#191713;
--accent:#c9703b; --line:#2b4133; --muted:#9db09b;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;overflow:hidden}
body{
height:100dvh;
background-color:var(--felt);
background-image:url('art/table.png');
background-size:cover;background-position:center;background-repeat:no-repeat;
color:var(--cream);
font-family:Georgia,'Times New Roman',serif;
display:flex;flex-direction:column;
}
header{
display:flex;align-items:center;gap:18px;flex-wrap:wrap;
padding:12px 20px;border-bottom:1px solid var(--line);
position:relative;z-index:2;
}
h1{font-size:clamp(13px,2.4vmin,20px);letter-spacing:.32em;text-transform:uppercase;font-weight:400;white-space:nowrap}
h1 b{color:var(--accent);font-weight:400}
.stats{display:flex;gap:22px;margin-left:auto;font-size:clamp(11px,1.9vmin,15px);color:var(--muted);letter-spacing:.06em;white-space:nowrap}
.stats b{color:var(--cream);font-variant-numeric:tabular-nums;font-size:1.25em;margin-left:.35em}
#new{
font:inherit;font-size:clamp(11px,1.9vmin,14px);letter-spacing:.18em;text-transform:uppercase;
background:none;color:var(--cream);border:1px solid var(--cream);border-radius:3px;
padding:.55em 1.1em;cursor:pointer;transition:background .18s,color .18s;
}
#new:hover{background:var(--cream);color:var(--ink)}
main{flex:1;min-height:0;display:grid;place-items:center;padding:14px}
#board{
width:min(94vw,calc(100dvh - 200px),640px);aspect-ratio:1;
display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(4,1fr);
gap:clamp(6px,1.4vmin,14px);
}
.card{position:relative;perspective:800px;cursor:pointer;outline:none}
.card:focus-visible .inner{box-shadow:0 0 0 2px var(--accent);border-radius:8px}
.inner{position:absolute;inset:0;transform-style:preserve-3d;transition:transform .55s cubic-bezier(.25,.7,.3,1)}
.card:not(.flipped):hover .inner{transform:rotateY(9deg)}
.card.flipped .inner{transform:rotateY(180deg)}
.face{
position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;
border-radius:clamp(6px,1.2vmin,12px);overflow:hidden;
background-color:#0d0c0a;background-repeat:no-repeat;
box-shadow:0 3px 10px rgba(0,0,0,.45);
border:clamp(2px,.7vmin,4px) solid #d9cfb8;
}
.face.front{transform:rotateY(180deg)}
.card.matched{cursor:default}
.card.matched .face.front{box-shadow:0 3px 10px rgba(0,0,0,.45),inset 0 0 0 2px var(--accent)}
.card.matched .inner{animation:settle .5s ease .1s}
@keyframes settle{
0%{transform:rotateY(180deg) scale(1)}
45%{transform:rotateY(180deg) scale(1.06)}
100%{transform:rotateY(180deg) scale(1)}
}
/* fallback faces (no artwork yet) */
.fb-front{background:var(--cream);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9%}
.fb-name{color:var(--ink);font-size:clamp(9px,2.4vmin,17px);font-weight:700;text-align:center;line-height:1.15;padding:0 6%;letter-spacing:.02em}
.seal{width:36%;height:36%;stroke:var(--ink);fill:none;stroke-width:2.4;stroke-linejoin:round}
.fb-back{display:grid;place-items:center;background-color:var(--felt-deep)}
.fb-back svg{width:40%;height:40%;opacity:.85}
footer{
border-top:1px solid var(--line);padding:10px 20px;display:flex;align-items:baseline;gap:16px;
position:relative;z-index:2;
}
#factName{color:var(--accent);font-variant-caps:all-small-caps;letter-spacing:.14em;font-size:clamp(12px,2vmin,16px);white-space:nowrap}
#factText{color:var(--cream);font-size:clamp(12px,2vmin,16px);opacity:.92;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.flash{animation:flash .6s ease}
@keyframes flash{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
#win{
position:fixed;inset:0;display:grid;place-items:center;
background:rgba(7,13,9,.85);opacity:0;pointer-events:none;transition:opacity .5s;z-index:1;
}
#win.show{opacity:1;pointer-events:auto}
#win .panel{text-align:center;padding:2.2em 3em;border:1px solid var(--line);border-radius:8px;background:var(--felt)}
#win h2{font-weight:400;font-size:clamp(20px,4.5vmin,34px);letter-spacing:.1em;margin-bottom:.5em}
#win h2 span{color:var(--accent)}
#win p{color:var(--muted);font-size:clamp(12px,2vmin,16px);letter-spacing:.05em}
#win p b{color:var(--cream)}
@media (max-width:600px){
h1{letter-spacing:.18em}
.stats{gap:12px}
}
</style>
</head>
<body>
<header>
<h1>Turn <b>Two</b> 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="new" type="button">New game</button>
</header>
<main><div id="board"></div></main>
<footer>
<span id="factName">Field notes</span>
<span id="factText">Match a pair to read a field note about it.</span>
</footer>
<div id="win" role="dialog" aria-label="Game won">
<div class="panel">
<h2>All eight pairs <span>found</span></h2>
<p>Solved in <b id="winMoves">0</b> moves — press New game to deal again.</p>
</div>
</div>
<script>
(function(){
'use strict';
var SHEET='art/cards.png';
var ANIMALS=[
{id:'axolotl',name:'Axolotl',cell:0,fact:'It regrows lost limbs, jaws, and even parts of its brain \u2014 without leaving a scar.'},
{id:'tardigrade',name:'Tardigrade',cell:1,fact:'Dried out and frozen, tardigrades can shut down for decades, then walk away when rehydrated.'},
{id:'mantis_shrimp',name:'Mantis Shrimp',cell:2,fact:'Its strike accelerates like a .22 bullet and boils the water it passes through.'},
{id:'platypus',name:'Platypus',cell:3,fact:'It hunts with eyes, ears and nostrils closed, sensing muscle electricity through its bill.'},
{id:'naked_mole_rat',name:'Naked Mole Rat',cell:4,fact:'It feels almost no pain, resists cancer, and can survive 18 minutes without oxygen.'},
{id:'immortal_jellyfish',name:'Immortal Jellyfish',cell:5,fact:'When old or injured, it reverses its own life cycle and restarts as a juvenile polyp.'},
{id:'pangolin',name:'Pangolin',cell:6,fact:'The only mammal armored in scales, it rolls into a ball that even lions cannot pry open.'},
{id:'barreleye',name:'Barreleye Fish',cell:7,fact:'Its head is transparent, and it swivels its tubular eyes inside the dome to look upward.'}
];
var SEALS={
axolotl:'<circle cx="20" cy="20" r="12"/>',
tardigrade:'<rect x="9" y="9" width="22" height="22" rx="8"/>',
mantis_shrimp:'<path d="M20 6 34 34H6Z"/>',
platypus:'<path d="M20 5l4.6 10.4L36 17l-8.2 7.6 2.3 11L20 30l-10.1 5.6 2.3-11L4 17l11.4-1.6Z"/>',
naked_mole_rat:'<path d="M20 6 34 20 20 34 6 20Z"/>',
immortal_jellyfish:'<path d="M26 5a15 15 0 1 0 9 17A12 12 0 0 1 26 5Z"/>',
pangolin:'<path d="M20 5 33 12v16L20 35 7 28V12Z"/>',
barreleye:'<circle cx="20" cy="20" r="13"/><circle cx="20" cy="20" r="4.5" fill="currentColor" stroke="none"/>'
};
var PATTERN="url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cpath d='M0 9h18M9 0v18' stroke='%232b4133' stroke-width='1.2'/%3E%3C/svg%3E\")";
var board=document.getElementById('board'),
movesEl=document.getElementById('moves'),
pairsEl=document.getElementById('pairs'),
factName=document.getElementById('factName'),
factText=document.getElementById('factText'),
winEl=document.getElementById('win'),
winMoves=document.getElementById('winMoves');
var cards=[], first=null, lock=false, moves=0, pairsLeft=8, artReady=false;
/* preload the contact sheet; fall back gracefully if it is missing */
var img=new Image();
img.onload=function(){artReady=true;paint();};
img.onerror=function(){artReady=false;paint();};
img.src=SHEET;
function shuffle(a){
for(var i=a.length-1;i>0;i--){
var j=Math.floor(Math.random()*(i+1)), t=a[i]; a[i]=a[j]; a[j]=t;
}
return a;
}
function newGame(demo){
board.innerHTML='';
cards=[]; first=null; lock=false; moves=0; pairsLeft=8;
winEl.classList.remove('show');
var deck=shuffle(ANIMALS.map(function(a,i){return i;}).flatMap(function(i){return [i,i];}));
deck.forEach(function(ai){
var el=document.createElement('div');
el.className='card'; el.tabIndex=0;
el.setAttribute('role','button');
el.setAttribute('aria-label','Face-down card');
el.innerHTML='<div class="inner"><div class="face back"></div><div class="face front"></div></div>';
el.addEventListener('click',function(){onCard(el);});
el.addEventListener('keydown',function(e){
if(e.key==='Enter'||e.key===' '){e.preventDefault();onCard(el);}
});
board.appendChild(el);
cards.push({el:el,ai:ai,matched:false});
});
if(demo){
/* a real board state: 7 pairs already matched, one pair left to find */
var pre=shuffle([0,1,2,3,4,5,6,7]).slice(0,7);
cards.forEach(function(c){
if(pre.indexOf(c.ai)>=0){
c.matched=true;
c.el.classList.add('flipped','matched');
c.el.removeAttribute('tabindex');
c.el.setAttribute('aria-label',ANIMALS[c.ai].name);
}
});
moves=14; pairsLeft=1;
setFact(null,'Demo board \u2014 seven pairs are already turned. Find the last one.');
}else{
setFact(null,'Match a pair to read a field note about it.');
}
paint(); hud();
}
function paint(){
cards.forEach(function(c){
var back=c.el.querySelector('.back'), front=c.el.querySelector('.front');
[back,front].forEach(function(f){
f.style.backgroundImage=''; f.style.backgroundSize=''; f.style.backgroundPosition='';
f.classList.remove('fb-front','fb-back');
});
if(artReady){
setCell(back,8);
setCell(front,ANIMALS[c.ai].cell);
back.innerHTML=''; front.innerHTML='';
}else{
fallbackBack(back);
fallbackFront(front,ANIMALS[c.ai]);
}
});
}
function setCell(el,cell){
el.style.backgroundImage='url("'+SHEET+'")';
el.style.backgroundSize='300% 300%';
el.style.backgroundPosition=((cell%3)*50)+'% '+(Math.floor(cell/3)*50)+'%';
}
function fallbackBack(el){
el.classList.add('fb-back');
el.style.backgroundImage=PATTERN;
el.style.backgroundSize='18px 18px';
el.innerHTML='<svg viewBox="0 0 40 40" aria-hidden="true"><path d="M20 7 33 20 20 33 7 20Z" fill="none" stroke="#8fa389" stroke-width="2"/></svg>';
}
function fallbackFront(el,a){
el.classList.add('fb-front');
el.innerHTML='<div class="fb-name">'+a.name+'</div>'+
'<svg class="seal" viewBox="0 0 40 40" aria-hidden="true">'+SEALS[a.id]+'</svg>';
}
function onCard(el){
if(lock)return;
var c=null;
for(var i=0;i<cards.length;i++){if(cards[i].el===el){c=cards[i];break;}}
if(!c||c.matched||c.el.classList.contains('flipped'))return;
ensureAudio(); sFlip();
el.classList.add('flipped');
el.setAttribute('aria-label',ANIMALS[c.ai].name);
if(!first){first=c;return;}
var second=c;
moves++; hud();
if(first.ai===second.ai){
var a=ANIMALS[c.ai], f=first;
first=null;
setTimeout(function(){
f.matched=second.matched=true;
f.el.classList.add('matched'); second.el.classList.add('matched');
f.el.removeAttribute('tabindex'); second.el.removeAttribute('tabindex');
pairsLeft--; hud(); sMatch();
setFact(a.name,a.fact);
if(pairsLeft===0)win();
},420);
}else{
lock=true;
var m=first;
first=null;
sMiss();
setTimeout(function(){
m.el.classList.remove('flipped'); second.el.classList.remove('flipped');
m.el.setAttribute('aria-label','Face-down card');
second.el.setAttribute('aria-label','Face-down card');
lock=false;
},900);
}
}
function hud(){
movesEl.textContent=moves;
pairsEl.textContent=pairsLeft;
}
function setFact(name,text){
factName.textContent=name||'Field notes';
factText.textContent=text;
factName.classList.remove('flash'); factText.classList.remove('flash');
void factText.offsetWidth;
factName.classList.add('flash'); factText.classList.add('flash');
}
function win(){
winMoves.textContent=moves;
setTimeout(function(){winEl.classList.add('show');sWin();},600);
}
/* --- tiny WebAudio feedback, no files --- */
var AC=null;
function ensureAudio(){
if(!AC){try{AC=new (window.AudioContext||window.webkitAudioContext)();}catch(e){}}
if(AC&&AC.state==='suspended')AC.resume();
}
function note(f,delay,dur,type,vol){
if(!AC)return;
var t=AC.currentTime+delay;
var o=AC.createOscillator(), g=AC.createGain();
o.type=type; o.frequency.setValueAtTime(f,t);
g.gain.setValueAtTime(0.0001,t);
g.gain.exponentialRampToValueAtTime(vol,t+.015);
g.gain.exponentialRampToValueAtTime(0.0001,t+dur);
o.connect(g); g.connect(AC.destination);
o.start(t); o.stop(t+dur+.05);
}
function sFlip(){note(320,0,.09,'triangle',.05);}
function sMatch(){note(523,0,.16,'sine',.07);note(784,.09,.22,'sine',.07);}
function sMiss(){note(196,0,.16,'sine',.05);}
function sWin(){[523,659,784,1047].forEach(function(f,i){note(f,i*.13,.3,'sine',.07);});}
document.getElementById('new').addEventListener('click',function(){
if(location.hash)history.replaceState(null,'',location.pathname+location.search);
newGame(false);
});
newGame(location.hash==='#demo');
})();
</script>
</body>
</html>
{
"game": { "name": "TURN TWO CARDS" },
"sheet": {
"style": "Flat vector illustration in a limited palette of cream, warm ochre, terracotta and sage green on the flat black background; bold simplified shapes, subtle paper-grain texture, even flat lighting, consistent dark outline weight; vintage naturalist museum-print poster style.",
"cells": [
{
"cell": 0,
"id": "axolotl",
"name": "Axolotl",
"role": "animal",
"prompt": "A smiling axolotl seen from the side, pale pink body, feathery coral-pink external gills fanning from its head, long tapering tail, floating calmly.",
"fact": "It regrows lost limbs, jaws, and even parts of its brain — without leaving a scar."
},
{
"cell": 1,
"id": "tardigrade",
"name": "Tardigrade",
"role": "animal",
"prompt": "A plump tardigrade (water bear) walking toward the viewer, segmented translucent amber body, eight stubby legs with tiny claws, round puckered mouth.",
"fact": "Dried out and frozen, tardigrades can shut down for decades, then walk away when rehydrated."
},
{
"cell": 2,
"id": "mantis_shrimp",
"name": "Mantis Shrimp",
"role": "animal",
"prompt": "A peacock mantis shrimp in profile, emerald and terracotta armored body, stalked compound eyes, one raptorial club fist cocked back mid-strike with a small cavitation bubble at its heel.",
"fact": "Its strike accelerates like a .22 bullet and boils the water it passes through."
},
{
"cell": 3,
"id": "platypus",
"name": "Platypus",
"role": "animal",
"prompt": "A platypus swimming, brown velvety body, wide rubbery duck-like bill, webbed feet, flat beaver tail, small closed eyes.",
"fact": "It hunts with eyes, ears and nostrils closed, sensing muscle electricity through its bill."
},
{
"cell": 4,
"id": "naked_mole_rat",
"name": "Naked Mole Rat",
"role": "animal",
"prompt": "A naked mole-rat standing upright, wrinkled pale pink saggy skin, two large protruding front teeth, tiny blind eyes, whiskers sprouting everywhere.",
"fact": "It feels almost no pain, resists cancer, and can survive 18 minutes without oxygen."
},
{
"cell": 5,
"id": "immortal_jellyfish",
"name": "Immortal Jellyfish",
"role": "animal",
"prompt": "A small immortal jellyfish with a translucent cream bell and a tangle of fine trailing tentacles drifting downward, a faint circular life-cycle ring behind it.",
"fact": "When old or injured, it reverses its own life cycle and restarts as a juvenile polyp."
},
{
"cell": 6,
"id": "pangolin",
"name": "Pangolin",
"role": "animal",
"prompt": "A pangolin in a defensive pose, body covered in large overlapping terracotta and cream scales like artichoke leaves, sharp claws, narrow scaly head tucked low.",
"fact": "The only mammal armored in scales, it rolls into a ball that even lions cannot pry open."
},
{
"cell": 7,
"id": "barreleye",
"name": "Barreleye Fish",
"role": "animal",
"prompt": "A barreleye fish (spookfish) in profile, transparent dome head revealing two glowing green tubular eyes inside, dark streamlined body and long delicate fin rays.",
"fact": "Its head is transparent, and it swivels its tubular eyes inside the dome to look upward."
},
{
"cell": 8,
"id": "back",
"name": "Card back",
"role": "back",
"prompt": "A symmetrical card-back emblem: a single rosette of overlapping cream and ochre scale-like leaves, framed by a thin double circle border, perfectly centered."
}
]
},
"extras": [
{
"id": "table",
"aspect": "16:9",
"prompt": "A dark green card-table felt surface viewed straight on, deep forest green with subtle woven texture and a gentle vignette toward the edges, no objects, no text."
}
]
}
new Image(); if it fails, every face-up card shows a cream panel with the animal's name in bold serif plus a unique geometric seal (circle, hexagon, crescent, star, etc.), and face-down cards show a dark green crosshatch pattern with a diamond emblem — fully readable and playable.