1import{b as T,g as O,o as S,d as R,c as b,i as d,v as l,l as z,F as A,e as I,C as D,S as G,t as g}from"./solid-vendor-CQ4bklhx.js";import{u as B,B as y}from"./index-BMJwaYYL.js";import{C as $}from"./Card-xg3jCnGU.js";import{P as K}from"./PageContainer-EK4IkFM8.js";import{P as j}from"./PageHeader-Y1siV6n8.js";import{u as N}from"./useMediaQuery-Caa62Je7.js";import"./ui-vendor-CMjh0a6q.js";const w={width:16,height:16,tickMs:140},H={up:{x:0,y:-1},down:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function U(e){return{width:Math.max(4,e?.width??w.width),height:Math.max(4,e?.height??w.height),tickMs:Math.max(40,e?.tickMs??w.tickMs)}}function E(e,r){return e.x===r.x&&e.y===r.y}function Y(e,r){return e==="up"&&r==="down"||e==="down"&&r==="up"||e==="left"&&r==="right"||e==="right"&&r==="left"}function V(e){const r=Math.floor(e.width/2),s=Math.floor(e.height/2);return[{x:r,y:s},{x:r-1,y:s},{x:r-2,y:s}]}function W(e,r){const s=[];for(let i=0;i<e.height;i+=1)for(let o=0;o<e.width;o+=1)r.some(h=>h.x===o&&h.y===i)||s.push({x:o,y:i});return s}function P(e,r,s=Math.random){const i=W(e,r);if(i.length===0)return null;const o=Math.min(i.length-1,Math.floor(Math.max(0,s())*i.length));return i[o]??null}function F(e,r=Math.random){const s=U(e),i=V(s),o=P(s,i,r)??{x:0,y:0};return{snake:i,direction:"right",food:o,score:0,status:"running",config:s}}function X(e,r){return e.status==="game_over"||Y(r,e.direction)?e:{...e,direction:r}}function Z(e){return e.status==="game_over"?e:{...e,status:e.status==="paused"?"running":"paused"}}function q(e,r=Math.random){return F(e.config,r)}function J(e,r=Math.random){if(e.status!=="running")return e;const s=H[e.direction],i=e.snake[0];if(!i)return{...e,status:"game_over"};const o={x:i.x+s.x,y:i.y+s.y};if(o.x<0||o.x>=e.config.width||o.y<0||o.y>=e.config.height)return{...e,status:"game_over"};const h=E(o,e.food);if((h?e.snake:e.snake.slice(0,-1)).some(t=>E(t,o)))return{...e,status:"game_over"};const p=[o,...e.snake];if(h||p.pop(),!h)return{...e,snake:p};const n=P(e.config,p,r);return{...e,snake:p,score:e.score+1,status:n?"running":"game_over",food:n??e.food}}var L=g('<div class="text-sm text-[var(--color-text-muted)]">: <span class="font-semibold text-[var(--color-text)]">'),Q=g('<div class="flex items-center gap-2">'),ee=g('<div class="mx-auto grid gap-[2px] bg-[var(--color-neutral-200)] p-[2px] rounded-[var(--radius-md)]">'),te=g('<div class="text-sm text-[var(--color-text-muted)]">'),ne=g('<div class="flex justify-center">'),re=g('<div class="flex justify-center gap-3">'),oe=g('<div class="max-w-3xl space-y-4">'),se=g('<div class="h-[20px] w-[20px] rounded-[var(--radius-sm)]">');const ae=20,ie={ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",w:"up",s:"down",a:"left",d:"right",W:"up",S:"down",A:"left",D:"right"},me=()=>{const{t:e}=B(),[r,s]=T(F(w,Math.random)),i=N(),o=n=>{s(t=>X(t,n))},k=()=>{s(n=>Z(n))},h=()=>{s(n=>q(n,Math.random))},C=n=>{const t=ie[n.key];if(t){n.preventDefault(),o(t);return}if(n.key===" "){n.preventDefault(),k();return}(n.key==="r"||n.key==="R")&&(n.preventDefault(),h())};O(()=>{window.addEventListener("keydown",C),S(()=>{window.removeEventListener("keydown",C)})}),R(()=>{const n=r();if(n.status!=="running")return;const t=window.setInterval(()=>{s(a=>J(a,Math.random))},n.config.tickMs);S(()=>{window.clearInterval(t)})});const M=b(()=>{const n=r(),t=n.snake[0];if(!t)return[];const a=new Set(n.snake.map(f=>`${f.x}-${f.y}`)),c=`${n.food.x}-${n.food.y}`,u=`${t.x}-${t.y}`,x=[];for(let f=0;f<n.config.height;f+=1)for(let v=0;v<n.config.width;v+=1){const m=`${v}-${f}`;let _="empty";m===c&&(_="food"),a.has(m)&&(_=m===u?"head":"snake"),x.push({key:m,type:_})}return x}),p=b(()=>{const n=r().status;return e(n==="game_over"?"snake.status.gameOver":n==="paused"?"snake.status.paused":"snake.status.running")});return d(K,{get children(){return[d(j,{get title(){return e("snake.page.title")}}),(()=>{var n=oe();return l(n,d($,{class:"flex items-center justify-between gap-4",padded:"sm",get children(){return[(()=>{var t=L(),a=t.firstChild,c=a.nextSibling;return l(t,()=>e("snake.score.label"),a),l(c,()=>r().score),t})(),(()=>{var t=L(),a=t.firstChild,c=a.nextSibling;return l(t,()=>e("snake.status.label"),a),l(c,p),t})(),(()=>{var t=Q();return l(t,d(y,{variant:"ghost",size:"sm",onClick:k,get children(){return z(()=>r().status==="paused")()?e("snake.controls.resume"):e("snake.controls.pause")}}),null),l(t,d(y,{variant:"primary",size:"sm",onClick:h,get children(){return e("snake.controls.restart")}}),null),t})()]}}),null),l(n,d($,{padded:"sm",class:"overflow-auto",get children(){var t=ee();return l(t,d(A,{get each(){return M()},children:a=>(()=>{var c=se();return I(u=>{var x=a.type==="empty",f=a.type==="snake",v=a.type==="head",m=a.type==="food";return x!==u.e&&c.classList.toggle("bg-[var(--color-surface)]",u.e=x),f!==u.t&&c.classList.toggle("bg-[var(--color-secondary-500)]",u.t=f),v!==u.a&&c.classList.toggle("bg-[var(--color-secondary-700)]",u.a=v),m!==u.o&&c.classList.toggle("bg-[var(--color-error-500)]",u.o=m),u},{e:void 0,t:void 0,a:void 0,o:void 0}),c})()})),I(a=>{var c=`${r().config.width*ae+4}px`,u=`repeat(${r().config.width}, minmax(0, 1fr))`;return c!==a.e&&D(t,"width",a.e=c),u!==a.t&&D(t,"grid-template-columns",a.t=u),a},{e:void 0,t:void 0}),t}}),null),l(n,d(G,{get when(){return i()},get children(){return d($,{class:"space-y-3",padded:"sm",get children(){return[(()=>{var t=te();return l(t,()=>
1e("snake.touchControls.label")),t})(),(()=>{var t=ne();return l(t,d(y,{variant:"ghost",size:"sm",onClick:()=>o("up"),get children(){return e("snake.touchControls.up")}})),t})(),(()=>{var t=re();return l(t,d(y,{variant:"ghost",size:"sm",onClick:()=>o("left"),get children(){return e("snake.touchControls.left")}}),null),l(t,d(y,{variant:"ghost",size:"sm",onClick:()=>o("down"),get children(){return e("snake.touchControls.down")}}),null),l(t,d(y,{variant:"ghost",size:"sm",onClick:()=>o("right"),get children(){return e("snake.touchControls.right")}}),null),t})()]}})}}),null),n})()]}})};export{me as default}; 2//# sourceMappingURL=SnakePage-BLVc-mzY.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.