Untitled

Anonymous
plain_text
02/10/2026 7:24 PM
4.4 KB
8
Indexable
<!DOCTYPE html>
<html>
<head>
<title>Mini Clash Royale</title>
<style>
body { background:#222; color:white; text-align:center; font-family:Arial }
canvas { background:#4aa; border:4px solid black; touch-action: manipulation; }
button { font-size:14px; margin:4px; padding:8px }
</style>
</head>
<body>

<h2>Mini Clash Royale</h2>
<p>Click a card, then click a lane</p>

<div>
<button onclick="selectCard('knight')">Knight (3)</button>
<button onclick="selectCard('archer')">Archer (2)</button>
<button onclick="selectCard('giant')">Giant (5)</button>
</div>

<p id="info"></p>
<canvas id="game" width="700" height="400"></canvas>

<script>
const canvas = document.getElementById("game");
const ctx = canvas.getContext("2d");

let selectedCard = null;
let elixir = 10;
let crownsPlayer = 0;
let crownsEnemy = 0;

const lanes = [150, 250];

const playerTowers = [
  {x:80, y:150, hp:300},
  {x:80, y:250, hp:300},
  {x:40, y:200, hp:500} // king
];

const enemyTowers = [
  {x:620, y:150, hp:300},
  {x:620, y:250, hp:300},
  {x:660, y:200, hp:500}
];

let troops = [];

const cards = {
  knight:{hp:120, dmg:6, cost:3, speed:0.6, range:15},
  archer:{hp:70, dmg:4, cost:2, speed:0.7, range:60},
  giant:{hp:300, dmg:10, cost:5, speed:0.3, range:15}
};

function selectCard(card){ selectedCard = card; }

canvas.onclick = e => {
  if(!selectedCard) return;
  let y = e.offsetY < 200 ? lanes[0] : lanes[1];
  let c = cards[selectedCard];
  if(elixir >= c.cost){
    elixir -= c.cost;
    troops.push({
      side:"player",
      card:selectedCard,
      x:120,
      y:y,
      hp:c.hp
    });
  }
};

function spawnEnemy(){
  let options = ["knight","archer","giant"];
  let card = options[Math.floor(Math.random()*options.length)];
  let lane = lanes[Math.floor(Math.random()*2)];
  troops.push({
    side:"enemy",
    card:card,
    x:580,
    y:lane,
    hp:cards[card].hp
  });
}

setInterval(()=>{ if(elixir<10) elixir++; },2000);
setInterval(()=>{ if(Math.random()<0.4) spawnEnemy(); },2500);

function update(){
  ctx.clearRect(0,0,700,400);

  drawTowers(playerTowers,"blue");
  drawTowers(enemyTowers,"red");

  troops.forEach(t=>{
    let c = cards[t.card];
    t.x += (t.side==="player"?c.speed:-c.speed);

    let targets = t.side==="player"?enemyTowers:playerTowers;
    let target = targets.find(to=>Math.abs(t.x-to.x)<c.range && Math.abs(t.y-to.y)<30 && to.hp>0);

    if(target) target.hp -= c.dmg/60;

    ctx.fillStyle = t.side==="player"?"cyan":"orange";
    ctx.fillRect(t.x-5,t.y-5,10,10);
  });

  checkCrowns();

  document.getElementById("info").innerText =
    `Elixir: ${elixir} | You 👑 ${crownsPlayer} - ${crownsEnemy} 👑 AI`;

  requestAnimationFrame(update);
}

function drawTowers(towers,color){
  ctx.fillStyle=color;
  towers.forEach(t=>{
    if(t.hp>0){
      ctx.fillRect(t.x-15,t.y-20,30,40);
      ctx.fillStyle="white";
      ctx.fillText(Math.floor(t.hp),t.x-15,t.y-25);
      ctx.fillStyle=color;
    }
  });
}

function checkCrowns(){
  if(playerTowers[2].hp<=0){ alert("You Lose!"); location.reload(); }
  if(enemyTowers[2].hp<=0){ alert("You Win!"); location.reload(); }

  playerTowers.slice(0,2).forEach(t=>{
    if(t.hp<=0 && !t.down){ crownsEnemy++; t.down=true; }
  });
  enemyTowers.slice(0,2).forEach(t=>{
    if(t.hp<=0 && !t.down){ crownsPlayer++; t.down=true; }
  });
}

update();
</script>

</body>
</html>
Editor is loading...
Leave a Comment