O'tgan darsda siz dvigatel qurdingiz: tsikl, delta time, fizika, to'qnashuv. Lekin dvigatel — bu hali o'yin emas. O'yin bo'lishi uchun maqsad, xavf va natija kerak. Bugun biz ochko tizimini, dushman to'lqinlarini va sinf reyting jadvalini quramiz — hamda nega ochkoga ishonib bo'lmasligini bilib olamiz.
O'yinchi nima uchun harakat qiladi? Ochko yig'ish, omon qolish, rekord o'rnatish. Maqsadsiz o'yin — bu ekran saqlagich.
Yutqazish mumkin bo'lishi shart. Yutqazib bo'lmaydigan o'yinda g'alabaning qiymati yo'q. Xavf — bu ochkoning narxi.
O'yin tugagach raqam qolishi kerak — va uni boshqalar bilan solishtirish mumkin bo'lsin. Mana shuning uchun leaderboard bor.
Uchala element bugun quriladi: ochko (maqsad), dushman to'lqinlari (xavf) va reyting jadvali (natija). Dars oxirida sinfda bitta umumiy jadval bo'ladi va siz undagi o'rningizni ko'rasiz.
// Ketma-ket urish kombo beradi kombo = kombo + 1; ochko = ochko + 10 * kombo; // Xato qilsa — kombo nolga tushadi if (jarohat) kombo = 0; // 5 ta ketma-ket: 10+20+30+40+50 = 150 // 5 ta uzilib: 10+10+10+10+10 = 50
Kombosiz o'yinchi ehtiyotkor o'ynaydi. Kombo bilan u tavakkal qiladi — chunki uzilish og'riqli. Bitta qator kod o'yinchining butun xulq-atvorini o'zgartiradi. Mana bu — dizayn.
// Har N soniyada yangi dushman
spawnTaymer -= dt;
if (spawnTaymer <= 0){
dushmanlar.push(yangiDushman());
spawnTaymer = spawnOraligi;
}
// To'lqin o'sgani sayin oraliq qisqaradi
spawnOraligi = 2.0 - tolqin * 0.15;
if (spawnOraligi < 0.4) spawnOraligi = 0.4;
Stendda har 15 soniyada yangi to'lqin boshlanadi: dushman tezligi oshadi va oraliq qisqaradi. Yuqorida joriy to'lqin raqami ko'rsatiladi. Necha to'lqingacha yetganingizni varaqaga yozing.
Ism kiritiladi, boshlash tugmasi. O'yin tsikli ishlaydi, lekin update qahramonni qimirlatmaydi.
Asosiy holat: fizika, dushmanlar, ochko, to'lqinlar. Klaviatura qahramonni boshqaradi.
Yakuniy ochko ko'rsatiladi, rekord saqlanadi, leaderboard yangilanadi. Space — qaytadan.
function update(dt){
if (holat === 'MENU') return; // hech narsa qilmaydi
if (holat === 'GAMEOVER') return;
// faqat shu yerdan pastda o'yin mantig'i
qahramonniYangila(dt);
dushmanlarniYangila(dt);
}
// Holatni tekshirmasangiz: GAME OVER ekranida
// dushmanlar harakatda qoladi va ochko o'sishda davom etadi.
var natija = { ism:'Aziz', ochko:1240, tolqin:7 };
// Obyekt -> matn (saqlash uchun)
var matn = JSON.stringify(natija);
// '{"ism":"Aziz","ochko":1240,"tolqin":7}'
// Matn -> obyekt (o'qish uchun)
var qayta = JSON.parse(matn);
qayta.ochko + 10; // 1250 — bu yana son!
localStorage faqat matn saqlaydi — obyektni to'g'ridan-to'g'ri qo'ysangiz [object Object] chiqadi.// ❌ parse ni unutish
var reyting = localStorage.getItem('top');
reyting.push(yangi); // XATO: bu matn, massiv emas!
// ✅ To'g'ri
var reyting = JSON.parse(localStorage.getItem('top') || '[]');
reyting.push(yangi);
localStorage.setItem('top', JSON.stringify(reyting));
// 1. Qo'shish
reyting.push({ ism:ism, ochko:ochko, sana:Date.now() });
// 2. Saralash — kattadan kichikka
reyting.sort(function(a, b){
return b.ochko - a.ochko;
});
// 3. Faqat top-10 ni qoldirish
reyting = reyting.slice(0, 10);
sort ga taqqoslash funksiyasi beriladi: u ikkita elementni oladi va son qaytaradi.b.ochko - a.ochko → kamayish (katta birinchi). a.ochko - b.ochko → o'sish.sort() sonlarni matn sifatida saralaydi: [100, 9, 80] → [100, 80, 9]. Klassik tuzoq!// Brauzerda F12 -> Console va bitta qator:
localStorage.setItem('top',
JSON.stringify([{ism:'Men', ochko:999999}]));
// Yoki to'g'ridan-to'g'ri o'zgaruvchiga:
ochko = 999999;
// Tamom. Rekord "o'rnatildi".
localStorage — bu himoya emas, bu shunchaki qulaylik. U parol bilan yopilmagan.Ismingizni kiriting va 2 ta mashq o'yin o'ynang. Boshqaruvni his qiling: harakat, sakrash, dushmanni bosish.
Eng yaxshi natijangizni qo'ying. Komboni uzmaslikka harakat qiling — aynan u eng ko'p ochko beradi.
Jadvaldagi o'rningizni yozing. Birinchi o'rindagi natijadan qancha orqadasiz? Qaysi to'lqinda yutqazdingiz?
💀 CHEAT tugmasini bosing — jadvalga soxta rekord tushadi. Keyin 🛡 Tekshirish ni bosing va nima bo'lishini ko'ring.
Dars oxirida o'qituvchi proyektorda jadvalni ochadi. Birinchi uch o'rin e'lon qilinadi. Lekin: avval 🛡 Tekshirish ishga tushadi va mumkin bo'lmagan natijalar o'chiriladi.
1) Объясни, почему нельзя доверять счёту,
который прислал браузер игрока.
Приведи 3 способа защиты в реальных играх.
2) Напиши функцию на JavaScript, которая
сортирует массив {ism, ochko} по убыванию
очков и оставляет топ-10.
3) Почему [100, 9, 80].sort() даёт
[100, 80, 9]? Объясни и покажи, как
исправить.
sort() sonlarni matn sifatida saralaydi.sort va leaderboard.JSON.stringify va JSON.parse nima qilishini misol bilan yozing.