Kunci jawaban 16 Latihan Game Platform. Ide solusinya; sesuaikan dengan nama fungsi di kode game-mu.

16.1 Game Over

async function runGame(plans, Display) {
  let nyawa = 3;
  for (let level = 0; level < plans.length && nyawa > 0;) {
    let status = await runLevel(
      new Level(plans[level]), Display);
    if (status == "won") {
      level++;
    } else {
      nyawa--;
      console.log(`Nyawa tersisa: ${nyawa}`);
    }
  }
  if (nyawa > 0) console.log("Kamu menang!");
  else console.log("Game Over");
}

Kenapa: runLevel (async) mengembalikan "won" atau "lost". Kalau menang, maju ke level berikutnya (level++); kalau kalah, kurangi nyawa dan jangan naikkan level (ulangi level yang sama). Kondisi loop nyawa > 0 menghentikan permainan waktu nyawa habis, jadi gak mengulang selamanya.

→ Soal: 16 Latihan Game Platform > 16.1 Game Over

16.2 Menjeda Game

Ide: bungkus loop animasi supaya bisa dihentikan, dan pasang handler Esc yang membalik status jeda.

function runLevel(level, Display) {
  let display = new Display(document.body, level);
  let state = State.start(level);
  let ending = 1;
  let berjalan = true;
 
  return new Promise(resolve => {
    function keydown(event) {
      if (event.key == "Escape") {
        event.preventDefault();
        if (berjalan) {
          berjalan = false;          // jeda
        } else {
          berjalan = true;           // lanjut
          requestAnimationFrame(frame);
        }
      }
    }
    window.addEventListener("keydown", keydown);
 
    let lastTime = null;
    function frame(time) {
      if (lastTime != null) {
        let step = Math.min((time - lastTime) / 1000, 0.1);
        state = state.update(step, arrowKeys);
        display.syncState(state);
        if (state.status != "playing") {
          display.clear();
          window.removeEventListener("keydown", keydown);
          resolve(state.status);
          return;
        }
      }
      lastTime = time;
      if (berjalan) requestAnimationFrame(frame);
    }
    requestAnimationFrame(frame);
  });
}

Kenapa: flag berjalan menentukan apakah frame menjadwalkan frame berikutnya. Waktu Esc ditekan saat berjalan → berjalan = false, loop berhenti menjadwalkan diri (game beku). Esc lagi → berjalan = true dan panggil requestAnimationFrame(frame) sekali untuk membangunkan loop. Yang krusial: removeEventListener("keydown", keydown) dipanggil waktu level selesai, supaya handler dari level ini gak menumpuk waktu level berikutnya dimulai. lastTime di-reset (jadi null di frame pertama setelah bangun) mencegah lompatan besar setelah jeda.

→ Soal: 16 Latihan Game Platform > 16.2 Menjeda Game