-->

Choose your language

Tutorial?

⚙️ Settings

Score: 0
$0.00
0
R 🧲 0/2
F 💣 0/3
T 🛡️ 0/2
Q 🏥 0/2

Resource Shop

⚡ Speed Boost $75

Move +15% faster each level. Max 3 levels.

🎒 Bigger Backpack $30

Add 1 inventory slot each level. Max 2 levels.

🔦 Bigger Light $40

Increase light radius by +15% each level. Max 3 levels.

🔫 Faster Firing $110

Fire +15% faster each level. Max 2 levels.

💥 Stronger Weapon $200

+1 power each level. Max 2 levels.

🔵 Bigger Orbs $40

Orbs are +15% bigger each level. Max 3 levels.

Utility Shop

Presents

Gifts can be found by playing the game.

Present
Reward

Verifying Reward...

Please wait 20 seconds.

Do not close this window.

Watch Ad for Gift 🎁

Loading ad...

10

W
A
S
D
🖱️ Aim at the zombie and press Left Mouse Button

Welcome to Zombie SOS!

Welcome, survivor! Your main goal is to survive as long as possible against waves of zombies. You can move with the W, A, S, D or arrow keys (desktop) or the gray joystick (mobile). Neutralize zombies by aiming with your mouse and pressing the left mouse button, or by using the red joystick on mobile. Gather resources, sell them for cash, and buy powerful upgrades to increase your chances of survival!

For the best mobile experience, we highly recommend playing with your phone held sideways. This gives you more space to see and react to the zombie hordes.

Would you like to go through a short interactive tutorial?

Completing the tutorial will grant you an extra 15 !

Are you sure?

The tutorial quickly explains the core mechanics of the game.

How to Play

Desktop: Use W, A, S, D or Arrow Keys to move. Aim with the mouse and use the Left Mouse Button to neutralize zombies.

Mobile: Use the gray joystick to move and the red joystick to neutralize. Play with your phone sideways for the best experience.

About Zombie SOS Survival

Zombie SOS Survival is a browser-based survival game where the player navigates an open map, gathers resources (wood, paper, tires), sells them for profit, upgrades abilities, and neutralizes hordes of zombies.

Core Mechanics

Fair Use & Privacy

This game uses Cookieyes for consent management and Adsterra/Monetag for advertising, including their Smart Link (direct link). Ads are loaded only after user consent is provided. For more details, please review our privacy policy.

ctx.lineWidth = 1.4; ctx.beginPath(); ctx.moveTo(-len * 0.12, 0); ctx.lineTo(-len * 0.3, -len * 0.18); ctx.moveTo(len * 0.08, 0); ctx.lineTo(len * 0.22, len * 0.2); ctx.stroke(); ctx.restore(); } function step(dt, t) { const wind = 0.8 + 0.5 * Math.sin(t * 0.00035); const gust = 0.55 * Math.sin(t * 0.0018 + 1.2) + 0.25 * Math.sin(t * 0.004); const push = wind + gust; for (let i = particles.length - 1; i >= 0; i--) { const p = particles[i]; p.x += (p.vx * push) * dt; p.y += (p.vy + Math.sin((p.x + t * 0.08) * 0.02) * p.wobble) * dt; p.rot += p.rotSpeed * dt; if (p.x > width + 60 || p.y < -80 || p.y > height + 80) { particles.splice(i, 1); } } while (particles.length < targetCount) { particles.push(spawn()); } } let last = performance.now(); function frame(now) { // Only show leaves/branches in menu, not during gameplay const currentGameState = typeof gameState !== 'undefined' ? gameState : 'menu'; const inMenu = currentGameState === 'menu'; if (!running || !inMenu) { ctx.clearRect(0, 0, width, height); last = now; requestAnimationFrame(frame); return; } const dt = Math.min(0.05, (now - last) / 1000); last = now; ctx.clearRect(0, 0, width, height); ctx.save(); ctx.globalAlpha = 0.10; const g = ctx.createLinearGradient(0, 0, width, height); g.addColorStop(0, 'rgba(0,0,0,0.35)'); g.addColorStop(1, 'rgba(0,0,0,0)'); ctx.fillStyle = g; ctx.fillRect(0, 0, width, height); ctx.restore(); step(dt, now); for (const p of particles) { if (p.type === 'branch') drawBranch(p); else drawLeaf(p); } requestAnimationFrame(frame); }a const ro = new ResizeObserver(resize); ro.observe(container); window.addEventListener('resize', resize); document.addEventListener('visibilitychange', () => { running = document.visibilityState === 'visible'; }); resize(); while (particles.length < targetCount) particles.push(spawn()); requestAnimationFrame(frame); })();