chore(i18n): sync translations with latest source changes (chunk 10/20, 100 files)

pull/1668/head
localizeflow[bot] 4 weeks ago
parent 6a6a57d2fb
commit e00c0e2d71

@ -26,7 +26,7 @@ journey
Build terrarium: 5: Student
```
![Pengantar HTML](../../../../translated_images/webdev101-html.4389c2067af68e98280c1bde52b6c6269f399eaae3659b7c846018d8a7b0bbd9.id.png)
![Pengantar HTML](../../../../translated_images/webdev101-html.4389c2067af68e98.id.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
HTML, atau HyperText Markup Language, adalah dasar dari setiap situs web yang pernah Anda kunjungi. Pikirkan HTML sebagai kerangka yang memberikan struktur pada halaman web HTML menentukan di mana konten berada, bagaimana konten diatur, dan apa yang diwakili oleh setiap bagian. Sementara CSS nantinya akan "mendandani" HTML Anda dengan warna dan tata letak, dan JavaScript akan menghidupkannya dengan interaktivitas, HTML menyediakan struktur penting yang membuat semuanya menjadi mungkin.
@ -88,7 +88,7 @@ Anda akan membuat folder khusus untuk proyek terrarium Anda dan menambahkan file
4. Di panel Explorer, klik ikon "New File"
5. Beri nama file Anda `index.html`
![Explorer VS Code menunjukkan pembuatan file baru](../../../../translated_images/vs-code-index.e2986cf919471eb984a0afef231380c8b132b000635105f2397bd2754d1b689c.id.png)
![Explorer VS Code menunjukkan pembuatan file baru](../../../../translated_images/vs-code-index.e2986cf919471eb9.id.png)
**Opsi 2: Menggunakan Perintah Terminal**
```bash

@ -30,7 +30,7 @@ journey
Glass reflections: 5: Student
```
![Pengantar CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a200d79e7257e5e450408d8ea97f5b531d31b2e3976317338ee.id.png)
![Pengantar CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a20.id.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
Ingat bagaimana terrarium HTML Anda terlihat cukup sederhana? CSS adalah tempat kita mengubah struktur polos itu menjadi sesuatu yang menarik secara visual.
@ -205,7 +205,7 @@ body {
Buka alat pengembang browser Anda (F12), navigasikan ke tab Elemen, dan inspeksi elemen `<h1>` Anda. Anda akan melihat bahwa elemen tersebut mewarisi keluarga font dari body:
![font yang diwarisi](../../../../translated_images/1.cc07a5cbe114ad1d4728c35134584ac1b87db688eff83cf75985cf31fe0ed95c.id.png)
![font yang diwarisi](../../../../translated_images/1.cc07a5cbe114ad1d.id.png)
**Waktu Eksperimen**: Cobalah mengatur properti lain yang dapat diwarisi pada `<body>` seperti `color`, `line-height`, atau `text-align`. Apa yang terjadi pada heading dan elemen lainnya?
@ -599,7 +599,7 @@ Siap meningkatkan terrarium Anda dengan refleksi kaca yang realistis? Teknik ini
Anda akan membuat sorotan halus yang mensimulasikan bagaimana cahaya memantul dari permukaan kaca. Pendekatan ini mirip dengan bagaimana pelukis Renaisans seperti Jan van Eyck menggunakan cahaya dan refleksi untuk membuat kaca yang dilukis tampak tiga dimensi. Berikut adalah tujuan Anda:
![finished terrarium](../../../../translated_images/terrarium-final.2f07047ffc597d0a06b06cab28a77801a10dd12fdb6c7fc630e9c40665491c53.id.png)
![finished terrarium](../../../../translated_images/terrarium-final.2f07047ffc597d0a.id.png)
**Tantangan Anda:**
- **Buat** bentuk oval putih atau berwarna terang untuk refleksi kaca

@ -26,7 +26,7 @@ journey
Complete terrarium: 5: Student
```
![DOM dan sebuah closure](../../../../translated_images/webdev101-js.10280393044d7eaaec7e847574946add7ddae6be2b2194567d848b61d849334a.id.png)
![DOM dan sebuah closure](../../../../translated_images/webdev101-js.10280393044d7eaa.id.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
Selamat datang di salah satu aspek paling menarik dari pengembangan web - membuat sesuatu menjadi interaktif! Document Object Model (DOM) adalah seperti jembatan antara HTML dan JavaScript Anda, dan hari ini kita akan menggunakannya untuk menghidupkan terrarium Anda. Ketika Tim Berners-Lee menciptakan browser web pertama, dia membayangkan web di mana dokumen bisa menjadi dinamis dan interaktif - DOM membuat visi itu menjadi mungkin.
@ -105,7 +105,7 @@ flowchart TD
style Q fill:#ffebee
```
![Representasi pohon DOM](../../../../translated_images/dom-tree.7daf0e763cbbba9273f9a66fe04c98276d7d23932309b195cb273a9cf1819b42.id.png)
![Representasi pohon DOM](../../../../translated_images/dom-tree.7daf0e763cbbba92.id.png)
> Representasi DOM dan markup HTML yang merujuk padanya. Dari [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
@ -150,7 +150,7 @@ flowchart LR
> 💡 **Memahami Penutupan**: Penutupan adalah topik penting dalam JavaScript, dan banyak pengembang menggunakannya selama bertahun-tahun sebelum sepenuhnya memahami semua aspek teoritisnya. Hari ini, kita fokus pada aplikasi praktis - Anda akan melihat penutupan muncul secara alami saat kita membangun fitur interaktif kita. Pemahaman akan berkembang saat Anda melihat bagaimana mereka menyelesaikan masalah nyata.
![Representasi pohon DOM](../../../../translated_images/dom-tree.7daf0e763cbbba9273f9a66fe04c98276d7d23932309b195cb273a9cf1819b42.id.png)
![Representasi pohon DOM](../../../../translated_images/dom-tree.7daf0e763cbbba92.id.png)
> Representasi DOM dan markup HTML yang merujuk padanya. Dari [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
@ -598,7 +598,7 @@ Sekarang uji terrarium interaktif Anda! Buka file `index.html` Anda di browser w
- **Dukungan lintas perangkat**: Berfungsi di desktop dan mobile
- **Sadar kinerja**: Tidak ada kebocoran memori atau perhitungan redundan
![terrarium selesai](../../../../translated_images/terrarium-final.0920f16e87c13a84cd2b553a5af9a3ad1cffbd41fbf8ce715d9e9c43809a5e2c.id.png)
![terrarium selesai](../../../../translated_images/terrarium-final.0920f16e87c13a84.id.png)
---

@ -1,45 +1,30 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7965cd2bc5dc92ad888dc4c6ab2ab70a",
"translation_date": "2025-08-27T22:55:45+00:00",
"original_hash": "bc5c5550f79d10add90ce419ee34abb3",
"translation_date": "2026-01-07T01:10:57+00:00",
"source_file": "3-terrarium/README.md",
"language_code": "id"
}
-->
# Terrarium Saya: Proyek untuk Belajar tentang HTML, CSS, dan Manipulasi DOM menggunakan JavaScript 🌵🌱
## Deploy Terrarium Anda
Sebuah meditasi kode kecil dengan fitur drag and drop. Dengan sedikit HTML, JS, dan CSS, Anda akan dapat membangun antarmuka web, mendesainnya, dan bahkan menambahkan berbagai interaksi sesuai keinginan Anda.
![terrarium saya](../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.id.png)
# Pelajaran
1. [Pengenalan HTML](./1-intro-to-html/README.md)
2. [Pengenalan CSS](./2-intro-to-css/README.md)
3. [Pengenalan DOM dan Penutupan JS](./3-intro-to-DOM-and-closures/README.md)
## Kredit
Ditulis dengan ♥️ oleh [Jen Looper](https://www.twitter.com/jenlooper)
Terrarium yang dibuat menggunakan CSS terinspirasi dari kaca toples karya Jakub Mandra di [codepen](https://codepen.io/Rotarepmi/pen/rjpNZY).
Karya seni digambar tangan oleh [Jen Looper](http://jenlooper.com) dengan bantuan Procreate.
## Publikasikan Terrarium Anda
Anda dapat mempublikasikan terrarium Anda di web menggunakan Azure Static Web Apps.
Anda dapat mendeply, atau menerbitkan Terrarium Anda di web menggunakan **Azure Static Web Apps**.
1. Fork repositori ini
2. Tekan tombol ini
2. Tekan tombol ini 👇
[![Tombol Deploy ke Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/?feature.customportal=false&WT.mc_id=academic-77807-sagibbon#create/Microsoft.StaticApp)
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.StaticApp)
3. Ikuti panduan wizard untuk membuat aplikasi Anda. Pastikan Anda mengatur root aplikasi ke `/solution` atau root dari basis kode Anda. Tidak ada API dalam aplikasi ini, jadi Anda tidak perlu khawatir menambahkannya. Sebuah folder GitHub akan dibuat di repositori yang telah Anda fork, yang akan membantu layanan build Azure Static Web Apps untuk membangun dan mempublikasikan aplikasi Anda ke URL baru.
3. Ikuti panduan penyiapan untuk membuat aplikasi Anda.
- Atur **App root** ke `/solution` atau root dari kode Anda.
- Tidak ada API dalam aplikasi ini, jadi Anda bisa melewati konfigurasi API.
- Folder `.github` akan dibuat secara otomatis untuk membantu Azure Static Web Apps membangun dan menerbitkan aplikasi Anda.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan terjemahan yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang resmi dan sah. Untuk informasi yang krusial, disarankan menggunakan jasa penerjemah profesional manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau salah tafsir yang timbul dari penggunaan terjemahan ini.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Sebuah meditasi kode kecil dengan fitur seret dan lepas. Dengan sedikit HTML, JS, dan CSS, Anda dapat membangun antarmuka web, menatanya, dan menambahkan interaksi.
![terrarium saya](../../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.id.png)
![terrarium saya](../../../../translated_images/screenshot_gray.0c796099a1f9f25e.id.png)
## Kredit

@ -26,7 +26,7 @@ journey
Polish experience: 5: Student
```
![Sketchnote Browser](../../../../translated_images/browser.60317c9be8b7f84adce43e30bff8d47a1ae15793beab762317b2bc6b74337c1a.id.jpg)
![Sketchnote Browser](../../../../translated_images/browser.60317c9be8b7f84a.id.jpg)
> Sketchnote oleh [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
## Kuis Pra-Pelajaran
@ -79,7 +79,7 @@ Proses ini mencerminkan bagaimana browser web pertama, WorldWideWeb, dirancang o
**Sedikit sejarah**: Browser pertama disebut 'WorldWideWeb' dan dibuat oleh Sir Timothy Berners-Lee pada tahun 1990.
![browser awal](../../../../translated_images/earlybrowsers.d984b711cdf3a42ddac919d46c4b5ca7232f68ccfbd81395e04e5a64c0015277.id.jpg)
![browser awal](../../../../translated_images/earlybrowsers.d984b711cdf3a42d.id.jpg)
> Beberapa browser awal, via [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
### Bagaimana Browser Memproses Konten Web
@ -198,7 +198,7 @@ quadrantChart
Memahami proses pemasangan ekstensi membantu Anda mengantisipasi pengalaman pengguna saat mereka memasang ekstensi Anda. Proses pemasangan distandarisasi di browser modern, dengan variasi kecil dalam desain antarmuka.
![tangkapan layar browser Edge yang menunjukkan halaman edge://extensions terbuka dan menu pengaturan terbuka](../../../../translated_images/install-on-edge.d68781acaf0b3d3dada8b7507cde7a64bf74b7040d9818baaa9070668e819f90.id.png)
![tangkapan layar browser Edge yang menunjukkan halaman edge://extensions terbuka dan menu pengaturan terbuka](../../../../translated_images/install-on-edge.d68781acaf0b3d3d.id.png)
> **Penting**: Pastikan untuk mengaktifkan mode pengembang dan izinkan ekstensi dari toko lain saat menguji ekstensi Anda sendiri.
@ -313,10 +313,10 @@ Ini mengikuti prinsip pengungkapan progresif yang digunakan dalam desain antarmu
### Ikhtisar Tampilan Ekstensi
**Tampilan Pengaturan** - Konfigurasi pengguna pertama kali:
![tangkapan layar ekstensi yang selesai terbuka di browser, menampilkan formulir dengan input untuk nama wilayah dan kunci API.](../../../../translated_images/1.b6da8c1394b07491afeb6b2a8e5aca73ebd3cf478e27bcc9aeabb187e722648e.id.png)
![tangkapan layar ekstensi yang selesai terbuka di browser, menampilkan formulir dengan input untuk nama wilayah dan kunci API.](../../../../translated_images/1.b6da8c1394b07491.id.png)
**Tampilan Hasil** - Tampilan data jejak karbon:
![tangkapan layar ekstensi yang selesai menampilkan nilai penggunaan karbon dan persentase bahan bakar fosil untuk wilayah US-NEISO.](../../../../translated_images/2.1dae52ff0804224692cd648afbf2342955d7afe3b0101b617268130dfb427f55.id.png)
![tangkapan layar ekstensi yang selesai menampilkan nilai penggunaan karbon dan persentase bahan bakar fosil untuk wilayah US-NEISO.](../../../../translated_images/2.1dae52ff08042246.id.png)
### Membuat Formulir Konfigurasi

@ -268,7 +268,7 @@ stateDiagram-v2
ClearStorage --> FirstTime: Back to setup
```
![Panel penyimpanan lokal](../../../../translated_images/localstorage.472f8147b6a3f8d141d9551c95a2da610ac9a3c6a73d4a1c224081c98bae09d9.id.png)
![Panel penyimpanan lokal](../../../../translated_images/localstorage.472f8147b6a3f8d1.id.png)
> ⚠️ **Pertimbangan Keamanan**: Dalam aplikasi produksi, menyimpan kunci API di LocalStorage menimbulkan risiko keamanan karena JavaScript dapat mengakses data ini. Untuk tujuan pembelajaran, pendekatan ini baik-baik saja, tetapi aplikasi nyata harus menggunakan penyimpanan sisi server yang aman untuk kredensial sensitif.

@ -126,7 +126,7 @@ Untuk membuka Developer Tools di Edge, klik tiga titik di sudut kanan atas, lalu
Mari kita coba ini. Buka sebuah situs web (Microsoft.com bekerja dengan baik untuk ini) dan klik tombol 'Record'. Sekarang segarkan halaman dan lihat profiler menangkap semua yang terjadi. Ketika Anda berhenti merekam, Anda akan melihat rincian mendetail tentang bagaimana browser 'menyusun', 'merender', dan 'melukis' situs tersebut. Ini mengingatkan saya pada bagaimana pusat kendali misi memantau setiap sistem selama peluncuran roket - Anda mendapatkan data waktu nyata tentang apa yang terjadi dan kapan.
![Edge profiler](../../../../translated_images/profiler.5a4a62479c5df01cfec9aab74173dba13f91d2c968e1a1ae434c26165792df15.id.png)
![Edge profiler](../../../../translated_images/profiler.5a4a62479c5df01c.id.png)
✅ [Dokumentasi Microsoft](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) memiliki banyak detail jika Anda ingin mendalami lebih jauh
@ -136,11 +136,11 @@ Pilih elemen dari timeline profil untuk memperbesar peristiwa yang terjadi saat
Dapatkan snapshot performa halaman Anda dengan memilih bagian dari timeline profil dan melihat panel ringkasan:
![Edge profiler snapshot](../../../../translated_images/snapshot.97750180ebcad73794a3594b36925eb5c8dbaac9e03fec7f9b974188c9ac63c7.id.png)
![Edge profiler snapshot](../../../../translated_images/snapshot.97750180ebcad737.id.png)
Periksa panel Event Log untuk melihat apakah ada peristiwa yang memakan waktu lebih dari 15 ms:
![Edge event log](../../../../translated_images/log.804026979f3707e00eebcfa028b2b5a88cec6292f858767bb6703afba65a7d9c.id.png)
![Edge event log](../../../../translated_images/log.804026979f3707e0.id.png)
✅ Kenali profiler Anda! Buka developer tools di situs ini dan lihat apakah ada hambatan. Apa aset yang paling lambat dimuat? Yang tercepat?

@ -23,7 +23,7 @@ Ekstensi ini dapat digunakan secara ad hoc oleh pengguna setelah kunci API dan k
### Kredit
![ekstensi browser berwarna hijau](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![ekstensi browser berwarna hijau](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Kredit

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API C02 Signal dari tmrow untuk melacak penggunaan listrik, buat ekstensi browser sehingga Anda dapat memiliki pengingat langsung di browser Anda tentang seberapa berat penggunaan listrik di wilayah Anda. Menggunakan ekstensi ini secara ad hoc akan membantu Anda membuat keputusan berdasarkan informasi ini.
![screenshot ekstensi](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![screenshot ekstensi](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu 'tiga titik' di sudut kanan atas browser untuk menemukan panel Ekstensi. Dari sana, pilih 'Load Unpacked' untuk memuat ekstensi baru. Buka folder 'dist' saat diminta, dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API untuk API CO2 Signal ([dapatkan di sini melalui email](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman ini) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Electricity Map](https://www.electricitymap.org/map) (di Boston, misalnya, saya menggunakan 'US-NEISO').
![menginstal](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![menginstal](../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antarmuka ekstensi, titik berwarna di bilah ekstensi browser seharusnya berubah untuk mencerminkan penggunaan energi di wilayah Anda dan memberikan petunjuk tentang aktivitas berat energi yang sesuai untuk Anda lakukan. Konsep di balik sistem 'titik' ini diberikan kepada saya oleh [ekstensi Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Dengan menggunakan API C02 Signal dari tmrow untuk memantau konsumsi listrik, buatlah ekstensi browser sehingga Anda dapat menerima pengingat langsung di browser Anda tentang konsumsi listrik di wilayah Anda. Penggunaan ekstensi ini akan membantu Anda membuat keputusan berdasarkan informasi tersebut.
![tangkapan layar ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![tangkapan layar ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu 'tiga titik' di sudut kanan atas browser untuk menemukan panel Ekstensi. Dari sana, pilih 'Muat ekstensi yang tidak dikompresi' untuk memuat ekstensi baru. Buka folder 'dist' saat diminta, dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API untuk API CO2 Signal ([dapatkan di sini melalui email](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman tersebut) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Peta Listrik](https://www.electricitymap.org/map) (di Boston, misalnya, saya menggunakan 'US-NEISO').
![instalasi](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![instalasi](../../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antarmuka ekstensi, titik berwarna di bilah ekstensi browser akan berubah untuk mencerminkan konsumsi energi di wilayah Anda dan memberikan indikator tentang aktivitas yang sesuai untuk dilakukan berdasarkan konsumsi energi tersebut. Konsep di balik sistem 'titik' ini terinspirasi oleh [ekstensi Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API CO2 Signal dari tmrow untuk melacak penggunaan listrik, ekstensi browser ini dirancang untuk memberikan pengingat tentang seberapa berat penggunaan listrik di wilayah Anda langsung di browser Anda. Dengan menggunakan ekstensi ini, Anda dapat membuat keputusan berdasarkan informasi tersebut untuk aktivitas Anda.
![Screenshot Ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![Screenshot Ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu 'tiga titik' di pojok kanan atas browser untuk menemukan panel ekstensi. Dari sana, pilih 'Load Unpacked' untuk memuat ekstensi baru. Pada prompt, buka folder 'dist' dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API CO2 Signal ([dapatkan melalui email di sini](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman tersebut) dan [kode wilayah Anda](http://api.electricitymap.org/v3/zones) dari [Electricity Map](https://www.electricitymap.org/map) (misalnya, di Boston, saya menggunakan 'US-NEISO').
![installing](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![installing](../../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antarmuka ekstensi, titik berwarna di bilah ekstensi browser Anda akan berubah untuk mencerminkan penggunaan energi di wilayah Anda dan memberikan indikator tentang aktivitas berat energi yang sesuai untuk dilakukan. Konsep sistem 'titik' ini terinspirasi oleh [Ekstensi Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kita akan menggunakan API Signal CO2 dari tmrow untuk memantau penggunaan listrik dan membuat ekstensi browser agar dapat memberikan pengingat langsung di browser tentang seberapa besar penggunaan listrik di wilayah kita. Penggunaan ekstensi ini akan membantu mengevaluasi aktivitas kita berdasarkan informasi tersebut.
![tangkapan layar ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![tangkapan layar ekstensi](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu "tiga titik" di sudut kanan atas browser untuk menemukan panel Ekstensi. Jika belum aktif, aktifkan Mode Pengembang (di bagian kiri bawah). Pilih "Muat tanpa kompresi" untuk memuat ekstensi baru. Buka folder "dist" saat diminta, dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API untuk API CO2 Signal (Anda dapat [memperolehnya melalui email di sini](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman tersebut) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [peta listrik](https://www.electricitymap.org/map) (misalnya, di Boston, "US-NEISO").
![instalasi](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![instalasi](../../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antarmuka ekstensi, titik berwarna di bilah ekstensi browser seharusnya berubah untuk mencerminkan penggunaan energi di wilayah tersebut dan memberikan petunjuk tentang aktivitas berenergi tinggi yang sesuai untuk dilakukan. Konsep di balik sistem "titik" ini terinspirasi oleh [ekstensi Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Bangun ekstensi browser yang memungkinkan Anda menampilkan pengingat di browser tentang seberapa besar konsumsi listrik di wilayah Anda, menggunakan API CO2 Signal dari tmrow untuk melacak penggunaan listrik. Dengan menggunakan ekstensi ini secara ad-hoc, Anda dapat membuat keputusan berdasarkan informasi ini untuk aktivitas Anda.
![extension screenshot](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![extension screenshot](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstalnya di Edge, temukan panel "Ekstensi" dari menu "tiga titik" di kanan atas browser. Dari sana, pilih "Load Unpacked" untuk memuat ekstensi baru. Ketika diminta, buka folder "dist", dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan API key dari CO2 Signal API ([dapatkan di sini melalui email](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman tersebut) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Electricity Map](https://www.electricitymap.org/map) (misalnya, untuk Boston, gunakan 'US-NEISO').
![installing](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![installing](../../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah Anda memasukkan API key dan wilayah Anda di antarmuka ekstensi, titik berwarna yang muncul di bilah ekstensi browser akan berubah, mencerminkan konsumsi energi di wilayah Anda. Ini akan membantu Anda menentukan aktivitas apa yang sesuai berdasarkan kebutuhan energi. Konsep sistem "titik" ini terinspirasi oleh [Energy Lollipop extension](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API Sinyal CO2 dari tmrow untuk memantau penggunaan listrik, buat ekstensi peramban sehingga Anda dapat menerima peringatan di peramban Anda tentang seberapa besar konsumsi listrik di wilayah Anda. Menggunakan ekstensi ini secara khusus akan membantu Anda membuat keputusan tentang aktivitas Anda berdasarkan informasi tersebut.
![tangkapan layar ekstensi peramban](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![tangkapan layar ekstensi peramban](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu 'tiga titik' di sudut kanan atas peramban untuk menemukan panel Ekstensi. Dari sana, pilih 'Load Unpacked' untuk memuat ekstensi baru. Buka folder 'dist' saat diminta, dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API untuk API Sinyal CO2 ([dapatkan satu di sini melalui email](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman tersebut) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Peta Listrik](https://www.electricitymap.org/map) (di Boston, misalnya, saya menggunakan 'US-NEISO').
![sedang menginstal](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![sedang menginstal](../../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke antarmuka ekstensi, titik berwarna di bilah ekstensi peramban akan berubah untuk mencerminkan konsumsi energi di wilayah Anda dan memberikan petunjuk tentang aktivitas berat yang sesuai untuk Anda lakukan. Konsep di balik sistem 'titik' ini terinspirasi oleh [ekstensi peramban Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API C02 Signal dari tmrow untuk melacak penggunaan listrik, bangun sebuah ekstensi browser sehingga Anda dapat memiliki pengingat langsung di browser Anda tentang seberapa berat penggunaan listrik di wilayah Anda. Menggunakan ekstensi ini secara ad hoc akan membantu Anda membuat keputusan berdasarkan informasi ini.
![screenshot ekstensi](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.id.png)
![screenshot ekstensi](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.id.png)
## Memulai
@ -31,7 +31,7 @@ npm run build
Untuk menginstal di Edge, gunakan menu 'tiga titik' di sudut kanan atas browser untuk menemukan panel Ekstensi. Dari sana, pilih 'Load Unpacked' untuk memuat ekstensi baru. Buka folder 'dist' saat diminta, dan ekstensi akan dimuat. Untuk menggunakannya, Anda memerlukan kunci API untuk API CO2 Signal ([dapatkan di sini melalui email](https://www.co2signal.com/) - masukkan email Anda di kotak pada halaman ini) dan [kode untuk wilayah Anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Electricity Map](https://www.electricitymap.org/map) (misalnya, di Boston, saya menggunakan 'US-NEISO').
![menginstal](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.id.png)
![menginstal](../../../../translated_images/install-on-edge.78634f02842c4828.id.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antarmuka ekstensi, titik berwarna di bilah ekstensi browser seharusnya berubah untuk mencerminkan penggunaan energi di wilayah Anda dan memberikan petunjuk tentang aktivitas berat energi apa yang sesuai untuk Anda lakukan. Konsep di balik sistem 'titik' ini terinspirasi oleh [ekstensi Energy Lollipop](https://energylollipop.com/) untuk emisi di California.

@ -108,7 +108,7 @@ quadrantChart
UI Elements: [0.9, 0.1]
```
![grid canvas](../../../../translated_images/canvas_grid.5f209da785ded492a01ece440e3032afe51efa500cc2308e5ea4252487ceaf0b.id.png)
![grid canvas](../../../../translated_images/canvas_grid.5f209da785ded492.id.png)
> Gambar dari [MDN](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)
Untuk menggambar di elemen canvas, Anda akan mengikuti proses tiga langkah yang sama yang membentuk dasar dari semua grafik canvas. Setelah Anda melakukannya beberapa kali, ini menjadi kebiasaan:
@ -329,11 +329,11 @@ Anda akan membuat halaman web dengan elemen Canvas. Halaman tersebut harus menam
- Kapal pahlawan
![Kapal pahlawan](../../../../translated_images/player.dd24c1afa8c71e9b82b2958946d4bad13308681392d4b5ddcc61a0e818ef8088.id.png)
![Kapal pahlawan](../../../../translated_images/player.dd24c1afa8c71e9b.id.png)
- 5*5 monster
![Kapal monster](../../../../translated_images/enemyShip.5df2a822c16650c2fb3c06652e8ec8120cdb9122a6de46b9a1a56d54db22657f.id.png)
![Kapal monster](../../../../translated_images/enemyShip.5df2a822c16650c2.id.png)
### Langkah-langkah yang Direkomendasikan untuk Memulai Pengembangan
@ -470,7 +470,7 @@ for (let x = START_X; x < STOP_X; x += ENEMY_SPACING) {
Hasil akhir seharusnya terlihat seperti ini:
![Layar hitam dengan seorang pahlawan dan 5*5 monster](../../../../translated_images/partI-solution.36c53b48c9ffae2a5e15496b23b604ba5393433e4bf91608a7a0a020eb7a2691.id.png)
![Layar hitam dengan seorang pahlawan dan 5*5 monster](../../../../translated_images/partI-solution.36c53b48c9ffae2a.id.png)
## Solusi

@ -160,7 +160,7 @@ sequenceDiagram
```
- **Sistem skor**: Setiap kapal musuh yang dihancurkan memberikan 100 poin (angka bulat lebih mudah dihitung secara mental oleh pemain). Skor ditampilkan di sudut kiri bawah.
- **Penghitung nyawa**: Pahlawan Anda memulai dengan tiga nyawa - standar yang ditetapkan oleh game arcade awal untuk menyeimbangkan tantangan dengan kemampuan bermain. Setiap tabrakan dengan musuh mengurangi satu nyawa. Kita akan menampilkan nyawa yang tersisa di sudut kanan bawah menggunakan ikon kapal ![gambar nyawa](../../../../translated_images/life.6fb9f50d53ee0413cd91aa411f7c296e10a1a6de5c4a4197c718b49bf7d63ebf.id.png).
- **Penghitung nyawa**: Pahlawan Anda memulai dengan tiga nyawa - standar yang ditetapkan oleh game arcade awal untuk menyeimbangkan tantangan dengan kemampuan bermain. Setiap tabrakan dengan musuh mengurangi satu nyawa. Kita akan menampilkan nyawa yang tersisa di sudut kanan bawah menggunakan ikon kapal ![gambar nyawa](../../../../translated_images/life.6fb9f50d53ee0413.id.png).
## Mari Mulai Membangun!

@ -652,7 +652,7 @@ sequenceDiagram
Menggunakan `history.pushState` menciptakan entri baru dalam riwayat navigasi browser. Anda dapat memeriksanya dengan menahan *tombol kembali* browser Anda, seharusnya menampilkan sesuatu seperti ini:
![Screenshot riwayat navigasi](../../../../translated_images/history.7fdabbafa521e06455b738d3dafa3ff41d3071deae60ead8c7e0844b9ed987d8.id.png)
![Screenshot riwayat navigasi](../../../../translated_images/history.7fdabbafa521e064.id.png)
Jika Anda mencoba mengklik tombol kembali beberapa kali, Anda akan melihat bahwa URL saat ini berubah dan riwayat diperbarui, tetapi template yang sama tetap ditampilkan.

@ -295,7 +295,7 @@ Pertama, mari kita amati apa yang terjadi dengan pengiriman formulir dasar:
2. Amati perubahan di bilah alamat browser Anda
3. Perhatikan bagaimana halaman memuat ulang dan data muncul di URL
![Screenshot perubahan URL browser setelah mengklik tombol Register](../../../../translated_images/click-register.e89a30bf0d4bc9ca867dc537c4cea679a7c26368bd790969082f524fed2355bc.id.png)
![Screenshot perubahan URL browser setelah mengklik tombol Register](../../../../translated_images/click-register.e89a30bf0d4bc9ca.id.png)
### Perbandingan Metode HTTP
@ -350,7 +350,7 @@ Mari kita konfigurasi formulir registrasi Anda untuk berkomunikasi dengan benar
2. **Klik** tombol "Create Account"
3. **Amati** respons server di browser Anda
![Jendela browser di alamat localhost:5000/api/accounts, menunjukkan string JSON dengan data pengguna](../../../../translated_images/form-post.61de4ca1b964d91a9e338416e19f218504dd0af5f762fbebabfe7ae80edf885f.id.png)
![Jendela browser di alamat localhost:5000/api/accounts, menunjukkan string JSON dengan data pengguna](../../../../translated_images/form-post.61de4ca1b964d91a.id.png)
**Apa yang harus Anda lihat:**
- **Browser mengarahkan** ke URL endpoint API
@ -615,7 +615,7 @@ async function register() {
3. **Klik** "Buat Akun"
4. **Amati** pesan konsol dan umpan balik pengguna
![Screenshot menunjukkan pesan log di konsol browser](../../../../translated_images/browser-console.efaf0b51aaaf67782a29e1a0bb32cc063f189b18e894eb5926e02f1abe864ec2.id.png)
![Screenshot menunjukkan pesan log di konsol browser](../../../../translated_images/browser-console.efaf0b51aaaf6778.id.png)
**Apa yang harus Anda lihat:**
- **Status pemuatan** muncul di tombol kirim
@ -790,7 +790,7 @@ Mari tingkatkan formulir registrasi Anda dengan validasi yang kuat yang memberik
3. **Coba** karakter khusus di bidang nama pengguna
4. **Masukkan** jumlah saldo negatif
![Screenshot menunjukkan kesalahan validasi saat mencoba mengirimkan formulir](../../../../translated_images/validation-error.8bd23e98d416c22f80076d04829a4bb718e0e550fd622862ef59008ccf0d5dce.id.png)
![Screenshot menunjukkan kesalahan validasi saat mencoba mengirimkan formulir](../../../../translated_images/validation-error.8bd23e98d416c22f.id.png)
**Apa yang akan Anda amati:**
- **Browser menampilkan** pesan validasi bawaan
@ -952,7 +952,7 @@ Tampilkan pesan kesalahan di HTML jika pengguna sudah ada.
Berikut adalah contoh tampilan halaman login setelah ditambahkan beberapa gaya CSS:
![Screenshot halaman login setelah menambahkan gaya CSS](../../../../translated_images/result.96ef01f607bf856aa9789078633e94a4f7664d912f235efce2657299becca483.id.png)
![Screenshot halaman login setelah menambahkan gaya CSS](../../../../translated_images/result.96ef01f607bf856a.id.png)
## Kuis Pasca-Pelajaran

@ -160,7 +160,7 @@ sequenceDiagram
Browser->>User: Displays new page (flash/reload)
```
![Alur pembaruan dalam aplikasi multi-halaman](../../../../translated_images/mpa.7f7375a1a2d4aa779d3f928a2aaaf9ad76bcdeb05cfce2dc27ab126024050f51.id.png)
![Alur pembaruan dalam aplikasi multi-halaman](../../../../translated_images/mpa.7f7375a1a2d4aa77.id.png)
**Mengapa pendekatan ini terasa kaku:**
- Setiap klik berarti membangun ulang seluruh halaman dari awal
@ -187,7 +187,7 @@ sequenceDiagram
Browser->>User: Shows updated content (no reload)
```
![Alur pembaruan dalam aplikasi satu halaman](../../../../translated_images/spa.268ec73b41f992c2a21ef9294235c6ae597b3c37e2c03f0494c2d8857325cc57.id.png)
![Alur pembaruan dalam aplikasi satu halaman](../../../../translated_images/spa.268ec73b41f992c2.id.png)
**Mengapa SPA terasa jauh lebih baik:**
- Hanya bagian yang benar-benar berubah yang diperbarui (cerdas, bukan?)
@ -523,7 +523,7 @@ if (data.error) {
Sekarang ketika Anda menguji dengan akun yang tidak valid, Anda akan melihat pesan kesalahan yang berguna langsung di halaman!
![Screenshot menunjukkan pesan kesalahan yang ditampilkan saat login](../../../../translated_images/login-error.416fe019b36a63276764c2349df5d99e04ebda54fefe60c715ee87a28d5d4ad0.id.png)
![Screenshot menunjukkan pesan kesalahan yang ditampilkan saat login](../../../../translated_images/login-error.416fe019b36a6327.id.png)
#### Langkah 4: Menjadi Inklusif dengan Aksesibilitas
@ -961,7 +961,7 @@ Siap membawa aplikasi perbankan Anda ke tingkat berikutnya? Mari buat aplikasi i
Berikut tampilan dashboard yang sudah dipoles:
![Screenshot dari contoh hasil dashboard setelah styling](../../../../translated_images/screen2.123c82a831a1d14ab2061994be2fa5de9cec1ce651047217d326d4773a6348e4.id.png)
![Screenshot dari contoh hasil dashboard setelah styling](../../../../translated_images/screen2.123c82a831a1d14a.id.png)
Jangan merasa harus meniru ini persis - gunakan sebagai inspirasi dan buat versi Anda sendiri!

@ -190,7 +190,7 @@ Seperti desain kompartemen Titanic yang tampak kokoh hingga beberapa kompartemen
Alih-alih mengejar ekor kita sendiri, kita akan membuat sistem **manajemen state terpusat**. Anggap saja seperti memiliki satu orang yang sangat terorganisir yang bertanggung jawab atas semua hal penting:
![Skema yang menunjukkan aliran data antara HTML, tindakan pengguna, dan state](../../../../translated_images/data-flow.fa2354e0908fecc89b488010dedf4871418a992edffa17e73441d257add18da4.id.png)
![Skema yang menunjukkan aliran data antara HTML, tindakan pengguna, dan state](../../../../translated_images/data-flow.fa2354e0908fecc8.id.png)
```mermaid
flowchart TD
@ -804,7 +804,7 @@ Tantangan ini akan membantu Anda berpikir seperti pengembang profesional yang me
Berikut adalah contoh hasil setelah menyelesaikan tugas:
![Screenshot menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f12f65ebf8f521c5d64e179c40b791c49c242cf15f7e7fab15.id.png)
![Screenshot menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f1.id.png)
---

@ -112,7 +112,7 @@ Lihat [dokumentasi API server](../api/README.md) untuk:
**Hasil yang Diharapkan:**
Setelah menyelesaikan tugas ini, aplikasi perbankan Anda harus memiliki fitur "Tambah Transaksi" yang berfungsi penuh dan terlihat profesional:
![Screenshot yang menunjukkan contoh dialog "Tambah Transaksi"](../../../../translated_images/dialog.93bba104afeb79f12f65ebf8f521c5d64e179c40b791c49c242cf15f7e7fab15.id.png)
![Screenshot yang menunjukkan contoh dialog "Tambah Transaksi"](../../../../translated_images/dialog.93bba104afeb79f1.id.png)
## Pengujian Implementasi Anda

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Dalam proyek ini, Anda akan belajar cara membangun bank fiksi. Pelajaran ini mencakup instruksi tentang cara merancang aplikasi web dan menyediakan rute, membuat formulir, mengelola state, serta mengambil data dari API yang memungkinkan Anda mendapatkan data bank.
| ![Screen1](../../../translated_images/screen1.baccbba0f1f93364672eb250d2fbd21574bb1caf79a2155022dc098a741cbdfe.id.png) | ![Screen2](../../../translated_images/screen2.123c82a831a1d14ab2061994be2fa5de9cec1ce651047217d326d4773a6348e4.id.png) |
| ![Screen1](../../../translated_images/screen1.baccbba0f1f93364.id.png) | ![Screen2](../../../translated_images/screen2.123c82a831a1d14a.id.png) |
|--------------------------------|--------------------------------|
## Pelajaran

@ -185,7 +185,7 @@ Seperti bagaimana telepon Alexander Graham Bell menghubungkan lokasi yang jauh,
Setelah semuanya dimuat, Anda akan melihat ruang kerja yang bersih dan indah yang dirancang untuk membuat Anda fokus pada hal yang penting kode Anda!
![Antarmuka default VSCode.dev](../../../../translated_images/default-vscode-dev.5d06881d65c1b3234ce50cd9ed3b0028e6031ad5f5b441bcbed96bfa6311f6d0.id.png)
![Antarmuka default VSCode.dev](../../../../translated_images/default-vscode-dev.5d06881d65c1b323.id.png)
**Berikut tur singkatnya:**
- **Activity Bar** (strip di sebelah kiri): Navigasi utama Anda dengan Explorer 📁, Pencarian 🔍, Source Control 🌿, Ekstensi 🧩, dan Pengaturan ⚙️
@ -233,7 +233,7 @@ Ini sempurna saat Anda memulai dari awal di VSCode.dev dan ingin membuka reposit
1. Pergi ke [vscode.dev](https://vscode.dev) jika Anda belum ada di sana
2. Cari tombol "Open Remote Repository" di layar selamat datang dan klik
![Buka repositori remote](../../../../translated_images/open-remote-repository.bd9c2598b8949e7fc283cdfc8f4050c6205a7c7c6d3f78c4b135115d037d6fa2.id.png)
![Buka repositori remote](../../../../translated_images/open-remote-repository.bd9c2598b8949e7f.id.png)
3. Tempelkan URL repositori GitHub mana pun (coba yang ini: `https://github.com/microsoft/Web-Dev-For-Beginners`)
4. Tekan Enter dan lihat keajaibannya!
@ -242,7 +242,7 @@ Ini sempurna saat Anda memulai dari awal di VSCode.dev dan ingin membuka reposit
Ingin merasa seperti penyihir kode? Coba pintasan keyboard ini: Ctrl+Shift+P (atau Cmd+Shift+P di Mac) untuk membuka Command Palette:
![Command Palette](../../../../translated_images/palette-menu.4946174e07f426226afcdad707d19b8d5150e41591c751c45b5dee213affef91.id.png)
![Command Palette](../../../../translated_images/palette-menu.4946174e07f42622.id.png)
**Command Palette seperti mesin pencari untuk semua yang bisa Anda lakukan:**
- Ketik "open remote" dan itu akan menemukan pembuka repositori untuk Anda
@ -304,7 +304,7 @@ Seperti mengatur cetak biru di kantor arsitek, pembuatan file di VSCode.dev meng
3. Masukkan nama file termasuk ekstensi yang sesuai (`style.css`, `script.js`, `index.html`)
4. Tekan Enter untuk membuat file
![Membuat file baru](../../../../translated_images/create-new-file.2814e609c2af9aeb6c6fd53156c503ac91c3d538f9cac63073b2dd4a7631f183.id.png)
![Membuat file baru](../../../../translated_images/create-new-file.2814e609c2af9aeb.id.png)
**Konvensi penamaan:**
- Gunakan nama deskriptif yang menunjukkan tujuan file
@ -322,7 +322,7 @@ Di sinilah kesenangan sebenarnya dimulai! Editor VSCode.dev penuh dengan fitur y
2. Mulai mengetik dan lihat VSCode.dev membantu Anda dengan warna, saran, dan deteksi kesalahan
3. Simpan pekerjaan Anda dengan Ctrl+S (Windows/Linux) atau Cmd+S (Mac) meskipun juga menyimpan otomatis!
![Mengedit file di VSCode.dev](../../../../translated_images/edit-a-file.52c0ee665ef19f08119d62d63f395dfefddc0a4deb9268d73bfe791f52c5807a.id.png)
![Mengedit file di VSCode.dev](../../../../translated_images/edit-a-file.52c0ee665ef19f08.id.png)
**Hal keren yang terjadi saat Anda mengkode:**
- Kode Anda diberi warna sehingga mudah dibaca
@ -343,7 +343,7 @@ Seperti bagaimana arkeolog membuat catatan rinci tentang lapisan penggalian, Git
2. File yang dimodifikasi muncul di bagian "Changes"
3. Kode warna menunjukkan jenis perubahan: hijau untuk penambahan, merah untuk penghapusan
![Melihat perubahan di Source Control](../../../../translated_images/working-tree.c58eec08e6335c79cc708c0c220c0b7fea61514bd3c7fb7471905a864aceac7c.id.png)
![Melihat perubahan di Source Control](../../../../translated_images/working-tree.c58eec08e6335c79.id.png)
**Menyimpan pekerjaan Anda (alur kerja commit):**
@ -438,7 +438,7 @@ Marketplace ekstensi sangat terorganisir, jadi Anda tidak akan tersesat saat men
2. Jelajahi atau cari sesuatu yang spesifik
3. Klik apa pun yang terlihat menarik untuk mempelajari lebih lanjut
![Antarmuka marketplace ekstensi](../../../../translated_images/extensions.eca0e0c7f59a10b5c88be7fe24b3e32cca6b6058b35a49026c3a9d80b1813b7c.id.png)
![Antarmuka marketplace ekstensi](../../../../translated_images/extensions.eca0e0c7f59a10b5.id.png)
**Apa yang akan Anda temukan di sana:**
@ -491,7 +491,7 @@ Sebagian besar ekstensi memiliki pengaturan yang dapat Anda sesuaikan agar beker
3. Pilih "Pengaturan Ekstensi" dari dropdown
4. Sesuaikan hingga terasa pas untuk alur kerja Anda
![Menyesuaikan pengaturan ekstensi](../../../../translated_images/extension-settings.21c752ae4f4cdb78a867f140ccd0680e04619d0c44bb4afb26373e54b829d934.id.png)
![Menyesuaikan pengaturan ekstensi](../../../../translated_images/extension-settings.21c752ae4f4cdb78.id.png)
**Hal-hal umum yang mungkin ingin Anda sesuaikan:**
- Bagaimana kode Anda diformat (tab vs spasi, panjang baris, dll.)

@ -78,7 +78,7 @@ Karena VSCode.dev membutuhkan setidaknya satu file untuk membuka repositori, kit
4. **Tulis** pesan commit: "Tambahkan struktur HTML awal"
5. **Klik** "Commit new file" untuk menyimpan perubahan Anda
![Membuat file awal di GitHub](../../../../translated_images/new-file-github.com.c886796d800e8056561829a181be1382c5303da9d902d8b2dd82b68a4806e21f.id.png)
![Membuat file awal di GitHub](../../../../translated_images/new-file-github.com.c886796d800e8056.id.png)
**Apa yang dicapai oleh pengaturan awal ini:**
- **Membangun** struktur dokumen HTML5 yang tepat dengan elemen semantik
@ -104,7 +104,7 @@ Setelah fondasi repositori Anda dibuat, mari beralih ke VSCode.dev untuk pekerja
**Indikator keberhasilan**: Anda akan melihat file proyek Anda di sidebar Explorer dan `index.html` tersedia untuk diedit di area editor utama.
![Proyek dimuat di VSCode.dev](../../../../translated_images/project-on-vscode.dev.e79815a9a95ee7feac72ebe5c941c91279716be37c575dbdbf2f43bea2c7d8b6.id.png)
![Proyek dimuat di VSCode.dev](../../../../translated_images/project-on-vscode.dev.e79815a9a95ee7fe.id.png)
**Apa yang akan Anda lihat di antarmuka:**
- **Sidebar Explorer**: **Menampilkan** file dan struktur folder repositori Anda
@ -448,7 +448,7 @@ Ekstensi meningkatkan pengalaman pengembangan Anda dengan menyediakan kemampuan
**Hasil langsung setelah instalasi:**
Setelah CodeSwing diinstal, Anda akan melihat preview langsung dari website resume Anda muncul di editor. Ini memungkinkan Anda melihat dengan tepat bagaimana tampilan situs Anda saat Anda membuat perubahan.
![Ekstensi CodeSwing menampilkan preview langsung](../../../../translated_images/after-codeswing-extension-pb.0ebddddcf73b550994947a9084e35e2836c713ae13839d49628e3c764c1cfe83.id.png)
![Ekstensi CodeSwing menampilkan preview langsung](../../../../translated_images/after-codeswing-extension-pb.0ebddddcf73b5509.id.png)
**Memahami antarmuka yang ditingkatkan:**
- **Tampilan terpisah**: **Menampilkan** kode Anda di satu sisi dan preview langsung di sisi lain

@ -61,7 +61,7 @@ print(response.choices[0].message.content)
Berikut adalah tampilan proyek akhir Anda:
![Antarmuka aplikasi chat yang menunjukkan percakapan antara pengguna dan asisten AI](../../../translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.id.png)
![Antarmuka aplikasi chat yang menunjukkan percakapan antara pengguna dan asisten AI](../../../translated_images/screenshot.0a1ee0d123df681b.id.png)
## 🗺️ Perjalanan Belajar Anda Melalui Pengembangan Aplikasi AI
@ -194,7 +194,7 @@ mindmap
**Prinsip Inti**: Pengembangan aplikasi AI menggabungkan keterampilan pengembangan web tradisional dengan integrasi layanan AI, menciptakan aplikasi cerdas yang terasa alami dan responsif bagi pengguna.
![Antarmuka GitHub Models AI Playground dengan pilihan model dan area pengujian](../../../translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.id.png)
![Antarmuka GitHub Models AI Playground dengan pilihan model dan area pengujian](../../../translated_images/playground.d2b927122224ff8f.id.png)
**Inilah yang membuat playground sangat berguna:**
- **Coba** berbagai model AI seperti GPT-4o-mini, Claude, dan lainnya (semuanya gratis!)
@ -204,7 +204,7 @@ mindmap
Setelah Anda mencoba-coba sedikit, cukup klik tab "Code" dan pilih bahasa pemrograman Anda untuk mendapatkan kode implementasi yang Anda butuhkan.
![Pilihan playground menunjukkan opsi pembuatan kode untuk berbagai bahasa pemrograman](../../../translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.id.png)
![Pilihan playground menunjukkan opsi pembuatan kode untuk berbagai bahasa pemrograman](../../../translated_images/playground-choice.1d23ba7d407f4758.id.png)
## Menyiapkan Integrasi Backend Python
@ -2365,14 +2365,14 @@ Ingin mencoba proyek ini di lingkungan pengembangan cloud? GitHub Codespaces men
- **Arahkan** ke [repository Web Dev For Beginners](https://github.com/microsoft/Web-Dev-For-Beginners)
- **Klik** "Use this template" di sudut kanan atas (pastikan Anda sudah masuk ke GitHub)
![Antarmuka pembuatan dari template yang menunjukkan tombol hijau "Use this template"](../../../translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.id.png)
![Antarmuka pembuatan dari template yang menunjukkan tombol hijau "Use this template"](../../../translated_images/template.67ad477109d29a2b.id.png)
**Langkah 2: Luncurkan Codespaces**
- **Buka** repository yang baru Anda buat
- **Klik** tombol hijau "Code" dan pilih "Codespaces"
- **Pilih** "Create codespace on main" untuk memulai lingkungan pengembangan Anda
![Antarmuka pembuatan codespace dengan opsi untuk meluncurkan lingkungan pengembangan cloud](../../../translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.id.png)
![Antarmuka pembuatan codespace dengan opsi untuk meluncurkan lingkungan pengembangan cloud](../../../translated_images/codespace.bcecbdf5d2747d3d.id.png)
**Langkah 3: Konfigurasi Lingkungan**
Setelah Codespace Anda dimuat, Anda akan memiliki akses ke:

@ -1,130 +1,144 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "caff943951276a4459a687166f3dfae2",
"translation_date": "2025-12-19T10:24:23+00:00",
"original_hash": "fea3a0fceb8ad86fd640c09cf63a2aac",
"translation_date": "2026-01-07T01:09:39+00:00",
"source_file": "README.md",
"language_code": "id"
}
-->
[![Lisensi GitHub](https://img.shields.io/github/license/microsoft/Web-Dev-For-Beginners.svg)](https://github.com/microsoft/Web-Dev-For-Beginners/blob/master/LICENSE)
[![Kontributor GitHub](https://img.shields.io/github/contributors/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/graphs/contributors/)
[![Masalah GitHub](https://img.shields.io/github/issues/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/issues/)
[![Permintaan Tarik GitHub](https://img.shields.io/github/issues-pr/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub license](https://img.shields.io/github/license/microsoft/Web-Dev-For-Beginners.svg)](https://github.com/microsoft/Web-Dev-For-Beginners/blob/master/LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/issues/)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![Pengamat GitHub](https://img.shields.io/github/watchers/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Watch&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/watchers/)
[![Fork GitHub](https://img.shields.io/github/forks/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/network/)
[![Bintang GitHub](https://img.shields.io/github/stars/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/stargazers/)
[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Watch&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/watchers/)
[![GitHub forks](https://img.shields.io/github/forks/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/network/)
[![GitHub stars](https://img.shields.io/github/stars/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/stargazers/)
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
# Pengembangan Web untuk Pemula - Kurikulum
Pelajari dasar-dasar pengembangan web dengan kursus komprehensif selama 12 minggu dari Microsoft Cloud Advocates. Setiap dari 24 pelajaran mendalami JavaScript, CSS, dan HTML melalui proyek langsung seperti terarium, ekstensi browser, dan permainan luar angkasa. Terlibat dengan kuis, diskusi, dan tugas praktis. Tingkatkan keterampilan Anda dan optimalkan retensi pengetahuan Anda dengan pedagogi berbasis proyek yang efektif. Mulailah perjalanan coding Anda hari ini!
Bergabunglah dengan Komunitas Discord Azure AI Foundry
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
Ikuti langkah-langkah ini untuk memulai menggunakan sumber daya ini:
1. **Fork Repository**: Klik [![GitHub forks](https://img.shields.io/github/forks/microsoft/Web-Dev-For-beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/fork)
2. **Klon Repository**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
3. [**Bergabunglah dengan Azure AI Foundry Discord dan temui ahli serta pengembang lainnya**](https://discord.com/invite/ByRwuEEgH4)
# Pengembangan Web untuk Pemula - Kurikulum
### 🌐 Dukungan Multi-Bahasa
Pelajari dasar-dasar pengembangan web dengan kursus 12 minggu yang komprehensif dari Microsoft Cloud Advocates. Setiap dari 24 pelajaran membahas JavaScript, CSS, dan HTML melalui proyek langsung seperti terrarium, ekstensi browser, dan permainan luar angkasa. Ikuti kuis, diskusi, dan tugas praktis. Tingkatkan keterampilan Anda dan optimalkan pemahaman Anda dengan pendekatan pembelajaran berbasis proyek kami yang efektif. Mulailah perjalanan coding Anda hari ini!
#### Didukung melalui GitHub Action (Otomatis & Selalu Terbaru)
Bergabunglah dengan Komunitas Discord Azure AI Foundry
<!-- CO-OP TRANSLATOR LANGUAGES TABLE START -->
[Arab](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgaria](../bg/README.md) | [Burma (Myanmar)](../my/README.md) | [Cina (Sederhana)](../zh/README.md) | [Cina (Tradisional, Hong Kong)](../hk/README.md) | [Cina (Tradisional, Macau)](../mo/README.md) | [Cina (Tradisional, Taiwan)](../tw/README.md) | [Kroasia](../hr/README.md) | [Ceko](../cs/README.md) | [Denmark](../da/README.md) | [Belanda](../nl/README.md) | [Estonia](../et/README.md) | [Finlandia](../fi/README.md) | [Perancis](../fr/README.md) | [Jerman](../de/README.md) | [Yunani](../el/README.md) | [Ibrani](../he/README.md) | [Hindi](../hi/README.md) | [Hongaria](../hu/README.md) | [Indonesia](./README.md) | [Italia](../it/README.md) | [Jepang](../ja/README.md) | [Kannada](../kn/README.md) | [Korea](../ko/README.md) | [Lituania](../lt/README.md) | [Melayu](../ms/README.md) | [Malayalam](../ml/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Pidgin Nigeria](../pcm/README.md) | [Norwegia](../no/README.md) | [Persia (Farsi)](../fa/README.md) | [Polandia](../pl/README.md) | [Portugis (Brasil)](../br/README.md) | [Portugis (Portugal)](../pt/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Rumania](../ro/README.md) | [Rusia](../ru/README.md) | [Serbia (Sirilik)](../sr/README.md) | [Slowakia](../sk/README.md) | [Slovenia](../sl/README.md) | [Spanyol](../es/README.md) | [Swahili](../sw/README.md) | [Swedia](../sv/README.md) | [Tagalog (Filipina)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turki](../tr/README.md) | [Ukraina](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnam](../vi/README.md)
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
> **Lebih Suka Kloning Lokal?**
Ikuti langkah-langkah ini untuk mulai menggunakan sumber daya ini:
1. **Fork Repositori**: Klik [![Fork GitHub](https://img.shields.io/github/forks/microsoft/Web-Dev-For-beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/fork)
2. **Clone Repositori**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
3. [**Bergabunglah dengan Azure AI Foundry Discord dan temui para ahli serta pengembang lainnya**](https://discord.com/invite/ByRwuEEgH4)
> Repository ini memiliki lebih dari 50 terjemahan bahasa yang secara signifikan meningkatkan ukuran unduhan. Untuk mengkloning tanpa terjemahan, gunakan sparse checkout:
> ```bash
> git clone --filter=blob:none --sparse https://github.com/microsoft/Web-Dev-For-Beginners.git
> cd Web-Dev-For-Beginners
> git sparse-checkout set --no-cone '/*' '!translations' '!translated_images'
> ```
> Ini memberi Anda semua yang Anda butuhkan untuk menyelesaikan kursus dengan unduhan yang jauh lebih cepat.
<!-- CO-OP TRANSLATOR LANGUAGES TABLE END -->
### 🌐 Dukungan Multi-Bahasa
**Jika Anda ingin mendukung bahasa tambahan, daftar bahasa yang didukung tersedia [di sini](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
#### Didukung melalui GitHub Action (Otomatis & Selalu Terbaru)
[![Buka di Visual Studio Code](https://img.shields.io/static/v1?logo=visualstudiocode&label=&message=Open%20in%20Visual%20Studio%20Code&labelColor=2c2c32&color=007acc&logoColor=007acc)](https://open.vscode.dev/microsoft/Web-Dev-For-Beginners)
<!-- CO-OP TRANSLATOR LANGUAGES TABLE START -->
[Arab](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgaria](../bg/README.md) | [Burma (Myanmar)](../my/README.md) | [Cina (Sederhana)](../zh/README.md) | [Cina (Tradisional, Hong Kong)](../hk/README.md) | [Cina (Tradisional, Makau)](../mo/README.md) | [Cina (Tradisional, Taiwan)](../tw/README.md) | [Kroasia](../hr/README.md) | [Ceko](../cs/README.md) | [Denmark](../da/README.md) | [Belanda](../nl/README.md) | [Estonia](../et/README.md) | [Finlandia](../fi/README.md) | [Prancis](../fr/README.md) | [Jerman](../de/README.md) | [Yunani](../el/README.md) | [Ibrani](../he/README.md) | [Hindi](../hi/README.md) | [Hungaria](../hu/README.md) | [Indonesia](./README.md) | [Italia](../it/README.md) | [Jepang](../ja/README.md) | [Korea](../ko/README.md) | [Lituania](../lt/README.md) | [Melayu](../ms/README.md) | [Marathi](../mr/README.md) | [Nepal](../ne/README.md) | [Norwegia](../no/README.md) | [Persia (Farsi)](../fa/README.md) | [Polandia](../pl/README.md) | [Portugis (Brasil)](../br/README.md) | [Portugis (Portugal)](../pt/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Rumania](../ro/README.md) | [Rusia](../ru/README.md) | [Serbia (Kiril)](../sr/README.md) | [Slovakia](../sk/README.md) | [Slovenia](../sl/README.md) | [Spanyol](../es/README.md) | [Swahili](../sw/README.md) | [Swedia](../sv/README.md) | [Tagalog (Filipina)](../tl/README.md) | [Tamil](../ta/README.md) | [Thailand](../th/README.md) | [Turki](../tr/README.md) | [Ukraina](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnam](../vi/README.md)
<!-- CO-OP TRANSLATOR LANGUAGES TABLE END -->
#### 🧑‍🎓 _Apakah Anda seorang pelajar?_
**Jika Anda ingin menambahkan bahasa terjemahan lainnya, daftar bahasa yang didukung tersedia [di sini](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
Kunjungi [**halaman Student Hub**](https://docs.microsoft.com/learn/student-hub/?WT.mc_id=academic-77807-sagibbon) di mana Anda akan menemukan sumber daya pemula, paket pelajar, dan bahkan cara mendapatkan voucher sertifikat gratis. Ini adalah halaman yang ingin Anda tandai dan periksa dari waktu ke waktu karena kami mengganti konten setiap bulan.
[![Buka di Visual Studio Code](https://img.shields.io/static/v1?logo=visualstudiocode&label=&message=Open%20in%20Visual%20Studio%20Code&labelColor=2c2c32&color=007acc&logoColor=007acc)](https://open.vscode.dev/microsoft/Web-Dev-For-Beginners)
### 📣 Pengumuman - Tantangan mode GitHub Copilot Agent baru untuk diselesaikan!
#### 🧑‍🎓 _Apakah Anda seorang pelajar?_
Tantangan Baru ditambahkan, cari "GitHub Copilot Agent Challenge 🚀" di sebagian besar bab. Itu adalah tantangan baru bagi Anda untuk diselesaikan menggunakan GitHub Copilot dan mode Agent. Jika Anda belum pernah menggunakan mode Agent sebelumnya, mode ini mampu tidak hanya menghasilkan teks tetapi juga membuat dan mengedit file, menjalankan perintah, dan banyak lagi.
Kunjungi [**Halaman Student Hub**](https://docs.microsoft.com/learn/student-hub/?WT.mc_id=academic-77807-sagibbon) di mana Anda akan menemukan sumber daya untuk pemula, paket pelajar, dan bahkan cara mendapatkan voucher sertifikat gratis. Halaman ini adalah yang perlu Anda tandai dan periksa dari waktu ke waktu karena kontennya diperbarui setiap bulan.
### 📣 Pengumuman - _Proyek Baru untuk dibangun menggunakan Generative AI_
### 📣 Pengumuman - Tantangan mode Agen GitHub Copilot baru untuk diselesaikan!
Proyek AI Assistant baru saja ditambahkan, lihat [proyek](./9-chat-project/README.md)
Tantangan baru ditambahkan, cari "Tantangan Agen GitHub Copilot 🚀" di sebagian besar bab. Ini adalah tantangan baru untuk Anda selesaikan menggunakan GitHub Copilot dan mode Agen. Jika Anda belum pernah menggunakan mode Agen sebelumnya, mode ini mampu tidak hanya menghasilkan teks tetapi juga membuat dan mengedit file, menjalankan perintah, dan banyak lagi.
### 📣 Pengumuman - _Kurikulum Baru_ tentang Generative AI untuk JavaScript baru saja dirilis
### 📣 Pengumuman - _Proyek Baru untuk Dibangun menggunakan Generative AI_
Jangan lewatkan kurikulum Generative AI baru kami!
Proyek Asisten AI baru saja ditambahkan, cek [proyek](./09-chat-project/README.md)
Kunjungi [https://aka.ms/genai-js-course](https://aka.ms/genai-js-course) untuk memulai!
### 📣 Pengumuman - _Kurikulum Baru_ tentang Generative AI untuk JavaScript baru saja dirilis
![Latar Belakang](../../translated_images/background.148a8d43afde5730.id.png)
Jangan lewatkan kurikulum Generative AI baru kami!
- Pelajaran mencakup segala sesuatu dari dasar hingga RAG.
- Berinteraksilah dengan karakter sejarah menggunakan GenAI dan aplikasi pendamping kami.
- Narasi yang menyenangkan dan menarik, Anda akan melakukan perjalanan waktu!
Kunjungi [https://aka.ms/genai-js-course](https://aka.ms/genai-js-course) untuk memulai!
![karakter](../../translated_images/character.5c0dd8e067ffd693.id.png)
![Latar Belakang](../../translated_images/background.148a8d43afde57303419a663f50daf586681bc2fabf833f66ef6954073983c66.id.png)
- Pelajaran mencakup segalanya dari dasar hingga RAG.
- Berinteraksi dengan tokoh sejarah menggunakan GenAI dan aplikasi pendamping kami.
- Narasi yang menyenangkan dan menarik, Anda akan melakukan perjalanan waktu!
Setiap pelajaran mencakup tugas untuk diselesaikan, pemeriksaan pengetahuan, dan tantangan untuk membimbing Anda mempelajari topik seperti:
- Prompting dan rekayasa prompt
- Pembuatan aplikasi teks dan gambar
- Aplikasi pencarian
![Karakter](../../translated_images/character.5c0dd8e067ffd693c16e2c5b7412ab075a2215ce31f998305639fa3a05e14fbe.id.png)
Kunjungi [https://aka.ms/genai-js-course](../../[https:/aka.ms/genai-js-course) untuk memulai!
Setiap pelajaran mencakup tugas untuk diselesaikan, pemeriksaan pengetahuan, dan tantangan untuk memandu Anda mempelajari topik seperti:
- Prompting dan rekayasa prompt
- Pembuatan aplikasi teks dan gambar
- Aplikasi pencarian
Kunjungi [https://aka.ms/genai-js-course](https://aka.ms/genai-js-course) untuk memulai!
## 🌱 Memulai
## 🌱 Memulai
> **Guru**, kami telah [menyertakan beberapa saran](for-teachers.md) tentang cara menggunakan kurikulum ini. Kami akan senang mendengar umpan balik Anda [di forum diskusi kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions/categories/teacher-corner)!
> **Guru**, kami telah [menyertakan beberapa saran](for-teachers.md) tentang cara menggunakan kurikulum ini. Kami ingin mendengar umpan balik Anda [di forum diskusi kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions/categories/teacher-corner)!
**[Pelajar](https://aka.ms/student-page/?WT.mc_id=academic-77807-sagibbon)**, untuk setiap pelajaran, mulailah dengan kuis pra-kuliah dan lanjutkan dengan membaca materi kuliah, menyelesaikan berbagai aktivitas, dan periksa pemahaman Anda dengan kuis pasca-kuliah.
**[Pelajar](https://aka.ms/student-page/?WT.mc_id=academic-77807-sagibbon)**, untuk setiap pelajaran, mulai dengan kuis pra-ceramah dan ikuti dengan membaca materi ceramah, menyelesaikan berbagai aktivitas, dan periksa pemahaman Anda dengan kuis pasca-ceramah.
Untuk meningkatkan pengalaman belajar Anda, hubungkan dengan teman-teman Anda untuk mengerjakan proyek bersama! Diskusi sangat dianjurkan di [forum diskusi kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions) di mana tim moderator kami akan tersedia untuk menjawab pertanyaan Anda.
Untuk meningkatkan pengalaman belajar Anda, hubungkan dengan rekan Anda untuk mengerjakan proyek bersama! Diskusi sangat dianjurkan di [forum diskusi kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions) di mana tim moderator kami akan siap menjawab pertanyaan Anda.
Untuk melanjutkan pendidikan Anda, kami sangat merekomendasikan menjelajahi [Microsoft Learn](https://learn.microsoft.com/users/wirelesslife/collections/p1ddcy5jwy0jkm?WT.mc_id=academic-77807-sagibbon) untuk bahan belajar tambahan.
Untuk memperdalam pendidikan Anda, kami sangat merekomendasikan menjelajahi [Microsoft Learn](https://learn.microsoft.com/users/wirelesslife/collections/p1ddcy5jwy0jkm?WT.mc_id=academic-77807-sagibbon) untuk materi studi tambahan.
### 📋 Menyiapkan lingkungan Anda
### 📋 Menyiapkan lingkungan Anda
Kurikulum ini memiliki lingkungan pengembangan yang siap digunakan! Saat Anda memulai, Anda dapat memilih untuk menjalankan kurikulum di [Codespace](https://github.com/features/codespaces/) (_lingkungan berbasis browser, tidak perlu instalasi_), atau secara lokal di komputer Anda menggunakan editor teks seperti [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
Kurikulum ini memiliki lingkungan pengembangan yang siap digunakan! Saat Anda memulai, Anda dapat memilih menjalankan kurikulum dalam [Codespace](https://github.com/features/codespaces/) (_lingkungan berbasis browser tanpa perlu instalasi_), atau secara lokal di komputer Anda menggunakan editor teks seperti [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
#### Buat repositori Anda
Agar Anda dapat dengan mudah menyimpan pekerjaan Anda, disarankan untuk membuat salinan repositori ini. Anda dapat melakukannya dengan mengklik tombol **Use this template** di bagian atas halaman. Ini akan membuat repositori baru di akun GitHub Anda dengan salinan kurikulum.
#### Buat repository Anda
Agar Anda mudah menyimpan pekerjaan Anda, disarankan agar Anda membuat salinan repository ini sendiri. Anda dapat melakukannya dengan mengklik tombol **Use this template** di bagian atas halaman. Ini akan membuat repository baru di akun GitHub Anda dengan salinan kurikulum.
Ikuti langkah-langkah ini:
1. **Fork Repositori**: Klik tombol "Fork" di sudut kanan atas halaman ini.
2. **Clone Repositori**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
Ikuti langkah-langkah ini:
1. **Fork Repository**: Klik tombol "Fork" di sudut kanan atas halaman ini.
2. **Klon Repository**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
#### Menjalankan kurikulum di Codespace
#### Menjalankan kurikulum di Codespace
Di salinan repositori Anda yang telah dibuat, klik tombol **Code** dan pilih **Open with Codespaces**. Ini akan membuat Codespace baru untuk Anda bekerja.
Dalam salinan repository ini yang Anda buat, klik tombol **Code** dan pilih **Open with Codespaces**. Ini akan membuat Codespace baru untuk Anda bekerja di dalamnya.
![Codespace](../../translated_images/createcodespace.0238bbf4d7a8d955fa8fa7f7b6602a3cb6499a24708fbee589f83211c5a613b7.id.png)
![Codespace](../../translated_images/createcodespace.0238bbf4d7a8d955.id.png)
#### Menjalankan kurikulum secara lokal di komputer Anda
#### Menjalankan kurikulum secara lokal di komputer Anda
Untuk menjalankan kurikulum ini secara lokal di komputer Anda, Anda memerlukan editor teks, browser, dan alat baris perintah. Pelajaran pertama kami, [Pengenalan Bahasa Pemrograman dan Alat yang Digunakan](../../1-getting-started-lessons/1-intro-to-programming-languages), akan memandu Anda melalui berbagai opsi untuk setiap alat ini agar Anda dapat memilih yang paling sesuai untuk Anda.
Untuk menjalankan kurikulum ini secara lokal di komputer Anda, Anda memerlukan editor teks, browser, dan alat baris perintah. Pelajaran pertama kami, [Pendahuluan tentang Bahasa Pemrograman dan Alat-Alat Dagang](../../1-getting-started-lessons/1-intro-to-programming-languages), akan memandu Anda melalui berbagai opsi untuk masing-masing alat ini agar Anda dapat memilih yang paling cocok untuk Anda.
Rekomendasi kami adalah menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) sebagai editor Anda, yang juga memiliki [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) bawaan. Anda dapat mengunduh Visual Studio Code [di sini](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
Rekomendasi kami adalah menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) sebagai editor Anda, yang juga memiliki [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) bawaan. Anda dapat mengunduh Visual Studio Code [di sini](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
1. Clone repositori Anda ke komputer Anda. Anda dapat melakukannya dengan mengklik tombol **Code** dan menyalin URL:
[CodeSpace](./images/createcodespace.png)
1. Klon repository Anda ke komputer Anda. Anda dapat melakukannya dengan mengklik tombol **Code** dan menyalin URL:
Kemudian, buka [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) di dalam [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) dan jalankan perintah berikut, mengganti `<your-repository-url>` dengan URL yang baru saja Anda salin:
[CodeSpace](./images/createcodespace.png)
Kemudian, buka [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) di dalam [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) dan jalankan perintah berikut, ganti `<your-repository-url>` dengan URL yang baru saja Anda salin:
```bash
git clone <your-repository-url>
```
2. Buka folder di Visual Studio Code. Anda dapat melakukannya dengan mengklik **File** > **Open Folder** dan memilih folder yang baru saja Anda clone.
> Rekomendasi ekstensi Visual Studio Code:
>
> * [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) - untuk melihat pratinjau halaman HTML di dalam Visual Studio Code
2. Buka folder di Visual Studio Code. Anda dapat melakukannya dengan mengklik **File** > **Open Folder** dan memilih folder yang baru saja Anda kloning.
> Ekstensi Visual Studio Code yang direkomendasikan:
>
> * [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) - untuk pratinjau halaman HTML di dalam Visual Studio Code
> * [Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot&WT.mc_id=academic-77807-sagibbon) - untuk membantu Anda menulis kode lebih cepat
## 📂 Setiap pelajaran mencakup:
@ -133,45 +147,45 @@ Rekomendasi kami adalah menggunakan [Visual Studio Code](https://code.visualstud
- video tambahan opsional
- kuis pemanasan sebelum pelajaran
- pelajaran tertulis
- untuk pelajaran berbasis proyek, panduan langkah demi langkah tentang cara membangun proyek
- untuk pelajaran berbasis proyek, panduan langkah demi langkah untuk membangun proyek
- pemeriksaan pengetahuan
- tantangan
- bacaan tambahan
- tugas
- [kuis setelah pelajaran](https://ff-quizzes.netlify.app/web/)
- [kuis pasca pelajaran](https://ff-quizzes.netlify.app/web/)
> **Catatan tentang kuis**: Semua kuis terdapat di folder Quiz-app, total 48 kuis dengan masing-masing tiga pertanyaan. Kuis tersedia [di sini](https://ff-quizzes.netlify.app/web/) dan aplikasi kuis dapat dijalankan secara lokal atau di-deploy ke Azure; ikuti instruksi di folder `quiz-app`.
> **Catatan tentang kuis**: Semua kuis terdapat dalam folder Quiz-app, total 48 kuis dengan tiga pertanyaan masing-masing. Kuis tersedia [di sini](https://ff-quizzes.netlify.app/web/) aplikasi kuis dapat dijalankan secara lokal atau diterapkan ke Azure; ikuti instruksi di folder `quiz-app`.
## 🗃️ Pelajaran
| | Nama Proyek | Konsep yang Diajarkan | Tujuan Pembelajaran | Tautan Pelajaran | Penulis |
| :-: | :------------------------------------------------------: | :--------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------: | :----------------------: |
| 01 | Memulai | Pengantar Pemrograman dan Alat yang Digunakan | Pelajari dasar-dasar di balik sebagian besar bahasa pemrograman dan perangkat lunak yang membantu pengembang profesional bekerja | [Pengantar Bahasa Pemrograman dan Alat yang Digunakan](./1-getting-started-lessons/1-intro-to-programming-languages/README.md) | Jasmine |
| 02 | Memulai | Dasar-dasar GitHub, termasuk bekerja dalam tim | Cara menggunakan GitHub dalam proyek Anda, cara berkolaborasi dengan orang lain pada basis kode | [Pengantar GitHub](./1-getting-started-lessons/2-github-basics/README.md) | Floor |
| 03 | Memulai | Aksesibilitas | Pelajari dasar-dasar aksesibilitas web | [Dasar-dasar Aksesibilitas](./1-getting-started-lessons/3-accessibility/README.md) | Christopher |
| 04 | Dasar JS | Tipe Data JavaScript | Dasar-dasar tipe data JavaScript | [Tipe Data](./2-js-basics/1-data-types/README.md) | Jasmine |
| 05 | Dasar JS | Fungsi dan Metode | Pelajari tentang fungsi dan metode untuk mengelola alur logika aplikasi | [Fungsi dan Metode](./2-js-basics/2-functions-methods/README.md) | Jasmine dan Christopher |
| 06 | Dasar JS | Membuat Keputusan dengan JS | Pelajari cara membuat kondisi dalam kode Anda menggunakan metode pengambilan keputusan | [Membuat Keputusan](./2-js-basics/3-making-decisions/README.md) | Jasmine |
| 07 | Dasar JS | Array dan Loop | Bekerja dengan data menggunakan array dan loop di JavaScript | [Array dan Loop](./2-js-basics/4-arrays-loops/README.md) | Jasmine |
| 08 | [Terrarium](./3-terrarium/solution/README.md) | HTML dalam Praktik | Bangun HTML untuk membuat terrarium online, dengan fokus pada membangun tata letak | [Pengantar HTML](./3-terrarium/1-intro-to-html/README.md) | Jen |
| 09 | [Terrarium](./3-terrarium/solution/README.md) | CSS dalam Praktik | Bangun CSS untuk menata terrarium online, dengan fokus pada dasar-dasar CSS termasuk membuat halaman responsif | [Pengantar CSS](./3-terrarium/2-intro-to-css/README.md) | Jen |
| 10 | [Terrarium](./3-terrarium/solution/README.md) | Penutupan JavaScript, manipulasi DOM | Bangun JavaScript untuk membuat terrarium berfungsi sebagai antarmuka seret/lepas, dengan fokus pada penutupan dan manipulasi DOM | [Penutupan JavaScript, manipulasi DOM](./3-terrarium/3-intro-to-DOM-and-closures/README.md) | Jen |
| 11 | [Typing Game](./4-typing-game/solution/README.md) | Membangun Game Mengetik | Pelajari cara menggunakan peristiwa keyboard untuk menggerakkan logika aplikasi JavaScript Anda | [Pemrograman Berbasis Peristiwa](./4-typing-game/typing-game/README.md) | Christopher |
| 12 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Bekerja dengan Browser | Pelajari cara kerja browser, sejarahnya, dan cara membuat elemen pertama dari ekstensi browser | [Tentang Browser](./5-browser-extension/1-about-browsers/README.md) | Jen |
| 13 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Membangun formulir, memanggil API, dan menyimpan variabel di penyimpanan lokal | Bangun elemen JavaScript dari ekstensi browser Anda untuk memanggil API menggunakan variabel yang disimpan di penyimpanan lokal | [API, Formulir, dan Penyimpanan Lokal](./5-browser-extension/2-forms-browsers-local-storage/README.md) | Jen |
| 14 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Proses latar belakang di browser, kinerja web | Gunakan proses latar belakang browser untuk mengelola ikon ekstensi; pelajari tentang kinerja web dan beberapa optimasi untuk meningkatkan | [Tugas Latar Belakang dan Kinerja](./5-browser-extension/3-background-tasks-and-performance/README.md) | Jen |
| 15 | [Space Game](./6-space-game/solution/README.md) | Pengembangan Game Lanjutan dengan JavaScript | Pelajari tentang Pewarisan menggunakan Kelas dan Komposisi serta pola Pub/Sub, sebagai persiapan untuk membangun game | [Pengantar Pengembangan Game Lanjutan](./6-space-game/1-introduction/README.md) | Chris |
| 16 | [Space Game](./6-space-game/solution/README.md) | Menggambar ke kanvas | Pelajari tentang API Kanvas, yang digunakan untuk menggambar elemen ke layar | [Menggambar ke Kanvas](./6-space-game/2-drawing-to-canvas/README.md) | Chris |
| 17 | [Space Game](./6-space-game/solution/README.md) | Memindahkan elemen di layar | Temukan cara elemen dapat bergerak menggunakan koordinat kartesian dan API Kanvas | [Memindahkan Elemen](./6-space-game/3-moving-elements-around/README.md) | Chris |
| 18 | [Space Game](./6-space-game/solution/README.md) | Deteksi tabrakan | Buat elemen bertabrakan dan bereaksi satu sama lain menggunakan penekanan tombol dan sediakan fungsi cooldown untuk memastikan kinerja game | [Deteksi Tabrakan](./6-space-game/4-collision-detection/README.md) | Chris |
| 19 | [Space Game](./6-space-game/solution/README.md) | Menjaga skor | Lakukan perhitungan matematika berdasarkan status dan kinerja game | [Menjaga Skor](./6-space-game/5-keeping-score/README.md) | Chris |
| 20 | [Space Game](./6-space-game/solution/README.md) | Mengakhiri dan memulai ulang game | Pelajari tentang mengakhiri dan memulai ulang game, termasuk membersihkan aset dan mengatur ulang nilai variabel | [Kondisi Akhir](./6-space-game/6-end-condition/README.md) | Chris |
| 21 | [Banking App](./7-bank-project/solution/README.md) | Template HTML dan Rute dalam Aplikasi Web | Pelajari cara membuat kerangka arsitektur situs web multipage menggunakan routing dan template HTML | [Template HTML dan Rute](./7-bank-project/1-template-route/README.md) | Yohan |
| 22 | [Banking App](./7-bank-project/solution/README.md) | Membangun Formulir Login dan Registrasi | Pelajari tentang membangun formulir dan menangani rutinitas validasi | [Formulir](./7-bank-project/2-forms/README.md) | Yohan |
| 23 | [Banking App](./7-bank-project/solution/README.md) | Metode Mengambil dan Menggunakan Data | Bagaimana data mengalir masuk dan keluar dari aplikasi Anda, cara mengambilnya, menyimpannya, dan membuangnya | [Data](./7-bank-project/3-data/README.md) | Yohan |
| 24 | [Banking App](./7-bank-project/solution/README.md) | Konsep Manajemen Status | Pelajari cara aplikasi Anda mempertahankan status dan cara mengelolanya secara programatik | [Manajemen Status](./7-bank-project/4-state-management/README.md) | Yohan |
| 25 | [Browser/VScode Code](../../8-code-editor) | Bekerja dengan VScode | Pelajari cara menggunakan editor kode | [Gunakan Editor Kode VScode](./8-code-editor/1-using-a-code-editor/README.md) | Chris |
| 26 | [AI Assistants](./9-chat-project/README.md) | Bekerja dengan AI | Pelajari cara membangun asisten AI Anda sendiri | [Proyek Asisten AI](./9-chat-project/README.md) | Chris |
| | Nama Proyek | Konsep yang Diajarkan | Tujuan Pembelajaran | Pelajaran Terkait | Penulis |
| :-: | :------------------------------------------------------: | :--------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------: |
| 01 | Memulai | Pengantar Pemrograman dan Alat Kerja | Pelajari dasar-dasar yang mendasari sebagian besar bahasa pemrograman dan perangkat lunak yang membantu pengembang profesional melakukan pekerjaannya | [Intro to Programming Languages and Tools of the Trade](./1-getting-started-lessons/1-intro-to-programming-languages/README.md) | Jasmine |
| 02 | Memulai | Dasar-dasar GitHub, termasuk bekerja dengan tim | Cara menggunakan GitHub dalam proyek Anda, cara berkolaborasi dengan orang lain pada basis kode | [Intro to GitHub](./1-getting-started-lessons/2-github-basics/README.md) | Floor |
| 03 | Memulai | Aksesibilitas | Pelajari dasar-dasar aksesibilitas web | [Accessibility Fundamentals](./1-getting-started-lessons/3-accessibility/README.md) | Christopher |
| 04 | Dasar JS | Tipe Data JavaScript | Dasar-dasar tipe data JavaScript | [Data Types](./2-js-basics/1-data-types/README.md) | Jasmine |
| 05 | Dasar JS | Fungsi dan Metode | Pelajari tentang fungsi dan metode untuk mengelola alur logika aplikasi | [Functions and Methods](./2-js-basics/2-functions-methods/README.md) | Jasmine dan Christopher |
| 06 | Dasar JS | Membuat Keputusan dengan JS | Pelajari cara membuat kondisi dalam kode Anda menggunakan metode pengambilan keputusan | [Making Decisions](./2-js-basics/3-making-decisions/README.md) | Jasmine |
| 07 | Dasar JS | Array dan Loop | Bekerja dengan data menggunakan array dan loop dalam JavaScript | [Arrays and Loops](./2-js-basics/4-arrays-loops/README.md) | Jasmine |
| 08 | [Terrarium](./3-terrarium/solution/README.md) | HTML dalam Praktek | Bangun HTML untuk membuat terrarium online, fokus pada membangun tata letak | [Introduction to HTML](./3-terrarium/1-intro-to-html/README.md) | Jen |
| 09 | [Terrarium](./3-terrarium/solution/README.md) | CSS dalam Praktek | Bangun CSS untuk memformat terrarium online, fokus pada dasar-dasar CSS termasuk membuat halaman responsif | [Introduction to CSS](./3-terrarium/2-intro-to-css/README.md) | Jen |
| 10 | [Terrarium](./3-terrarium/solution/README.md) | Penutupan JavaScript, manipulasi DOM | Bangun JavaScript untuk membuat terrarium berfungsi sebagai antarmuka seret/jatuh, fokus pada closures dan manipulasi DOM | [JavaScript Closures, DOM manipulation](./3-terrarium/3-intro-to-DOM-and-closures/README.md) | Jen |
| 11 | [Typing Game](./4-typing-game/solution/README.md) | Membuat Game Mengetik | Pelajari cara menggunakan event keyboard untuk menggerakkan logika aplikasi JavaScript Anda | [Event-Driven Programming](./4-typing-game/typing-game/README.md) | Christopher |
| 12 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Bekerja dengan Browser | Pelajari cara kerja browser, sejarahnya, dan cara membuat kerangka elemen pertama ekstensi browser | [About Browsers](./5-browser-extension/1-about-browsers/README.md) | Jen |
| 13 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Membangun formulir, memanggil API dan menyimpan variabel di penyimpanan lokal | Bangun elemen JavaScript dari ekstensi browser Anda untuk memanggil API menggunakan variabel yang disimpan di penyimpanan lokal | [APIs, Forms, and Local Storage](./5-browser-extension/2-forms-browsers-local-storage/README.md) | Jen |
| 14 | [Green Browser Extension](./5-browser-extension/solution/README.md) | Proses latar belakang di browser, kinerja web | Gunakan proses latar belakang browser untuk mengelola ikon ekstensi; pelajari tentang kinerja web dan beberapa optimasi untuk membuat | [Background Tasks and Performance](./5-browser-extension/3-background-tasks-and-performance/README.md) | Jen |
| 15 | [Space Game](./6-space-game/solution/README.md) | Pengembangan Game Tingkat Lanjut dengan JavaScript | Pelajari tentang Pewarisan menggunakan Kelas dan Komposisi serta pola Pub/Sub, sebagai persiapan untuk membangun sebuah game | [Introduction to Advanced Game Development](./6-space-game/1-introduction/README.md) | Chris |
| 16 | [Space Game](./6-space-game/solution/README.md) | Menggambar ke kanvas | Pelajari tentang API Canvas, digunakan untuk menggambar elemen pada layar | [Drawing to Canvas](./6-space-game/2-drawing-to-canvas/README.md) | Chris |
| 17 | [Space Game](./6-space-game/solution/README.md) | Memindahkan elemen di sekitar layar | Temukan bagaimana elemen dapat bergerak menggunakan koordinat kartesius dan API Canvas | [Moving Elements Around](./6-space-game/3-moving-elements-around/README.md) | Chris |
| 18 | [Space Game](./6-space-game/solution/README.md) | Deteksi tabrakan | Buat elemen bertabrakan dan bereaksi satu sama lain menggunakan penekanan tombol dan menyediakan fungsi cooldown untuk memastikan kinerja game | [Collision Detection](./6-space-game/4-collision-detection/README.md) | Chris |
| 19 | [Space Game](./6-space-game/solution/README.md) | Menyimpan skor | Lakukan perhitungan matematika berdasarkan status dan kinerja game | [Keeping Score](./6-space-game/5-keeping-score/README.md) | Chris |
| 20 | [Space Game](./6-space-game/solution/README.md) | Mengakhiri dan memulai ulang game | Pelajari tentang mengakhiri dan memulai ulang game, termasuk membersihkan aset dan mengatur ulang nilai variabel | [The Ending Condition](./6-space-game/6-end-condition/README.md) | Chris |
| 21 | [Banking App](./7-bank-project/solution/README.md) | Template HTML dan Rute dalam Aplikasi Web | Pelajari cara membuat kerangka arsitektur situs web multipage menggunakan routing dan template HTML | [HTML Templates and Routes](./7-bank-project/1-template-route/README.md) | Yohan |
| 22 | [Banking App](./7-bank-project/solution/README.md) | Membuat Formulir Login dan Pendaftaran | Pelajari tentang membangun formulir dan menangani rutin validasi | [Forms](./7-bank-project/2-forms/README.md) | Yohan |
| 23 | [Banking App](./7-bank-project/solution/README.md) | Metode Mengambil dan Menggunakan Data | Bagaimana data mengalir masuk dan keluar dari aplikasi Anda, bagaimana mengambilnya, menyimpannya, dan membuangnya | [Data](./7-bank-project/3-data/README.md) | Yohan |
| 24 | [Banking App](./7-bank-project/solution/README.md) | Konsep Manajemen State | Pelajari bagaimana aplikasi Anda mempertahankan state dan cara mengelolanya secara programatik | [State Management](./7-bank-project/4-state-management/README.md) | Yohan |
| 25 | [Browser/VScode Code](../../8-code-editor) | Bekerja dengan VScode | Pelajari cara menggunakan editor kode | [Use VScode Code Editor](./8-code-editor/1-using-a-code-editor/README.md) | Chris |
| 26 | [AI Assistants](./9-chat-project/README.md) | Bekerja dengan AI | Pelajari cara membangun asisten AI Anda sendiri | [AI Assistant project](./9-chat-project/README.md) | Chris |
## 🏫 Pedagogi
@ -179,22 +193,22 @@ Kurikulum kami dirancang dengan dua prinsip pedagogi utama:
* pembelajaran berbasis proyek
* kuis yang sering
Program ini mengajarkan dasar-dasar JavaScript, HTML, dan CSS, serta alat dan teknik terbaru yang digunakan oleh pengembang web saat ini. Siswa akan memiliki kesempatan untuk mengembangkan pengalaman langsung dengan membangun game mengetik, terrarium virtual, ekstensi browser ramah lingkungan, game bergaya space-invader, dan aplikasi perbankan untuk bisnis. Pada akhir seri, siswa akan memiliki pemahaman yang solid tentang pengembangan web.
Program ini mengajarkan dasar-dasar JavaScript, HTML, dan CSS, serta alat dan teknik terbaru yang digunakan oleh pengembang web saat ini. Siswa akan memiliki kesempatan untuk mengembangkan pengalaman langsung dengan membangun game mengetik, terrarium virtual, ekstensi browser ramah lingkungan, game gaya space-invader, dan aplikasi perbankan untuk bisnis. Pada akhir seri, siswa akan memiliki pemahaman yang kuat tentang pengembangan web.
> 🎓 Anda dapat mengikuti beberapa pelajaran pertama dalam kurikulum ini sebagai [Learn Path](https://docs.microsoft.com/learn/paths/web-development-101/?WT.mc_id=academic-77807-sagibbon) di Microsoft Learn!
> 🎓 Anda dapat mengambil beberapa pelajaran pertama dalam kurikulum ini sebagai [Learn Path](https://docs.microsoft.com/learn/paths/web-development-101/?WT.mc_id=academic-77807-sagibbon) di Microsoft Learn!
Dengan memastikan bahwa konten selaras dengan proyek, proses pembelajaran menjadi lebih menarik bagi siswa dan retensi konsep akan meningkat. Kami juga menulis beberapa pelajaran awal dalam dasar-dasar JavaScript untuk memperkenalkan konsep, dipasangkan dengan video dari koleksi tutorial video "[Beginners Series to: JavaScript](https://channel9.msdn.com/Series/Beginners-Series-to-JavaScript/?WT.mc_id=academic-77807-sagibbon)", beberapa penulisnya berkontribusi pada kurikulum ini.
Dengan memastikan bahwa konten sesuai dengan proyek, proses dibuat lebih menarik bagi siswa dan retensi konsep akan meningkat. Kami juga menulis beberapa pelajaran pemula dalam dasar-dasar JavaScript untuk memperkenalkan konsep, dipasangkan dengan video dari koleksi tutorial video "[Beginners Series to: JavaScript](https://channel9.msdn.com/Series/Beginners-Series-to-JavaScript/?WT.mc_id=academic-77807-sagibbon)", beberapa penulisnya berkontribusi pada kurikulum ini.
Selain itu, kuis dengan risiko rendah sebelum kelas menetapkan niat siswa untuk mempelajari topik, sementara kuis kedua setelah kelas memastikan retensi lebih lanjut. Kurikulum ini dirancang agar fleksibel dan menyenangkan serta dapat diambil secara keseluruhan atau sebagian. Proyek dimulai dari yang kecil dan menjadi semakin kompleks pada akhir siklus 12 minggu.
Selain itu, kuis dengan taruhan rendah sebelum kelas menetapkan niat siswa untuk mempelajari suatu topik, sedangkan kuis kedua setelah kelas memastikan retensi lebih lanjut. Kurikulum ini dirancang agar fleksibel dan menyenangkan serta dapat diambil secara keseluruhan atau sebagian. Proyek dimulai dari kecil dan menjadi semakin kompleks pada akhir siklus 12 minggu.
Meskipun kami sengaja menghindari memperkenalkan kerangka kerja JavaScript untuk berkonsentrasi pada keterampilan dasar yang diperlukan sebagai pengembang web sebelum mengadopsi kerangka kerja, langkah selanjutnya yang baik setelah menyelesaikan kurikulum ini adalah mempelajari tentang Node.js melalui koleksi video lainnya: "[Beginner Series to: Node.js](https://channel9.msdn.com/Series/Beginners-Series-to-Nodejs/?WT.mc_id=academic-77807-sagibbon)".
Meskipun kami sengaja menghindari memperkenalkan kerangka kerja JavaScript untuk fokus pada keterampilan dasar yang diperlukan sebagai pengembang web sebelum mengadopsi kerangka kerja, langkah selanjutnya yang baik untuk menyelesaikan kurikulum ini adalah belajar tentang Node.js melalui koleksi video lain: "[Beginner Series to: Node.js](https://channel9.msdn.com/Series/Beginners-Series-to-Nodejs/?WT.mc_id=academic-77807-sagibbon)".
> Kunjungi [Kode Etik](CODE_OF_CONDUCT.md) dan pedoman [Kontribusi](CONTRIBUTING.md) kami. Kami menyambut umpan balik konstruktif Anda!
> Kunjungi pedoman [Code of Conduct](CODE_OF_CONDUCT.md) dan [Contributing](CONTRIBUTING.md) kami. Kami menyambut umpan balik konstruktif Anda!
## 🧭 Akses Offline
Anda dapat menjalankan dokumentasi ini secara offline dengan menggunakan [Docsify](https://docsify.js.org/#/). Fork repositori ini, [instal Docsify](https://docsify.js.org/#/quickstart) di mesin lokal Anda, lalu di folder root repositori ini, ketik `docsify serve`. Situs web akan disajikan di port 3000 di localhost Anda: `localhost:3000`.
Anda dapat menjalankan dokumentasi ini secara offline dengan menggunakan [Docsify](https://docsify.js.org/#/). Fork repo ini, [instal Docsify](https://docsify.js.org/#/quickstart) di mesin lokal Anda, lalu di folder root repo ini, ketik `docsify serve`. Situs web akan dilayani pada port 3000 di localhost Anda: `localhost:3000`.
## 📘 PDF
@ -202,55 +216,55 @@ PDF dari semua pelajaran dapat ditemukan [di sini](https://microsoft.github.io/W
## 🎒 Kursus Lainnya
Tim kami juga memproduksi kursus lainnya! Lihat:
Tim kami menghasilkan kursus lain! Lihat:
<!-- CO-OP TRANSLATOR OTHER COURSES START -->
### LangChain
[![LangChain4j untuk Pemula](https://img.shields.io/badge/LangChain4j%20untuk%20Pemula-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners)
[![LangChain.js untuk Pemula](https://img.shields.io/badge/LangChain.js%20untuk%20Pemula-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners)
[![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
---
### Azure / Edge / MCP / Agen
[![AZD untuk Pemula](https://img.shields.io/badge/AZD%20untuk%20Pemula-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Edge AI untuk Pemula](https://img.shields.io/badge/Edge%20AI%20untuk%20Pemula-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![MCP untuk Pemula](https://img.shields.io/badge/MCP%20untuk%20Pemula-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI Agen untuk Pemula](https://img.shields.io/badge/AI%20Agen%20untuk%20Pemula-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI Agents for Beginners](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Seri AI Generatif
[![AI Generatif untuk Pemula](https://img.shields.io/badge/AI%20Generatif%20untuk%20Pemula-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (.NET)](https://img.shields.io/badge/AI%20Generatif%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (Java)](https://img.shields.io/badge/AI%20Generatif%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (JavaScript)](https://img.shields.io/badge/AI%20Generatif%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
[![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[![Generative AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
---
### Pembelajaran Inti
[![ML untuk Pemula](https://img.shields.io/badge/ML%20untuk%20Pemula-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[![Data Science untuk Pemula](https://img.shields.io/badge/Data%20Science%20untuk%20Pemula-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[![AI untuk Pemula](https://img.shields.io/badge/AI%20untuk%20Pemula-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[![Keamanan Siber untuk Pemula](https://img.shields.io/badge/Keamanan%20Siber%20untuk%20Pemula-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[![Pengembangan Web untuk Pemula](https://img.shields.io/badge/Pengembangan%20Web%20untuk%20Pemula-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[![IoT untuk Pemula](https://img.shields.io/badge/IoT%20untuk%20Pemula-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[![Pengembangan XR untuk Pemula](https://img.shields.io/badge/Pengembangan%20XR%20untuk%20Pemula-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
[![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Seri Copilot
[![Copilot untuk Pemrograman Berpasangan AI](https://img.shields.io/badge/Copilot%20untuk%20Pemrograman%20Berpasangan%20AI-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[![Copilot untuk C#/.NET](https://img.shields.io/badge/Copilot%20untuk%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
[![Petualangan Copilot](https://img.shields.io/badge/Petualangan%20Copilot-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst)
[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst)
<!-- CO-OP TRANSLATOR OTHER COURSES END -->
## Mendapatkan Bantuan
Jika Anda mengalami kesulitan atau memiliki pertanyaan tentang membangun aplikasi AI, bergabunglah dengan sesama pelajar dan pengembang berpengalaman dalam diskusi tentang MCP. Ini adalah komunitas yang mendukung di mana pertanyaan diterima dan pengetahuan dibagikan secara bebas.
Jika Anda mengalami kesulitan atau memiliki pertanyaan tentang membangun aplikasi AI. Bergabunglah dengan sesama pelajar dan pengembang berpengalaman dalam diskusi tentang MCP. Ini adalah komunitas yang mendukung dimana pertanyaan disambut dan pengetahuan dibagikan dengan bebas.
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
Jika Anda memiliki masukan produk atau menemukan kesalahan saat membangun, kunjungi:
Jika Anda memiliki umpan balik produk atau menemukan kesalahan saat membangun kunjungi:
[![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum)
@ -262,5 +276,5 @@ Repositori ini dilisensikan di bawah lisensi MIT. Lihat file [LICENSE](../../LIC
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa terjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang salah yang timbul dari penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan terjemahan yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang penting, disarankan menggunakan penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -42,10 +42,10 @@ Kurikulum ini mencakup paket yang dapat diimpor untuk alur kerja LMS umum.
- Moodle Cloud memiliki dukungan Common Cartridge yang terbatas. Lebih baik gunakan file Moodle di atas, yang juga dapat diunggah ke Canvas.
- Setelah diimpor, tinjau modul, tanggal jatuh tempo, dan pengaturan kuis agar sesuai dengan jadwal semester Anda.
![Moodle](../../translated_images/moodle.94eb93d714a50cb2c97435b408017dee224348b61bc86203ffd43a4f4e57b95f.id.png)
![Moodle](../../translated_images/moodle.94eb93d714a50cb2.id.png)
> Kurikulum di kelas Moodle
![Canvas](../../translated_images/canvas.fbd605ff8e5b8aff567d398528ce113db304446b90b9cad55c654de3fdfcda34.id.png)
![Canvas](../../translated_images/canvas.fbd605ff8e5b8aff.id.png)
> Kurikulum di Canvas
### Penggunaan repositori secara langsung (tanpa Classroom)

@ -17,7 +17,7 @@ Dengar, saya faham sepenuhnya jika pengaturcaraan terasa menakutkan sekarang. Ke
Hari ini, kita akan meneroka alat luar biasa yang menjadikan pembangunan web moden bukan sahaja mungkin, tetapi sangat menyeronokkan. Saya bercakap tentang editor, pelayar, dan aliran kerja yang sama yang digunakan oleh pembangun di Netflix, Spotify, dan studio aplikasi indie kegemaran anda setiap hari. Dan inilah bahagian yang akan membuatkan anda menari kegembiraan: kebanyakan alat profesional ini adalah percuma!
![Intro Programming](../../../../translated_images/webdev101-programming.d6e3f98e61ac4bff0b27dcbf1c3f16c8ed46984866f2d29988929678b0058fde.ms.png)
![Intro Programming](../../../../translated_images/webdev101-programming.d6e3f98e61ac4bff.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid

@ -17,7 +17,7 @@ Saya tahu ini mungkin terasa banyak pada mulanya malah, saya masih ingat men
Kita akan melalui perjalanan ini bersama-sama, satu langkah pada satu masa. Tiada tergesa-gesa, tiada tekanan hanya anda, saya, dan beberapa alat yang sangat hebat yang akan menjadi sahabat baru anda!
![Pengenalan kepada GitHub](../../../../translated_images/webdev101-github.8846d7971abef6f947909b4f9d343e2a23778aa716ca6b9d71df7174ee5009ac.ms.png)
![Pengenalan kepada GitHub](../../../../translated_images/webdev101-github.8846d7971abef6f9.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid
@ -610,7 +610,7 @@ Pertama, mari kita cari repositori (atau **repo**) di GitHub yang menarik minat
✅ Cara yang baik untuk mencari repo 'mesra pemula' adalah dengan [mencari tag 'good-first-issue'](https://github.blog/2020-01-22-browse-good-first-issues-to-start-contributing-to-open-source/).
![Salin repo secara tempatan](../../../../translated_images/clone_repo.5085c48d666ead57664f050d806e325d7f883be6838c821e08bc823ab7c66665.ms.png)
![Salin repo secara tempatan](../../../../translated_images/clone_repo.5085c48d666ead57.ms.png)
Terdapat beberapa cara untuk menyalin kod. Salah satu cara adalah dengan "clone" kandungan repositori, menggunakan HTTPS, SSH, atau menggunakan GitHub CLI (Command Line Interface).

@ -9,7 +9,7 @@ CO_OP_TRANSLATOR_METADATA:
-->
# Membuat Laman Web yang Mesra Akses
![Semua Tentang Kebolehcapaian](../../../../translated_images/webdev101-a11y.8ef3025c858d897a403a1a42c0897c76e11b724d9a8a0c0578dd4316f7507622.ms.png)
![Semua Tentang Kebolehcapaian](../../../../translated_images/webdev101-a11y.8ef3025c858d897a.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid

@ -9,7 +9,7 @@ CO_OP_TRANSLATOR_METADATA:
-->
# Asas JavaScript: Jenis Data
![Asas JavaScript - Jenis Data](../../../../translated_images/webdev101-js-datatypes.4cc470179730702c756480d3ffa46507f746e5975ebf80f99fdaaf1cff09a7f4.ms.png)
![Asas JavaScript - Jenis Data](../../../../translated_images/webdev101-js-datatypes.4cc470179730702c.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid

@ -9,7 +9,7 @@ CO_OP_TRANSLATOR_METADATA:
-->
# Asas JavaScript: Kaedah dan Fungsi
![Asas JavaScript - Fungsi](../../../../translated_images/webdev101-js-functions.be049c4726e94f8b7605c36330ac42eeb5cd8ed02bcdd60fdac778174d6cb865.ms.png)
![Asas JavaScript - Fungsi](../../../../translated_images/webdev101-js-functions.be049c4726e94f8b.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid

@ -9,7 +9,7 @@ CO_OP_TRANSLATOR_METADATA:
-->
# Asas JavaScript: Membuat Keputusan
![Asas JavaScript - Membuat keputusan](../../../../translated_images/webdev101-js-decisions.69e1b20f272dd1f0b1cb2f8adaff3ed2a77c4f91db96d8a0594132a353fa189a.ms.png)
![Asas JavaScript - Membuat keputusan](../../../../translated_images/webdev101-js-decisions.69e1b20f272dd1f0.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)

@ -9,7 +9,7 @@ CO_OP_TRANSLATOR_METADATA:
-->
# Asas JavaScript: Array dan Gelung
![Asas JavaScript - Array](../../../../translated_images/webdev101-js-arrays.439d7528b8a294558d0e4302e448d193f8ad7495cc407539cc81f1afe904b470.ms.png)
![Asas JavaScript - Array](../../../../translated_images/webdev101-js-arrays.439d7528b8a29455.ms.png)
> Nota sketsa oleh [Tomomi Imura](https://twitter.com/girlie_mac)
```mermaid

@ -26,7 +26,7 @@ journey
Build terrarium: 5: Student
```
![Pengenalan kepada HTML](../../../../translated_images/webdev101-html.4389c2067af68e98280c1bde52b6c6269f399eaae3659b7c846018d8a7b0bbd9.ms.png)
![Pengenalan kepada HTML](../../../../translated_images/webdev101-html.4389c2067af68e98.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
HTML, atau HyperText Markup Language, adalah asas kepada setiap laman web yang pernah anda lawati. Fikirkan HTML sebagai rangka yang memberikan struktur kepada halaman web ia menentukan di mana kandungan diletakkan, bagaimana ia diatur, dan apa yang setiap bahagian wakili. Walaupun CSS nanti akan "menghias" HTML anda dengan warna dan susunan, dan JavaScript akan menghidupkannya dengan interaktiviti, HTML menyediakan struktur penting yang menjadikan segalanya mungkin.
@ -88,7 +88,7 @@ Anda akan mencipta folder khusus untuk projek terrarium anda dan menambah fail H
4. Dalam panel Explorer, klik ikon "New File"
5. Namakan fail anda `index.html`
![Explorer VS Code menunjukkan penciptaan fail baru](../../../../translated_images/vs-code-index.e2986cf919471eb984a0afef231380c8b132b000635105f2397bd2754d1b689c.ms.png)
![Explorer VS Code menunjukkan penciptaan fail baru](../../../../translated_images/vs-code-index.e2986cf919471eb9.ms.png)
**Pilihan 2: Menggunakan Perintah Terminal**
```bash

@ -30,7 +30,7 @@ journey
Glass reflections: 5: Student
```
![Pengenalan kepada CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a200d79e7257e5e450408d8ea97f5b531d31b2e3976317338ee.ms.png)
![Pengenalan kepada CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a20.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
Ingat bagaimana HTML terrarium anda kelihatan agak asas? CSS adalah tempat kita mengubah struktur biasa itu menjadi sesuatu yang menarik secara visual.
@ -205,7 +205,7 @@ body {
Buka alat pembangun pelayar anda (F12), navigasi ke tab Elemen, dan periksa elemen `<h1>` anda. Anda akan melihat bahawa ia mewarisi keluarga fon dari body:
![fon diwarisi](../../../../translated_images/1.cc07a5cbe114ad1d4728c35134584ac1b87db688eff83cf75985cf31fe0ed95c.ms.png)
![fon diwarisi](../../../../translated_images/1.cc07a5cbe114ad1d.ms.png)
**Masa Eksperimen**: Cuba tetapkan sifat lain yang boleh diwarisi pada `<body>` seperti `color`, `line-height`, atau `text-align`. Apa yang berlaku pada tajuk dan elemen lain anda?
@ -599,7 +599,7 @@ Bersedia untuk meningkatkan terrarium anda dengan refleksi kaca yang realistik?
Anda akan mencipta sorotan halus yang mensimulasikan bagaimana cahaya memantul dari permukaan kaca. Pendekatan ini serupa dengan bagaimana pelukis Renaissance seperti Jan van Eyck menggunakan cahaya dan pantulan untuk membuat kaca yang dilukis kelihatan tiga dimensi. Berikut adalah apa yang anda sasarkan:
![terrarium siap](../../../../translated_images/terrarium-final.2f07047ffc597d0a06b06cab28a77801a10dd12fdb6c7fc630e9c40665491c53.ms.png)
![terrarium siap](../../../../translated_images/terrarium-final.2f07047ffc597d0a.ms.png)
**Cabaran anda:**
- **Cipta** bentuk bujur putih atau warna terang untuk refleksi kaca

@ -26,7 +26,7 @@ journey
Complete terrarium: 5: Student
```
![DOM dan penutupan](../../../../translated_images/webdev101-js.10280393044d7eaaec7e847574946add7ddae6be2b2194567d848b61d849334a.ms.png)
![DOM dan penutupan](../../../../translated_images/webdev101-js.10280393044d7eaa.ms.png)
> Sketchnote oleh [Tomomi Imura](https://twitter.com/girlie_mac)
Selamat datang ke salah satu aspek paling menarik dalam pembangunan web - menjadikan sesuatu interaktif! Document Object Model (DOM) adalah seperti jambatan antara HTML dan JavaScript anda, dan hari ini kita akan menggunakannya untuk menghidupkan terrarium anda. Apabila Tim Berners-Lee mencipta pelayar web pertama, beliau membayangkan web di mana dokumen boleh menjadi dinamik dan interaktif - DOM menjadikan visi itu mungkin.
@ -105,7 +105,7 @@ flowchart TD
style Q fill:#ffebee
```
![Representasi pokok DOM](../../../../translated_images/dom-tree.7daf0e763cbbba9273f9a66fe04c98276d7d23932309b195cb273a9cf1819b42.ms.png)
![Representasi pokok DOM](../../../../translated_images/dom-tree.7daf0e763cbbba92.ms.png)
> Representasi DOM dan markup HTML yang merujuknya. Daripada [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
@ -150,7 +150,7 @@ flowchart LR
> 💡 **Memahami Penutupan**: Penutupan adalah topik penting dalam JavaScript, dan ramai pembangun menggunakannya selama bertahun-tahun sebelum memahami sepenuhnya semua aspek teori. Hari ini, kita fokus pada aplikasi praktikal - anda akan melihat penutupan muncul secara semula jadi semasa kita membina ciri interaktif kita. Pemahaman akan berkembang apabila anda melihat bagaimana ia menyelesaikan masalah sebenar.
![Representasi pokok DOM](../../../../translated_images/dom-tree.7daf0e763cbbba9273f9a66fe04c98276d7d23932309b195cb273a9cf1819b42.ms.png)
![Representasi pokok DOM](../../../../translated_images/dom-tree.7daf0e763cbbba92.ms.png)
> Representasi DOM dan markup HTML yang merujuknya. Daripada [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
@ -598,7 +598,7 @@ Sekarang uji terrarium interaktif anda! Buka fail `index.html` anda dalam pelaya
- **Sokongan merentas peranti**: Berfungsi pada desktop dan mudah alih
- **Sedarkan prestasi**: Tiada kebocoran memori atau pengiraan berlebihan
![terrarium siap](../../../../translated_images/terrarium-final.0920f16e87c13a84cd2b553a5af9a3ad1cffbd41fbf8ce715d9e9c43809a5e2c.ms.png)
![terrarium siap](../../../../translated_images/terrarium-final.0920f16e87c13a84.ms.png)
---

@ -1,45 +1,30 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7965cd2bc5dc92ad888dc4c6ab2ab70a",
"translation_date": "2025-08-27T22:55:57+00:00",
"original_hash": "bc5c5550f79d10add90ce419ee34abb3",
"translation_date": "2026-01-07T01:12:30+00:00",
"source_file": "3-terrarium/README.md",
"language_code": "ms"
}
-->
# Terrarium Saya: Projek untuk belajar tentang HTML, CSS, dan manipulasi DOM menggunakan JavaScript 🌵🌱
## Terbitkan Terrarium anda
Sebuah meditasi kod kecil dengan fungsi seret dan lepas. Dengan sedikit HTML, JS, dan CSS, anda akan dapat membina antara muka web, menggayakannya, dan bahkan menambah pelbagai interaksi pilihan anda.
![terrarium saya](../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.ms.png)
# Pelajaran
1. [Pengenalan kepada HTML](./1-intro-to-html/README.md)
2. [Pengenalan kepada CSS](./2-intro-to-css/README.md)
3. [Pengenalan kepada DOM dan Penutupan JS](./3-intro-to-DOM-and-closures/README.md)
## Kredit
Ditulis dengan ♥️ oleh [Jen Looper](https://www.twitter.com/jenlooper)
Terrarium yang dibuat menggunakan CSS diilhamkan oleh balang kaca Jakub Mandra [codepen](https://codepen.io/Rotarepmi/pen/rjpNZY).
Karya seni dilukis tangan oleh [Jen Looper](http://jenlooper.com) dengan bantuan Procreate.
## Terbitkan Terrarium Anda
Anda boleh menerbitkan atau memaparkan terrarium anda di web menggunakan Azure Static Web Apps.
Anda boleh menerbitkan, atau memaparkan Terrarium anda di web menggunakan **Azure Static Web Apps**.
1. Fork repositori ini
2. Tekan butang ini
2. Tekan butang ini 👇
[![Butang Terbitkan ke Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/?feature.customportal=false&WT.mc_id=academic-77807-sagibbon#create/Microsoft.StaticApp)
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.StaticApp)
3. Ikuti panduan wizard untuk mencipta aplikasi anda. Pastikan anda menetapkan akar aplikasi kepada sama ada `/solution` atau akar pangkalan kod anda. Tiada API dalam aplikasi ini, jadi tidak perlu risau untuk menambahnya. Folder github akan dicipta dalam repositori yang telah anda fork, yang akan membantu perkhidmatan binaan Azure Static Web Apps membina dan menerbitkan aplikasi anda ke URL baharu.
3. Ikuti panduan penetapan untuk mencipta aplikasi anda.
- Tetapkan **App root** kepada sama ada `/solution` atau akar kod anda.
- Aplikasi ini tidak mempunyai API, jadi anda boleh langkau konfigurasi API.
- Folder `.github` akan dicipta secara automatik untuk membantu Azure Static Web Apps membina dan menerbitkan aplikasi anda.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, disyorkan untuk mendapatkan terjemahan profesional oleh manusia. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Sebuah meditasi kod kecil dengan fungsi seret dan lepas. Dengan sedikit HTML, JS, dan CSS, anda boleh membina antara muka web, menghiasnya, dan menambah interaksi.
![terrarium saya](../../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.ms.png)
![terrarium saya](../../../../translated_images/screenshot_gray.0c796099a1f9f25e.ms.png)
## Kredit

@ -26,7 +26,7 @@ journey
Polish experience: 5: Student
```
![Sketchnote Penyemak Imbas](../../../../translated_images/browser.60317c9be8b7f84adce43e30bff8d47a1ae15793beab762317b2bc6b74337c1a.ms.jpg)
![Sketchnote Penyemak Imbas](../../../../translated_images/browser.60317c9be8b7f84a.ms.jpg)
> Sketchnote oleh [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
## Kuiz Pra-Kuliah
@ -79,7 +79,7 @@ Proses ini mencerminkan bagaimana penyemak imbas pertama, WorldWideWeb, direka o
**Sedikit sejarah**: Penyemak imbas pertama dipanggil 'WorldWideWeb' dan dicipta oleh Sir Timothy Berners-Lee pada tahun 1990.
![penyemak imbas awal](../../../../translated_images/earlybrowsers.d984b711cdf3a42ddac919d46c4b5ca7232f68ccfbd81395e04e5a64c0015277.ms.jpg)
![penyemak imbas awal](../../../../translated_images/earlybrowsers.d984b711cdf3a42d.ms.jpg)
> Beberapa penyemak imbas awal, melalui [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
### Bagaimana Penyemak Imbas Memproses Kandungan Web
@ -198,7 +198,7 @@ quadrantChart
Memahami proses pemasangan sambungan membantu anda menjangkakan pengalaman pengguna apabila orang memasang sambungan anda. Proses pemasangan adalah standard merentas penyemak imbas moden, dengan sedikit variasi dalam reka bentuk antara muka.
![tangkapan skrin penyemak imbas Edge menunjukkan halaman edge://extensions yang terbuka dan menu tetapan yang terbuka](../../../../translated_images/install-on-edge.d68781acaf0b3d3dada8b7507cde7a64bf74b7040d9818baaa9070668e819f90.ms.png)
![tangkapan skrin penyemak imbas Edge menunjukkan halaman edge://extensions yang terbuka dan menu tetapan yang terbuka](../../../../translated_images/install-on-edge.d68781acaf0b3d3d.ms.png)
> **Penting**: Pastikan untuk menghidupkan mod pembangun dan benarkan sambungan daripada kedai lain semasa menguji sambungan anda sendiri.
@ -313,10 +313,10 @@ Ini mengikuti prinsip pendedahan progresif yang digunakan dalam reka bentuk anta
### Gambaran Keseluruhan Paparan Sambungan
**Paparan Persediaan** - Konfigurasi pengguna kali pertama:
![tangkapan skrin sambungan yang lengkap dibuka dalam penyemak imbas, memaparkan borang dengan input untuk nama kawasan dan kunci API.](../../../../translated_images/1.b6da8c1394b07491afeb6b2a8e5aca73ebd3cf478e27bcc9aeabb187e722648e.ms.png)
![tangkapan skrin sambungan yang lengkap dibuka dalam penyemak imbas, memaparkan borang dengan input untuk nama kawasan dan kunci API.](../../../../translated_images/1.b6da8c1394b07491.ms.png)
**Paparan Hasil** - Paparan data jejak karbon:
![tangkapan skrin sambungan yang lengkap memaparkan nilai penggunaan karbon dan peratusan bahan api fosil untuk kawasan US-NEISO.](../../../../translated_images/2.1dae52ff0804224692cd648afbf2342955d7afe3b0101b617268130dfb427f55.ms.png)
![tangkapan skrin sambungan yang lengkap memaparkan nilai penggunaan karbon dan peratusan bahan api fosil untuk kawasan US-NEISO.](../../../../translated_images/2.1dae52ff08042246.ms.png)
### Membina Borang Konfigurasi

@ -268,7 +268,7 @@ stateDiagram-v2
ClearStorage --> FirstTime: Back to setup
```
![Panel penyimpanan tempatan](../../../../translated_images/localstorage.472f8147b6a3f8d141d9551c95a2da610ac9a3c6a73d4a1c224081c98bae09d9.ms.png)
![Panel penyimpanan tempatan](../../../../translated_images/localstorage.472f8147b6a3f8d1.ms.png)
> ⚠️ **Pertimbangan Keselamatan**: Dalam aplikasi pengeluaran, menyimpan kunci API dalam LocalStorage menimbulkan risiko keselamatan kerana JavaScript boleh mengakses data ini. Untuk tujuan pembelajaran, pendekatan ini berfungsi dengan baik, tetapi aplikasi sebenar harus menggunakan penyimpanan pelayan yang selamat untuk kelayakan sensitif.

@ -126,7 +126,7 @@ Untuk membuka Alat Pembangun di Edge, klik tiga titik di sudut kanan atas, kemud
Mari cuba ini. Buka laman web (Microsoft.com berfungsi dengan baik untuk ini) dan klik butang 'Rekod'. Sekarang segarkan halaman dan lihat profiler menangkap segala yang berlaku. Apabila anda berhenti merekod, anda akan melihat pecahan terperinci tentang bagaimana pelayar 'menykrip', 'merender', dan 'melukis' laman tersebut. Ia mengingatkan saya bagaimana pusat kawalan misi memantau setiap sistem semasa pelancaran roket - anda mendapat data masa nyata tentang apa yang berlaku dan bila.
![Profiler Edge](../../../../translated_images/profiler.5a4a62479c5df01cfec9aab74173dba13f91d2c968e1a1ae434c26165792df15.ms.png)
![Profiler Edge](../../../../translated_images/profiler.5a4a62479c5df01c.ms.png)
✅ Dokumentasi [Microsoft](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) mempunyai banyak lagi butiran jika anda ingin mendalami lebih jauh
@ -136,11 +136,11 @@ Pilih elemen garis masa profil untuk memperbesar acara yang berlaku semasa halam
Dapatkan gambaran prestasi halaman anda dengan memilih bahagian garis masa profil dan melihat panel ringkasan:
![Snapshot profiler Edge](../../../../translated_images/snapshot.97750180ebcad73794a3594b36925eb5c8dbaac9e03fec7f9b974188c9ac63c7.ms.png)
![Snapshot profiler Edge](../../../../translated_images/snapshot.97750180ebcad737.ms.png)
Periksa panel Log Acara untuk melihat jika ada acara yang mengambil masa lebih daripada 15 ms:
![Log acara Edge](../../../../translated_images/log.804026979f3707e00eebcfa028b2b5a88cec6292f858767bb6703afba65a7d9c.ms.png)
![Log acara Edge](../../../../translated_images/log.804026979f3707e0.ms.png)
✅ Kenali profiler anda! Buka alat pembangun di laman ini dan lihat jika ada halangan. Apakah aset yang paling lambat dimuatkan? Yang paling pantas?

@ -23,7 +23,7 @@ Sambungan ini boleh dipanggil secara ad hoc oleh pengguna setelah kunci API dan
### Kredit
![sambungan pelayar berwarna hijau](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![sambungan pelayar berwarna hijau](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Kredit

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API C02 Signal daripada tmrow untuk menjejak penggunaan elektrik, bina sambungan pelayar supaya anda boleh mendapat peringatan terus di pelayar anda tentang seberapa berat penggunaan elektrik di kawasan anda. Menggunakan sambungan ini secara ad hoc akan membantu anda membuat keputusan berdasarkan maklumat ini.
![screenshot sambungan](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![screenshot sambungan](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Memulakan
@ -31,7 +31,7 @@ npm run build
Untuk memasang pada Edge, gunakan menu 'tiga titik' di sudut kanan atas pelayar untuk mencari panel Sambungan. Dari situ, pilih 'Load Unpacked' untuk memuatkan sambungan baru. Buka folder 'dist' apabila diminta, dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API untuk API CO2 Signal ([dapatkan satu di sini melalui emel](https://www.co2signal.com/) - masukkan emel anda di kotak pada halaman ini) dan [kod untuk kawasan anda](http://api.electricitymap.org/v3/zones) yang sepadan dengan [Electricity Map](https://www.electricitymap.org/map) (contohnya, di Boston, saya menggunakan 'US-NEISO').
![memasang](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![memasang](../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah kunci API dan kawasan dimasukkan ke dalam antara muka sambungan, titik berwarna di bar sambungan pelayar sepatutnya berubah untuk mencerminkan penggunaan tenaga di kawasan anda dan memberikan panduan tentang aktiviti berat tenaga yang sesuai untuk anda lakukan. Konsep di sebalik sistem 'titik' ini diilhamkan oleh [sambungan Energy Lollipop](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Dengan menggunakan API C02 Signal daripada tmrow untuk menjejaki penggunaan elektrik, cipta sambungan penyemak imbas supaya anda boleh mendapat peringatan terus dalam penyemak imbas anda tentang penggunaan elektrik di kawasan anda. Penggunaan sambungan ini secara ad hoc akan membantu anda membuat keputusan berdasarkan maklumat tersebut.
![tangkapan skrin sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![tangkapan skrin sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Memulakan
@ -31,7 +31,7 @@ npm run build
Untuk memasang pada Edge, gunakan menu 'tiga titik' di sudut kanan atas penyemak imbas untuk mencari panel Sambungan. Dari situ, pilih 'Muatkan sambungan yang tidak dimampatkan' untuk memuatkan sambungan baharu. Buka folder 'dist' apabila diminta dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API untuk API CO2 Signal ([dapatkan satu melalui e-mel di sini](https://www.co2signal.com/) - masukkan e-mel anda dalam kotak di halaman ini) dan [kod untuk kawasan anda](http://api.electricitymap.org/v3/zones) yang sepadan dengan [Peta Elektrik](https://www.electricitymap.org/map) (contohnya, di Boston, saya menggunakan 'US-NEISO').
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Sebaik sahaja kunci API dan kawasan dimasukkan ke dalam antara muka sambungan, titik berwarna dalam bar sambungan penyemak imbas akan berubah untuk mencerminkan penggunaan tenaga di kawasan anda dan memberikan petunjuk tentang aktiviti yang menggunakan tenaga yang sesuai untuk dilakukan. Konsep di sebalik sistem 'titik' ini diilhamkan oleh [sambungan Energy Lollipop](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API C02 Signal dari tmrow untuk menjejak penggunaan elektrik, sambungan pelayar ini dibina untuk memberikan peringatan tentang seberapa berat penggunaan elektrik di kawasan anda semasa anda melayari internet. Dengan menggunakan sambungan ini, anda boleh membuat keputusan berdasarkan maklumat tersebut untuk aktiviti anda.
![Tangkap layar sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![Tangkap layar sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Memulakan
@ -31,7 +31,7 @@ npm run build
Untuk memasang di Edge, gunakan menu 'tiga titik' di sudut kanan atas pelayar untuk mencari panel sambungan. Dari situ, pilih 'Load Unpacked' untuk memuatkan sambungan baru. Pada prompt, buka folder 'dist' dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API CO2 Signal ([dapatkan melalui e-mel di sini](https://www.co2snal.com/) - masukkan e-mel anda dalam kotak di halaman tersebut) dan [kod kawasan anda](http://api.electricitymap.org/v3/zones) dari [Peta Elektrik](https://www.electricitymap.org/map) (contohnya, di Boston, saya menggunakan 'US-NEISO').
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah kunci API dan kod kawasan dimasukkan ke dalam antara muka sambungan, titik berwarna pada bar sambungan pelayar sepatutnya berubah untuk mencerminkan penggunaan tenaga di kawasan anda dan memberikan indikator tentang aktiviti berat tenaga yang sesuai untuk dilakukan. Konsep sistem 'titik' ini diilhamkan oleh [Energy Lollipop Extension](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Anda akan menggunakan API Signal CO2 daripada tmrow untuk memantau penggunaan elektrik bagi mencipta sambungan penyemak imbas supaya anda boleh mendapatkan peringatan terus dalam penyemak imbas anda tentang betapa beratnya penggunaan elektrik di kawasan anda. Penggunaan sambungan ini secara ad hoc akan membantu menilai aktiviti anda berdasarkan maklumat ini.
![paparan sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![paparan sambungan](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Untuk Bermula
@ -31,7 +31,7 @@ npm run build
Untuk memasang pada Edge, gunakan menu "tiga titik" di sudut kanan atas penyemak imbas untuk mencari panel Sambungan. Jika belum diaktifkan, aktifkan Mod Pembangun (di bahagian bawah kiri). Pilih "Muatkan tanpa mampatan" untuk memuatkan sambungan baharu. Buka folder "dist" pada prompt dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API untuk API CO2 Signal (anda boleh [memperolehnya melalui e-mel di sini](https://www.co2signal.com/) - masukkan e-mel anda dalam kotak di halaman ini) dan [kod untuk kawasan anda](http://api.electricitymap.org/v3/zones) yang sepadan dengan [peta elektrik](https://www.electricitymap.org/map) (contohnya, di Boston, "US-NEISO").
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![pemasangan](../../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah kunci API dan kawasan dimasukkan ke dalam antara muka sambungan, titik berwarna pada bar sambungan penyemak imbas sepatutnya berubah untuk mencerminkan penggunaan tenaga kawasan tersebut dan memberikan petunjuk tentang aktiviti penggunaan tenaga tinggi yang sesuai untuk dilakukan. Konsep di sebalik sistem "titik" ini telah diilhamkan oleh [sambungan Energy Lollipop](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Gunakan API CO2 Signal daripada tmrow untuk menjejak penggunaan tenaga elektrik anda dan memaparkan peringatan di penyemak imbas tentang betapa tinggi penggunaan tenaga di kawasan anda. Sambungan penyemak imbas ini membolehkan anda membuat keputusan berdasarkan maklumat tersebut secara ad hoc.
![extension screenshot](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![extension screenshot](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Pengenalan
@ -31,7 +31,7 @@ npm run build
Untuk memasang di Edge, cari panel "Extensions" melalui menu "tiga titik" di bahagian atas kanan penyemak imbas. Dari situ, pilih "Load Unpacked" untuk memuatkan sambungan baharu. Apabila diminta, buka folder "dist" dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API CO2 Signal ([dapatkan di sini melalui e-mel](https://www.co2signal.com/) - masukkan e-mel anda di kotak pada halaman tersebut) dan [kod untuk kawasan anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Electricity Map](https://www.electricitymap.org/map) (contohnya, di Boston gunakan 'US-NEISO').
![installing](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![installing](../../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah anda memasukkan kunci API dan kawasan ke dalam antara muka sambungan, titik berwarna yang dipaparkan di bar sambungan penyemak imbas akan berubah mengikut penggunaan tenaga di kawasan anda. Ini membantu anda menentukan aktiviti yang sesuai berdasarkan keperluan tenaga. Konsep sistem "titik" ini diilhamkan oleh sambungan [Energy Lollipop](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API Isyarat CO2 tmrow untuk memantau penggunaan elektrik, bina sambungan penyemak imbas supaya anda boleh menerima peringatan di penyemak imbas anda tentang tahap penggunaan elektrik di kawasan anda. Menggunakan sambungan ini secara khusus akan membantu anda membuat keputusan yang lebih bijak berdasarkan maklumat ini.
![tangkapan pelanjutan penyemak imbas](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![tangkapan pelanjutan penyemak imbas](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Bermula Dari Sini
@ -31,7 +31,7 @@ npm run build
Untuk memasang di Edge, gunakan menu 'tiga titik' di sudut kanan atas penyemak imbas untuk mencari panel Sambungan. Dari sana, pilih 'Load Unpacked' untuk memuatkan sambungan baru. Buka folder 'dist' apabila diminta, dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API untuk API Isyarat CO2 ([dapatkan satu di sini melalui e-mel](https://www.co2signal.com/) - masukkan e-mel anda di dalam kotak di halaman ini) dan [kod untuk wilayah anda](http://api.electricitymap.org/v3/zones) yang sesuai dengan [Peta Elektrik](https://www.electricitymap.org/map) (contohnya, di Boston, saya menggunakan 'US-NEISO').
![sedang memuat turun](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![sedang memuat turun](../../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah kunci API dan wilayah dimasukkan ke dalam antara muka sambungan, titik berwarna di bar sambungan penyemak imbas akan berubah untuk mencerminkan penggunaan tenaga di kawasan anda dan memberikan cadangan mengenai aktiviti berat yang sesuai untuk dilakukan. Konsep di sebalik sistem 'dot' ini diilhamkan oleh [sambungan penyemak imbas Lollipop Tenaga](https://energylollipop.com/) untuk pelepasan di California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Menggunakan API C02 Signal daripada tmrow untuk menjejak penggunaan elektrik, bina sambungan pelayar supaya anda boleh mendapat peringatan terus di pelayar anda tentang seberapa berat penggunaan elektrik di kawasan anda. Menggunakan sambungan ini secara ad hoc akan membantu anda membuat keputusan berdasarkan maklumat ini.
![screenshot sambungan](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.ms.png)
![screenshot sambungan](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.ms.png)
## Memulakan
@ -31,7 +31,7 @@ npm run build
Untuk memasang pada Edge, gunakan menu 'tiga titik' di sudut kanan atas pelayar untuk mencari panel Sambungan. Dari situ, pilih 'Load Unpacked' untuk memuatkan sambungan baru. Buka folder 'dist' apabila diminta, dan sambungan akan dimuatkan. Untuk menggunakannya, anda memerlukan kunci API untuk API CO2 Signal ([dapatkan satu di sini melalui emel](https://www.co2signal.com/) - masukkan emel anda di kotak pada halaman ini) dan [kod untuk kawasan anda](http://api.electricitymap.org/v3/zones) yang sepadan dengan [Peta Elektrik](https://www.electricitymap.org/map) (contohnya, di Boston, saya menggunakan 'US-NEISO').
![memasang](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.ms.png)
![memasang](../../../../translated_images/install-on-edge.78634f02842c4828.ms.png)
Setelah kunci API dan kawasan dimasukkan ke dalam antara muka sambungan, titik berwarna di bar sambungan pelayar sepatutnya berubah untuk mencerminkan penggunaan tenaga di kawasan anda dan memberikan anda petunjuk tentang aktiviti berat tenaga yang sesuai untuk dilakukan. Konsep di sebalik sistem 'titik' ini diilhamkan oleh [sambungan Energy Lollipop](https://energylollipop.com/) untuk pelepasan di California.

@ -108,7 +108,7 @@ quadrantChart
UI Elements: [0.9, 0.1]
```
![grid kanvas](../../../../translated_images/canvas_grid.5f209da785ded492a01ece440e3032afe51efa500cc2308e5ea4252487ceaf0b.ms.png)
![grid kanvas](../../../../translated_images/canvas_grid.5f209da785ded492.ms.png)
> Imej dari [MDN](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)
Untuk melukis pada elemen kanvas, anda akan mengikuti proses tiga langkah yang sama yang membentuk asas semua grafik kanvas. Setelah anda melakukannya beberapa kali, ia menjadi kebiasaan:
@ -329,11 +329,11 @@ Anda akan membina halaman web dengan elemen Kanvas. Ia harus memaparkan skrin hi
- Kapal hero
![Kapal hero](../../../../translated_images/player.dd24c1afa8c71e9b82b2958946d4bad13308681392d4b5ddcc61a0e818ef8088.ms.png)
![Kapal hero](../../../../translated_images/player.dd24c1afa8c71e9b.ms.png)
- 5*5 raksasa
![Kapal raksasa](../../../../translated_images/enemyShip.5df2a822c16650c2fb3c06652e8ec8120cdb9122a6de46b9a1a56d54db22657f.ms.png)
![Kapal raksasa](../../../../translated_images/enemyShip.5df2a822c16650c2.ms.png)
### Langkah yang Disyorkan untuk Memulakan Pembangunan
@ -470,7 +470,7 @@ for (let x = START_X; x < STOP_X; x += ENEMY_SPACING) {
Hasil akhir sepatutnya kelihatan seperti ini:
![Skrin hitam dengan seorang hero dan 5*5 raksasa](../../../../translated_images/partI-solution.36c53b48c9ffae2a5e15496b23b604ba5393433e4bf91608a7a0a020eb7a2691.ms.png)
![Skrin hitam dengan seorang hero dan 5*5 raksasa](../../../../translated_images/partI-solution.36c53b48c9ffae2a.ms.png)
## Penyelesaian

@ -160,7 +160,7 @@ sequenceDiagram
```
- **Sistem mata**: Setiap kapal musuh yang dimusnahkan memberikan 100 mata (nombor bulat lebih mudah untuk pemain kira secara mental). Mata dipaparkan di sudut kiri bawah.
- **Pengiraan nyawa**: Wira anda bermula dengan tiga nyawa - satu standard yang ditetapkan oleh permainan arked awal untuk mengimbangi cabaran dengan kebolehmainan. Setiap perlanggaran dengan musuh mengurangkan satu nyawa. Kita akan memaparkan nyawa yang tinggal di sudut kanan bawah menggunakan ikon kapal ![imej nyawa](../../../../translated_images/life.6fb9f50d53ee0413cd91aa411f7c296e10a1a6de5c4a4197c718b49bf7d63ebf.ms.png).
- **Pengiraan nyawa**: Wira anda bermula dengan tiga nyawa - satu standard yang ditetapkan oleh permainan arked awal untuk mengimbangi cabaran dengan kebolehmainan. Setiap perlanggaran dengan musuh mengurangkan satu nyawa. Kita akan memaparkan nyawa yang tinggal di sudut kanan bawah menggunakan ikon kapal ![imej nyawa](../../../../translated_images/life.6fb9f50d53ee0413.ms.png).
## Mari Mula Membina!

@ -652,7 +652,7 @@ sequenceDiagram
Menggunakan `history.pushState` mencipta entri baru dalam sejarah navigasi pelayar. Anda boleh memeriksanya dengan menahan *butang mundur* pelayar anda, ia seharusnya memaparkan sesuatu seperti ini:
![Tangkap layar sejarah navigasi](../../../../translated_images/history.7fdabbafa521e06455b738d3dafa3ff41d3071deae60ead8c7e0844b9ed987d8.ms.png)
![Tangkap layar sejarah navigasi](../../../../translated_images/history.7fdabbafa521e064.ms.png)
Jika anda cuba klik pada butang mundur beberapa kali, anda akan melihat bahawa URL semasa berubah dan sejarah dikemas kini, tetapi templat yang sama terus dipaparkan.

@ -295,7 +295,7 @@ Pertama, mari kita perhatikan apa yang berlaku dengan penghantaran borang asas:
2. Perhatikan perubahan dalam bar alamat pelayar anda
3. Perhatikan bagaimana halaman dimuat semula dan data muncul dalam URL
![Tangkapan skrin perubahan URL pelayar selepas klik butang Daftar](../../../../translated_images/click-register.e89a30bf0d4bc9ca867dc537c4cea679a7c26368bd790969082f524fed2355bc.ms.png)
![Tangkapan skrin perubahan URL pelayar selepas klik butang Daftar](../../../../translated_images/click-register.e89a30bf0d4bc9ca.ms.png)
### Perbandingan Kaedah HTTP
@ -350,7 +350,7 @@ Mari kita konfigurasikan borang pendaftaran anda untuk berkomunikasi dengan betu
2. **Klik** butang "Buat Akaun"
3. **Perhatikan** respons pelayan dalam pelayar anda
![Tetingkap pelayar di alamat localhost:5000/api/accounts, menunjukkan string JSON dengan data pengguna](../../../../translated_images/form-post.61de4ca1b964d91a9e338416e19f218504dd0af5f762fbebabfe7ae80edf885f.ms.png)
![Tetingkap pelayar di alamat localhost:5000/api/accounts, menunjukkan string JSON dengan data pengguna](../../../../translated_images/form-post.61de4ca1b964d91a.ms.png)
**Apa yang anda harus lihat:**
- **Pelayar mengarahkan** ke URL endpoint API
@ -615,7 +615,7 @@ async function register() {
3. **Klik** "Buat Akaun"
4. **Perhatikan** mesej konsol dan maklum balas pengguna
![Tangkapan skrin menunjukkan mesej log dalam konsol pelayar](../../../../translated_images/browser-console.efaf0b51aaaf67782a29e1a0bb32cc063f189b18e894eb5926e02f1abe864ec2.ms.png)
![Tangkapan skrin menunjukkan mesej log dalam konsol pelayar](../../../../translated_images/browser-console.efaf0b51aaaf6778.ms.png)
**Apa yang anda patut lihat:**
- **Keadaan pemuatan** muncul pada butang hantar
@ -790,7 +790,7 @@ Mari tingkatkan borang pendaftaran anda dengan pengesahan yang kukuh yang member
3. **Cuba** aksara khas dalam medan nama pengguna
4. **Masukkan** jumlah baki negatif
![Tangkapan skrin menunjukkan ralat pengesahan apabila cuba menghantar borang](../../../../translated_images/validation-error.8bd23e98d416c22f80076d04829a4bb718e0e550fd622862ef59008ccf0d5dce.ms.png)
![Tangkapan skrin menunjukkan ralat pengesahan apabila cuba menghantar borang](../../../../translated_images/validation-error.8bd23e98d416c22f.ms.png)
**Apa yang anda akan perhatikan:**
- **Pelayar memaparkan** mesej pengesahan asli
@ -952,7 +952,7 @@ Tunjukkan mesej ralat dalam HTML jika pengguna sudah wujud.
Berikut adalah contoh bagaimana halaman log masuk akhir boleh kelihatan selepas sedikit gaya:
![Tangkapan skrin halaman log masuk selepas menambah gaya CSS](../../../../translated_images/result.96ef01f607bf856aa9789078633e94a4f7664d912f235efce2657299becca483.ms.png)
![Tangkapan skrin halaman log masuk selepas menambah gaya CSS](../../../../translated_images/result.96ef01f607bf856a.ms.png)
## Kuiz Selepas Kuliah

@ -160,7 +160,7 @@ sequenceDiagram
Browser->>User: Displays new page (flash/reload)
```
![Aliran kerja kemas kini dalam aplikasi berbilang halaman](../../../../translated_images/mpa.7f7375a1a2d4aa779d3f928a2aaaf9ad76bcdeb05cfce2dc27ab126024050f51.ms.png)
![Aliran kerja kemas kini dalam aplikasi berbilang halaman](../../../../translated_images/mpa.7f7375a1a2d4aa77.ms.png)
**Kenapa pendekatan ini terasa tidak lancar:**
- Setiap klik bermaksud membina semula keseluruhan halaman dari awal
@ -187,7 +187,7 @@ sequenceDiagram
Browser->>User: Shows updated content (no reload)
```
![Aliran kerja kemas kini dalam aplikasi halaman tunggal](../../../../translated_images/spa.268ec73b41f992c2a21ef9294235c6ae597b3c37e2c03f0494c2d8857325cc57.ms.png)
![Aliran kerja kemas kini dalam aplikasi halaman tunggal](../../../../translated_images/spa.268ec73b41f992c2.ms.png)
**Kenapa SPA terasa lebih baik:**
- Hanya bahagian yang benar-benar berubah dikemas kini (bijak, bukan?)
@ -523,7 +523,7 @@ if (data.error) {
Sekarang apabila anda menguji dengan akaun yang tidak sah, anda akan melihat mesej kesalahan yang berguna terus di halaman!
![Tangkapan skrin menunjukkan mesej kesalahan yang dipaparkan semasa log masuk](../../../../translated_images/login-error.416fe019b36a63276764c2349df5d99e04ebda54fefe60c715ee87a28d5d4ad0.ms.png)
![Tangkapan skrin menunjukkan mesej kesalahan yang dipaparkan semasa log masuk](../../../../translated_images/login-error.416fe019b36a6327.ms.png)
#### Langkah 4: Menjadi Inklusif dengan Kebolehaksesan
@ -961,7 +961,7 @@ Bersedia untuk membawa aplikasi perbankan anda ke tahap seterusnya? Mari jadikan
Berikut adalah contoh bagaimana papan pemuka yang digilap boleh kelihatan:
![Tangkapan skrin hasil contoh papan pemuka selepas gaya](../../../../translated_images/screen2.123c82a831a1d14ab2061994be2fa5de9cec1ce651047217d326d4773a6348e4.ms.png)
![Tangkapan skrin hasil contoh papan pemuka selepas gaya](../../../../translated_images/screen2.123c82a831a1d14a.ms.png)
Jangan rasa seperti anda perlu meniru ini sepenuhnya - gunakan ia sebagai inspirasi dan jadikan ia milik anda!

@ -190,7 +190,7 @@ Seperti reka bentuk berkompartmen Titanic yang kelihatan kukuh sehingga beberapa
Daripada mengejar ekor kita sendiri, kita akan mencipta sistem **pengurusan keadaan berpusat**. Anggaplah ia seperti mempunyai seorang yang sangat teratur yang bertanggungjawab ke atas semua perkara penting:
![Skema menunjukkan aliran data antara HTML, tindakan pengguna dan keadaan](../../../../translated_images/data-flow.fa2354e0908fecc89b488010dedf4871418a992edffa17e73441d257add18da4.ms.png)
![Skema menunjukkan aliran data antara HTML, tindakan pengguna dan keadaan](../../../../translated_images/data-flow.fa2354e0908fecc8.ms.png)
```mermaid
flowchart TD
@ -803,7 +803,7 @@ Cabaran ini akan membantu anda berfikir seperti pembangun profesional yang mempe
Berikut adalah contoh hasil selepas menyelesaikan tugasan:
![Tangkapan skrin menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f12f65ebf8f521c5d64e179c40b791c49c242cf15f7e7fab15.ms.png)
![Tangkapan skrin menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f1.ms.png)
---

@ -112,7 +112,7 @@ Rujuk dokumentasi [API pelayan](../api/README.md) untuk:
**Hasil Dijangka:**
Selepas menyelesaikan tugasan ini, aplikasi perbankan anda sepatutnya mempunyai ciri "Tambah Transaksi" yang berfungsi sepenuhnya dan kelihatan profesional:
![Tangkap layar menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f12f65ebf8f521c5d64e179c40b791c49c242cf15f7e7fab15.ms.png)
![Tangkap layar menunjukkan contoh dialog "Tambah transaksi"](../../../../translated_images/dialog.93bba104afeb79f1.ms.png)
## Ujian Pelaksanaan Anda

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Dalam projek ini, anda akan belajar cara membina bank fiksyen. Pelajaran ini merangkumi arahan tentang cara menyusun aplikasi web dan menyediakan laluan, membina borang, menguruskan keadaan, dan mendapatkan data daripada API yang membolehkan anda mengambil data bank.
| ![Screen1](../../../translated_images/screen1.baccbba0f1f93364672eb250d2fbd21574bb1caf79a2155022dc098a741cbdfe.ms.png) | ![Screen2](../../../translated_images/screen2.123c82a831a1d14ab2061994be2fa5de9cec1ce651047217d326d4773a6348e4.ms.png) |
| ![Screen1](../../../translated_images/screen1.baccbba0f1f93364.ms.png) | ![Screen2](../../../translated_images/screen2.123c82a831a1d14a.ms.png) |
|--------------------------------|--------------------------------|
## Pelajaran

@ -185,7 +185,7 @@ Seperti bagaimana telefon Alexander Graham Bell menghubungkan lokasi yang jauh,
Apabila semuanya dimuatkan, anda akan melihat ruang kerja yang bersih dan cantik yang direka untuk memastikan anda fokus pada perkara yang penting kod anda!
![Antara muka lalai VSCode.dev](../../../../translated_images/default-vscode-dev.5d06881d65c1b3234ce50cd9ed3b0028e6031ad5f5b441bcbed96bfa6311f6d0.ms.png)
![Antara muka lalai VSCode.dev](../../../../translated_images/default-vscode-dev.5d06881d65c1b323.ms.png)
**Inilah lawatan kawasan anda:**
- **Bar Aktiviti** (jalur di sebelah kiri): Navigasi utama anda dengan Explorer 📁, Carian 🔍, Kawalan Sumber 🌿, Sambungan 🧩, dan Tetapan ⚙️
@ -233,7 +233,7 @@ Ini sesuai apabila anda baru bermula di VSCode.dev dan ingin membuka repositori
1. Pergi ke [vscode.dev](https://vscode.dev) jika anda belum berada di sana
2. Cari butang "Open Remote Repository" pada skrin selamat datang dan klik
![Buka repositori jauh](../../../../translated_images/open-remote-repository.bd9c2598b8949e7fc283cdfc8f4050c6205a7c7c6d3f78c4b135115d037d6fa2.ms.png)
![Buka repositori jauh](../../../../translated_images/open-remote-repository.bd9c2598b8949e7f.ms.png)
3. Tampal mana-mana URL repositori GitHub (cuba yang ini: `https://github.com/microsoft/Web-Dev-For-Beginners`)
4. Tekan Enter dan lihat keajaiban berlaku!
@ -242,7 +242,7 @@ Ini sesuai apabila anda baru bermula di VSCode.dev dan ingin membuka repositori
Ingin berasa seperti ahli sihir pengekodan? Cuba pintasan papan kekunci ini: Ctrl+Shift+P (atau Cmd+Shift+P pada Mac) untuk membuka Palet Perintah:
![Palet Perintah](../../../../translated_images/palette-menu.4946174e07f426226afcdad707d19b8d5150e41591c751c45b5dee213affef91.ms.png)
![Palet Perintah](../../../../translated_images/palette-menu.4946174e07f42622.ms.png)
**Palet Perintah adalah seperti mempunyai enjin carian untuk semua yang anda boleh lakukan:**
- Taip "open remote" dan ia akan mencari pembuka repositori untuk anda
@ -304,7 +304,7 @@ Seperti mengatur pelan di pejabat arkitek, penciptaan fail dalam VSCode.dev meng
3. Masukkan nama fail termasuk sambungan yang sesuai (`style.css`, `script.js`, `index.html`)
4. Tekan Enter untuk mencipta fail
![Mencipta fail baru](../../../../translated_images/create-new-file.2814e609c2af9aeb6c6fd53156c503ac91c3d538f9cac63073b2dd4a7631f183.ms.png)
![Mencipta fail baru](../../../../translated_images/create-new-file.2814e609c2af9aeb.ms.png)
**Konvensyen penamaan:**
- Gunakan nama deskriptif yang menunjukkan tujuan fail
@ -322,7 +322,7 @@ Di sinilah keseronokan sebenar bermula! Editor VSCode.dev dipenuhi dengan ciri-c
2. Mula menaip dan lihat VSCode.dev membantu anda dengan warna, cadangan, dan pengesanan ralat
3. Simpan kerja anda dengan Ctrl+S (Windows/Linux) atau Cmd+S (Mac) walaupun ia juga menyimpan secara automatik!
![Menyunting fail dalam VSCode.dev](../../../../translated_images/edit-a-file.52c0ee665ef19f08119d62d63f395dfefddc0a4deb9268d73bfe791f52c5807a.ms.png)
![Menyunting fail dalam VSCode.dev](../../../../translated_images/edit-a-file.52c0ee665ef19f08.ms.png)
**Perkara menarik yang berlaku semasa anda mengekod:**
- Kod anda akan diwarnakan dengan cantik supaya mudah dibaca
@ -343,7 +343,7 @@ Seperti bagaimana ahli arkeologi mencipta rekod terperinci lapisan penggalian, G
2. Fail yang diubah suai muncul dalam bahagian "Changes"
3. Pengekodan warna menunjukkan jenis perubahan: hijau untuk penambahan, merah untuk penghapusan
![Melihat perubahan dalam Kawalan Sumber](../../../../translated_images/working-tree.c58eec08e6335c79cc708c0c220c0b7fea61514bd3c7fb7471905a864aceac7c.ms.png)
![Melihat perubahan dalam Kawalan Sumber](../../../../translated_images/working-tree.c58eec08e6335c79.ms.png)
**Menyimpan kerja anda (aliran kerja komit):**
@ -438,7 +438,7 @@ Pasaran sambungan sangat teratur, jadi anda tidak akan tersesat mencari apa yang
2. Jelajah atau cari sesuatu yang spesifik
3. Klik pada apa sahaja yang kelihatan menarik untuk mengetahui lebih lanjut mengenainya
![Antara muka pasaran sambungan](../../../../translated_images/extensions.eca0e0c7f59a10b5c88be7fe24b3e32cca6b6058b35a49026c3a9d80b1813b7c.ms.png)
![Antara muka pasaran sambungan](../../../../translated_images/extensions.eca0e0c7f59a10b5.ms.png)
**Apa yang anda akan lihat di sana:**
@ -491,7 +491,7 @@ Kebanyakan sambungan datang dengan tetapan yang boleh anda ubah untuk membuatnya
3. Pilih "Tetapan Sambungan" dari menu dropdown
4. Laraskan perkara sehingga ia sesuai dengan aliran kerja anda
![Menyesuaikan tetapan sambungan](../../../../translated_images/extension-settings.21c752ae4f4cdb78a867f140ccd0680e04619d0c44bb4afb26373e54b829d934.ms.png)
![Menyesuaikan tetapan sambungan](../../../../translated_images/extension-settings.21c752ae4f4cdb78.ms.png)
**Perkara biasa yang mungkin anda mahu laraskan:**
- Bagaimana kod anda diformatkan (tab vs ruang, panjang baris, dll.)

@ -78,7 +78,7 @@ Oleh kerana VSCode.dev memerlukan sekurang-kurangnya satu fail untuk membuka rep
4. **Tulis** mesej komit: "Tambah struktur HTML awal"
5. **Klik** "Commit new file" untuk menyimpan perubahan anda
![Mencipta fail awal di GitHub](../../../../translated_images/new-file-github.com.c886796d800e8056561829a181be1382c5303da9d902d8b2dd82b68a4806e21f.ms.png)
![Mencipta fail awal di GitHub](../../../../translated_images/new-file-github.com.c886796d800e8056.ms.png)
**Apa yang dicapai oleh persediaan awal ini:**
- **Menetapkan** struktur dokumen HTML5 yang betul dengan elemen semantik
@ -104,7 +104,7 @@ Sekarang repositori anda telah disediakan, mari beralih ke VSCode.dev untuk kerj
**Petunjuk kejayaan**: Anda sepatutnya melihat fail projek anda di bar sisi Explorer dan `index.html` tersedia untuk diedit di kawasan editor utama.
![Projek dimuatkan di VSCode.dev](../../../../translated_images/project-on-vscode.dev.e79815a9a95ee7feac72ebe5c941c91279716be37c575dbdbf2f43bea2c7d8b6.ms.png)
![Projek dimuatkan di VSCode.dev](../../../../translated_images/project-on-vscode.dev.e79815a9a95ee7fe.ms.png)
**Apa yang anda akan lihat dalam antara muka:**
- **Bar sisi Explorer**: **Memaparkan** fail dan struktur folder repositori anda
@ -448,7 +448,7 @@ Sambungan meningkatkan pengalaman pembangunan anda dengan menyediakan keupayaan
**Hasil segera selepas pemasangan:**
Sebaik sahaja CodeSwing dipasang, anda akan melihat pratonton langsung laman web resume anda muncul dalam editor. Ini membolehkan anda melihat dengan tepat bagaimana laman web anda kelihatan semasa anda membuat perubahan.
![Sambungan CodeSwing menunjukkan pratonton langsung](../../../../translated_images/after-codeswing-extension-pb.0ebddddcf73b550994947a9084e35e2836c713ae13839d49628e3c764c1cfe83.ms.png)
![Sambungan CodeSwing menunjukkan pratonton langsung](../../../../translated_images/after-codeswing-extension-pb.0ebddddcf73b5509.ms.png)
**Memahami antara muka yang dipertingkatkan:**
- **Paparan berpecah**: **Memaparkan** kod anda di satu sisi dan pratonton langsung di sisi lain

@ -61,7 +61,7 @@ print(response.choices[0].message.content)
Inilah rupa projek siap anda:
![Antara muka aplikasi chat menunjukkan perbualan antara pengguna dan pembantu AI](../../../translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.ms.png)
![Antara muka aplikasi chat menunjukkan perbualan antara pengguna dan pembantu AI](../../../translated_images/screenshot.0a1ee0d123df681b.ms.png)
## 🗺️ Perjalanan Pembelajaran Anda Melalui Pembangunan Aplikasi AI
@ -194,7 +194,7 @@ mindmap
**Prinsip Teras**: Pembangunan aplikasi AI menggabungkan kemahiran pembangunan web tradisional dengan integrasi perkhidmatan AI, mencipta aplikasi pintar yang terasa semula jadi dan responsif kepada pengguna.
![Antara muka GitHub Models AI Playground dengan pilihan model dan kawasan ujian](../../../translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.ms.png)
![Antara muka GitHub Models AI Playground dengan pilihan model dan kawasan ujian](../../../translated_images/playground.d2b927122224ff8f.ms.png)
**Inilah yang membuatkan playground sangat berguna:**
- **Cuba** model AI yang berbeza seperti GPT-4o-mini, Claude, dan lain-lain (semuanya percuma!)
@ -204,7 +204,7 @@ mindmap
Setelah anda bermain-main sedikit, hanya klik tab "Code" dan pilih bahasa pengaturcaraan anda untuk mendapatkan kod pelaksanaan yang anda perlukan.
![Pilihan playground menunjukkan pilihan penjanaan kod untuk bahasa pengaturcaraan yang berbeza](../../../translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.ms.png)
![Pilihan playground menunjukkan pilihan penjanaan kod untuk bahasa pengaturcaraan yang berbeza](../../../translated_images/playground-choice.1d23ba7d407f4758.ms.png)
## Menyediakan Integrasi Backend Python
@ -2363,14 +2363,14 @@ Ingin mencuba projek ini dalam persekitaran pembangunan awan? GitHub Codespaces
- **Navigasi** ke [repositori Web Dev For Beginners](https://github.com/microsoft/Web-Dev-For-Beginners)
- **Klik** "Use this template" di sudut kanan atas (pastikan anda log masuk ke GitHub)
![Antara muka cipta dari templat menunjukkan butang hijau "Use this template"](../../../translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.ms.png)
![Antara muka cipta dari templat menunjukkan butang hijau "Use this template"](../../../translated_images/template.67ad477109d29a2b.ms.png)
**Langkah 2: Lancarkan Codespaces**
- **Buka** repositori yang baru anda cipta
- **Klik** butang hijau "Code" dan pilih "Codespaces"
- **Pilih** "Create codespace on main" untuk memulakan persekitaran pembangunan anda
![Antara muka cipta codespace dengan pilihan untuk melancarkan persekitaran pembangunan awan](../../../translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.ms.png)
![Antara muka cipta codespace dengan pilihan untuk melancarkan persekitaran pembangunan awan](../../../translated_images/codespace.bcecbdf5d2747d3d.ms.png)
**Langkah 3: Konfigurasi Persekitaran**
Sebaik sahaja Codespace anda dimuatkan, anda akan mempunyai akses kepada:

@ -1,76 +1,86 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "caff943951276a4459a687166f3dfae2",
"translation_date": "2025-12-19T10:25:31+00:00",
"original_hash": "fea3a0fceb8ad86fd640c09cf63a2aac",
"translation_date": "2026-01-07T01:11:03+00:00",
"source_file": "README.md",
"language_code": "ms"
}
-->
[![GitHub license](https://img.shields.io/github/license/microsoft/Web-Dev-For-Beginners.svg)](https://github.com/microsoft/Web-Dev-For-Beginners/blob/master/LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/issues/)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![Lesen GitHub](https://img.shields.io/github/license/microsoft/Web-Dev-For-Beginners.svg)](https://github.com/microsoft/Web-Dev-For-Beginners/blob/master/LICENSE)
[![Penyumbang GitHub](https://img.shields.io/github/contributors/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/graphs/contributors/)
[![Isu GitHub](https://img.shields.io/github/issues/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/issues/)
[![Permintaan tarik GitHub](https://img.shields.io/github/issues-pr/microsoft/Web-Dev-For-Beginners.svg)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/pulls/)
[![PRs Dialu-alukan](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Watch&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/watchers/)
[![GitHub forks](https://img.shields.io/github/forks/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/network/)
[![GitHub stars](https://img.shields.io/github/stars/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/stargazers/)
[![Pemerhati GitHub](https://img.shields.io/github/watchers/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Watch&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/watchers/)
[![Fork GitHub](https://img.shields.io/github/forks/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/network/)
[![Bintang GitHub](https://img.shields.io/github/stars/microsoft/Web-Dev-For-Beginners.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/stargazers/)
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
# Pembangunan Web untuk Pemula - Kurikulum
Pelajari asas pembangunan web dengan kursus 12 minggu yang komprehensif oleh Microsoft Cloud Advocates. Setiap daripada 24 pelajaran meneroka JavaScript, CSS, dan HTML melalui projek praktikal seperti terrarium, sambungan pelayar, dan permainan angkasa. Sertai kuiz, perbincangan, dan tugasan praktikal. Tingkatkan kemahiran anda dan optimalkan pemahaman anda dengan pendekatan pembelajaran berasaskan projek yang efektif. Mulakan perjalanan pengkodan anda hari ini!
Pelajari asas-asas pembangunan web dengan kursus komprehensif selama 12 minggu oleh Microsoft Cloud Advocates. Setiap 24 pelajaran menyelami JavaScript, CSS, dan HTML melalui projek hands-on seperti terrarium, sambungan pelayar, dan permainan angkasa lepas. Sertai kuiz, perbincangan, dan tugasan praktikal. Tingkatkan kemahiran dan optimakan pengekalan pengetahuan anda dengan pedagogi berasaskan projek kami yang berkesan. Mulakan perjalanan pengkodan anda hari ini!
Sertai Komuniti Discord Azure AI Foundry
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
Ikuti langkah-langkah ini untuk mula menggunakan sumber ini:
1. **Fork Repositori**: Klik [![GitHub forks](https://img.shields.io/github/forks/microsoft/Web-Dev-For-beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/fork)
Ikuti langkah-langkah ini untuk memulakan menggunakan sumber ini:
1. **Fork Repositori**: Klik [![Fork GitHub](https://img.shields.io/github/forks/microsoft/Web-Dev-For-beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Web-Dev-For-Beginners/fork)
2. **Clone Repositori**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
3. [**Sertai Azure AI Foundry Discord dan berhubung dengan pakar serta pembangun lain**](https://discord.com/invite/ByRwuEEgH4)
3. [**Sertai The Azure AI Foundry Discord dan temui pakar dan pembangun lain**](https://discord.com/invite/ByRwuEEgH4)
### 🌐 Sokongan Pelbagai Bahasa
#### Disokong melalui GitHub Action (Automatik & Sentiasa Terkini)
#### Disokong melalui Tindakan GitHub (Automatik & Sentiasa Dikemaskini)
<!-- CO-OP TRANSLATOR LANGUAGES TABLE START -->
[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](./README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../br/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../vi/README.md)
[Arab](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgaria](../bg/README.md) | [Burma (Myanmar)](../my/README.md) | [Cina (Dipermudahkan)](../zh/README.md) | [Cina (Tradisional, Hong Kong)](../hk/README.md) | [Cina (Tradisional, Macau)](../mo/README.md) | [Cina (Tradisional, Taiwan)](../tw/README.md) | [Kroasia](../hr/README.md) | [Czech](../cs/README.md) | [Denmark](../da/README.md) | [Belanda](../nl/README.md) | [Estonia](../et/README.md) | [Finland](../fi/README.md) | [Perancis](../fr/README.md) | [Jerman](../de/README.md) | [Greek](../el/README.md) | [Ibrani](../he/README.md) | [Hindi](../hi/README.md) | [Hungary](../hu/README.md) | [Indonesia](../id/README.md) | [Itali](../it/README.md) | [Jepun](../ja/README.md) | [Kannada](../kn/README.md) | [Korea](../ko/README.md) | [Lithuania](../lt/README.md) | [Melayu](./README.md) | [Malayalam](../ml/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Pidgin Nigeria](../pcm/README.md) | [Norway](../no/README.md) | [Parsi (Farsi)](../fa/README.md) | [Poland](../pl/README.md) | [Portugis (Brazil)](../br/README.md) | [Portugis (Portugal)](../pt/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romania](../ro/README.md) | [Rusia](../ru/README.md) | [Serbia (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenia](../sl/README.md) | [Sepanyol](../es/README.md) | [Swahili](../sw/README.md) | [Sweden](../sv/README.md) | [Tagalog (Filipina)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turki](../tr/README.md) | [Ukrain](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnam](../vi/README.md)
> **Lebih suka Clone Secara Tempatan?**
> Repositori ini merangkumi lebih 50+ terjemahan bahasa yang meningkatkan saiz muat turun dengan ketara. Untuk clone tanpa terjemahan, gunakan sparse checkout:
> ```bash
> git clone --filter=blob:none --sparse https://github.com/microsoft/Web-Dev-For-Beginners.git
> cd Web-Dev-For-Beginners
> git sparse-checkout set --no-cone '/*' '!translations' '!translated_images'
> ```
> Ini memberi anda segala yang anda perlukan untuk melengkapkan kursus dengan muat turun yang jauh lebih pantas.
<!-- CO-OP TRANSLATOR LANGUAGES TABLE END -->
**Jika anda ingin menambah sokongan bahasa tambahan, senarai bahasa yang disokong boleh didapati [di sini](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
**Jika anda ingin menyokong lebih banyak bahasa terjemahan, senarai sokongan tambahan terdapat [di sini](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
[![Open in Visual Studio Code](https://img.shields.io/static/v1?logo=visualstudiocode&label=&message=Open%20in%20Visual%20Studio%20Code&labelColor=2c2c32&color=007acc&logoColor=007acc)](https://open.vscode.dev/microsoft/Web-Dev-For-Beginners)
[![Buka dalam Visual Studio Code](https://img.shields.io/static/v1?logo=visualstudiocode&label=&message=Open%20in%20Visual%20Studio%20Code&labelColor=2c2c32&color=007acc&logoColor=007acc)](https://open.vscode.dev/microsoft/Web-Dev-For-Beginners)
#### 🧑‍🎓 _Adakah anda seorang pelajar?_
Lawati [**Halaman Hub Pelajar**](https://docs.microsoft.com/learn/student-hub/?WT.mc_id=academic-77807-sagibbon) di mana anda akan menemui sumber untuk pemula, pakej pelajar dan juga cara mendapatkan baucar sijil percuma. Ini adalah halaman yang patut anda tandai dan periksa dari semasa ke semasa kerana kandungan akan ditukar setiap bulan.
Lawati [**Halaman Pusat Pelajar**](https://docs.microsoft.com/learn/student-hub/?WT.mc_id=academic-77807-sagibbon) di mana anda akan menemui sumber untuk pemula, Pakej Pelajar dan juga cara untuk mendapatkan baucar sijil percuma. Ini adalah halaman yang anda mahu tandai dan periksa dari semasa ke semasa kerana kami menukar kandungan setiap bulan.
### 📣 Pengumuman - Cabaran mod Agen GitHub Copilot baru untuk diselesaikan!
### 📣 Pengumuman - Cabaran Mod Agen GitHub Copilot baru untuk diselesaikan!
Cabaran baru ditambah, cari "Cabaran Agen GitHub Copilot 🚀" dalam kebanyakan bab. Ini adalah cabaran baru untuk anda selesaikan menggunakan GitHub Copilot dan mod Agen. Jika anda belum pernah menggunakan mod Agen sebelum ini, ia mampu bukan sahaja menjana teks tetapi juga mencipta dan mengedit fail, menjalankan arahan dan banyak lagi.
Cabaran baru ditambah, cari "GitHub Copilot Agent Challenge 🚀" dalam kebanyakan bab. Ini adalah cabaran baru untuk anda selesaikan menggunakan GitHub Copilot dan Mod Agen. Jika anda belum pernah menggunakan Mod Agen sebelum ini, ia boleh bukan sahaja menjana teks tetapi juga boleh mencipta dan menyunting fail, menjalankan arahan dan banyak lagi.
### 📣 Pengumuman - _Projek Baru untuk dibina menggunakan AI Generatif_
### 📣 Pengumuman - _Projek Baru yang Dibina menggunakan AI Generatif_
Projek Pembantu AI baru sahaja ditambah, lihat [projek](./09-chat-project/README.md)
Projek Pembantu AI baru sahaja ditambah, semak [projek](./9-chat-project/README.md)
### 📣 Pengumuman - _Kurikulum Baru_ mengenai AI Generatif untuk JavaScript baru sahaja dilancarkan
### 📣 Pengumuman - _Kurikulum Baru_ mengenai AI Generatif untuk JavaScript baru sahaja diterbitkan
Jangan lepaskan kurikulum AI Generatif baru kami!
Jangan terlepas kurikulum AI Generatif baru kami!
Lawati [https://aka.ms/genai-js-course](https://aka.ms/genai-js-course) untuk bermula!
![Background](../../translated_images/background.148a8d43afde57303419a663f50daf586681bc2fabf833f66ef6954073983c66.ms.png)
![Latar Belakang](../../translated_images/background.148a8d43afde5730.ms.png)
- Pelajaran yang merangkumi segalanya dari asas hingga RAG.
- Pelajaran merangkumi segala-galanya dari asas kepada RAG.
- Berinteraksi dengan watak sejarah menggunakan GenAI dan aplikasi pendamping kami.
- Naratif yang menyeronokkan dan menarik, anda akan mengembara masa!
- Naratif yang menyeronokkan dan menarik, anda akan mengembara waktu!
![character](../../translated_images/character.5c0dd8e067ffd693c16e2c5b7412ab075a2215ce31f998305639fa3a05e14fbe.ms.png)
![watak](../../translated_images/character.5c0dd8e067ffd693.ms.png)
Setiap pelajaran termasuk tugasan untuk diselesaikan, semakan pengetahuan dan cabaran untuk membimbing anda mempelajari topik seperti:
Setiap pelajaran termasuk tugasan untuk diselesaikan, pemeriksaan pengetahuan dan cabaran untuk membimbing anda dalam mempelajari topik seperti:
- Prompting dan kejuruteraan prompt
- Penjanaan aplikasi teks dan imej
- Aplikasi carian
@ -81,48 +91,48 @@ Lawati [https://aka.ms/genai-js-course](../../[https:/aka.ms/genai-js-course) un
## 🌱 Bermula
> **Guru**, kami telah [menyertakan beberapa cadangan](for-teachers.md) tentang cara menggunakan kurikulum ini. Kami menghargai maklum balas anda [di forum perbincangan kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions/categories/teacher-corner)!
> **Guru**, kami telah [menyertakan beberapa cadangan](for-teachers.md) bagaimana menggunakan kurikulum ini. Kami sangat menghargai maklum balas anda [dalam forum perbincangan kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions/categories/teacher-corner)!
**[Pelajar](https://aka.ms/student-page/?WT.mc_id=academic-77807-sagibbon)**, untuk setiap pelajaran, mulakan dengan kuiz pra-kuliah dan teruskan dengan membaca bahan kuliah, melengkapkan pelbagai aktiviti dan semak pemahaman anda dengan kuiz pasca-kuliah.
**[Pelajar](https://aka.ms/student-page/?WT.mc_id=academic-77807-sagibbon)**, untuk setiap pelajaran, mulakan dengan kuiz pra-ceramah dan teruskan dengan membaca bahan kuliah, menyelesaikan pelbagai aktiviti dan memeriksa pemahaman anda dengan kuiz pasca-ceramah.
Untuk meningkatkan pengalaman pembelajaran anda, berhubung dengan rakan sebaya untuk bekerjasama dalam projek! Perbincangan digalakkan di [forum perbincangan kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions) di mana pasukan moderator kami akan tersedia untuk menjawab soalan anda.
Untuk meningkatkan pengalaman pembelajaran anda, berhubung dengan rakan-rakan sekelas untuk bekerja bersama projek ini! Perbincangan digalakkan dalam [forum perbincangan kami](https://github.com/microsoft/Web-Dev-For-Beginners/discussions) di mana pasukan moderator kami sedia menjawab soalan anda.
Untuk melanjutkan pendidikan anda, kami sangat mengesyorkan meneroka [Microsoft Learn](https://learn.microsoft.com/users/wirelesslife/collections/p1ddcy5jwy0jkm?WT.mc_id=academic-77807-sagibbon) untuk bahan kajian tambahan.
Untuk pendidikan lanjut, kami sangat mengesyorkan meneroka [Microsoft Learn](https://learn.microsoft.com/users/wirelesslife/collections/p1ddcy5jwy0jkm?WT.mc_id=academic-77807-sagibbon) untuk bahan pembelajaran tambahan.
### 📋 Menyediakan persekitaran anda
Kurikulum ini mempunyai persekitaran pembangunan yang sedia untuk digunakan! Semasa anda bermula, anda boleh memilih untuk menjalankan kurikulum ini dalam [Codespace](https://github.com/features/codespaces/) (_persekitaran berasaskan pelayar, tidak memerlukan pemasangan_), atau secara tempatan di komputer anda menggunakan editor teks seperti [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
Kurikulum ini mempunyai persekitaran pembangunan sedia digunakan! Semasa anda bermula, anda boleh memilih untuk menjalankan kurikulum dalam [Codespace](https://github.com/features/codespaces/) (_persekitaran berasaskan pelayar tanpa perlu pemasangan_), atau secara lokal di komputer anda menggunakan penyunting teks seperti [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
#### Cipta repositori anda
Untuk memudahkan anda menyimpan kerja anda, disarankan agar anda mencipta salinan repositori ini. Anda boleh melakukannya dengan mengklik butang **Use this template** di bahagian atas halaman. Ini akan mencipta repositori baru dalam akaun GitHub anda dengan salinan kurikulum.
Untuk memudahkan anda menyimpan kerja anda, disyorkan agar anda mencipta salinan anda sendiri repositori ini. Anda boleh melakukannya dengan mengklik butang **Use this template** di bahagian atas halaman. Ini akan mencipta repositori baru dalam akaun GitHub anda dengan salinan kurikulum.
Ikuti langkah-langkah ini:
1. **Fork Repositori**: Klik pada butang "Fork" di sudut kanan atas halaman ini.
Ikuti langkah ini:
1. **Fork Repositori**: Klik butang "Fork" di sudut kanan atas halaman ini.
2. **Clone Repositori**: `git clone https://github.com/microsoft/Web-Dev-For-Beginners.git`
#### Menjalankan kurikulum dalam Codespace
Dalam salinan repositori anda yang telah anda cipta, klik butang **Code** dan pilih **Open with Codespaces**. Ini akan mencipta Codespace baru untuk anda bekerja.
Dalam salinan repositori yang anda buat, klik butang **Code** dan pilih **Open with Codespaces**. Ini akan mencipta Codespace baru untuk anda bekerja.
![Codespace](../../translated_images/createcodespace.0238bbf4d7a8d955.ms.png)
![Codespace](../../translated_images/createcodespace.0238bbf4d7a8d955fa8fa7f7b6602a3cb6499a24708fbee589f83211c5a613b7.ms.png)
#### Menjalankan kurikulum secara lokal di komputer anda
#### Menjalankan kurikulum secara tempatan di komputer anda
Untuk menjalankan kurikulum ini secara lokal di komputer anda, anda memerlukan penyunting teks, pelayar dan alat baris perintah. Pelajaran pertama kami, [Pengenalan kepada Bahasa Pengaturcaraan dan Alat Perdagangan](../../1-getting-started-lessons/1-intro-to-programming-languages), akan membimbing anda melalui pelbagai pilihan untuk setiap alat ini supaya anda boleh memilih apa yang terbaik untuk anda.
Untuk menjalankan kurikulum ini secara tempatan di komputer anda, anda memerlukan editor teks, pelayar dan alat baris arahan. Pelajaran pertama kami, [Pengenalan kepada Bahasa Pengaturcaraan dan Alat Perdagangan](../../1-getting-started-lessons/1-intro-to-programming-languages), akan membimbing anda melalui pelbagai pilihan untuk setiap alat ini supaya anda boleh memilih yang paling sesuai untuk anda.
Saranan kami adalah menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) sebagai penyunting anda, yang juga mempunyai [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) terbina dalam. Anda boleh muat turun Visual Studio Code [di sini](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
Cadangan kami adalah menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) sebagai editor anda, yang juga mempunyai [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) terbina dalam. Anda boleh memuat turun Visual Studio Code [di sini](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon).
1. Clone repositori anda ke komputer anda. Anda boleh melakukannya dengan mengklik butang **Code** dan menyalin URL:
[CodeSpace](./images/createcodespace.png)
Kemudian, buka [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) dalam [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) dan jalankan arahan berikut, gantikan `<your-repository-url>` dengan URL yang baru anda salin:
Kemudian, buka [Terminal](https://code.visualstudio.com/docs/terminal/basics/?WT.mc_id=academic-77807-sagibbon) dalam [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon) dan jalankan arahan berikut, menggantikan `<your-repository-url>` dengan URL yang baru anda salin:
```bash
git clone <your-repository-url>
```
2. Buka folder dalam Visual Studio Code. Anda boleh melakukannya dengan mengklik **File** > **Open Folder** dan memilih folder yang baru anda clone.
2. Buka folder di Visual Studio Code. Anda boleh lakukan ini dengan mengklik **File** > **Open Folder** dan memilih folder yang baru anda klon.
> Sambungan Visual Studio Code yang disyorkan:
@ -136,123 +146,124 @@ Cadangan kami adalah menggunakan [Visual Studio Code](https://code.visualstudio.
- video tambahan pilihan
- kuiz pemanasan sebelum pelajaran
- pelajaran bertulis
- untuk pelajaran berasaskan projek, panduan langkah demi langkah tentang cara membina projek
- semakan pengetahuan
- untuk pelajaran berasaskan projek, panduan langkah demi langkah cara membina projek
- pemeriksaan pengetahuan
- cabaran
- bacaan tambahan
- tugasan
- [kuiz selepas pelajaran](https://ff-quizzes.netlify.app/web/)
- [kuiz pasca pelajaran](https://ff-quizzes.netlify.app/web/)
> **Nota tentang kuiz**: Semua kuiz terdapat dalam folder Quiz-app, sebanyak 48 kuiz dengan tiga soalan setiap satu. Ia boleh didapati [di sini](https://ff-quizzes.netlify.app/web/) dan aplikasi kuiz boleh dijalankan secara tempatan atau dideploy ke Azure; ikuti arahan dalam folder `quiz-app`.
> **Nota tentang kuiz**: Semua kuiz terkandung dalam folder Quiz-app, 48 kuiz kesemuanya dengan tiga soalan setiap satu. Ia boleh didapati [di sini](https://ff-quizzes.netlify.app/web/) aplikasi kuiz boleh dijalankan secara lokal atau diterapkan ke Azure; ikuti arahan dalam folder `quiz-app`.
## 🗃️ Pelajaran
| | Nama Projek | Konsep yang Diajarkan | Objektif Pembelajaran | Pelajaran Terkait | Penulis |
| :-: | :------------------------------------------------------: | :--------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------: |
| 01 | Memulakan Asas | Pengenalan kepada Pengaturcaraan dan Alat yang Digunakan | Belajar asas di sebalik kebanyakan bahasa pengaturcaraan dan tentang perisian yang membantu pembangun profesional melakukan kerja mereka | [Pengenalan kepada Bahasa Pengaturcaraan dan Alat yang Digunakan](./1-getting-started-lessons/1-intro-to-programming-languages/README.md) | Jasmine |
| 02 | Memulakan Asas | Asas GitHub, termasuk bekerja dalam pasukan | Cara menggunakan GitHub dalam projek anda, cara bekerjasama dengan orang lain dalam kod asas | [Pengenalan kepada GitHub](./1-getting-started-lessons/2-github-basics/README.md) | Floor |
| 03 | Memulakan Asas | Kebolehcapaian | Belajar asas kebolehcapaian web | [Asas Kebolehcapaian](./1-getting-started-lessons/3-accessibility/README.md) | Christopher |
| 04 | Asas JS | Jenis Data JavaScript | Asas jenis data JavaScript | [Jenis Data](./2-js-basics/1-data-types/README.md) | Jasmine |
| 05 | Asas JS | Fungsi dan Kaedah | Belajar tentang fungsi dan kaedah untuk mengurus aliran logik aplikasi | [Fungsi dan Kaedah](./2-js-basics/2-functions-methods/README.md) | Jasmine dan Christopher |
| 06 | Asas JS | Membuat Keputusan dengan JS | Belajar cara mencipta syarat dalam kod anda menggunakan kaedah membuat keputusan | [Membuat Keputusan](./2-js-basics/3-making-decisions/README.md) | Jasmine |
| 07 | Asas JS | Array dan Gelung | Bekerja dengan data menggunakan array dan gelung dalam JavaScript | [Array dan Gelung](./2-js-basics/4-arrays-loops/README.md) | Jasmine |
| 08 | [Terrarium](./3-terrarium/solution/README.md) | HTML dalam Praktik | Membina HTML untuk mencipta terrarium dalam talian, dengan fokus pada membina susun atur | [Pengenalan kepada HTML](./3-terrarium/1-intro-to-html/README.md) | Jen |
| 09 | [Terrarium](./3-terrarium/solution/README.md) | CSS dalam Praktik | Membina CSS untuk menggayakan terrarium dalam talian, dengan fokus pada asas CSS termasuk menjadikan halaman responsif | [Pengenalan kepada CSS](./3-terrarium/2-intro-to-css/README.md) | Jen |
| 10 | [Terrarium](./3-terrarium/solution/README.md) | Penutupan JavaScript, manipulasi DOM | Membina JavaScript untuk menjadikan terrarium berfungsi sebagai antara muka seret/lepas, dengan fokus pada penutupan dan manipulasi DOM | [Penutupan JavaScript, manipulasi DOM](./3-terrarium/3-intro-to-DOM-and-closures/README.md) | Jen |
| 11 | [Permainan Menaip](./4-typing-game/solution/README.md) | Membina Permainan Menaip | Belajar cara menggunakan acara papan kekunci untuk menggerakkan logik aplikasi JavaScript anda | [Pengaturcaraan Berasaskan Acara](./4-typing-game/typing-game/README.md) | Christopher |
| 12 | [Pelanjutan Pelayar Hijau](./5-browser-extension/solution/README.md) | Bekerja dengan Pelayar | Belajar cara pelayar berfungsi, sejarahnya, dan cara membina elemen pertama pelanjutan pelayar | [Tentang Pelayar](./5-browser-extension/1-about-browsers/README.md) | Jen |
| 13 | [Pelanjutan Pelayar Hijau](./5-browser-extension/solution/README.md) | Membina borang, memanggil API dan menyimpan pembolehubah dalam storan tempatan | Membina elemen JavaScript pelanjutan pelayar anda untuk memanggil API menggunakan pembolehubah yang disimpan dalam storan tempatan | [API, Borang, dan Storan Tempatan](./5-browser-extension/2-forms-browsers-local-storage/README.md) | Jen |
| 14 | [Pelanjutan Pelayar Hijau](./5-browser-extension/solution/README.md) | Proses latar belakang dalam pelayar, prestasi web | Menggunakan proses latar belakang pelayar untuk mengurus ikon pelanjutan; belajar tentang prestasi web dan beberapa pengoptimuman untuk meningkatkan | [Tugas Latar Belakang dan Prestasi](./5-browser-extension/3-background-tasks-and-performance/README.md) | Jen |
| 15 | [Permainan Angkasa](./6-space-game/solution/README.md) | Pembangunan Permainan yang Lebih Lanjutan dengan JavaScript | Belajar tentang Pewarisan menggunakan kedua-dua Kelas dan Komposisi serta corak Pub/Sub, sebagai persediaan untuk membina permainan | [Pengenalan kepada Pembangunan Permainan Lanjutan](./6-space-game/1-introduction/README.md) | Chris |
| 16 | [Permainan Angkasa](./6-space-game/solution/README.md) | Melukis ke kanvas | Belajar tentang API Kanvas, digunakan untuk melukis elemen ke skrin | [Melukis ke Kanvas](./6-space-game/2-drawing-to-canvas/README.md) | Chris |
| 17 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menggerakkan elemen di sekitar skrin | Mengetahui cara elemen boleh bergerak menggunakan koordinat Cartesian dan API Kanvas | [Menggerakkan Elemen di Sekitar](./6-space-game/3-moving-elements-around/README.md) | Chris |
| 18 | [Permainan Angkasa](./6-space-game/solution/README.md) | Pengesanan perlanggaran | Membuat elemen bertembung dan bertindak balas antara satu sama lain menggunakan penekanan kekunci dan menyediakan fungsi cooldown untuk memastikan prestasi permainan | [Pengesanan Perlanggaran](./6-space-game/4-collision-detection/README.md) | Chris |
| 19 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menyimpan skor | Melakukan pengiraan matematik berdasarkan status dan prestasi permainan | [Menyimpan Skor](./6-space-game/5-keeping-score/README.md) | Chris |
| 20 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menamatkan dan memulakan semula permainan | Belajar tentang menamatkan dan memulakan semula permainan, termasuk membersihkan aset dan menetapkan semula nilai pembolehubah | [Keadaan Tamat](./6-space-game/6-end-condition/README.md) | Chris |
| 21 | [Aplikasi Perbankan](./7-bank-project/solution/README.md) | Templat HTML dan Laluan dalam Aplikasi Web | Belajar cara mencipta rangka seni bina laman web berbilang halaman menggunakan laluan dan templat HTML | [Templat HTML dan Laluan](./7-bank-project/1-template-route/README.md) | Yohan |
| 22 | [Aplikasi Perbankan](./7-bank-project/solution/README.md) | Membina Borang Log Masuk dan Pendaftaran | Belajar tentang membina borang dan mengendalikan rutin pengesahan | [Borang](./7-bank-project/2-forms/README.md) | Yohan |
| 23 | [Aplikasi Perbankan](./7-bank-project/solution/README.md) | Kaedah Mengambil dan Menggunakan Data | Bagaimana data mengalir masuk dan keluar dari aplikasi anda, cara mengambilnya, menyimpannya, dan membuangnya | [Data](./7-bank-project/3-data/README.md) | Yohan |
| 24 | [Aplikasi Perbankan](./7-bank-project/solution/README.md) | Konsep Pengurusan Keadaan | Belajar cara aplikasi anda mengekalkan keadaan dan cara menguruskannya secara programatik | [Pengurusan Keadaan](./7-bank-project/4-state-management/README.md) | Yohan |
| 25 | [Kod Pelayar/VScode](../../8-code-editor) | Bekerja dengan VScode | Belajar cara menggunakan editor kod| [Gunakan Editor Kod VScode](./8-code-editor/1-using-a-code-editor/README.md) | Chris |
| 26 | [Pembantu AI](./9-chat-project/README.md) | Bekerja dengan AI | Belajar cara membina pembantu AI anda sendiri | [Projek Pembantu AI](./9-chat-project/README.md) | Chris |
| | Nama Projek | Konsep Diajarkan | Objektif Pembelajaran | Pelajaran Berpaut | Pengarang |
| :-: | :------------------------------------------------------: | :--------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------: |
| 01 | Memulakan | Pengenalan Kepada Pengaturcaraan dan Alat Perdagangan | Pelajari asas di sebalik kebanyakan bahasa pengaturcaraan dan tentang perisian yang membantu pembangun profesional menjalankan tugas mereka | [Pengenalan Kepada Bahasa Pengaturcaraan dan Alat Perdagangan](./1-getting-started-lessons/1-intro-to-programming-languages/README.md) | Jasmine |
| 02 | Memulakan | Asas GitHub, termasuk bekerjasama dalam pasukan | Cara menggunakan GitHub dalam projek anda, cara bekerjasama dengan orang lain pada pangkalan kod | [Pengenalan Kepada GitHub](./1-getting-started-lessons/2-github-basics/README.md) | Floor |
| 03 | Memulakan | Kebolehcapaian | Pelajari asas kebolehcapaian web | [Asas Kebolehcapaian](./1-getting-started-lessons/3-accessibility/README.md) | Christopher |
| 04 | Asas JS | Jenis Data JavaScript | Asas jenis data JavaScript | [Jenis Data](./2-js-basics/1-data-types/README.md) | Jasmine |
| 05 | Asas JS | Fungsi dan Kaedah | Pelajari tentang fungsi dan kaedah untuk mengurus aliran logik aplikasi | [Fungsi dan Kaedah](./2-js-basics/2-functions-methods/README.md) | Jasmine dan Christopher |
| 06 | Asas JS | Membuat Keputusan dengan JS | Pelajari cara membuat syarat dalam kod anda menggunakan kaedah membuat keputusan | [Membuat Keputusan](./2-js-basics/3-making-decisions/README.md) | Jasmine |
| 07 | Asas JS | Tatasusunan dan Gelung | Bekerja dengan data menggunakan tatasusunan dan gelung dalam JavaScript | [Tatasusunan dan Gelung](./2-js-basics/4-arrays-loops/README.md) | Jasmine |
| 08 | [Terrarium](./3-terrarium/solution/README.md) | HTML dalam Amalan | Bangunkan HTML untuk mencipta terrarium dalam talian, fokus pada membina susun atur | [Pengenalan kepada HTML](./3-terrarium/1-intro-to-html/README.md) | Jen |
| 09 | [Terrarium](./3-terrarium/solution/README.md) | CSS dalam Amalan | Bangunkan CSS untuk gayakan terrarium dalam talian, fokus pada asas CSS termasuk menjadikan halaman responsif | [Pengenalan kepada CSS](./3-terrarium/2-intro-to-css/README.md) | Jen |
| 10 | [Terrarium](./3-terrarium/solution/README.md) | Penutupan JavaScript, manipulasi DOM | Bangunkan JavaScript untuk menjadikan terrarium berfungsi sebagai antara muka seret/lepas, fokus pada penutupan dan manipulasi DOM | [Penutupan JavaScript, manipulasi DOM](./3-terrarium/3-intro-to-DOM-and-closures/README.md) | Jen |
| 11 | [Permainan Mengetik](./4-typing-game/solution/README.md) | Membangun Permainan Mengetik | Pelajari cara menggunakan acara papan kekunci untuk menggerakkan logik aplikasi JavaScript anda | [Pengaturcaraan Berpandukan Acara](./4-typing-game/typing-game/README.md) | Christopher |
| 12 | [Sambungan Pelayar Hijau](./5-browser-extension/solution/README.md) | Bekerja dengan Pelayar | Pelajari bagaimana pelayar berfungsi, sejarahnya, dan cara membina elemen pertama sambungan pelayar | [Mengenai Pelayar](./5-browser-extension/1-about-browsers/README.md) | Jen |
| 13 | [Sambungan Pelayar Hijau](./5-browser-extension/solution/README.md) | Membina borang, memanggil API dan menyimpan pembolehubah dalam storan lokal | Bina elemen JavaScript sambungan pelayar anda untuk memanggil API menggunakan pembolehubah yang disimpan dalam storan lokal | [API, Borang, dan Storan Lokal](./5-browser-extension/2-forms-browsers-local-storage/README.md) | Jen |
| 14 | [Sambungan Pelayar Hijau](./5-browser-extension/solution/README.md) | Proses latar belakang dalam pelayar, prestasi web | Gunakan proses latar belakang pelayar untuk mengurus ikon sambungan; pelajari tentang prestasi web dan beberapa pengoptimuman | [Tugas Latar Belakang dan Prestasi](./5-browser-extension/3-background-tasks-and-performance/README.md) | Jen |
| 15 | [Permainan Angkasa](./6-space-game/solution/README.md) | Pembangunan Permainan Lebih Lanjutan dengan JavaScript | Pelajari tentang Pewarisan menggunakan Kelas dan Komposisi serta corak Pub/Sub, sebagai persiapan untuk membina permainan | [Pengenalan Kepada Pembangunan Permainan Lanjutan](./6-space-game/1-introduction/README.md) | Chris |
| 16 | [Permainan Angkasa](./6-space-game/solution/README.md) | Melukis pada kanvas | Pelajari tentang API Canvas, yang digunakan untuk melukis elemen ke skrin | [Melukis Pada Kanvas](./6-space-game/2-drawing-to-canvas/README.md) | Chris |
| 17 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menggerakkan elemen di sekitar skrin | Temui cara elemen boleh bergerak menggunakan koordinat kartesian dan API Canvas | [Menggerakkan Elemen](./6-space-game/3-moving-elements-around/README.md) | Chris |
| 18 | [Permainan Angkasa](./6-space-game/solution/README.md) | Pengesanan perlanggaran | Buat elemen bertembung dan bertindak balas antara satu sama lain menggunakan kekunci dan sediakan fungsi penyejukan untuk memastikan prestasi permainan | [Pengesanan Perlanggaran](./6-space-game/4-collision-detection/README.md) | Chris |
| 19 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menjaga skor | Lakukan pengiraan matematik berdasarkan status dan prestasi permainan | [Menjaga Skor](./6-space-game/5-keeping-score/README.md) | Chris |
| 20 | [Permainan Angkasa](./6-space-game/solution/README.md) | Menamat dan memulakan semula permainan | Pelajari tentang menamatkan dan memulakan semula permainan, termasuk membersihkan aset dan menetapkan semula nilai pembolehubah | [Keadaan Tamat](./6-space-game/6-end-condition/README.md) | Chris |
| 21 | [Apl Perbankan](./7-bank-project/solution/README.md) | Template HTML dan Laluan dalam Aplikasi Web | Pelajari cara mencipta struktur antara muka laman web berbilang halaman menggunakan laluan dan template HTML | [Template HTML dan Laluan](./7-bank-project/1-template-route/README.md) | Yohan |
| 22 | [Apl Perbankan](./7-bank-project/solution/README.md) | Membangun Borang Log Masuk dan Pendaftaran | Pelajari tentang membina borang dan menangani rutin pengesahan | [Borang](./7-bank-project/2-forms/README.md) | Yohan |
| 23 | [Apl Perbankan](./7-bank-project/solution/README.md) | Kaedah Mengambil dan Menggunakan Data | Cara data mengalir masuk dan keluar dari aplikasi anda, cara mendapatkannya, menyimpannya, dan membuangnya | [Data](./7-bank-project/3-data/README.md) | Yohan |
| 24 | [Apl Perbankan](./7-bank-project/solution/README.md) | Konsep Pengurusan Keadaan | Pelajari bagaimana aplikasi anda mengekalkan keadaan dan cara menguruskannya secara programatik | [Pengurusan Keadaan](./7-bank-project/4-state-management/README.md) | Yohan |
| 25 | [Kod Penyemak Imbas/VScode](../../8-code-editor) | Bekerja dengan VScode | Pelajari cara menggunakan penyunting kod| [Gunakan Penyunting Kod VScode](./8-code-editor/1-using-a-code-editor/README.md) | Chris |
| 26 | [Pembantu AI](./9-chat-project/README.md) | Bekerja dengan AI | Pelajari cara membina pembantu AI anda sendiri | [Projek Pembantu AI](./9-chat-project/README.md) | Chris |
## 🏫 Pedagogi
Kurikulum kami direka dengan dua prinsip pedagogi utama:
Kurikulum kami direka dengan dua prinsip pedagogi utama dalam fikiran:
* pembelajaran berasaskan projek
* kuiz yang kerap
Program ini mengajar asas JavaScript, HTML, dan CSS, serta alat dan teknik terkini yang digunakan oleh pembangun web masa kini. Pelajar akan berpeluang untuk mendapatkan pengalaman praktikal dengan membina permainan menaip, terrarium maya, pelanjutan pelayar mesra alam, permainan gaya penyerang angkasa, dan aplikasi perbankan untuk perniagaan. Menjelang akhir siri ini, pelajar akan memperoleh pemahaman yang kukuh tentang pembangunan web.
Program ini mengajar asas JavaScript, HTML, dan CSS, serta alat dan teknik terkini yang digunakan oleh pembangun web hari ini. Pelajar akan berpeluang mengembangkan pengalaman praktikal dengan membina permainan menaip, terrarium maya, sambungan pelayar mesra alam, permainan bergaya penyerang angkasa, dan aplikasi perbankan untuk perniagaan. Pada akhir siri ini, pelajar akan memperoleh pemahaman yang kukuh tentang pembangunan web.
> 🎓 Anda boleh mengambil beberapa pelajaran pertama dalam kurikulum ini sebagai [Learn Path](https://docs.microsoft.com/learn/paths/web-development-101/?WT.mc_id=academic-77807-sagibbon) di Microsoft Learn!
> 🎓 Anda boleh mengambil beberapa pelajaran pertama dalam kurikulum ini sebagai [Jalur Pembelajaran](https://docs.microsoft.com/learn/paths/web-development-101/?WT.mc_id=academic-77807-sagibbon) di Microsoft Learn!
Dengan memastikan kandungan selaras dengan projek, proses pembelajaran menjadi lebih menarik bagi pelajar dan pengekalan konsep akan dipertingkatkan. Kami juga menulis beberapa pelajaran permulaan dalam asas JavaScript untuk memperkenalkan konsep, digabungkan dengan video daripada koleksi tutorial video "[Beginners Series to: JavaScript](https://channel9.msdn.com/Series/Beginners-Series-to-JavaScript/?WT.mc_id=academic-77807-sagibbon)", beberapa penulisnya menyumbang kepada kurikulum ini.
Dengan memastikan kandungan sejajar dengan projek, proses ini dibuat lebih menarik untuk pelajar dan pengekalan konsep akan dipertingkatkan. Kami juga menulis beberapa pelajaran permulaan dalam asas JavaScript untuk memperkenalkan konsep, dipadankan dengan video dari koleksi tutorial video "[Siri Pemula kepada: JavaScript](https://channel9.msdn.com/Series/Beginners-Series-to-JavaScript/?WT.mc_id=academic-77807-sagibbon)", beberapa pengarangnya menyumbang kepada kurikulum ini.
Selain itu, kuiz berisiko rendah sebelum kelas menetapkan niat pelajar untuk mempelajari topik, manakala kuiz kedua selepas kelas memastikan pengekalan yang lebih lanjut. Kurikulum ini direka untuk fleksibel dan menyeronokkan dan boleh diambil secara keseluruhan atau sebahagian. Projek bermula kecil dan menjadi semakin kompleks menjelang akhir kitaran 12 minggu.
Selain itu, kuiz berisiko rendah sebelum kelas menetapkan niat pelajar untuk belajar sesuatu topik, manakala kuiz kedua selepas kelas memastikan pengekalan lanjut. Kurikulum ini direka untuk menjadi fleksibel dan menyeronokkan dan boleh diambil secara keseluruhan atau sebahagian. Projek bermula kecil dan menjadi semakin kompleks pada akhir kitaran 12 minggu.
Walaupun kami sengaja mengelakkan memperkenalkan rangka kerja JavaScript untuk menumpukan pada kemahiran asas yang diperlukan sebagai pembangun web sebelum mengguna pakai rangka kerja, langkah seterusnya yang baik selepas melengkapkan kurikulum ini adalah belajar tentang Node.js melalui koleksi video lain: "[Beginner Series to: Node.js](https://channel9.msdn.com/Series/Beginners-Series-to-Nodejs/?WT.mc_id=academic-77807-sagibbon)".
Walaupun kami sengaja mengelakkan memperkenalkan rangka kerja JavaScript untuk memfokus pada kemahiran asas yang diperlukan sebagai pembangun web sebelum mengguna pakai rangka kerja, langkah seterusnya yang baik untuk melengkapkan kurikulum ini adalah mempelajari tentang Node.js melalui koleksi video lain: "[Siri Pemula kepada: Node.js](https://channel9.msdn.com/Series/Beginners-Series-to-Nodejs/?WT.mc_id=academic-77807-sagibbon)".
> Lawati [Kod Etika](CODE_OF_CONDUCT.md) dan panduan [Menyumbang](CONTRIBUTING.md) kami. Kami mengalu-alukan maklum balas membina anda!
> Lawati [Kod Etika](CODE_OF_CONDUCT.md) dan panduan [Sumbangan](CONTRIBUTING.md) kami. Kami mengalu-alukan maklum balas membina anda!
## 🧭 Akses Luar Talian
## 🧭 Akses luar talian
Anda boleh menjalankan dokumentasi ini secara luar talian dengan menggunakan [Docsify](https://docsify.js.org/#/). Fork repo ini, [pasang Docsify](https://docsify.js.org/#/quickstart) pada mesin tempatan anda, dan kemudian dalam folder root repo ini, taip `docsify serve`. Laman web akan disediakan pada port 3000 di localhost anda: `localhost:3000`.
Anda boleh menjalankan dokumentasi ini tanpa sambungan internet dengan menggunakan [Docsify](https://docsify.js.org/#/). Fork repositori ini, [pasang Docsify](https://docsify.js.org/#/quickstart) pada mesin tempatan anda, dan kemudian di dalam folder akar repositori ini, taip `docsify serve`. Laman web akan dihidangkan pada port 3000 pada localhost anda: `localhost:3000`.
## 📘 PDF
PDF semua pelajaran boleh didapati [di sini](https://microsoft.github.io/Web-Dev-For-Beginners/pdf/readme.pdf).
PDF bagi semua pelajaran boleh didapati [di sini](https://microsoft.github.io/Web-Dev-For-Beginners/pdf/readme.pdf).
## 🎒 Kursus Lain
Pasukan kami menghasilkan kursus lain! Lihat:
<!-- CO-OP TRANSLATOR OTHER COURSES START -->
### LangChain
[![LangChain4j untuk Pemula](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners)
[![LangChain.js untuk Pemula](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners)
[![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
---
### Azure / Edge / MCP / Ejen
[![AZD untuk Pemula](https://img.shields.io/badge/AZD%20untuk%20Pemula-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Edge AI untuk Pemula](https://img.shields.io/badge/Edge%20AI%20untuk%20Pemula-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![MCP untuk Pemula](https://img.shields.io/badge/MCP%20untuk%20Pemula-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Ejen AI untuk Pemula](https://img.shields.io/badge/Ejen%20AI%20untuk%20Pemula-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI Agents for Beginners](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Siri AI Generatif
[![AI Generatif untuk Pemula](https://img.shields.io/badge/AI%20Generatif%20untuk%20Pemula-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (.NET)](https://img.shields.io/badge/AI%20Generatif%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (Java)](https://img.shields.io/badge/AI%20Generatif%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[![AI Generatif (JavaScript)](https://img.shields.io/badge/AI%20Generatif%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
[![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[![Generative AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
---
### Pembelajaran Teras
[![ML untuk Pemula](https://img.shields.io/badge/ML%20untuk%20Pemula-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[![Sains Data untuk Pemula](https://img.shields.io/badge/Sains%20Data%20untuk%20Pemula-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[![AI untuk Pemula](https://img.shields.io/badge/AI%20untuk%20Pemula-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[![Keselamatan Siber untuk Pemula](https://img.shields.io/badge/Keselamatan%20Siber%20untuk%20Pemula-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[![Pembangunan Web untuk Pemula](https://img.shields.io/badge/Pembangunan%20Web%20untuk%20Pemula-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[![IoT untuk Pemula](https://img.shields.io/badge/IoT%20untuk%20Pemula-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[![Pembangunan XR untuk Pemula](https://img.shields.io/badge/Pembangunan%20XR%20untuk%20Pemula-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
[![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Siri Copilot
[![Copilot untuk Pengaturcaraan Berpasangan AI](https://img.shields.io/badge/Copilot%20untuk%20Pengaturcaraan%20Berpasangan%20AI-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[![Copilot untuk C#/.NET](https://img.shields.io/badge/Copilot%20untuk%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
[![Pengembaraan Copilot](https://img.shields.io/badge/Pengembaraan%20Copilot-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst)
[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst)
<!-- CO-OP TRANSLATOR OTHER COURSES END -->
## Mendapatkan Bantuan
Jika anda menghadapi kesukaran atau mempunyai sebarang soalan tentang membina aplikasi AI, sertai pelajar lain dan pembangun berpengalaman dalam perbincangan tentang MCP. Ia adalah komuniti yang menyokong di mana soalan dialu-alukan dan pengetahuan dikongsi secara bebas.
Jika anda tersekat atau mempunyai sebarang pertanyaan mengenai membina aplikasi AI. Sertai pelajar lain dan pembangun berpengalaman dalam perbincangan tentang MCP. Ia adalah komuniti yang menyokong di mana soalan dialu-alukan dan pengetahuan dikongsi secara bebas.
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
Jika anda mempunyai maklum balas produk atau menghadapi ralat semasa membina, lawati:
Jika anda mempunyai maklum balas produk atau ralat semasa membina, lawati:
[![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum)
@ -264,5 +275,5 @@ Repositori ini dilesenkan di bawah lesen MIT. Lihat fail [LICENSE](../../LICENSE
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya perlu dianggap sebagai sumber yang sahih. Untuk maklumat penting, disarankan terjemahan profesional oleh manusia. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -42,10 +42,10 @@ Kurikulum ini termasuk pakej yang boleh diimport untuk aliran kerja LMS yang bia
- Moodle Cloud mempunyai sokongan Common Cartridge yang terhad. Lebih baik gunakan fail Moodle di atas, yang juga boleh dimuat naik ke Canvas.
- Selepas import, semak modul, tarikh akhir, dan tetapan kuiz untuk disesuaikan dengan jadual penggal anda.
![Moodle](../../translated_images/moodle.94eb93d714a50cb2c97435b408017dee224348b61bc86203ffd43a4f4e57b95f.ms.png)
![Moodle](../../translated_images/moodle.94eb93d714a50cb2.ms.png)
> Kurikulum dalam kelas Moodle
![Canvas](../../translated_images/canvas.fbd605ff8e5b8aff567d398528ce113db304446b90b9cad55c654de3fdfcda34.ms.png)
![Canvas](../../translated_images/canvas.fbd605ff8e5b8aff.ms.png)
> Kurikulum dalam Canvas
### Penggunaan repositori secara langsung (tanpa Classroom)

File diff suppressed because it is too large Load Diff

@ -1,27 +1,43 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d0092f6533ae3ec3adad5b5ece68efaf",
"translation_date": "2025-10-24T19:09:52+00:00",
"original_hash": "672b0bb6e8b431075f3bdb7130590d2d",
"translation_date": "2026-01-07T01:25:08+00:00",
"source_file": "2-js-basics/1-data-types/README.md",
"language_code": "sw"
}
-->
# Misingi ya JavaScript: Aina za Data
![Misingi ya JavaScript - Aina za Data](../../../../translated_images/webdev101-js-datatypes.4cc470179730702c756480d3ffa46507f746e5975ebf80f99fdaaf1cff09a7f4.sw.png)
![Misingi ya JavaScript - Aina za data](../../../../translated_images/webdev101-js-datatypes.4cc470179730702c.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
Aina za data ni mojawapo ya dhana za msingi katika JavaScript ambazo utazikuta katika kila programu unayoandika. Fikiria aina za data kama mfumo wa kuhifadhi unaotumiwa na maktaba za kale huko Alexandria walikuwa na sehemu maalum za kuhifadhi maandiko ya mashairi, hesabu, na historia. JavaScript hupanga taarifa kwa njia sawa na hiyo kwa kutumia makundi tofauti kwa aina tofauti za data.
Katika somo hili, tutachunguza aina za msingi za data zinazofanya JavaScript ifanye kazi. Utajifunza jinsi ya kushughulikia namba, maandishi, thamani za kweli/siyo kweli, na kuelewa kwa nini kuchagua aina sahihi ni muhimu kwa programu zako. Dhana hizi zinaweza kuonekana ngumu mwanzoni, lakini kwa mazoezi, zitakuwa rahisi kuelewa.
Kuelewa aina za data kutafanya kila kitu kingine katika JavaScript kuwa wazi zaidi. Kama vile wasanifu majengo wanavyohitaji kuelewa vifaa tofauti vya ujenzi kabla ya kujenga kanisa kuu, misingi hii itasaidia kila kitu unachojenga baadaye.
## Jaribio la Kabla ya Somo
[Jaribio la kabla ya somo](https://ff-quizzes.netlify.app/web/)
Somo hili linashughulikia misingi ya JavaScript, lugha inayotoa mwingiliano kwenye wavuti.
```mermaid
journey
title Safari Yako ya Aina za Data za JavaScript
section Msingi
Vigezo & Thamani Dumu: 5: You
Muundo wa Tangazo: 4: You
Dhana za Uteuzi: 5: You
section Aina Kuu
Nambari & Hisabati: 4: You
Mitindo & Maandishi: 5: You
Booleans & Mantiki: 4: You
section Tumia Maarifa
Ubadilishaji Aina: 4: You
Mifano Halisi: 5: You
Mbinu Bora: 5: You
```
Aina za data ni mojawapo ya dhana za msingi katika JavaScript ambazo utakutana nazo katika kila programu unayoandika. Fikiria aina za data kama mfumo wa kuhifadhi uliotumiwa na maktaba za zamani huko Alexandria walikuwa na sehemu maalum za mikokoteni yenye shairi, hisabati, na kumbukumbu za kihistoria. JavaScript huandaa taarifa kwa njia kama hiyo kwa makundi tofauti ya aina tofauti za data.
Katika somo hili, tutaangazia aina nyeti za data zinazofanya JavaScript ifanye kazi. Utajifunza jinsi ya kushughulikia nambari, maandishi, thamani za kweli/sifuri, na kuelewa kwa nini kuchagua aina sahihi ni muhimu kwa programu zako. Dhana hizi zinaweza kuonekana kuwa za dhahania mwanzoni, lakini kwa mazoezi, zitakuwa za asili kabisa.
Kuelewa aina za data kutafanya kila kitu kingine katika JavaScript kuwa wazi zaidi. Kama wahandisi wa majengo wanavyohitaji kuelewa vifaa tofauti kabla ya kujenga kanisa kuu, misingi hii itasaidia kila kitu utakachojenga baadaye.
## Mtihani wa Kabla ya Mada
[Mtihani wa kabla ya mada](https://ff-quizzes.netlify.app/web/)
Somo hili linahusu misingi ya JavaScript, lugha inayotoa mwingiliano kwenye wavuti.
> Unaweza kuchukua somo hili kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-variables/?WT.mc_id=academic-77807-sagibbon)!
@ -29,295 +45,574 @@ Somo hili linashughulikia misingi ya JavaScript, lugha inayotoa mwingiliano kwen
[![Data Types in JavaScript](https://img.youtube.com/vi/AWfA95eLdq8/0.jpg)](https://youtube.com/watch?v=AWfA95eLdq8 "Data Types in JavaScript")
> 🎥 Bonyeza picha hapo juu kwa video kuhusu variables na aina za data
Tuanzie na variables na aina za data zinazojaza ndani yake!
## Variables
Variables ni sehemu za msingi za programu. Kama vile mitungi yenye lebo ambayo wataalamu wa alkemia wa enzi za kati walitumia kuhifadhi vitu tofauti, variables hukuruhusu kuhifadhi taarifa na kuipa jina la kuelezea ili uweze kuitumia baadaye. Unahitaji kukumbuka umri wa mtu? Hifadhi kwenye variable inayoitwa `age`. Unataka kufuatilia jina la mtumiaji? Hifadhi kwenye variable inayoitwa `userName`.
Tutazingatia mbinu za kisasa za kuunda variables katika JavaScript. Mbinu utakazojifunza hapa zinawakilisha miaka ya mageuzi ya lugha na mazoea bora yaliyotengenezwa na jamii ya programu.
Kuunda na **kutangaza** variable kuna syntax ifuatayo **[keyword] [name]**. Inajumuisha sehemu mbili:
- **Keyword**. Tumia `let` kwa variables zinazoweza kubadilika, au `const` kwa thamani zinazobaki sawa.
- **Jina la variable**, hili ni jina la kuelezea unalochagua mwenyewe.
✅ Keyword `let` ilianzishwa katika ES6 na inatoa variable yako kinachoitwa _block scope_. Inapendekezwa utumie `let` au `const` badala ya keyword ya zamani `var`. Tutashughulikia block scopes kwa undani zaidi katika sehemu zijazo.
### Kazi - Kufanya kazi na variables
1. **Tangaza variable**. Hebu tuanze kwa kuunda variable yetu ya kwanza:
> 🎥 Bonyeza picha zilizo juu kwa video kuhusu vigezo na aina za data
Tuanze na vigezo na aina za data zinazojaza!
```mermaid
mindmap
root((Data za JavaScript))
Variables
let myVar
const PI = 3.14
var oldStyle
Primitive Types
number
42
3.14
-5
string
"Hello"
'Dunia'
`Kiolezo`
boolean
kweli
uongo
undefined
null
Operations
Arithmetic
+ - * / %
String Methods
uunganishaji
herufi za kiolezo
Type Conversion
ya siri
waziwazi
```
## Vigezo
Vigezo ni vipengele vya msingi katika programu. Kama chupa zilizo lebo zilizotumika na wananayotajiri wa karne za kati kuhifadhi vitu mbalimbali, vigezo hukuruhusu kuhifadhi taarifa na kutoa jina la kuelezea ili uziwekeze tena baadaye. Unahitaji kukumbuka umri wa mtu? Hifadhi katika kigezo kinachoitwa `age`. Unataka kufuatilia jina la mtumiaji? Hifadhi kwenye kigezo kinachoitwa `userName`.
Tutazingatia njia ya kisasa ya kuunda vigezo katika JavaScript. Mbinu utakazojifunza hapa zinawakilisha miaka ya maendeleo ya lugha na mbinu bora zilizotengenezwa na jamii ya programu.
Kuunda na **kutangaza** kigezo kuna sintaksia ifuatayo **[keyword] [name]**. Inaundwa na sehemu mbili:
- **Neno kuu (Keyword)**. Tumia `let` kwa vigezo vinavyoweza kubadilika, au `const` kwa thamani zinazoendelea kuwa zile zile.
- **Jina la kigezo**, hili ni jina lenye maelezo unalochagua mwenyewe.
✅ Neno kuu `let` lilianzishwa katika ES6 na linatoa kigezo chako kile kinachoitwa _block scope_. Inapendekezwa utumie `let` au `const` badala ya neno la zamani `var`. Tutaangazia block scopes zaidi kwa kina katika sehemu zijazo.
### Kazi - kufanya kazi na vigezo
1. **Tangaza kigezo**. Tuanze kwa kuunda kigezo chetu cha kwanza:
```javascript
let myVariable;
```
**Hili linalofanikisha:**
- Hii inamuambia JavaScript kuunda sehemu ya kuhifadhi inayoitwa `myVariable`
- JavaScript inapatia nafasi ya kumbukumbu kwa kigezo hiki
- Kigezo kwa sasa hakina thamani (undefined)
**Hii inakamilisha:**
- Hii inaiambia JavaScript kuunda eneo la kuhifadhi linaloitwa `myVariable`
- JavaScript inatenga nafasi kwenye kumbukumbu kwa variable hii
- Variable kwa sasa haina thamani (undefined)
2. **Ipe thamani**. Sasa hebu tuweke kitu kwenye variable yetu:
2. **Mpa thamani**. Sasa tuweke kitu katika kigezo chetu:
```javascript
myVariable = 123;
```
**Jinsi ya kugawa thamani:**
- Operator `=` huagiza thamani 123 kwa kigezo chetu
- Kigezo sasa kina thamani hii badala ya kuwa undefined
- Unaweza kurejelea thamani hii katika msimbo wako ukitumia `myVariable`
**Jinsi ugawaji unavyofanya kazi:**
- Opereta `=` inagawanya thamani ya 123 kwa variable yetu
- Variable sasa ina thamani hii badala ya kuwa undefined
- Unaweza kutumia thamani hii katika msimbo wako ukitumia `myVariable`
> Kumbuka: matumizi ya `=` katika somo hili yanamaanisha tunatumia "operator wa kugawa", inayotumika kuweka thamani kwa kigezo. Hailaani usawa wa thamani.
> Kumbuka: matumizi ya `=` katika somo hili yanamaanisha tunatumia "assignment operator", inayotumika kuweka thamani kwenye variable. Haimaanishi usawa.
3. **Fanya kwa njia bora**. Kwa kweli, hebu tuunganishe hatua hizo mbili:
3. **Fanya kwa njia sahihi**. Kwa kweli, tuunganishe hatua hizo mbili:
```javascript
let myVariable = 123;
```
**Njia hii ni bora zaidi:**
- Unatangaza kigezo na kugawa thamani katika kauli moja
- Hii ni njia ya kawaida miongoni mwa waendelezaji
- Inapunguza urefu wa msimbo huku ikibaki wazi
**Njia hii ni bora zaidi:**
- Unatangaza variable na kugawa thamani kwa kauli moja
- Hii ni mazoea ya kawaida miongoni mwa watengenezaji programu
- Inapunguza urefu wa msimbo huku ikihifadhi uwazi
4. **Badilisha mawazo yako**. Je, ikiwa tunataka kuhifadhi namba tofauti?
4. **Badilisha mawazo**. Ikiwa tutataka kuhifadhi nambari tofauti?
```javascript
myVariable = 321;
```
**Kuelewa kugawanya upya thamani:**
- Kigezo sasa kina 321 badala ya 123
- Thamani ya awali imebadilishwa vigezo huhifadhi thamani moja kwa wakati
- Ubadilishaji huu ndio tabia kuu ya vigezo vilivyotangazwa kwa `let`
✅ Jaribu! Unaweza kuandika JavaScript moja kwa moja kwenye kivinjari chako. Fungua dirisha la kivinjari na nenda kwenye Developer Tools. Katika console, utaona mwaliko; andika `let myVariable = 123`, bonyeza kuingia, kisha andika `myVariable`. Nini kinatokea? Kumbuka, utajifunza zaidi kuhusu dhana hizi katika masomo yajayo.
### 🧠 **Mtiifu wa Vigezo: Kujisikiza Vizuri**
**Tuchunguze jinsi unavyohisi kuhusu vigezo:**
- Unaweza kuelezea tofauti kati ya kutangaza na kugawa thamani ya kigezo?
- Nini kinatokea ikiwa utajaribu kutumia kigezo kabla ya kukitangaza?
- Utachagua lini `let` badala ya `const` kwa kigezo?
```mermaid
stateDiagram-v2
[*] --> Declared: let myVar
Declared --> Assigned: myVar = 123
Assigned --> Reassigned: myVar = 456
Assigned --> [*]: Kigezo tayari!
Reassigned --> [*]: Thamani imeboreshwa
note right of Declared
Kigezo kipo lakini
hakina thamani (haijafafanuliwa)
end note
note right of Assigned
Kigezo kina
thamani 123
end note
```
> **Vidokezo vya haraka**: Fikiria vigezo kama maboksi ya kuhifadhi yenye lebo. Unaunda boksi (`let`), unaweka kitu ndani (`=`), na baadaye unaweza kubadilisha yaliyomo ikiwa ni lazima!
**Kuelewa ugawaji upya:**
- Variable sasa ina thamani ya 321 badala ya 123
- Thamani ya awali inabadilishwa variables huhifadhi thamani moja tu kwa wakati mmoja
- Uwezo huu wa kubadilika ni sifa kuu ya variables zilizotangazwa na `let`
✅ Jaribu! Unaweza kuandika JavaScript moja kwa moja kwenye kivinjari chako. Fungua dirisha la kivinjari na nenda kwenye Developer Tools. Kwenye console, utapata prompt; andika `let myVariable = 123`, bonyeza return, kisha andika `myVariable`. Nini kinatokea? Kumbuka, utajifunza zaidi kuhusu dhana hizi katika masomo yanayofuata.
## Constants
## Visaidizi (Constants)
Wakati mwingine unahitaji kuhifadhi taarifa ambayo haipaswi kubadilika wakati wa utekelezaji wa programu. Fikiria constants kama kanuni za hesabu ambazo Euclid alianzisha huko Ugiriki ya kale mara tu zilipothibitishwa na kuandikwa, zilibaki thabiti kwa marejeleo ya baadaye.
Wakati mwingine unahitaji kuhifadhi taarifa ambazo hazipaswi kubadilika wakati wa utekelezaji wa programu. Fikiria visaidi kama kanuni za kihisabati ambazo Euclid aliwanzisha huko Ugiriki wa kale mara tu zilithibitishwa na kuandikwa, zilibaki thabiti kwa rejeleo zote zijazo.
Constants hufanya kazi sawa na variables, lakini kwa kizuizi muhimu: mara tu unapogawa thamani yao, haiwezi kubadilishwa. Uwezo huu wa kutobadilika husaidia kuzuia mabadiliko ya bahati mbaya kwa thamani muhimu katika programu yako.
Visaidizi hufanya kazi kama vigezo, lakini na kizuizi muhimu: mara unapopewa thamani, haiwezi kubadilishwa. Uisumbufu huu husaidia kuzuia mabadiliko yasiyotakiwa kwa thamani muhimu katika programu yako.
Kutangaza na kuanzisha constant kunafuata dhana sawa na variable, isipokuwa kwa keyword ya `const`. Constants kwa kawaida hutangazwa kwa herufi kubwa zote.
Kutangaza na kuanzisha kisaidizi kunafuata dhana sawa na kigezo, isipokuwa kwa neno kuu `const`. Visaidizi kwa kawaida huandikwa kwa herufi kubwa kabisa.
```javascript
const MY_VARIABLE = 123;
```
**Hiki ndicho msimbo huu unachofanya:**
- **Huunda** kisaidizi kinachoitwa `MY_VARIABLE` chenye thamani 123
- **Hutumia** mtindo wa majina kwa herufi kubwa kwa visaidizi
- **Huzuia** mabadiliko yoyote ya baadaye kwa thamani hii
**Hii inafanya nini:**
- **Inaunda** constant inayoitwa `MY_VARIABLE` yenye thamani ya 123
- **Inatumia** mtindo wa jina la herufi kubwa kwa constants
- **Inazuia** mabadiliko yoyote ya baadaye kwa thamani hii
Visaidizi vina kanuni kuu mbili:
Constants zina sheria kuu mbili:
- **Lazima uwapatie thamani mara moja** visaidizi tupu haviruhusiwi!
- **Haiwezi kubadilishwa thamani hiyo** JavaScript itatoa kosa ikiwa utajaribu. Tazama ninachomaanisha:
- **Lazima uwape thamani mara moja** hakuna constants tupu zinazoruhusiwa!
- **Huwezi kubadilisha thamani hiyo** JavaScript itatoa kosa ukijaribu. Hebu tuone ninachomaanisha:
**Thamani rahisi** - Ifuatayo HAIRUHUSIWI:
**Thamani rahisi** - Ifuatayo haikubaliki:
```javascript
const PI = 3;
PI = 4; // haikubaliki
PI = 4; // hairuhusiwi
```
**Unachohitaji kukumbuka:**
- **Jaribio** la kugawa upya constant litasababisha kosa
- **Inalinda** thamani muhimu dhidi ya mabadiliko ya bahati mbaya
- **Inahakikisha** thamani inabaki thabiti katika programu yako
**Rejeleo la kitu linalindwa** - Ifuatayo haikubaliki:
**Kile unachopaswa kukumbuka:**
- **Jaribio** la kugawanya upya kisaidizi husababisha kosa
- **Hulinda** thamani muhimu kutokana na mabadiliko yasiyotakiwa
- **Hakikisha** thamani inabaki kuwa sawa katika programu yako
**Kuhifadhi rejeleo la kitu** - Ifuatayo HAIRUHUSIWI:
```javascript
const obj = { a: 3 };
obj = { b: 5 } // haikubaliki
obj = { b: 5 } // hairuhusiwi
```
**Kuelewa dhana hizi:**
- **Inazuia** kubadilisha kitu kizima na kipya
- **Inalinda** rejeleo la kitu cha awali
- **Inahifadhi** utambulisho wa kitu kwenye kumbukumbu
**Kuelewa dhana hizi:**
- **Huzuia** kubadilisha kitu kizima kwa kipya
- **Hulinda** rejeleo la kitu cha awali
- **Hudumisha** utambulisho wa kitu kwenye kumbukumbu
**Thamani ya kitu haileveriwi** - Ifuatayo INARUHUSIWA:
**Thamani ya kitu haijalindwa** - Ifuatayo inakubalika:
```javascript
const obj = { a: 3 };
obj.a = 5; // inakubalika
obj.a = 5; // inaruhusiwa
```
**Kufafanua kinachotokea hapa:**
- **Inabadilisha** thamani ya mali ndani ya kitu
- **Inahifadhi** rejeleo la kitu kile kile
- **Inaonyesha** kuwa maudhui ya kitu yanaweza kubadilika huku rejeleo likibaki thabiti
**Maelezo ya kile kinachotokea hapa:**
- **Hubadilisha** thamani ya mali ndani ya kitu
- **Hushikilia** rejeleo sawa la kitu
- **Inaonyesha** kuwa yaliyomo kwenye kitu yanaweza kubadilika huku rejeleo likiendelea thabiti
> Kumbuka, `const` inamaanisha kuwa rejeleo linalindwa dhidi ya kugawa upya. Hata hivyo, thamani si _thabiti_ na inaweza kubadilika, hasa ikiwa ni muundo tata kama kitu.
> Kumbuka, `const` inamaanisha rejeleo linahifadhiwa dhidi ya kugawanywa upya. Thamani si _isiyobadilika_ na inaweza kubadilika, hasa kama ni muundo tata kama kitu.
## Aina za Data
JavaScript hupanga taarifa katika makundi tofauti yanayoitwa aina za data. Dhana hii inafanana na jinsi wasomi wa kale walivyopanga maarifa Aristotle alitofautisha kati ya aina tofauti za hoja, akijua kuwa kanuni za mantiki haziwezi kutumika kwa usawa kwa mashairi, hesabu, na falsafa ya asili.
JavaScript huandaa taarifa katika makundi tofauti yanayojulikana kama aina za data. Dhana hii inafanana na jinsi wasomi wa zamani walivyogawa maarifa Aristotle alitofautisha aina tofauti za hoja, akijua kwamba kanuni za mantiki haziwezi kutumika sawa katika shairi, hisabati, na filosofia ya asili.
Aina za data ni muhimu kwa sababu operesheni tofauti hufanya kazi na aina tofauti za taarifa. Kama vile huwezi kufanya hesabu kwa jina la mtu au kupanga alfabeti kwa mlinganyo wa hesabu, JavaScript inahitaji aina sahihi ya data kwa kila operesheni. Kuelewa hili kunazuia makosa na hufanya msimbo wako kuwa wa kuaminika zaidi.
Aina za data ni muhimu kwa sababu shughuli tofauti hufanya kazi na aina tofauti za taarifa. Kama huwezi kufanya hisabati kwa jina la mtu au kupanga kwa alfabeti hesabu ya hisabati, JavaScript inahitaji aina sahihi ya data kwa kila operesheni. Kuelewa hili huzuia makosa na kufanya msimbo wako kuwa imara zaidi.
Variables zinaweza kuhifadhi aina nyingi tofauti za thamani, kama namba na maandishi. Aina hizi mbalimbali za thamani zinajulikana kama **aina za data**. Aina za data ni sehemu muhimu ya maendeleo ya programu kwa sababu husaidia watengenezaji kufanya maamuzi kuhusu jinsi msimbo unavyopaswa kuandikwa na jinsi programu inavyopaswa kufanya kazi. Zaidi ya hayo, baadhi ya aina za data zina sifa za kipekee zinazosaidia kubadilisha au kutoa taarifa ya ziada katika thamani.
Vigezo vinaweza kuhifadhi aina mbalimbali za thamani, kama nambari na maandishi. Aina hizi mbalimbali zinajulikana kama **aina ya data**. Aina za data ni sehemu muhimu ya maendeleo ya programu kwa sababu husaidia waendelezaji kufanya maamuzi jinsi msimbo unavyopaswa kuandikwa na programu inavyopaswa kuendeshwa. Zaidi ya hayo, baadhi ya aina za data zina sifa za kipekee zinazosaidia kubadilisha au kutoa taarifa zaidi katika thamani.
✅ Aina za Data pia hujulikana kama primitives za data za JavaScript, kwa kuwa ni aina za data za kiwango cha chini kabisa zinazotolewa na lugha. Kuna aina 7 za msingi za data: string, number, bigint, boolean, undefined, null na symbol. Chukua dakika moja kufikiria kila moja ya hizi inawakilisha nini. Je, `zebra` ni nini? Vipi kuhusu `0`? `true`?
✅ Aina za Data pia huitwa data primitives za JavaScript, kwa kuwa ni aina za data za ngazi ya chini kabisa zinazotolewa na lugha. Kuna aina 7 za primitive: string, number, bigint, boolean, undefined, null, na symbol. Chukua dakika kufikiria kinachoweza kuwakilishwa na kila moja ya primitives hizi. `zebra` ni nini? Vipi kuhusu `0`? `true`?
### Namba
### Nambari
Namba ni aina ya data rahisi zaidi katika JavaScript. Ikiwa unafanya kazi na namba kamili kama 42, desimali kama 3.14, au namba hasi kama -5, JavaScript inazishughulikia kwa njia sawa.
Nambari ni aina ya data rahisi zaidi katika JavaScript. Iwapo unatumia nambari kamili kama 42, desimali kama 3.14, au nambari hasi kama -5, JavaScript hufanya kazi nao sawia.
Kumbuka variable yetu kutoka awali? Ile 123 tuliyohifadhi ilikuwa kweli aina ya data ya namba:
Kumbuka kigezo chetu cha awali? Hiyo 123 tuliyoihifadhi ilikuwa aina ya nambari:
```javascript
let myVariable = 123;
```
**Sifa kuu:**
- JavaScript hutambua moja kwa moja thamani za nambari
- Unaweza kufanya operesheni za kihisabati kwa vigezo hivi
- Hakuna haja ya kutangaza aina rasmi
Vigezo vinaweza kuhifadhi aina zote za nambari, ikiwemo desimali au nambari hasi. Nambari pia zinaweza kutumika na waendeshaji wa kihisabati, waliodhihirishwa katika [sehemu inayofuata](../../../../2-js-basics/1-data-types).
```mermaid
flowchart LR
A["🔢 Nambari"] --> B[" Ujumlisho"]
A --> C[" Utoaji"]
A --> D["✖️ Kuzidisha"]
A --> E["➗ Kugawanya"]
A --> F["📊 Salio %"]
B --> B1["1 + 2 = 3"]
C --> C1["5 - 3 = 2"]
D --> D1["4 * 3 = 12"]
E --> E1["10 / 2 = 5"]
F --> F1["7 % 3 = 1"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
### Waendeshaji wa Kihisabati
**Sifa kuu:**
- JavaScript inatambua thamani za namba moja kwa moja
- Unaweza kufanya operesheni za hesabu na variables hizi
- Hakuna hitaji la kutangaza aina ya data waziwazi
Waendeshaji wa kihisabati wanakuwezesha kufanya mahesabu ya kihisabati katika JavaScript. Waendeshaji hawa hufuata kanuni zile zile zilizotumika na waandishi wa hisabati kwa karne nyingi alama zile zile zilizojitokeza katika kazi za wasomi kama Al-Khwarizmi, aliyebuni noti za aljebra.
Variables zinaweza kuhifadhi aina zote za namba, ikiwa ni pamoja na desimali au namba hasi. Namba pia zinaweza kutumika na opereta za hesabu, zilizofunikwa katika [sehemu inayofuata](../../../../2-js-basics/1-data-types).
Waendeshaji hufanya kazi kama unavyotarajia kutoka kwa hisabati ya jadi: ongeza kwa kuongeza, toa kwa kutoa, na kadhalika.
### Opereta za Hesabu
Kuna aina kadhaa za waendeshaji za kutumia wakati wa kufanya kazi za kihisabati, na baadhi yao yamo hapa:
Opereta za hesabu hukuruhusu kufanya mahesabu ya kihesabu katika JavaScript. Opereta hizi hufuata kanuni zile zile ambazo wanahisabati wametumia kwa karne nyingi alama zile zile zilizotokea katika kazi za wasomi kama Al-Khwarizmi, aliyebuni noti za algebra.
| Alama | Maelezo | Mfano |
| ------| ----------------------------------------------------------------------| -----------------------------|
| `+` | **Ujumlishaji**: Huhesabu jumla ya nambari mbili | `1 + 2 //jibu linatarajiwa ni 3` |
| `-` | **Tofauti**: Huhesabu tofauti ya nambari mbili | `1 - 2 //jibu linatarajiwa ni -1` |
| `*` | **Mnozalishaji**: Huhesabu bidhaa ya nambari mbili | `1 * 2 //jibu linatarajiwa ni 2` |
| `/` | **Mgawanyiko**: Huhesabu sehemu ya nambari mbili | `1 / 2 //jibu linatarajiwa ni 0.5`|
| `%` | **Baki**: Huhesabu mabaki kutoka mgawanyiko wa nambari mbili | `1 % 2 //jibu linatarajiwa ni 1` |
Opereta hufanya kazi kama unavyotarajia kutoka kwa hesabu za jadi: plus kwa kuongeza, minus kwa kutoa, na kadhalika.
✅ Jaribu! Jaribu kufanya operesheni ya kihisabati kwenye console ya kivinjari chako. Je, matokeo yanakushangaza?
Kuna aina kadhaa za opereta za kutumia wakati wa kufanya kazi za hesabu, na baadhi yao yameorodheshwa hapa:
### 🧮 **Jaribu Uwezo wa Hisabati: Kuhesabu kwa Kujiamini**
| Alama | Maelezo | Mfano |
| ------ | ------------------------------------------------------------------------ | -------------------------------- |
| `+` | **Kuongeza**: Inahesabu jumla ya namba mbili | `1 + 2 //jibu linalotarajiwa ni 3` |
| `-` | **Kutoa**: Inahesabu tofauti ya namba mbili | `1 - 2 //jibu linalotarajiwa ni -1` |
| `*` | **Kuzidisha**: Inahesabu bidhaa ya namba mbili | `1 * 2 //jibu linalotarajiwa ni 2` |
| `/` | **Kugawanya**: Inahesabu mgawanyiko wa namba mbili | `1 / 2 //jibu linalotarajiwa ni 0.5` |
| `%` | **Salio**: Inahesabu salio kutoka kwa mgawanyiko wa namba mbili | `1 % 2 //jibu linalotarajiwa ni 1` |
**Jaribu uelewa wako wa hisabati:**
- Tofautisha kati ya `/` (mgawanyiko) na `%` (baki)?
- Unaweza kutabiri nini `10 % 3` ni sawa na? (Kibukizi: sio 3.33...)
- Kwa nini operator wa baki unaweza kuwa na manufaa kwa programu?
✅ Jaribu! Jaribu operesheni ya hesabu kwenye console ya kivinjari chako. Je, matokeo yanakushangaza?
```mermaid
pie title "Matumizi ya Operesheni za Nambari za JavaScript"
"Mkusanyo (+)" : 35
"Tofauti (-)" : 20
"Mnozina (*)" : 20
"Mgawanyiko (/)" : 15
"Mabaki (%)" : 10
```
> **Maelezo ya dunia halisi**: Operator wa baki (%) ni muhimu sana kuchunguza kama nambari ni hata/idaha, kutengeneza mifumo, au kuzunguka kwenye arrays!
### Strings
### Mionesho (Strings)
Katika JavaScript, data ya maandishi inawakilishwa kama strings. Neno "string" linatokana na dhana ya herufi zinazounganishwa pamoja kwa mpangilio, kama vile waandishi wa maandishi katika monasteri za enzi za kati walivyokuwa wakichanganya herufi kuunda maneno na sentensi katika maandiko yao.
Katika JavaScript, data ya maandishi huonyeshwa kama mionesho. Neno "string" linatoka dhana ya herufi zilizounganishwa mfululizo, kama walivyotumia waandishi wa karne za kati kuunganisha herufi kuunda maneno na sentensi katika nakala zao.
Strings ni muhimu sana katika maendeleo ya wavuti. Kila kipande cha maandishi kinachoonyeshwa kwenye tovuti majina ya watumiaji, lebo za vifungo, ujumbe wa makosa, maudhui hushughulikiwa kama data ya string. Kuelewa strings ni muhimu kwa kuunda interfaces za watumiaji zinazofanya kazi.
Mionesho ni msingi wa maendeleo ya wavuti. Kila kipande cha maandishi kinachoonyeshwa kwenye tovuti majina ya watumiaji, lebo za vitufe, ujumbe wa makosa, maudhui hutunzwa kama data ya string. Kuelewa mionesho ni muhimu kwa kuunda sehemu za mtumiaji zenye kazi.
Strings ni seti za herufi zinazokaa kati ya alama za nukta moja au nukta mbili.
Mionesho ni seti za herufi zilizoko kati ya alama za nukuu moja au mbili.
```javascript
'This is a string'
"This is also a string"
let myString = 'This is a string value stored in a variable';
```
**Kuelewa dhana hizi:**
- **Inatumia** nukuu moja `'` au nukuu mbili `"` kufafanua mionesho
- **Huhinidhi** data ya maandishi inayoweza kujumuisha herufi, nambari, na alama
- **Huagiza** thamani ya mionesho kwa vigezo kwa matumizi baadaye
- **Inahitaji** nukuu kutofautisha maandishi na majina ya vigezo
Kumbuka kutumia nukuu unapoongeza string, vinginevyo JavaScript itadhani ni jina la kigezo.
```mermaid
flowchart TD
A["📝 Mifano ya Mishale"] --> B["Nukuu Moja"]
A --> C["Nukuu Mbili"]
A --> D["Mifano ya Kiolezo"]
B --> B1["'Habari Dunia'"]
C --> C1["\"Habari Dunia\""]
D --> D1["`Habari \${name}`"]
E["Uendeshaji wa Mifano"] --> F["Uunganishaji"]
E --> G["Uingiza Kiolezo"]
E --> H["Ugumu & Mbinu"]
F --> F1["'Habari' + ' ' + 'Dunia'"]
G --> G1["`Habari \${firstName} \${lastName}`"]
H --> H1["myString.length"]
style A fill:#e3f2fd
style E fill:#fff3e0
style D fill:#e8f5e8
style G fill:#e8f5e8
```
### Kuunda Mionesho
**Kuelewa dhana hizi:**
- **Inatumia** nukta moja `'` au nukta mbili `"` kufafanua strings
- **Inahifadhi** data ya maandishi inayoweza kujumuisha herufi, namba, na alama
- **Inagawa** thamani za string kwa variables kwa matumizi ya baadaye
- **Inahitaji** nukta ili kutofautisha maandishi na majina ya variables
Kumbuka kutumia nukta wakati wa kuandika string, vinginevyo JavaScript itadhani ni jina la variable.
### Kuweka Muundo wa Strings
Ubadilishaji wa strings hukuruhusu kuunganisha vipengele vya maandishi, kuingiza variables, na kuunda maudhui ya kubadilika yanayojibu hali ya programu. Mbinu hii hukuwezesha kuunda maandishi kwa njia ya programu.
Mara nyingi unahitaji kuunganisha strings nyingi pamoja mchakato huu unaitwa concatenation.
Manipulate mionesho hukuwezesha kuunganisha vipengele vya maandishi, kuingiza vigezo, na kuunda maudhui yanayobadilika kulingana na hali ya programu. Mbinu hii inakuwezesha kujenga maandishi kwa njia ya programu.
Ili **kuunganisha** strings mbili au zaidi, au kuziunganisha pamoja, tumia opereta `+`.
Mara nyingi unahitaji kuunganisha mionesho mingi pamoja mchakato huu huitwa concatenation.
Ili **kuunganisha** mnyororo wa herufi mbili au zaidi, au kuziunganisha pamoja, tumia kiendeshaji `+`.
```javascript
let myString1 = "Hello";
let myString2 = "World";
myString1 + myString2 + "!"; //HelloWorld!
myString1 + " " + myString2 + "!"; //Hello World!
myString1 + ", " + myString2 + "!"; //Hello, World!
myString1 + myString2 + "!"; //HaloDunia!
myString1 + " " + myString2 + "!"; //Halo Dunia!
myString1 + ", " + myString2 + "!"; //Halo, Dunia!
```
**Hatua kwa hatua, kinachotokea:**
- **Inaunganisha** strings nyingi kwa kutumia opereta `+`
- **Inaunganisha** strings moja kwa moja bila nafasi katika mfano wa kwanza
- **Inaongeza** nafasi za wahusika `" "` kati ya strings kwa usomaji mzuri
- **Inaingiza** alama za uakifishi kama koma kuunda muundo sahihi
**Hatua kwa hatua, hii ndicho kinachotokea:**
- **Inachanganya** mnyororo wa herufi nyingi kwa kutumia kiendeshaji `+`
- **Inaunda** mnyororo wa herufi moja kwa moja bila nafasi katika mfano wa kwanza
- **Inaongeza** nafasi `" "` kati ya mnyororo kwa usomeji mzuri
- **Inaweka** alama za uamuzi kama vile koma ili kuunda muundo sahihi
✅ Kwa nini `1 + 1 = 2` katika JavaScript, lakini `'1' + '1' = 11?` Fikiria kuhusu hilo. Vipi kuhusu `'1' + 1`?
✅ Kwa nini `1 + 1 = 2` katika JavaScript, lakini `'1' + '1' = 11?` Fikiria. Je, vipi kuhusu `'1' + 1`?
**Template literals** ni njia nyingine ya kuweka muundo wa strings, isipokuwa badala ya nukta, alama ya backtick inatumika. Kitu chochote ambacho si maandishi ya kawaida lazima kiwekwe ndani ya placeholders `${ }`. Hii inajumuisha variables ambazo zinaweza kuwa strings.
**Liturari za templeti** ni njia nyingine ya kuunda mnyororo wa herufi, isipokuwa badala ya nukuu, hutumika alama ya kurudisha nyuma (backtick). Kila kitu ambacho si maandishi ya kawaida lazima kiwe ndani ya sehemu za kuweka thamani `${ }`. Hii ni pamoja na mabadiliko yoyote yanayoweza kuwa mnyororo wa herufi.
```javascript
let myString1 = "Hello";
let myString2 = "World";
`${myString1} ${myString2}!` //Hello World!
`${myString1}, ${myString2}!` //Hello, World!
`${myString1} ${myString2}!` //Hujambo Dunia!
`${myString1}, ${myString2}!` //Hujambo, Dunia!
```
**Hebu tuelewe kila sehemu:**
- **Inatumia** backticks `` ` `` badala ya nukta za kawaida kuunda template literals
- **Inaingiza** variables moja kwa moja kwa kutumia syntax ya placeholder `${}`
**Tuelewee kila sehemu:**
- **Inatumia** alama za kurudisha nyuma `` ` `` badala ya nukuu za kawaida kuunda liturari za templeti
- **Inaingiza** mabadiliko moja kwa moja kwa kutumia muundo wa `${}`
- **Inahifadhi** nafasi na muundo kama ilivyoandikwa
- **Inatoa** njia safi ya kuunda strings ngumu na variables
Unaweza kufanikisha malengo yako ya uundaji kwa kutumia mojawapo ya mbinu hizi, lakini template literals zitaheshimu nafasi na mistari mipya.
- **Inatoa** njia safi ya kuunda mnyororo tata zenye mabadiliko
Unaweza kufanikisha malengo yako ya muundo kwa njia yoyote, lakini liturari za templeti zitaenzi nafasi zote na virukizo vya mistari.
✅ Ni lini ungetumia template literal badala ya string ya kawaida?
✅ Ungetumia lini liturari za templeti badala ya mnyororo wa herufi wa kawaida?
### 🔤 **Ukaguzi wa Uwezo wa Mnyororo wa Herufi: Kujiamini Katika Ubadilishaji wa Maandishi**
**Tathmini ujuzi wako wa mnyororo wa herufi:**
- Je, unaweza kueleza kwa nini `'1' + '1'` ni sawa na `'11'` badala ya `2`?
- Ni njia gani ya mnyororo unayoona ni rahisi kusoma zaidi: kuunganisha au liturari za templeti?
- Nini kinatokea ikiwa utasahau nukuu kuzunguka mnyororo?
```mermaid
stateDiagram-v2
[*] --> PlainText: "Hello"
[*] --> Variable: name = "Alice"
PlainText --> Concatenated: + " " + name
Variable --> Concatenated
PlainText --> Template: `Hello ${name}`
Variable --> Template
Concatenated --> Result: "Hello Alice"
Template --> Result
note right of Concatenated
Njia ya jadi
Zaidi ya maelezo
end note
note right of Template
Sarufi ya kisasa ya ES6
Safi & yenye kusomeka zaidi
end note
```
> **Ushauri wa mtaalamu**: Liturari za templeti kwa kawaida zinapendekezwa kwa ajili ya kuunda mnyororo tata kwa sababu ni rahisi kusoma na zinaweza kushughulikia mistari mingi kwa ufanisi!
### Booleans
### Boolean
Booleans zinawakilisha aina rahisi zaidi ya data: zinaweza tu kushikilia mojawapo ya thamani mbili `true` au `false`. Mfumo huu wa mantiki ya binary unarudi kwenye kazi ya George Boole, mwanahisabati wa karne ya 19 ambaye alianzisha algebra ya Boolean.
Boolean zinawakilisha aina rahisi kabisa ya data: zinaweza kushikilia tu mojawapo ya thamani mbili `true` au `false`. Mfumo huu wa kiakili wa binary unatokana na kazi ya George Boole, mtaalamu wa hesabu wa karne ya 19 aliyebuni algebra ya Boolean.
Licha ya urahisi wake, booleans ni muhimu sana kwa mantiki ya programu. Zinasaidia programu yako kufanya maamuzi kulingana na hali kama mtumiaji ameingia, kama kitufe kimebonyezwa, au kama vigezo fulani vimetimizwa.
Licha ya urahisi wake, boolean ni muhimu kwa mantiki ya programu. Zinawawezesha msimbo wako kufanya maamuzi kulingana na masharti kama mtumiaji ameingia, kama kitufe kilibonyea, au ikiwa vigezo fulani vimetimizwa.
Booleans zinaweza kuwa na thamani mbili tu: `true` au `false`. Booleans zinaweza kusaidia kufanya maamuzi kuhusu mistari gani ya msimbo inapaswa kutekelezwa wakati hali fulani zimetimizwa. Katika hali nyingi, [operators](../../../../2-js-basics/1-data-types) husaidia kuweka thamani ya Boolean na mara nyingi utaona na kuandika vigezo vikiwa vimeanzishwa au thamani zao zikiwa zimebadilishwa kwa kutumia operator.
Boolean zinaweza kuwa na thamani mbili tu: `true` au `false`. Boolean zinaweza kusaidia kufanya maamuzi ni mistari gani ya msimbo inapaswa kuendeshwa pale ambapo masharti fulani yanatimizwa. Katika hali nyingi, [vaidhibiti](../../../../2-js-basics/1-data-types) husaidia kuweka thamani ya Boolean na mara nyingi utagundua na kuandika mabadiliko yanayoanzishwa au yenye kuwekwa upya kwa kutumia vaidhibiti.
```javascript
let myTrueBool = true;
let myFalseBool = false;
```
**Katika mfano hapo juu, tumefanya:**
- **Kuunda** kigezo kinachohifadhi thamani ya Boolean `true`
- **Kuonyesha** jinsi ya kuhifadhi thamani ya Boolean `false`
- **Kutumia** maneno halisi `true` na `false` (hakuna nukuu zinazohitajika)
- **Kuandaa** vigezo hivi kwa matumizi katika kauli za hali
**Juu tulikuwa:**
- **Tumeunda** mabadiliko yanayohifadhi thamani ya Boolean `true`
- **Tumeonyesha** jinsi ya kuhifadhi thamani ya Boolean `false`
- **Tume tumia** maneno halisi `true` na `false` (pasipo nukuu)
- **Tumeandaa** mabadiliko haya kwa matumizi katika masharti ya hali
✅ Kigezo kinaweza kuchukuliwa kuwa 'truthy' ikiwa kinatathminiwa kuwa boolean `true`. Cha kushangaza, katika JavaScript, [thamani zote ni truthy isipokuwa zifafanuliwe kama falsy](https://developer.mozilla.org/docs/Glossary/Truthy).
✅ Mabadiliko yanaweza kuchukuliwa kuwa 'truthy' ikiwa yanathibitishwa kuwa boolean `true`. Vilevile, katika JavaScript, [thamani zote ni truthy isipokuwa zilizoainishwa kuwa falsy](https://developer.mozilla.org/docs/Glossary/Truthy).
```mermaid
flowchart LR
A["🔘 Thamani za Boolean"] --> B["true"]
A --> C["false"]
D["Thamani za Kweli"] --> D1["'hello'"]
D --> D2["42"]
D --> D3["[]"]
D --> D4["{}"]
E["Thamani za Uongo"] --> E1["false"]
E --> E2["0"]
E --> E3["''"]
E --> E4["null"]
E --> E5["undefined"]
E --> E6["NaN"]
style B fill:#e8f5e8
style C fill:#ffebee
style D fill:#e3f2fd
style E fill:#fff3e0
```
### 🎯 **Ukaguzi wa Mantiki ya Boolean: Ujuzi wa Kufanya Maamuzi**
**Jaribu uelewa wako wa boolean:**
- Kwa nini unadhani JavaScript ina thamani "truthy" na "falsy" zaidi ya `true` na `false` peke yake?
- Je, unaweza kutabiri ni ipi kati ya hizi ni falsy: `0`, `"0"`, `[]`, `"false"`?
- Je, boolean zinaweza kusaidiaje katika kudhibiti mtiririko wa programu?
```mermaid
pie title "Matumizi ya Kawaida ya Boolean"
"Mantiki ya Masharti" : 40
"Hali ya Mtumiaji" : 25
"Mabadiliko ya Kipengele" : 20
"Uthibitishaji" : 15
```
> **Kumbuka**: Katika JavaScript, thamani 6 tu ndizo ni falsy: `false`, `0`, `""`, `null`, `undefined`, na `NaN`. Kila kitu kingine ni truthy!
---
## 📊 **Muhtasari wa Zana Zako za Aina za Data**
```mermaid
graph TD
A["🎯 Aina za Data za JavaScript"] --> B["📦 Vigezo"]
A --> C["🔢 Nambari"]
A --> D["📝 Mstari wa maandishi"]
A --> E["🔘 Booleans"]
B --> B1["let inayobadilika"]
B --> B2["const isiyobadilika"]
C --> C1["42, 3.14, -5"]
C --> C2["+ - * / %"]
D --> D1["'nukuu' au \\\"nukuu\\\""]
D --> D2["`herufi za templeti`"]
E --> E1["kweli au potofu"]
E --> E2["kweli dhidi ya uongo"]
F["⚡ Dhana Muhimu"] --> F1["Aina ni muhimu kwa shughuli"]
F --> F2["JavaScript ina aina zinazobadilika"]
F --> F3["Vigezo vinaweza kubadilisha aina"]
F --> F4["Kuhesabu ni kwa herufi kubwa na ndogo"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
## Changamoto ya Wakala wa GitHub Copilot 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
**Maelezo:** Unda meneja wa taarifa za kibinafsi unaoonyesha aina zote za data za JavaScript ulizojifunza katika somo hili huku ukishughulikia hali halisi za data.
**Maelezo:** Unda meneja wa taarifa binafsi anayetoa mfano wa aina zote za data za JavaScript ulizojifunza katika somo hili huku ukishughulikia hali halisi za data.
**Maelekezo:** Tengeneza programu ya JavaScript inayounda kitu cha wasifu wa mtumiaji kinachojumuisha: jina la mtu (string), umri (number), hali ya kuwa mwanafunzi (boolean), rangi zinazopendwa kama array, na kitu cha anwani chenye mali za mtaa, jiji, na nambari ya posta. Jumuisha kazi za kuonyesha taarifa za wasifu na kusasisha sehemu za mtu binafsi. Hakikisha unaonyesha muunganiko wa string, template literals, operesheni za hesabu na umri, na mantiki ya boolean kwa hali ya mwanafunzi.
**Onyo:** Jenga programu ya JavaScript inayounda kitu cha wasifu wa mtumiaji kinachoonyesha: jina la mtu (mnyororo), umri (nambari), hali ya kuwa mwanafunzi (boolean), rangi anazopenda kama mpangilio, na kitu chenye anwani yenye barabara, jiji, na msimbo wa posta. Jumuisha kazi za kuonyesha taarifa za wasifu na kusasisha nyanja binafsi. Hakikisha unaonyesha kuunganisha mnyororo, liturari za templeti, operesheni za hisabati na umri, na mantiki ya boolean kwa hali ya mwanafunzi.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
JavaScript ina tabia fulani zinazoweza kuwashangaza watengenezaji. Hapa kuna mfano wa kawaida wa kuchunguza: jaribu kuandika hii kwenye console ya kivinjari chako: `let age = 1; let Age = 2; age == Age` na angalia matokeo. Inarudisha `false` unaweza kubaini kwa nini?
Hii inawakilisha mojawapo ya tabia nyingi za JavaScript zinazostahili kueleweka. Kuzifahamu tabia hizi kutakusaidia kuandika msimbo wa kuaminika zaidi na kutatua masuala kwa ufanisi zaidi.
## Jaribio la Baada ya Somo
[Jaribio la baada ya somo](https://ff-quizzes.netlify.app)
## Mapitio na Kujisomea
Angalia [orodha hii ya mazoezi ya JavaScript](https://css-tricks.com/snippets/javascript/) na jaribu moja. Umejifunza nini?
## Kazi
[Mazoezi ya Aina za Data](assignment.md)
JavaScript ina tabia kadhaa zinazoweza kumshangaza mendelevu. Hapa kuna mfano wa kuwaeleza: jaribu kuandika hii kwenye konsole ya kivinjari chako: `let age = 1; let Age = 2; age == Age` na tazama matokeo. Inarudisha `false` unaweza kubaini kwa nini?
Hii ni mojawapo ya tabia nyingi za JavaScript zinazostahili kueleweka. Uelewa wa tabia hizi utakusaidia kuandika msimbo imara zaidi na kutatua matatizo kwa ufanisi zaidi.
## Mtihani wa Baada ya Mafunzo
[Mtihani wa baada ya mafundisho](https://ff-quizzes.netlify.app)
## Mapitio & Kujifunza Binafsi
Tazama [orujo la mazoezi ya JavaScript](https://css-tricks.com/snippets/javascript/) na jaribu moja. Umejifunza nini?
## Kazi ya Nyumbani
[Kazi ya Aina za Data](assignment.md)
## 🚀 Ratiba Yako ya Uwezo wa Aina za Data za JavaScript
### ⚡ **Unachoweza Kufanya Dakika 5 Zijazo**
- [ ] Fungua konsole ya kivinjari na tengeneza mabadiliko 3 yenye aina tofauti za data
- [ ] Jaribu changamoto: `let age = 1; let Age = 2; age == Age` na gundua kwa nini ni false
- [ ] Fanya mazoezi ya kuunganisha mnyororo na jina lako na nambari unayopenda
- [ ] Jaribu kuona kinachotokea unapoongeza nambari kwenye mnyororo
### 🎯 **Unachoweza Kufanikisha Saa Hili**
- [ ] Kamilisha mtihani wa baada ya somo na pitia dhana yoyote ngumu
- [ ] Unda kalkuleta ndogo inayoongeza, kutoa, kuzidisha, na kugawa nambari mbili
- [ ] Tengeneza mtafsiri wa majina kwa kutumia liturari za templeti
- [ ] Chunguza tofauti kati ya vaidhibiti `==` na `===`
- [ ] Fanya mazoezi ya kubadilisha kati ya aina tofauti za data
### 📅 **Msingi Wako wa JavaScript kwa Wiki Nzima**
- [ ] Kamilisha kazi ya nyumbani kwa kujiamini na ubunifu
- [ ] Unda kitu cha wasifu binafsi ukitumia aina zote za data ulizojifunza
- [ ] Fanya mazoezi na [mazoezi ya JavaScript kutoka CSS-Tricks](https://css-tricks.com/snippets/javascript/)
- [ ] Unda kipimaji rahisi cha fomu kwa kutumia mantiki ya boolean
- [ ] Jaribu aina za data za mpangilio (array) na kitu (object) (mapitio ya masomo yanayokuja)
- [ ] Jiunge na jamii ya JavaScript na uliza maswali kuhusu aina za data
### 🌟 **Mabadiliko Yako kwa Mwezi Mzima**
- [ ] Unganisha maarifa ya aina za data katika miradi mikubwa ya programu
- [ ] Elewa lini na kwa nini utumie aina mbalimbali za data katika matumizi halisi
- [ ] Saidia wanaoanza kuelewa misingi ya JavaScript
- [ ] Tengeneza programu ndogo inayosimamia aina mbalimbali za data za watumiaji
- [ ] Chunguza dhana za juu za aina za data kama vile coercion ya aina na usawa mkali
- [ ] Changia katika miradi ya chanzo huria ya JavaScript kwa kuboresha nyaraka
### 🧠 **Ukaguzi wa Mwisho wa Uwezo wa Aina za Data**
**Sherehekea msingi wako wa JavaScript:**
- Ni aina gani ya data ilikushangaza zaidi kwa tabia yake?
- Je, unahisi vipi kueleza mabadiliko dhidi ya constants kwa rafiki?
- Nini kitu cha kuvutia zaidi ulicho kugundua kuhusu mfumo wa aina za JavaScript?
- Ni programu gani halisi unaweza kufikiria kuunda ukitumia misingi hii?
```mermaid
journey
title Safari Yako ya Kujiamini Kwenye JavaScript
section Leo
Confused: 3: You
Curious: 4: You
Excited: 5: You
section Wiki Hii
Practicing: 4: You
Understanding: 5: You
Building: 5: You
section Mwezi Ujao
Problem Solving: 5: You
Teaching Others: 5: You
Real Projects: 5: You
```
> 💡 **Umejenga msingi!** Kuelewa aina za data ni kama kujifunza alfabeti kabla ya kuandika hadithi. Kila programu ya JavaScript utakayoiandika itatumia dhana hizi msingi. Sasa una vifaa vya kuunda tovuti zenye mwingiliano, programu zenye nguvu, na kutatua matatizo halisi kwa msimbo. Karibu kwenye dunia nzuri ya JavaScript! 🎉
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya kiasili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tangazo la Kawia**:
Nyaraka hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Nyaraka ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inashauriwa. Hatuwajibiki kwa kutoelewana au tafsiri potofu zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,57 +1,105 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ec43b53e8e015cdabfd3ad877b3c28e5",
"translation_date": "2025-10-24T19:10:37+00:00",
"original_hash": "71f7d7dafa1c7194d79ddac87f669ff9",
"translation_date": "2026-01-07T01:23:37+00:00",
"source_file": "2-js-basics/2-functions-methods/README.md",
"language_code": "sw"
}
-->
# Misingi ya JavaScript: Mbinu na Kazi
# Misingi ya JavaScript: Mbinu na Zana
![Misingi ya JavaScript - Kazi](../../../../translated_images/webdev101-js-functions.be049c4726e94f8b7605c36330ac42eeb5cd8ed02bcdd60fdac778174d6cb865.sw.png)
![JavaScript Basics - Functions](../../../../translated_images/webdev101-js-functions.be049c4726e94f8b.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
## Maswali ya Awali ya Somo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app)
```mermaid
journey
title Safari Yako ya Kazi za JavaScript
section Msingi
Function Syntax: 5: You
Calling Functions: 4: You
Parameters & Arguments: 5: You
section Dhana za Juu Zaidi
Return Values: 4: You
Default Parameters: 5: You
Function Composition: 4: You
section JavaScript ya Kisasa
Arrow Functions: 5: You
Anonymous Functions: 4: You
Higher-Order Functions: 5: You
```
## Mtihani Kabla ya Mhodhi
[Pre-lecture quiz](https://ff-quizzes.netlify.app)
Kuandika msimbo ule ule mara kwa mara ni mojawapo ya changamoto za kawaida za programu. Kazi hutatua tatizo hili kwa kukuruhusu kufungasha msimbo katika vipande vinavyoweza kutumika tena. Fikiria kazi kama sehemu zilizo sanifu ambazo zilifanya mstari wa uzalishaji wa Henry Ford kuwa wa mapinduzi mara tu unapounda sehemu inayotegemewa, unaweza kuitumia popote inapohitajika bila kuijenga upya.
Kuandika msimbo huo huo mara nyingi ni moja ya hasa za kawaida katika uundaji programu. Zana (functions) huboresha tatizo hili kwa kukuwezesha kufunga msimbo kuwa vitengo vinavyoweza kutumika tena. Fikiria zana kama sehemu za viwango zilizoifanya mstari wa mkusanyiko wa Henry Ford kuwa ya mapinduzi mara tu unapotengeneza kipengele kinachotegemewa, unaweza kukitumia popote unapohitaji bila kujenga upya kutoka mwanzo.
Kazi hukuruhusu kufungasha vipande vya msimbo ili uweze kuvitumia tena katika programu yako. Badala ya kunakili na kubandika mantiki ile ile kila mahali, unaweza kuunda kazi mara moja na kuziita wakati wowote zinapohitajika. Njia hii husaidia kuweka msimbo wako katika mpangilio na kufanya masasisho kuwa rahisi zaidi.
Zana zinakuwezesha kufunga vipande vya msimbo ili uweze kuvitumia tena katika programu yako nzima. Badala ya kunakili na kubandika mantiki ile ile kila mahali, unaweza kuunda zana mara moja na kuitisha inapohitajika. Njia hii hufanya msimbo wako kuwa na mpangilio mzuri na kufanya masasisho kuwa rahisi zaidi.
Katika somo hili, utajifunza jinsi ya kuunda kazi zako mwenyewe, kupitisha taarifa kwao, na kupata matokeo muhimu. Utatambua tofauti kati ya kazi na mbinu, kujifunza mbinu za kisasa za sintaksia, na kuona jinsi kazi zinavyoweza kufanya kazi na kazi nyingine. Tutajenga dhana hizi hatua kwa hatua.
Katika somo hili, utajifunza jinsi ya kuunda zana zako mwenyewe, kupitisha taarifa kwao, na kupata matokeo mazuri. Utaelewa tofauti kati ya zana na mbinu, ujifunze mbinu za kisasa za herufi, na kuona jinsi zana zinaweza kufanya kazi pamoja na zana nyingine. Tutajenga dhana hizi hatua kwa hatua.
[![Mbinu na Kazi](https://img.youtube.com/vi/XgKsD6Zwvlc/0.jpg)](https://youtube.com/watch?v=XgKsD6Zwvlc "Mbinu na Kazi")
[![Methods and Functions](https://img.youtube.com/vi/XgKsD6Zwvlc/0.jpg)](https://youtube.com/watch?v=XgKsD6Zwvlc "Methods and Functions")
> 🎥 Bofya picha hapo juu kwa video kuhusu mbinu na kazi.
> 🎥 Bonyeza picha hapo juu kwa video kuhusu mbinu na zana.
> Unaweza kuchukua somo hili kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-functions/?WT.mc_id=academic-77807-sagibbon)!
## Kazi
```mermaid
mindmap
root((JavaScript Functions))
Basic Concepts
Declaration
Traditional syntax
Arrow function syntax
Calling
Using parentheses
Parentheses required
Parameters
Input Values
Multiple parameters
Default values
Arguments
Values passed in
Can be any type
Return Values
Output Data
return statement
Exit function
Use Results
Store in variables
Chain functions
Advanced Patterns
Higher-Order
Functions as parameters
Callbacks
Anonymous
No name needed
Inline definition
```
## Zana
Kazi ni kipande cha msimbo kilichojitegemea ambacho hufanya kazi maalum. Inajumuisha mantiki ambayo unaweza kuitekeleza wakati wowote inapohitajika.
Zana ni kipande cha msimbo chenye kujitegemea kinachotekeleza kazi maalum. Inahifadhi mantiki ambayo unaweza kuitekeleza kila inapohitajika.
Badala ya kuandika msimbo ule ule mara nyingi katika programu yako, unaweza kuufungasha katika kazi na kuuita kazi hiyo wakati wowote unapoihitaji. Njia hii husaidia kuweka msimbo wako safi na kufanya masasisho kuwa rahisi zaidi. Fikiria changamoto ya matengenezo ikiwa unahitaji kubadilisha mantiki iliyotawanyika katika maeneo 20 tofauti kwenye msimbo wako.
Badala ya kuandika msimbo ule ule mara nyingi katika programu yako, unaweza kuipakia ndani ya zana na kuitisha zana hiyo kila unaponihitaji. Njia hii hufanya msimbo wako usafi na kufanya masasisho kuwa rahisi. Fikiria changamoto ya matengenezo kama unahitaji kubadilisha mantiki iliyosambaa sehemu 20 tofauti za msimbo wako.
Kutoa majina ya kueleweka kwa kazi zako ni muhimu. Kazi yenye jina zuri inaeleza kusudi lake wazi unapokutana na `cancelTimer()`, unajua mara moja inachofanya, kama vile kitufe kilichowekwa alama wazi kinakuambia kinachotokea unapokibonyeza.
Kukataa majina yako kwa usahihi ni muhimu. Zana iliyo na jina zuri inaelezea kusudi lake kwa uwazi unapomuona `cancelTimer()`, unaelewa mara moja inavyofanya, kama vile kitufe kilicho na lebo wazi kinakuambia hasa kile kitakachotokea unapokibonyeza.
## Kuunda na kuita kazi
## Kuunda na kuitisha zana
Hebu tuangalie jinsi ya kuunda kazi. Sintaksia inafuata muundo thabiti:
Hebu tuchunguze jinsi ya kuunda zana. Sarufi inafuata muundo thabiti:
```javascript
function nameOfFunction() { // function definition
// function definition/body
function nameOfFunction() { // ufafanuzi wa kazi
// ufafanuzi/maumbo ya kazi
}
```
Hebu tuvunje hili:
- Neno kuu `function` linaambia JavaScript "Hey, ninaunda kazi!"
- `nameOfFunction` ni mahali unapotoa jina la kueleweka kwa kazi yako
- Mabano `()` ni mahali unapoweza kuongeza vigezo (tutafikia hilo hivi karibuni)
- Mabano ya curly `{}` yanajumuisha msimbo halisi unaoendeshwa unapoiita kazi
Hebu tugawanye hii:
- Neno `function` linamweleza JavaScript "Haya, ninaunda zana!"
- `nameOfFunction` ni mahali unapoipa zana yako jina linaloelezea
- Kipengele cha mabano `()` ni mahali pa kuongeza vigezo (tutafikia hapo hivi karibuni)
- Mabano ya mviringo `{}` yana msimbo halisi unaotekelezwa unapoitisha zana
Hebu tuunde kazi rahisi ya salamu ili kuona hili likifanya kazi:
Tengeneza zana rahisi ya salamu ili kuona hili kwa vitendo:
```javascript
function displayGreeting() {
@ -59,34 +107,57 @@ function displayGreeting() {
}
```
Kazi hii inachapisha "Hello, world!" kwenye console. Mara tu unapoiunda, unaweza kuitumia mara nyingi unavyohitaji.
Zana hii inanukuu "Hello, world!" kwenye console. Ukimaliza kuitengeneza, unaweza kuitumia mara ngapi unavyotaka.
Ili kutekeleza (au "kuita") kazi yako, andika jina lake likifuatiwa na mabano. JavaScript inakuruhusu kufafanua kazi yako kabla au baada ya kuuita injini ya JavaScript itashughulikia mpangilio wa utekelezaji.
Ili kuitekeleza (au "kuitisha") zana yako, andika jina lake likifuatiwa na mabano. JavaScript inaruhusu kuainisha zana yako kabla au baada ya kuitisha engine ya JavaScript itashughulikia mpangilio wa utekelezaji.
```javascript
// calling our function
// kupiga simu kwa kazi yetu
displayGreeting();
```
Unapotekeleza mstari huu, inatekeleza msimbo wote ndani ya kazi yako ya `displayGreeting`, ikionyesha "Hello, world!" kwenye console ya kivinjari chako. Unaweza kuita kazi hii mara kwa mara.
> **Note:** Umekuwa ukitumia **mbinu** katika masomo haya. `console.log()` ni mbinu kimsingi kazi inayohusiana na kitu cha `console`. Tofauti kuu ni kwamba mbinu zimeunganishwa na vitu, wakati kazi zinasimama peke yake. Waendelezaji wengi hutumia maneno haya kwa kubadilishana katika mazungumzo ya kawaida.
Unaporun mstari huu, unatenda msimbo wote ndani ya zana yako `displayGreeting`, ikionyesha "Hello, world!" kwenye console ya kivinjari chako. Unaweza kuitisha zana hii mara nyingi.
### 🧠 **Ukaguzi wa Misingi ya Zana: Kujenga Zana Zako za Kwanza**
**Hebu tazama jinsi unavyohisi kuhusu zana za msingi:**
- Unaweza kueleza kwa nini tunatumia mabano `{}` katika maelezo ya zana?
- Nini hutokea ikiwa utaandika `displayGreeting` bila mabano?
- Kwa nini unaweza kutaka kuitisha zana ile ile mara nyingi?
```mermaid
flowchart TD
A["✏️ Eleza Kazi"] --> B["📦 Funga Msimbo"]
B --> C["🏷️ Mpa Jina"]
C --> D["📞 Piga Unapotakiwa"]
D --> E["🔄 Tumia Tena Popote"]
F["💡 Manufaa"] --> F1["Hakuna kurudia msimbo"]
F --> F2["Rahisi kudumisha"]
F --> F3["Mpangilio wazi"]
F --> F4["Upimaji rahisi"]
style A fill:#e3f2fd
style E fill:#e8f5e8
style F fill:#fff3e0
```
> **Kumbuka:** Umekuwa ukitumia **mbinu** katika masomo haya yote. `console.log()` ni mbinu kwa msingi, zana inayomilikiwa na kitu cha `console`. Tofauti kuu ni kwamba mbinu zinahusishwa na vitu, wakati zana zinajitegemea. Waendelezaji wengi hutumia maneno haya kwa kubadilishana katika mazungumzo ya kawaida.
### Mazoea bora ya kazi
### Mbinu bora za zana
Hapa kuna vidokezo kadhaa vya kukusaidia kuandika kazi nzuri:
Hapa kuna vidokezo vidogo vya kukusaidia kuandika zana nzuri:
- Toa majina ya wazi, ya kueleweka kwa kazi zako utajishukuru baadaye!
- Pata majina ya kueleweka na ya kuelezea wewe mwenyewe utajisikia shukrani baadaye!
- Tumia **camelCasing** kwa majina ya maneno mengi (kama `calculateTotal` badala ya `calculate_total`)
- Weka kila kazi ikilenga kufanya jambo moja vizuri
- Hifadhi kila zana iangalie kufanikisha jambo moja vizuri
## Kupitisha taarifa kwa kazi
## Kupitisha taarifa kwa zana
Kazi yetu ya `displayGreeting` ina mipaka inaweza tu kuonyesha "Hello, world!" kwa kila mtu. Vigezo vinaturuhusu kufanya kazi kuwa rahisi na muhimu zaidi.
Zana yetu `displayGreeting` ina kikomo inaweza kuonyesha tu "Hello, world!" kwa kila mtu. Vigezo vinaturuhusu kufanya zana ziwe na ufanisi zaidi.
**Vigezo** hufanya kama nafasi za kuweka maadili tofauti kila wakati unapotumia kazi. Kwa njia hii, kazi hiyo hiyo inaweza kufanya kazi na taarifa tofauti kila unapoiita.
**Vigezo** hufanya kama vifunga ambapo unaweza kuweka thamani tofauti kila unapotumia zana. Kwa njia hii, zana hiyo hiyo inaweza kufanya kazi na taarifa tofauti kila kuitisha.
Unaorodhesha vigezo ndani ya mabano unapofafanua kazi yako, ukitenganisha vigezo vingi kwa koma:
Unaorodhesha vigezo ndani ya mabano unapofafanua zana yako, ukitenganisha vigezo vingi na koma:
```javascript
function name(param, param2, param3) {
@ -94,9 +165,9 @@ function name(param, param2, param3) {
}
```
Kila kigezo hufanya kama nafasi ya kuweka mtu anapoiita kazi yako, atatoa maadili halisi ambayo yatawekwa katika sehemu hizi.
Kila kigezo hutenda kama kivutio cha nafasi mtu atakapoitisha zana yako, atatoa thamani halisi zinazowekwa sehemu hizi.
Hebu tusasishe kazi yetu ya salamu ili ikubali jina la mtu:
Hebu tubadilishe zana ya salamu ya kupokea jina la mtu:
```javascript
function displayGreeting(name) {
@ -105,22 +176,44 @@ function displayGreeting(name) {
}
```
Angalia jinsi tunavyotumia alama za nyuma (`` ` ``) na `${}` kuingiza jina moja kwa moja kwenye ujumbe wetu hii inaitwa template literal, na ni njia rahisi ya kujenga mistari ya maandishi yenye mchanganyiko wa vigezo.
Angalia jinsi tunavyotumia backticks (`` ` ``) na `${}` kuweka jina moja kwa moja ndani ya ujumbe wetu hii huitwa templet literal, na ni njia rahisi ya kujenga misemo yenye vigezo vimechanganywa.
Sasa tunapoiita kazi yetu, tunaweza kupitisha jina lolote:
Sasa tunapoitisha zana yetu, tunaweza kupitisha jina lolote:
```javascript
displayGreeting('Christopher');
// displays "Hello, Christopher!" when run
// inaonyesha "Hello, Christopher!" wakati inapoendeshwa
```
JavaScript inachukua maandishi `'Christopher'`, inaiweka kwa kigezo cha `name`, na kuunda ujumbe wa kibinafsi "Hello, Christopher!"
## Maadili ya chaguo-msingi
JavaScript huchukua mfurushi wa maneno `'Christopher'`, kuuweka katika kigezo `name`, na kutengeneza ujumbe wa kibinafsi "Hello, Christopher!"
```mermaid
flowchart LR
A["🎯 Kuitwa kwa Kazi"] --> B["📥 Vigezo"]
B --> C["⚙️ Mwili wa Kazi"]
C --> D["📤 Matokeo"]
A1["displayGreeting('Alice')"] --> A
B1["jina = 'Alice'"] --> B
C1["Template literal\n\`Hujambo, \${name}!\`"] --> C
D1["'Hujambo, Alice!'"] --> D
E["🔄 Aina za Vigezo"] --> E1["Mizungumzo"]
E --> E2["Nambari"]
E --> E3["Maandishi ya kweli au potofu"]
E --> E4["Vitu"]
E --> E5["Kazi"]
style A fill:#e3f2fd
style C fill:#e8f5e8
style D fill:#fff3e0
style E fill:#f3e5f5
```
## Thamani za chaguo-msingi
Je, tunataka kufanya vigezo vingine kuwa vya hiari? Hapo ndipo maadili ya chaguo-msingi yanapokuwa muhimu!
Je, tungependa kufanya baadhi ya vigezo kuwa hiari? Hapo ndipo thamani za chaguo-msingi zinapokuja muhimu!
Hebu tuseme tunataka watu waweze kubadilisha neno la salamu, lakini ikiwa hawatafafanua moja, tutatumia tu "Hello" kama chaguo-msingi. Unaweza kuweka maadili ya chaguo-msingi kwa kutumia alama ya sawa, kama vile kuweka kigezo:
Tuseme tunataka watu waweze kubadilisha neno la salamu, lakini ikiwa hawataeleza lolote, tutatumia "Hello" kama msaada. Unaweza kuweka thamani za chaguo-msingi kwa kutumia alama ya usawa, kama vile kuweka thamani ya variable:
```javascript
function displayGreeting(name, salutation='Hello') {
@ -128,35 +221,63 @@ function displayGreeting(name, salutation='Hello') {
}
```
Hapa, `name` bado ni lazima, lakini `salutation` ina thamani ya akiba ya `'Hello'` ikiwa hakuna mtu anayetoa salamu tofauti.
Hapa, `name` bado ni la lazima, lakini `salutation` ina thamani ya ziada ya `'Hello'` ikiwa hakuna atakayetoa salamu tofauti.
Sasa tunaweza kuita kazi hii kwa njia mbili tofauti:
Sasa tunaweza kuitisha zana hii kwa njia mbili tofauti:
```javascript
displayGreeting('Christopher');
// displays "Hello, Christopher"
// inaonyesha "Hello, Christopher"
displayGreeting('Christopher', 'Hi');
// displays "Hi, Christopher"
// inaonyesha "Hi, Christopher"
```
Katika wito wa kwanza, JavaScript inatumia "Hello" ya chaguo-msingi kwa kuwa hatukufafanua salamu. Katika wito wa pili, inatumia "Hi" yetu ya kibinafsi badala yake. Uwezo huu hufanya kazi kuwa rahisi kwa hali tofauti.
Katika utekelezaji wa kwanza, JavaScript inatumia "Hello" chaguo-msingi kwa sababu hatukuweka salamu yoyote. Katika utekelezaji wa pili, inatumia salamu yetu ya "Hi" badala yake. Uwezo huu hufanya zana ziwe za kubadilika kwa hali tofauti.
### 🎛️ **Ukaguzi wa Ustadi wa Vigezo: Kufanya Zana Ziwe na Uwezo wa Kubadilika**
**Jaribu ufahamu wako wa vigezo:**
- Nini tofauti kati ya kigezo na hoja?
- Kwa nini thamani za chaguo-msingi ni muhimu katika uundaji programu wa kweli?
- Unaweza kutabiri nini hutokea ikiwa utapitisha hoja nyingi zaidi kuliko vigezo?
```mermaid
stateDiagram-v2
[*] --> NoParams: function greet() {}
[*] --> WithParams: function greet(name) {}
[*] --> WithDefaults: function greet(name, greeting='Hi') {}
NoParams --> Static: Matokeo yanayofanana kila mara
WithParams --> Dynamic: Hubadilika kulingana na ingizo
WithDefaults --> Flexible: Ubinafsishaji wa hiari
Static --> [*]
Dynamic --> [*]
Flexible --> [*]
note right of WithDefaults
Njia inayobadilika zaidi
Inakubaliana nyuma
end note
```
> **Ushauri wa kitaalamu**: Vigezo vya chaguo-msingi hufanya zana zako ziwe rafiki kwa mtumiaji. Watumiaji wanaweza kuanza haraka kwa thamani za kawaida, lakini bado kubadilisha inapohitajika!
## Maadili ya kurudi
## Thamani za kurudishiwa
Kazi zetu hadi sasa zimekuwa zikichapisha tu ujumbe kwenye console, lakini vipi ikiwa unataka kazi ihesabu kitu na kukurudishia matokeo?
Hadi sasa zana zetu zimekuwa zikichapisha ujumbe kwenye console, lakini je, ungetaka zana ikokotoe kitu na ikurudishie matokeo?
Hapo ndipo **maadili ya kurudi** yanapokuja. Badala ya kuonyesha tu kitu, kazi inaweza kukurudishia thamani ambayo unaweza kuihifadhi kwenye kigezo au kuitumia katika sehemu nyingine za msimbo wako.
Hapo ndipo **thamani za kurudishiwa** zinapokuja. Badala ya kuonyesha jambo tu, zana inaweza kurudisha thamani ambayo unaweza kuhifadhi katika variable au kuitumia sehemu nyingine za msimbo wako.
Ili kurudisha thamani, unatumia neno kuu `return` likifuatiwa na chochote unachotaka kurudisha:
Ili kurudisha thamani, tumia neno `return` linalo fuatwa na kile unachotaka kurudisha:
```javascript
return myVariable;
```
Hapa kuna jambo muhimu: kazi inapofikia kauli ya `return`, inasimama mara moja na kurudisha thamani hiyo kwa yeyote aliyeiita.
Hapa kuna jambo muhimu: zana inapogonga kauli ya `return`, mara moja hukoma kutekeleza na kurudisha thamani hiyo kwa mtumiaji aliyoitisha.
Hebu tubadilishe kazi yetu ya salamu ili irudishe ujumbe badala ya kuuchapisha:
Turekebishe zana yetu ya salamu kurudisha ujumbe badala ya kuuchapisha:
```javascript
function createGreetingMessage(name) {
@ -165,23 +286,61 @@ function createGreetingMessage(name) {
}
```
Sasa badala ya kuchapisha salamu, kazi hii inaunda ujumbe na kuurudisha kwetu.
Sasa badala ya kuchapisha salamu, zana hii inatengeneza ujumbe na kuturudishia.
Ili kutumia thamani iliyorejeshwa, tunaweza kuihifadhi kwenye kigezo kama thamani nyingine yoyote:
Ili kutumia thamani iliyorejeshwa, tunaweza kuihifadhi katika variable kama thamani nyingine yoyote:
```javascript
const greetingMessage = createGreetingMessage('Christopher');
```
Sasa `greetingMessage` ina "Hello, Christopher" na tunaweza kuitumia popote kwenye msimbo wetu kuionyesha kwenye ukurasa wa wavuti, kuijumuisha kwenye barua pepe, au kuipatia kazi nyingine.
Sasa `greetingMessage` ina "Hello, Christopher" na tunaweza kuitumia mahali popote kwenye msimbo wetu kuionyesha kwenye ukurasa wa wavuti, kuingiza barua pepe, au kuipitisha kwa zana nyingine.
```mermaid
flowchart TD
A["🔧 Uchakataji wa Kazi"] --> B{"kauli ya kurudi?"}
B -->|Ndiyo| C["📤 Thamani ya Kurudisha"]
B -->|Hapana| D["📭 Rudisha haijaainishwa"]
C --> E["💾 Hifadhi katika Kigezo"]
C --> F["🔗 Tumia katika Kauli"]
C --> G["📞 Pitia kwa Kazi"]
D --> H["⚠️ Kawaida haifai"]
I["📋 Matumizi ya Thamani ya Kurudisha"] --> I1["Hesabu matokeo"]
I --> I2["Thibitisha ingizo"]
I --> I3["Badilisha data"]
I --> I4["Tengeneza vitu"]
style C fill:#e8f5e8
style D fill:#ffebee
style I fill:#e3f2fd
```
### 🔄 **Ukaguzi wa Thamani za Kurudishiwa: Kupata Matokeo**
**Pima ufahamu wako wa thamani za kurudishiwa:**
- Nini hutokea kwa msimbo baada ya kauli ya `return` katika zana?
- Kwa nini kurudisha thamani ni bora zaidi kuliko kuchapisha tu kwenye console?
- Je, zana inaweza kurudisha aina tofauti za thamani (mfuatano wa maneno, nambari, boolean)?
```mermaid
pie title "Aina za Thamani za Kurudisha Zilizotumika"
"Mikondo" : 30
"Nambari" : 25
"Vitu" : 20
"Booleani" : 15
"Safu" : 10
```
> **Uelewa muhimu**: Zana zinazorudisha thamani ni za kubadilika kwa sababu mtumiaji anaamua kufanya nini na matokeo. Hii hufanya msimbo wako kuwa wa moduli na unavyoweza kutumika tena!
## Kazi kama vigezo kwa kazi
## Zana kama vigezo kwa zana nyingine
Kazi zinaweza kupitishwa kama vigezo kwa kazi nyingine. Ingawa dhana hii inaweza kuonekana ngumu mwanzoni, ni kipengele chenye nguvu kinachowezesha mifumo ya programu inayobadilika.
Zana zinaweza kupitishwa kama vigezo kwa zana nyingine. Ingawa dhana hii inaweza kuonekana ngumu mwanzoni, ni sifa yenye nguvu inayowezesha mifumo flexible ya uundaji programu.
Mfano huu ni wa kawaida sana unaposema "wakati kitu kinatokea, fanya jambo hili lingine." Kwa mfano, "wakati kipima muda kinamalizika, endesha msimbo huu" au "wakati mtumiaji anabonyeza kitufe, ita kazi hii."
Mfumo huu ni wa kawaida sana wakati unataka kusema "wakati jambo fulani litokee, fanya jambo hili." Kwa mfano, "wakati kengele inamaliza, endesha msimbo huu" au "wakati mtumiaji anakibonyeza kitufe, ita zana hii."
Hebu tuangalie `setTimeout`, ambayo ni kazi iliyojengwa ndani inayosubiri muda fulani na kisha kuendesha msimbo fulani. Tunahitaji kuambia ni msimbo gani wa kuendesha hali nzuri ya kutumia kazi kama kigezo!
Tazama `setTimeout`, ambayo ni zana ya ndani inayosubiri muda fulani na kisha kuendesha msimbo. Tunahitaji kuambia ni msimbo gani waendeshe hii ni mfano bora wa kupitisha zana!
Jaribu msimbo huu baada ya sekunde 3, utaona ujumbe:
@ -189,19 +348,19 @@ Jaribu msimbo huu baada ya sekunde 3, utaona ujumbe:
function displayDone() {
console.log('3 seconds has elapsed');
}
// timer value is in milliseconds
// thamani ya kipimaji muda iko katika millisekunde
setTimeout(displayDone, 3000);
```
Angalia jinsi tunavyopitisha `displayDone` (bila mabano) kwa `setTimeout`. Hatuiiti kazi sisi wenyewe tunaipeleka kwa `setTimeout` na kusema "iite hii baada ya sekunde 3."
Angalia jinsi tunavyopitisha `displayDone` (bila mabano) kwa `setTimeout`. Hatuwafanyi kuitisha zana sisi peke yetu tunaikabidhi kwa `setTimeout` na kusema "iite ndani ya sekunde 3."
### Kazi zisizo na jina
### Zana zisizo na majina
Wakati mwingine unahitaji kazi kwa jambo moja tu na hutaki kuipa jina. Fikiria ikiwa unatumia kazi mara moja tu, kwa nini uchafue msimbo wako na jina la ziada?
Wakati mwingine unahitaji zana kwa jambo moja tu na hutaki kuipa jina. Fikiria kama utatumia zana mara moja tu, kwa nini ujaze msimbo wako na jina ziada?
JavaScript inakuruhusu kuunda **kazi zisizo na jina** kazi bila majina unazoweza kufafanua pale pale unapozihitaji.
JavaScript hukuwezesha kuunda **zana zisizo na majina** zana zisizo na majina ambazo unaweza kuziainisha mahali unapotakiwa.
Hivi ndivyo tunavyoweza kuandika upya mfano wetu wa kipima muda kwa kutumia kazi isiyo na jina:
Hapa kuna jinsi tunaweza kuandika upya mfano wetu wa kengele tukitumia zana isiyo na jina:
```javascript
setTimeout(function() {
@ -209,15 +368,15 @@ setTimeout(function() {
}, 3000);
```
Hii inafanikisha matokeo sawa, lakini kazi inafafanuliwa moja kwa moja ndani ya wito wa `setTimeout`, ikiondoa hitaji la tamko la kazi tofauti.
Hii inapatikana matokeo sawa, lakini zana imefafanuliwa moja kwa moja ndani ya wito wa `setTimeout`, kuondoa hitaji la tangazo la zana tofauti.
### Kazi za mishale
### Zana za mshale mpana (Fat arrow functions)
JavaScript ya kisasa ina njia fupi zaidi ya kuandika kazi inayoitwa **kazi za mishale**. Zinatumia `=>` (ambayo inaonekana kama mshale umeona?) na ni maarufu sana kwa waendelezaji.
JavaScript ya kisasa ina njia fupi zaidi ya kuandika zana inayoitwa **arrow functions**. Zinatumia `=>` (inavyoonekana kama mshale umeielewa?) na ni maarufu sana kwa waendelezaji.
Kazi za mishale hukuruhusu kuruka neno kuu `function` na kuandika msimbo wa muhtasari zaidi.
Zana za mshale hukuruhusu kuacha neno `function` na kuandika msimbo wenye ufanisi zaidi.
Hapa kuna mfano wetu wa kipima muda ukitumia kazi ya mshale:
Hapa ni mfano wa kengele ukitumia zana ya mshale:
```javascript
setTimeout(() => {
@ -225,11 +384,64 @@ setTimeout(() => {
}, 3000);
```
`()` ni mahali ambapo vigezo vingine vinaweza kwenda (hakuna katika kesi hii), kisha mshale `=>`, na hatimaye mwili wa kazi katika mabano ya curly. Hii inatoa utendaji sawa na sintaksia ya muhtasari zaidi.
### Wakati wa kutumia kila mkakati
Ni lini unapaswa kutumia kila mbinu? Mwongozo wa vitendo: ikiwa utatumia kazi mara nyingi, ipe jina na uifafanue tofauti. Ikiwa ni kwa matumizi maalum, fikiria kazi isiyo na jina. Kazi za mishale na sintaksia ya jadi zote ni chaguo halali, ingawa kazi za mishale ni maarufu katika misimbo ya kisasa ya JavaScript.
`()` ni mahali pa vigezo (hali hii ni tupu), kisha mshale `=>`, na mwili wa zana ndani ya mabano. Hii hutoa utendakazi uleule kwa sarufi fupi zaidi.
```mermaid
flowchart LR
A["📝 Mitindo ya Function"] --> B["Ya Kawaida"]
A --> C["Upinde"]
A --> D["Isiyojulikana"]
B --> B1["function name() {}"]
B --> B2["Iliyopandishwa"]
B --> B3["Iliyopangwa"]
C --> C1["const name = () => {}"]
C --> C2["Msamiati mfupi"]
C --> C3["Mtindo wa kisasa"]
D --> D1["function() {}"]
D --> D2["Bila jina"]
D --> D3["Matumizi ya mara moja"]
E["⏰ Wakati wa Kutumia"] --> E1["Ya Kawaida: Functions zinazoweza kutumika tena"]
E --> E2["Upinde: Callbacks fupi"]
E --> E3["Isiyojulikana: Washughulikiaji wa matukio"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
```
### Wakati wa kutumia kila mbinu
Ni lini unapaswa kutumia kila njia? Mwelekeo wa vitendo: ikiwa utatumia zana mara nyingi, ipa jina na uiainishe tofauti. Ikiwa ni kwa matumizi maalum mara moja, fikiria zana isiyo na jina. Zana za mshale na sarufi ya jadi zote ni chaguo halali, ingawa zana za mshale zinaenea sana katika misimbo ya JavaScript ya kisasa.
### 🎨 **Ukaguzi wa Mtindo wa Zana: Kuchagua Sarufi Sahihi**
**Jaribu ufahamu wako wa sarufi:**
- Ni lini unaweza kupendelea zana za mshale badala ya sarufi ya jadi za zana?
- Faida kuu ya zana zisizo na majina ni nini?
- Unaweza kufikiria hali ambapo zana iliyo na jina ni bora kuliko isiyo na jina?
```mermaid
quadrantChart
title Matrii ya Uamuzi wa Uchaguzi wa Kazi
x-axis Rahisi --> Ngumu
y-axis Matumizi ya Mara Moja --> Yanayoweza Kutumika Mara Nyingi
quadrant-1 Arrow Functions
quadrant-2 Named Functions
quadrant-3 Anonymous Functions
quadrant-4 Traditional Functions
Event Handlers: [0.3, 0.2]
Utility Functions: [0.7, 0.8]
Callbacks: [0.2, 0.3]
Class Methods: [0.8, 0.7]
Mathematical Operations: [0.4, 0.6]
```
> **Mwelekeo wa kisasa**: Zana za mshale zinakuwa chaguo la asili kwa waendelezaji wengi kwa sababu ya sarufi fupi, lakini zana za jadi bado zina nafasi zao!
---
@ -237,35 +449,136 @@ Ni lini unapaswa kutumia kila mbinu? Mwongozo wa vitendo: ikiwa utatumia kazi ma
## 🚀 Changamoto
Je, unaweza kueleza kwa sentensi moja tofauti kati ya kazi na mbinu? Jaribu!
Je, unaweza kuelezea tofauti kati ya zana na mbinu kwa sentensi moja? Jaribu sasa!
## Changamoto ya Wakala wa GitHub Copilot 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
**Maelezo:** Unda maktaba ya zana za hesabu inayoonyesha dhana tofauti za kazi zilizofunikwa katika somo hili, ikiwa ni pamoja na vigezo, maadili ya chaguo-msingi, maadili ya kurudi, na kazi za mishale.
**Maelezo:** Unda maktaba ya zana za hisabati inayoonyesha dhana mbalimbali za zana zilizojadiliwa katika somo hili, ikijumuisha vigezo, thamani za chaguo-msingi, thamani za kurudishiwa, na zana za mshale.
**Maelekezo:** Unda faili ya JavaScript inayoitwa `mathUtils.js` inayojumuisha kazi zifuatazo:
1. Kazi `add` inayochukua vigezo viwili na kurudisha jumla yao
2. Kazi `multiply` yenye maadili ya chaguo-msingi ya kigezo (kigezo cha pili kinachukulia chaguo-msingi ya 1)
3. Kazi ya mshale `square` inayochukua namba na kurudisha mraba wake
4. Kazi `calculate` inayokubali kazi nyingine kama kigezo na namba mbili, kisha kuitumia kazi hiyo kwa namba hizo
5. Onyesha wito wa kila kazi na kesi za majaribio zinazofaa
**Maelekezo:** Unda faili la JavaScript linaloitwa `mathUtils.js` lenye zana zifuatazo:
1. Zana `add` inayopitisha vigezo viwili na kurudisha jumla yao
2. Zana `multiply` ikiwa na thamani za chaguo-msingi za vigezo (kigezo cha pili kina thamani ya asili 1)
3. Zana ya mshale `square` inayopitisha nambari na kurudisha mraba wake
4. Zana `calculate` inayokubali zana nyingine kama kigezo na nambari mbili, kisha kutumia zana hiyo kwa nambari hizo
5. Onyesha kuitisha kila zana kwa kesi za majaribio zinazofaa
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## Maswali ya Baada ya Somo
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app)
## Mtihani Baada ya Mhodhi
[Post-lecture quiz](https://ff-quizzes.netlify.app)
## Mapitio na Kujisomea
## Mapitio & Kujisomea
Inafaa [kusoma zaidi kuhusu kazi za mishale](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), kwa kuwa zinatumika zaidi katika misimbo ya kisasa. Fanya mazoezi ya kuandika kazi, kisha uandike upya kwa sintaksia hii.
Inafaa [kusoma zaidi kuhusu zana za mshale](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), kwani zinazidi kutumika katika misimbo ya kisasa. Fanya mazoezi ya kuandika zana, kisha uiongeze tena kwa sarufi hii.
## Kazi ya Nyumbani
[Furaha na Kazi](assignment.md)
[Burudika na Zana](assignment.md)
---
## 🧰 **Muhtasari wa Kikokotoo cha Zana Zako za JavaScript**
```mermaid
graph TD
A["🎯 Kazi za JavaScript"] --> B["📋 Ufafanuzi wa Kazi"]
A --> C["📥 Vigezo"]
A --> D["📤 Thamani za Kurudi"]
A --> E["🎨 Sintaksia ya Kisasa"]
B --> B1["function name() {}"]
B --> B2["Kutoa majina ya kueleweka"]
B --> B3["Vizuizi vya msimbo vinavyoweza kutumika tena"]
C --> C1["Data za kuingiza"]
C --> C2["Thamani za msingi"]
C --> C3["Vigezo vingi"]
D --> D1["kauli ya kurudi"]
D --> D2["Kutoka kazi"]
D --> D3["Pitia data kurudi"]
E --> E1["Kazi za mshale: () =>"]
E --> E2["Kazi zisizo na majina"]
E --> E3["Kazi za daraja la juu"]
F["⚡ Manufaa Muhimu"] --> F1["Uwezekano wa kutumia msimbo tena"]
F --> F2["Mpangilio bora"]
F --> F3["Upimaji rahisi"]
F --> F4["Muundo wa modular"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
---
## 🚀 Muda wa Ukamilishaji wa Ustadi wa Zana za JavaScript Yako
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Andika zana rahisi inayorudisha nambari unayopenda
- [ ] Unda zana yenye vigezo viwili inayojumlisha vigezo hivyo pamoja
- [ ] Jaribu kubadilisha kazi ya kawaida kuwa sintaksia ya kazi ya mshale
- [ ] Fanya mazoezi ya changamoto: eleza tofauti kati ya kazi na mbinu
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Kompleti jaribio la baada ya somo na kupitia dhana zozote zinazochanganya
- [ ] Jenga maktaba ya zana za hisabati kutoka changamoto ya GitHub Copilot
- [ ] Unda kazi inayotumia kazi nyingine kama parameta
- [ ] Fanya mazoezi ya kuandika kazi zilizo na parameta za chaguo-msingi
- [ ] Jaribu tempeleti za maneno katika thamani za kurudisha kazi
### 📅 **Utaalamu Wako wa Kazi Kwa Wiki Nzima**
- [ ] Kompleti kazi ya "Mchezo na Kazi" kwa ubunifu
- [ ] Rekebisha baadhi ya msimbo unaorudiwa uliouandika kuwa kazi zinazotumika tena
- [ ] Jenga kalkuleta ndogo ukitumia kazi pekee (hakuna vigezo vya ulimwengu)
- [ ] Fanya mazoezi ya kazi za mshale kwa kutumia mbinu za safu kama `map()` na `filter()`
- [ ] Unda mkusanyiko wa kazi za zana kwa kazi za kawaida
- [ ] Soma kazi za ngazi ya juu na dhana za programu za kazi
### 🌟 **Mabadiliko Yako Kwa Mwezi Mzima**
- [ ] Tawala dhana za juu za kazi kama closures na scope
- [ ] Jenga mradi unaotumia sana muundo wa kazi
- [ ] Changia kwenye chanzo wazi kwa kuboresha hati za kazi
- [ ] Fundisha mtu mwingine kuhusu kazi na mtindo tofauti wa sintaksia
- [ ] Chunguza mitazamo ya programu za kazi katika JavaScript
- [ ] Unda maktaba binafsi ya kazi zinazotumika tena kwa miradi ya baadaye
### 🏆 **Ukaguzi wa Mwisho wa Bingwa wa Kazi**
**Sherehekea utaalamu wako wa kazi:**
- Ni kazi gani yenye manufaa zaidi uliyounda hadi sasa?
- Je, kujifunza kuhusu kazi kumeathiri vipi mtazamo wako juu ya upangaji wa msimbo?
- Ni sintaksia gani ya kazi unapendelea na kwa nini?
- Ni tatizo gani halisi la dunia ungeweza kulitatua kwa kuandika kazi?
```mermaid
journey
title Maendeleo ya Kujiamini Kwako Katika Kazi za Kazi
section Leo
Kushangaa Sintaksia: 3: You
Kuelewa Misingi: 4: You
Kuandika Kazi Rahisi: 5: You
section Wiki Hii
Kutumia Vigezo: 4: You
Kurudisha Thamani: 5: You
Sintaksia ya Kisasa: 5: You
section Mwezi Ujao
Uundaji wa Kazi: 5: You
Mifumo Changamfu: 5: You
Kufundisha Wengine: 5: You
```
> 🎉 **Umeweza sana kuhusu mojawapo ya dhana zenye nguvu zaidi za programu!** Kazi ni msingi wa programu kubwa. Kila programu utakayojenga kutumia kazi kupanga, kutumia tena, na kuunda muundo wa msimbo. Sasa unaelewa jinsi ya kufunga mantiki katika vipengele vinavyoweza kutumika tena, na kufanya wewe kuwa mpogozaji wa msimbo mwenye ufanisi zaidi. Karibu kwenye dunia ya programu ya moduli! 🚀
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tangazo la Kukataa**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au kasoro. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha zaidi kuaminiwa. Kwa taarifa muhimu, tafsiri ya mtaalamu wa lugha ya binadamu inapendekezwa. Hatubeba dhamana yoyote kwa kutoelewana au tafsiri potofu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,149 +1,295 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "90a3c32c3377f83ab750c2447c77ab98",
"translation_date": "2025-10-24T19:12:00+00:00",
"original_hash": "c688385d15dd3645e924ea0ffee8967f",
"translation_date": "2026-01-07T01:26:54+00:00",
"source_file": "2-js-basics/3-making-decisions/README.md",
"language_code": "sw"
}
-->
# Misingi ya JavaScript: Kufanya Maamuzi
![Misingi ya JavaScript - Kufanya maamuzi](../../../../translated_images/webdev101-js-decisions.69e1b20f272dd1f0b1cb2f8adaff3ed2a77c4f91db96d8a0594132a353fa189a.sw.png)
![JavaScript Basics - Making decisions](../../../../translated_images/webdev101-js-decisions.69e1b20f272dd1f0.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
Je, umewahi kujiuliza jinsi programu zinavyofanya maamuzi ya busara? Kama jinsi mfumo wa urambazaji unavyochagua njia ya haraka zaidi, au jinsi thermostat inavyoamua wakati wa kuwasha joto? Hii ni dhana ya msingi ya kufanya maamuzi katika programu.
```mermaid
journey
title Safari Yako ya Uamuzi wa JavaScript
section Msingi
Thamani za Boolean: 5: You
Waendeshaji wa Ikaguzi: 4: You
Fikra za Kiakili: 5: You
section Maamuzi Msingi
Taarifa za If: 4: You
Mantiki ya If-Else: 5: You
Taarifa za Switch: 4: You
section Mantiki ya Juu
Waendeshaji wa Mantiki: 5: You
Masharti Magumu: 4: You
Vigezo vya Ternary: 5: You
```
Je, umewahi kuwa na mshangao jinsi programu zinavyofanya maamuzi mahiri? Kama vile mfumo wa urambazaji unavyochagua njia ya haraka zaidi, au jinsi thermostat inavyopima lini kuwasha joto? Hii ni dhana msingi ya kufanya maamuzi katika programu.
Kama vile Injini ya Uchambuzi ya Charles Babbage ilivyoundwa kufuata mfululizo tofauti wa operesheni kulingana na hali, programu za kisasa za JavaScript zinahitaji kufanya chaguo kulingana na hali tofauti. Uwezo huu wa kuchagua na kufanya maamuzi ndio hubadilisha msimbo wa tuli kuwa programu zinazojibu na zenye akili.
Kama vile Mashine ya Kikaguzi ya Charles Babbage ilivyotengenezwa kufuata mfuatano tofauti wa operesheni kulingana na masharti, programu za kisasa za JavaScript zinahitaji kufanya chaguzi kulingana na hali tofauti. Uwezo huu wa kupinda na kufanya maamuzi ndio unaobadilisha msimbo wa kustaafu kuwa programu zenye majibu mahiri.
Katika somo hili, utajifunza jinsi ya kutekeleza mantiki ya masharti katika programu zako. Tutachunguza kauli za masharti, waendeshaji wa kulinganisha, na maelezo ya kimantiki yanayoruhusu msimbo wako kutathmini hali na kujibu ipasavyo.
Katika somo hili, utajifunza jinsi ya kutekeleza mantiki ya masharti katika programu zako. Tutachunguza taarifa za masharti, vigezo vya kulinganisha, na maelezo ya mantiki ambayo yanaruhusu msimbo wako kutathmini hali na kutoa majibu sahihi.
## Jaribio la Kabla ya Somo
## Mtihani wa Kabla ya Mhadhara
[Jaribio la kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/11)
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/11)
Uwezo wa kufanya maamuzi na kudhibiti mtiririko wa programu ni kipengele cha msingi cha programu. Sehemu hii inashughulikia jinsi ya kudhibiti njia ya utekelezaji wa programu zako za JavaScript kwa kutumia thamani za Boolean na mantiki ya masharti.
Uwezo wa kufanya maamuzi na kudhibiti mtiririko wa programu ni kipengele msingi cha programu. Sehemu hii inahusu jinsi ya kudhibiti njia ya utekelezaji wa programu zako za JavaScript kwa kutumia Thamani za Boolean na mantiki ya masharti.
[![Kufanya Maamuzi](https://img.youtube.com/vi/SxTp8j-fMMY/0.jpg)](https://youtube.com/watch?v=SxTp8j-fMMY "Kufanya Maamuzi")
[![Making Decisions](https://img.youtube.com/vi/SxTp8j-fMMY/0.jpg)](https://youtube.com/watch?v=SxTp8j-fMMY "Making Decisions")
> 🎥 Bonyeza picha hapo juu kwa video kuhusu kufanya maamuzi.
> Unaweza kuchukua somo hili kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-if-else/?WT.mc_id=academic-77807-sagibbon)!
## Muhtasari Mfupi Kuhusu Booleans
```mermaid
mindmap
root((Uamuzi wa Kufanya))
Boolean Logic
kweli/sio kweli
Matokeo ya kulinganisha
Maelezo ya kimantiki
Conditional Statements
kauli za ikiwa
Hali moja
Utekelezaji wa msimbo
ikiwa-vinginevyo
Njia mbili
Vitendo mbadala
kubadili
Chaguzi nyingi
Muundo safi
Operators
Comparison
=== !== < > <= >=
Uhusiano wa thamani
Logical
&& || !
Kuunganisha masharti
Advanced Patterns
Ternary
? : sintaksi
Maamuzi ya mstari
Complex Logic
Masharti yaliyopindika
Vigezo vingi
```
## Muhtasari Mfupi kuhusu Booleans
Kabla ya kuchunguza kufanya maamuzi, hebu tukumbuke thamani za Boolean kutoka somo letu la awali. Zikitajwa kwa jina la mwanahisabati George Boole, thamani hizi zinawakilisha hali mbili aidha `true` au `false`. Hakuna utata, hakuna hali ya kati.
Kabla ya kuchunguza kufanya maamuzi, tuchukulie tena Thamani za Boolean kutoka somo letu la awali. Zinaitwa kwa jina la mwanagundua hisabati George Boole, thamani hizi zinaonyesha hali za binary iwe `true` au `false`. Hakuna mkanganyiko, hakuna kati.
Thamani hizi za binary zinaunda msingi wa mantiki yote ya kompyuta. Kila uamuzi ambao programu yako hufanya hatimaye hupunguzwa kuwa tathmini ya Boolean.
Thamani hizi za binary ndizo msingi wa mantiki zote za kompyuta. Kila uamuzi unaotengenezwa na programu yako hatimaye huanza na tathmini ya Boolean.
Kuunda vigezo vya Boolean ni rahisi:
Kuumba vigezo vya Boolean ni rahisi:
```javascript
let myTrueBool = true;
let myFalseBool = false;
```
Hii huunda vigezo viwili vyenye thamani za Boolean wazi.
✅ Booleans zimetajwa kwa jina la mwanahisabati, mwanafalsafa na mtaalamu wa mantiki George Boole (18151864).
## Waendeshaji wa Kulinganisha na Booleans
Kwa vitendo, mara chache utaweka thamani za Boolean kwa mkono. Badala yake, utazalisha thamani hizi kwa kutathmini hali: "Je, namba hii ni kubwa kuliko ile?" au "Je, thamani hizi ni sawa?"
Waendeshaji wa kulinganisha huwezesha tathmini hizi. Wanalinganisha thamani na kurudisha matokeo ya Boolean kulingana na uhusiano kati ya operands.
| Alama | Maelezo | Mfano |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| `<` | **Kidogo kuliko**: Inalinganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni ndogo kuliko ya kulia | `5 < 6 // true` |
| `<=` | **Kidogo au sawa na**: Inalinganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni ndogo au sawa na ya kulia | `5 <= 6 // true` |
| `>` | **Kubwa kuliko**: Inalinganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni kubwa kuliko ya kulia | `5 > 6 // false` |
| `>=` | **Kubwa au sawa na**: Inalinganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni kubwa au sawa na ya kulia | `5 >= 6 // false` |
| `===` | **Usawa mkali**: Inalinganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kulia na kushoto ni sawa NA ni aina sawa ya data. | `5 === 6 // false` |
| `!==` | **Kutokuwepo usawa**: Inalinganisha thamani mbili na kurudisha thamani ya Boolean kinyume na kile ambacho operator wa usawa mkali ungeweza kurudisha | `5 !== 6 // true` |
✅ Angalia ujuzi wako kwa kuandika kulinganisha kadhaa kwenye console ya kivinjari chako. Je, data yoyote iliyorejeshwa inakushangaza?
Hii inaunda vigezo viwili vilivyo na thamani za wazi za Boolean.
✅ Booleans zinaitwa kwa jina la mwanahisabati, mwanafalsafa na mantiki wa Kiingereza George Boole (18151864).
## Vigezo vya Kulinganisha na Booleans
Katika vitendo, mara chache utaweka Thamani za Boolean kwa mkono. Badala yake, utazitengeneza kwa kutathmini masharti: "Je, nambari hii ni kubwa zaidi kuliko ile?" au "Je, thamani hizi ni sawa?"
Vigezo vya kulinganisha vinaruhusu tathmini hizi. Vinalinganisha thamani na kurudisha matokeo ya Boolean kulingana na uhusiano kati ya waendeshaji.
| Alama | Maelezo | Mfano |
| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| `<` | **Chini zaidi**: Linganisha thamani mbili na kurudisha aina ya data ya Boolean `true` kama thamani upande wa kushoto ni chini kuliko kulia | `5 < 6 // true` |
| `<=` | **Chini au sawa na**: Linganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni chini au sawa na upande wa kulia | `5 <= 6 // true` |
| `>` | **Kubwa zaidi**: Linganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni kubwa kuliko upande wa kulia | `5 > 6 // false` |
| `>=` | **Kubwa au sawa na**: Linganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kushoto ni kubwa au sawa na upande wa kulia | `5 >= 6 // false` |
| `===` | **Ulinganifu wa dhati**: Linganisha thamani mbili na kurudisha aina ya data ya Boolean `true` ikiwa thamani upande wa kulia na kushoto ni sawa NA ni aina moja | `5 === 6 // false` |
| `!==` | **Kutofautiana**: Linganisha thamani mbili na kurudisha kinyume cha thamani ya Boolean ambayo uendeshaji wa ulinganifu wa dhati ungeirudisha | `5 !== 6 // true` |
✅ Angalia maarifa yako kwa kuandika kulinganisha kadhaa kwenye koni ya kivinjari chako. Je, data iliyorejeshwa inakushangaza?
```mermaid
flowchart LR
A["🔢 Thamani"] --> B["⚖️ Ulinganishi"]
B --> C["✅ Matokeo ya Boolean"]
D["5"] --> E["< 6"]
E --> F["kweli"]
G["10"] --> H["=== '10'"]
H --> I["sikuwa"]
J["'hello'"] --> K["!== 'world'"]
K --> L["kweli"]
M["📋 Aina za Operator"] --> M1["Usawa: === !=="]
M --> M2["Ulinganifu: < > <= >="]
M --> M3["Kali vs Nyeupe"]
style A fill:#e3f2fd
style C fill:#e8f5e8
style M fill:#fff3e0
```
### 🧠 **Mtihani wa Uwezo wa Kulinganisha: Kuelewa Mantiki ya Boolean**
**Jaribu uelewa wako wa kulinganisha:**
- Kwa nini unadhani `===` (ulinganifu wa dhati) hupendekezwa zaidi kuliko `==` (ulinganifu usio rasmi)?
- Je, unaweza kutabiri nini `5 === '5'` inarudisha? Vipi kwa `5 == '5'`?
- Tofauti ni gani kati ya `!==` na `!=`?
```mermaid
stateDiagram-v2
[*] --> Comparison: Thamani mbili
Comparison --> StrictEqual: === au !==
Comparison --> Relational: < > <= >=
StrictEqual --> TypeCheck: Angalia aina NA thamani
Relational --> NumberCompare: Badilisha kuwa nambari
TypeCheck --> BooleanResult: kweli au sio kweli
NumberCompare --> BooleanResult
note right of StrictEqual
Njia inayopendekezwa
Hakuna uongofu wa aina
end note
note right of Relational
Inafaa kwa vipimo
Mlinganiko wa nambari
end note
```
> **Ushauri wa mtaalamu**: Daima tumia `===` na `!==` kwa ukaguzi wa usawa isipokuwa unahitaji kubadilisha aina maalum. Hii huzuia tabia zisizotarajiwa!
## Kauli ya If
Kauli ya `if` ni kama kuuliza swali katika msimbo wako. "Ikiwa hali hii ni kweli, basi fanya jambo hili." Labda ni zana muhimu zaidi utakayotumia kufanya maamuzi katika JavaScript.
Kauli ya `if` ni kama kuuliza swali ndani ya msimbo wako. "Kama sharti hili ni kweli, basi fanya hili jambo." Inaweza kuwa zana muhimu zaidi unayotumia kwa kufanya maamuzi ndani ya JavaScript.
Hivi ndivyo inavyofanya kazi:
```javascript
if (condition) {
// Condition is true. Code in this block will run.
// Hali ni kweli. Msimbo katika sehemu hii utaendeshwa.
}
```
Hali huwekwa ndani ya mabano, na ikiwa ni `true`, JavaScript inaendesha msimbo ndani ya mabano ya curly. Ikiwa ni `false`, JavaScript inaruka kizuizi hicho chote.
Sharti linaingia ndani ya mabano ya mzunguko, na ikiwa ni `true`, JavaScript inaendesha msimbo ndani ya mabano hayo. Ikiwa ni `false`, JavaScript inasahau sehemu yote hiyo.
Mara nyingi utatumia waendeshaji wa kulinganisha kuunda hali hizi. Hebu tuone mfano wa vitendo:
Mara nyingi utatumia vigezo vya kulinganisha kuunda masharti haya. Tazama mfano wa vitendo:
```javascript
let currentMoney = 1000;
let laptopPrice = 800;
if (currentMoney >= laptopPrice) {
// Condition is true. Code in this block will run.
// Hali ni kweli. Nambari katika sehemu hii itaendeshwa.
console.log("Getting a new laptop!");
}
```
Kwa kuwa `1000 >= 800` inatathminiwa kuwa `true`, msimbo ndani ya kizuizi unatekelezwa, na kuonyesha "Kupata laptop mpya!" kwenye console.
Kwa kuwa `1000 >= 800` inathibitishwa kuwa `true`, msimbo ndani ya block unaendeshwa, ukionyesha "Kupata kompyuta mpya!" kwenye koni.
```mermaid
flowchart TD
A["🚀 Kuanzisha Programu"] --> B{"💰 currentMoney >= laptopPrice?"}
B -->|true| C["🎉 'Kupata kompyuta mpakato mpya!'"]
B -->|false| D["⏭️ Ruka sehemu ya msimbo"]
C --> E["📋 Endelea na programu"]
D --> E
F["📊 Muundo wa Kauli ya Ikiwa"] --> F1["if (hali) {"]
F1 --> F2[" // msimbo wa kuendesha ikiwa kweli"]
F2 --> F3["}"]
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#ffebee
style F fill:#e3f2fd
```
## Kauli ya If..Else
Lakini vipi ikiwa unataka programu yako ifanye kitu tofauti wakati hali ni false? Hapo ndipo `else` inapoingia ni kama kuwa na mpango wa dharura.
Lakini vipi ikiwa unataka programu yako ifanye kitu tofauti wakati sharti ni false? Hapo ndipo `else` huingia ni kama kuwa na mpango wa akiba.
Kauli ya `else` inakupa njia ya kusema "ikiwa hali hii si kweli, fanya jambo hili badala yake."
Kauli ya `else` inakupa njia ya kusema "kama sharti hili si kweli, fanya jambo hili badala yake."
```javascript
let currentMoney = 500;
let laptopPrice = 800;
if (currentMoney >= laptopPrice) {
// Condition is true. Code in this block will run.
// Hali ni kweli. Msimbo katika kubuni hii utaendesha.
console.log("Getting a new laptop!");
} else {
// Condition is false. Code in this block will run.
// Hali ni potofu. Msimbo katika kubuni hii utaendesha.
console.log("Can't afford a new laptop, yet!");
}
```
Sasa kwa kuwa `500 >= 800` ni `false`, JavaScript inaruka kizuizi cha kwanza na inaendesha kizuizi cha `else` badala yake. Utaona "Siwezi kumudu laptop mpya, bado!" kwenye console.
✅ Jaribu kuelewa msimbo huu na msimbo unaofuata kwa kuutekeleza kwenye console ya kivinjari. Badilisha thamani za vigezo vya currentMoney na laptopPrice ili kubadilisha `console.log()` inayorejeshwa.
Sasa kwa kuwa `500 >= 800` ni `false`, JavaScript inaruka sehemu ya kwanza na kuendesha block la `else` badala yake. Utaona "Huwezi kumudu kompyuta mpya, bado!" kwenye koni.
✅ Jaribu kuelewa msimbo huu na msimbo unaofuata kwa kuukimbia kwenye koni ya kivinjari. Badilisha thamani za vigezo vya currentMoney na laptopPrice kubadilisha `console.log()` inayorejeshwa.
### 🎯 **Kagua Mantiki ya If-Else: Njia Zinazotofautiana**
**Tathmini uelewa wako wa mantiki ya masharti:**
- Nini hutokea ikiwa `currentMoney` iko sawa kabisa na `laptopPrice`?
- Je, unaweza kufikiria mfano halisi ambapo mantiki ya if-else itakuwa na manufaa?
- Unawezaje kuiongeza hii kushughulikia anuwai ya viwango vya bei?
```mermaid
flowchart TD
A["🔍 Tathmini Hali"] --> B{"Hali Ni Kweli?"}
B -->|Ndiyo| C["📤 Tekeleza sehemu YA IF"]
B -->|Hapana| D["📥 Tekeleza sehemu YA ELSE"]
C --> E["✅ Njia moja imechaguliwa"]
D --> E
F["🌐 Mifano ya Ulimwengu Halisi"] --> F1["Hali ya kuingia mtumiaji"]
F --> F2["Uhakiki umri"]
F --> F3["Uthibitisho wa fomu"]
F --> F4["Mabadiliko ya hali ya mchezo"]
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#e3f2fd
style F fill:#f3e5f5
```
> **Uelewa muhimu**: If-else inahakikisha njia moja tu inachukuliwa. Hii inahakikisha programu yako daima ina jibu kwa sharti lolote!
## Kauli ya Switch
Wakati mwingine unahitaji kulinganisha thamani moja dhidi ya chaguo nyingi. Ingawa unaweza kufunga kauli kadhaa za `if..else`, mbinu hii inakuwa ngumu. Kauli ya `switch` inatoa muundo safi zaidi wa kushughulikia thamani nyingi tofauti.
Wakati mwingine unahitaji kulinganisha thamani moja dhidi ya chaguzi nyingi. Ingawa unaweza kuunganisha kauli kadhaa za `if..else`, njia hii inaweza kuwa ngumu kusimamia. Kauli ya `switch` hutoa muundo safi wa kushughulikia thamani nyingi tofauti.
Dhana hii inafanana na mifumo ya kubadili mitambo iliyotumika katika ubadilishaji wa simu za mapema thamani moja ya pembejeo huamua njia maalum ambayo utekelezaji unafuata.
Dhana hii inafanana na mifumo ya kubadili mitambo iliyotumika kwenye mabadilishano ya simu ya mwanzo thamani moja ya ingizo huchagua njia maalum ambayo utekelezaji unaifuata.
```javascript
switch (expression) {
case x:
// code block
// kipande cha msimbo
break;
case y:
// code block
// kipande cha msimbo
break;
default:
// code block
// kipande cha msimbo
}
```
Hivi ndivyo ilivyo:
- JavaScript inatathmini usemi mara moja
- Inatafuta kila `case` ili kupata mechi
- Inapopata mechi, inaendesha kizuizi cha msimbo hicho
- `break` inaambia JavaScript kusimama na kutoka kwenye switch
- Ikiwa hakuna kesi inayolingana, inaendesha kizuizi cha `default` (ikiwa unacho)
Hivi ndivyo imeumbwa:
- JavaScript inathibitisha usemi mara moja
- Inaangalia kila `case` kutafuta mechi
- Inapopata mechi, inaendesha sehemu ya msimbo huo
- `break` inamuambia JavaScript kusimamisha na kutoka switch
- Ikiwa hakuna case inapatana, inaendesha block ya `default` (ikiwa ipo)
```javascript
// Program using switch statement for day of week
// Programu inayotumia tamko la switch kwa siku ya wiki
let dayNumber = 2;
let dayName;
@ -164,72 +310,168 @@ switch (dayNumber) {
console.log(`Today is ${dayName}`);
```
Katika mfano huu, JavaScript inaona kwamba `dayNumber` ni `2`, inapata `case 2` inayolingana, inaweka `dayName` kuwa "Jumanne", na kisha inatoka kwenye switch. Matokeo? "Leo ni Jumanne" linaonyeshwa kwenye console.
✅ Jaribu kuelewa msimbo huu na msimbo unaofuata kwa kuutekeleza kwenye console ya kivinjari. Badilisha thamani za kigezo a ili kubadilisha `console.log()` inayorejeshwa.
## Waendeshaji wa Mantiki na Booleans
Maamuzi magumu mara nyingi yanahitaji kutathmini hali nyingi kwa wakati mmoja. Kama vile aljebra ya Boolean inavyoruhusu wanahisabati kuunganisha maelezo ya kimantiki, programu hutoa waendeshaji wa mantiki kuunganisha hali nyingi za Boolean.
Waendeshaji hawa huwezesha mantiki ya masharti ya hali ya juu kwa kuunganisha tathmini rahisi za kweli/siyo kweli.
Katika mfano huu, JavaScript inaona kwamba `dayNumber` ni `2`, inapata case inayoendana ya `2`, inaweka `dayName` kuwa "Tuesday", na kisha inatoka switch. Matokeo? "Leo ni Jumanne" inaandikwa kwenye koni.
```mermaid
flowchart TD
A["📥 switch(expression)"] --> B["🔍 Tathmini mara moja"]
B --> C{"Inalingana na kesi 1?"}
C -->|Ndio| D["📋 Tekeleza kesi 1"]
C -->|Hapana| E{"Inalingana na kesi 2?"}
E -->|Ndio| F["📋 Tekeleza kesi 2"]
E -->|Hapana| G{"Inalingana na kesi 3?"}
G -->|Ndio| H["📋 Tekeleza kesi 3"]
G -->|Hapana| I["📋 Tekeleza kawaida"]
D --> J["🛑 simama"]
F --> K["🛑 simama"]
H --> L["🛑 simama"]
J --> M["✅ Toka switch"]
K --> M
L --> M
I --> M
style A fill:#e3f2fd
style B fill:#fff3e0
style M fill:#e8f5e8
```
✅ Jaribu kuelewa msimbo huu na msimbo unaofuata kwa kuukimbia kwenye koni ya kivinjari. Badilisha thamani za mabadiliko a kubadilisha `console.log()` inayorejeshwa.
| Alama | Maelezo | Mfano |
| ------ | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `&&` | **Mantiki AND**: Inalinganisha maelezo mawili ya Boolean. Inarudisha kweli **tu** ikiwa pande zote mbili ni kweli | `(5 > 3) && (5 < 10) // Pande zote mbili ni kweli. Inarudisha kweli` |
| `\|\|` | **Mantiki OR**: Inalinganisha maelezo mawili ya Boolean. Inarudisha kweli ikiwa angalau upande mmoja ni kweli | `(5 > 10) \|\| (5 < 10) // Upande mmoja ni false, mwingine ni kweli. Inarudisha kweli` |
| `!` | **Mantiki NOT**: Inarudisha thamani kinyume ya maelezo ya Boolean | `!(5 > 10) // 5 si kubwa kuliko 10, kwa hivyo "!" inafanya kuwa kweli` |
### 🔄 **Ukakamavu wa Kauli ya Switch: Chaguzi Nyingi**
Waendeshaji hawa hukuruhusu kuunganisha hali kwa njia za manufaa:
- AND (`&&`) inamaanisha hali zote mbili lazima ziwe kweli
- OR (`||`) inamaanisha angalau hali moja lazima iwe kweli
- NOT (`!`) hubadilisha kweli kuwa si kweli (na kinyume chake)
**Jaribu uelewa wako wa switch:**
- Nini hutokea ikiwa unasahau kauli ya `break`?
- Ungetumia `switch` lini badala ya kauli nyingi za `if-else`?
- Kwa nini case ya `default` ni muhimu hata kama unadhani umefunika kila uwezekano?
## Hali na Maamuzi kwa Waendeshaji wa Mantiki
```mermaid
pie title "Wakati wa Kutumia Kila Muundo wa Uamuzi"
"Ikiwa-ng'ang'ania rahisi" : 40
"Minyororo tata ya ikiwa-ng'ang'ania" : 25
" taarifa za Switch" : 20
"Wakaguzi wa Ternary" : 15
```
> **Mazoea bora**: Tumia `switch` unapolinganisha mabadiliko moja dhidi ya thamani maalum nyingi. Tumia `if-else` kwa ukaguzi wa mikoa au masharti magumu!
## Vigezo vya Mantiki na Booleans
Maamuzi magumu mara nyingi yanahitaji kutathmini masharti mengi kwa wakati mmoja. Kama vile aljebra ya Boolean inavyowezesha mwanahisabati kuunganisha maelezo ya mantiki, programu hutoa vigezo vya mantiki kuunganisha masharti mengi ya Boolean.
Vigezo hivi vinaruhusu mantiki ya masharti ya hali ya juu kwa kuunganisha tathmini rahisi za true/false.
| Alama | Maelezo | Mfano |
| ------ | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `&&` | **Logical AND**: Linganisha maelezo mawili ya Boolean. Hurudisha true **mara tu** pande zote mbili zikiwa true | `(5 > 3) && (5 < 10) // Pande zote mbili ni true. Hurudisha true` |
| `\|\|` | **Logical OR**: Linganisha maelezo mawili ya Boolean. Hurudisha true ikiwa angalau upande mmoja ni true | `(5 > 10) \|\| (5 < 10) // Upande mmoja ni false, mwingine ni true. Hurudisha true` |
| `!` | **Logical NOT**: Hurudisha thamani kinyume ya maelezo ya Boolean | `!(5 > 10) // 5 si kubwa kuliko 10, hivyo "!" inaifanya iwe true` |
Vigezo hivi vinakuwezesha kuunganisha masharti kwa njia zenye manufaa:
- AND (`&&`) maana yake masharti yote mawili lazima yawe true
- OR (`||`) maana yake angalau sharti moja lazima liwe true
- NOT (`!`) hubadilisha true kuwa false (na kinyume chake)
```mermaid
flowchart LR
A["🔗 Waendeshaji wa Mantiki"] --> B["&& NA"]
A --> C["|| AU"]
A --> D["! SIO"]
B --> B1["Zote lazima ziwe kweli"]
B --> B2["kweli && kweli = kweli"]
B --> B3["kweli && uongo = uongo"]
C --> C1["Angalau moja ni kweli"]
C --> C2["kweli || uongo = kweli"]
C --> C3["uongo || uongo = uongo"]
D --> D1["Inageuza thamani"]
D --> D2["!kweli = uongo"]
D --> D3["!uongo = kweli"]
E["🌍 Mifano Halisi"] --> E1["Umri >= 18 && anaLeseni"]
E --> E2["niMwishoWiki || niLikizo"]
E --> E3["!ameingiaNdani"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
```
## Masharti na Maamuzi na Vigezo vya Mantiki
Hebu tuone waendeshaji hawa wa mantiki wakifanya kazi na mfano halisi zaidi:
Tazama jinsi vigezo hivi vya mantiki vinavyofanya kazi kwa mfano halisi zaidi:
```javascript
let currentMoney = 600;
let laptopPrice = 800;
let laptopDiscountPrice = laptopPrice - (laptopPrice * 0.2); // Laptop price at 20 percent off
let laptopDiscountPrice = laptopPrice - (laptopPrice * 0.2); // Bei ya kompyuta mdogo punguzo la asilimia 20
if (currentMoney >= laptopPrice || currentMoney >= laptopDiscountPrice) {
// Condition is true. Code in this block will run.
// Hali ni kweli. Msimbo katika sehemu hii utaendeshwa.
console.log("Getting a new laptop!");
} else {
// Condition is false. Code in this block will run.
// Hali si kweli. Msimbo katika sehemu hii utaendeshwa.
console.log("Can't afford a new laptop, yet!");
}
```
Katika mfano huu: tunahesabu bei ya punguzo la 20% (640), kisha tunatathmini ikiwa fedha zetu zilizopo zinatosha kwa bei kamili AU bei ya punguzo. Kwa kuwa 600 inakidhi kizingiti cha bei ya punguzo cha 640, hali inatathminiwa kuwa kweli.
Katika mfano huu: tunaweka bei ya punguzo la 20% (640), kisha tunathibitisha ikiwa fedha zetu zinatosha kulipia bei kamili AU bei yenye punguzo. Kwa kuwa 600 ni chini ya kiwango cha punguzo cha 640, sharti linatathminiwa kuwa true.
### 🧮 **Kagua Vigezo vya Mantiki: Kuunganisha Masharti**
**Jaribu uelewa wako wa vigezo vya mantiki:**
- Katika usemi `A && B`, nini hutokea ikiwa A ni false? Je, B inatathminiwa?
- Je, unaweza kufikiria hali ambayo unahitaji vigezo vyote vitatu (&&, ||, !) pamoja?
- Tofauti ni gani kati ya `!user.isActive` na `user.isActive !== true`?
```mermaid
stateDiagram-v2
[*] --> EvaluateA: A && B
EvaluateA --> CheckB: A ni kweli
EvaluateA --> ReturnFalse: A si kweli
CheckB --> ReturnTrue: B ni kweli
CheckB --> ReturnFalse: B si kweli
[*] --> EvaluateC: A || B
EvaluateC --> ReturnTrue: A ni kweli
EvaluateC --> CheckD: A si kweli
CheckD --> ReturnTrue: B ni kweli
CheckD --> ReturnFalse: B si kweli
note right of EvaluateA
Tathmini ya kukata njia mfupi:
Ikiwa A si kweli, B hahakikishiwi kamwe
end note
```
> **Ushauri wa utendaji**: JavaScript hutumia "tathmini ya mzunguko mfupi" - katika `A && B`, ikiwa A ni false, B hata haitathminiwa. Tumia hili kwa faida yako!
### Operator ya Kukanusha
### Kinyume cha Mantiki
Wakati mwingine ni rahisi kufikiria kuhusu wakati kitu si kweli. Kama badala ya kuuliza "Je, mtumiaji ameingia?", unaweza kutaka kuuliza "Je, mtumiaji hajajaingia?" Alama ya mshangao (`!`) hubadilisha mantiki kwa ajili yako.
Wakati mwingine ni rahisi kufikiria wakati jambo si kweli. Kama badala ya kuuliza "Je, mtumiaji ameingia?" unaweza kuuliza "Je, mtumiaji HAJAINGIA?" Uendeshaji wa alama ya kishindo (`!`) hubadilisha mantiki hii kwako.
```javascript
if (!condition) {
// runs if condition is false
// inaendesha ikiwa hali sio kweli
} else {
// runs if condition is true
// inaendesha ikiwa hali ni kweli
}
```
Operator ya `!` ni kama kusema "kinyume cha..." ikiwa kitu ni `true`, `!` inafanya kuwa `false`, na kinyume chake.
Uendeshaji `!` ni kama kusema "kinyume cha..." ikiwa jambo ni `true`, `!` linaifanya iwe `false`, na kinyume chake.
### Maelezo ya Ternary
Kwa ugawaji rahisi wa masharti, JavaScript hutoa **operator ya ternary**. Sintaksia hii fupi hukuruhusu kuandika maelezo ya masharti kwa mstari mmoja, muhimu unapohitaji kugawa moja ya thamani mbili kulingana na hali.
Kwa ajili ya ugawaji rahisi wa masharti, JavaScript hutoa **uendeshaji wa ternary**. Hii ni sintaksia fupi inayokuwezesha kuandika usemi wa sharti kwenye mstari mmoja, na ni muhimu wakati unahitaji kugawa thamani moja kati ya mbili kulingana na sharti.
```javascript
let variable = condition ? returnThisIfTrue : returnThisIfFalse;
```
Inasomeka kama swali: "Je, hali hii ni kweli? Ikiwa ndiyo, tumia thamani hii. Ikiwa hapana, tumia thamani ile."
Inasomeka kama swali: "Je, sharti hili ni kweli? Ikiwa ndiyo, tumia thamani hii. Ikiwa siyo, tumia thamani ile."
Hapa chini kuna mfano wa dhahiri zaidi:
Hapa chini kuna mfano halisi zaidi:
```javascript
let firstNumber = 20;
@ -237,11 +479,11 @@ let secondNumber = 10;
let biggestNumber = firstNumber > secondNumber ? firstNumber : secondNumber;
```
✅ Chukua dakika kusoma msimbo huu mara kadhaa. Je, unaelewa jinsi waendeshaji hawa wanavyofanya kazi?
✅ Chukua muda kusoma msimbo huu mara kadhaa. Je, unaelewa jinsi vigezo hivi vinavyotumika?
Hii ndiyo mstari unasema: "Je, `firstNumber` ni kubwa kuliko `secondNumber`? Ikiwa ndiyo, weka `firstNumber` ndani ya `biggestNumber`. Ikiwa hapana, weka `secondNumber` ndani ya `biggestNumber`."
Hii mistari inasema: "Je, `firstNumber` ni kubwa kuliko `secondNumber`? Ikiwa ndiyo, weka `firstNumber` katika `biggestNumber`. Ikiwa siyo, weka `secondNumber` katika `biggestNumber`."
Operator ya ternary ni njia fupi tu ya kuandika kauli ya jadi ya `if..else`:
Uendeshaji wa ternary ni njia fupi zaidi ya kuandika kauli ya kawaida ya `if..else`:
```javascript
let biggestNumber;
@ -252,25 +494,46 @@ if (firstNumber > secondNumber) {
}
```
Mbinu zote mbili hutoa matokeo sawa. Operator ya ternary inatoa ufupi, wakati muundo wa jadi wa if-else unaweza kuwa rahisi kusomeka kwa hali ngumu.
Mbali na kuchapisha matokeo sawa. Uendeshaji wa ternary hutoa ufupi, wakati muundo wa kawaida wa if-else unaweza kuwa rahisi kusoma kwa masharti magumu.
```mermaid
flowchart LR
A["🤔 Mshindani wa Ternary"] --> B["hali ?"]
B --> C["thamaniIkiwaKweli :"]
C --> D["thamaniIkiwaSioKweli"]
E["📝 Ikiwa-Vingine Kwa Jadi"] --> F["ikiwa (hali) {"]
F --> G[" rudisha thamaniIkiwaKweli"]
G --> H["} vinginevyo {"]
H --> I[" rudisha thamaniIkiwaSioKweli"]
I --> J["}"]
K["⚡ Wakati wa Kutumia"] --> K1["Uteuzi rahisi"]
K --> K2["Masharti mafupi"]
K --> K3["Maamuzi ya mstari mmoja"]
K --> K4["Taarifa za kurudi"]
style A fill:#e3f2fd
style E fill:#fff3e0
style K fill:#e8f5e8
```
---
## 🚀 Changamoto
Unda programu ambayo imeandikwa kwanza kwa waendeshaji wa mantiki, kisha iandike upya kwa kutumia maelezo ya ternary. Je, sintaksia unayoipendelea ni ipi?
Tengeneza programu ambayo imeandikwa kwanza kwa vigezo vya mantiki, kisha uandike upya ukitumia usemi wa ternary. Je, ni sintaksia gani unayopendelea?
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya Msaidizi wa GitHub Copilot 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Msaidizi kukamilisha changamoto ifuatayo:
**Maelezo:** Unda kikokotoo cha alama za daraja kinachojumuisha dhana nyingi za kufanya maamuzi kutoka somo hili, ikiwa ni pamoja na kauli za if-else, kauli za switch, waendeshaji wa mantiki, na maelezo ya ternary.
**Maelezo:** Tengeneza kalikulatori ya alama kamili inayowakilisha dhana nyingi za kufanya maamuzi kutoka somo hili, ikiwa ni pamoja na kauli za if-else, switch, vigezo vya mantiki, na maelezo ya ternary.
**Kichocheo:** Andika programu ya JavaScript inayochukua alama ya nambari ya mwanafunzi (0-100) na kuamua daraja lake la herufi kwa kutumia vigezo vifuatavyo:
**Agizo:** Andika programu ya JavaScript inayopokea alama ya kisambaza chuo kutoka 0 hadi 100 na kuamua daraja la barua kutumia vigezo vifuatavyo:
- A: 90-100
- B: 80-89
- C: 70-79
@ -278,32 +541,132 @@ Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
- F: Chini ya 60
Mahitaji:
1. Tumia kauli ya if-else kuamua daraja la herufi
2. Tumia waendeshaji wa mantiki kuangalia ikiwa mwanafunzi amefaulu (alama >= 60) NA ana heshima (alama >= 90)
3. Tumia kauli ya switch kutoa maoni maalum kwa kila daraja la herufi
4. Tumia operator ya ternary kuamua ikiwa mwanafunzi anastahili kozi inayofuata (alama >= 70)
5. Jumuisha uthibitishaji wa pembejeo ili kuhakikisha alama iko kati ya 0 na 100
Jaribu programu yako kwa alama mbalimbali ikiwa ni pamoja na kesi za ukingo kama 59, 60, 89, 90, na pembejeo zisizo sahihi.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## Jaribio la Baada ya Somo
[Jaribio la baada ya somo](https://ff-quizzes.netlify.app/web/quiz/12)
## Mapitio & Kujisomea
Soma zaidi kuhusu waendeshaji wengi waliopo kwa mtumiaji [kwenye MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators).
Pitisha muhtasari mzuri wa waendeshaji wa Josh Comeau [operator lookup](https://joshwcomeau.com/operator-lookup/)!
## Kazi ya Nyumbani
[Waendeshaji](assignment.md)
1. Tumia kauli ya if-else kuamua daraja la barua
2. Tumia waendeshaji wa mantiki kuangalia kama mwanafunzi anapita (alama >= 60) NA ana heshima (alama >= 90)
3. Tumia tamko la switch kutoa maoni maalum kwa kila daraja la herufi
4. Tumia muendeshaji wa ternary kuamua kama mwanafunzi anastahili kozi inayofuata (alama >= 70)
5. Jumuisha uthibitishaji wa ingizo kuhakikisha alama ni kati ya 0 na 100
Jaribu programu yako kwa alama mbalimbali ikiwa ni pamoja na matukio ya mwisho kama 59, 60, 89, 90, na maingizo yasiyo halali.
Jifunze zaidi kuhusu [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## Post-Lecture Quiz
[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/12)
## Review & Self Study
Soma zaidi kuhusu waendeshaji wengi waliopo kwa mtumiaji [katika MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators).
Pitia nzuri ya Josh Comeau [operator lookup](https://joshwcomeau.com/operator-lookup/)!
## Assignment
[Operators](assignment.md)
---
## 🧠 **Muhtasari wa Kifaa Chako cha Kutoa Maamuzi**
```mermaid
graph TD
A["🎯 Maamuzi ya JavaScript"] --> B["🔍 Mantiki ya Boolean"]
A --> C["📊 Bayana za Masharti"]
A --> D["🔗 Waendeshaji wa Mantiki"]
A --> E["⚡ Mifumo ya Juu-Madaraja"]
B --> B1["thamani za kweli/si kweli"]
B --> B2["Waendeshaji wa kulinganisha"]
B --> B3["Dhana za ukweli"]
C --> C1["bayana za if"]
C --> C2["minyororo ya if-else"]
C --> C3["bayana za switch"]
D --> D1["&& (NA)"]
D --> D2["|| (AU)"]
D --> D3["! (SIO)"]
E --> E1["Mwendeshaji wa ternary"]
E --> E2["Tathmini ya kukata njia"]
E --> E3["Masharti changamano"]
F["💡 Kanuni Muhimu"] --> F1["Masharti yaliyo wazi na yasomeka"]
F --> F2["Mtindo thabiti wa kulinganisha"]
F --> F3["Kipaumbele sahihi cha waendeshaji"]
F --> F4["Mpangilio wa tathmini wenye ufanisi"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
---
## 🚀 Ratiba Yako ya Ustadi wa Kutoa Maamuzi wa JavaScript
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zifuatazo**
- [ ] Fanya mazoezi ya waendeshaji wa kulinganisha kwenye console ya kivinjari chako
- [ ] Andika tamko rahisi la if-else linalokagua umri wako
- [ ] Jaribu changamoto: andika upya if-else ukitumia muendeshaji wa ternary
- [ ] Jaribu kinachotokea na thamani tofauti za "truthy" na "falsy"
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Kamilisha mtihani baada ya somo na pitia dhana yoyote isiyoeleweka
- [ ] Tengeneza kalkuleta kamili ya alama kutoka changamoto ya GitHub Copilot
- [ ] Unda mti wa maamuzi rahisi kwa hali halisi (kama kuchagua mavazi)
- [ ] Fanya mazoezi ya kuunganisha masharti mengi kwa kutumia waendeshaji wa mantiki
- [ ] Jaribu tamko za switch kwa matumizi tofauti
### 📅 **Ustadi Wako wa Mantiki wa Wiki Nzima**
- [ ] Kamilisha kazi ya waendeshaji kwa mifano ya ubunifu
- [ ] Tengeneza programu ndogo ya mtihani kwa kutumia muundo mbalimbali wa masharti
- [ ] Unda kirekodi kinachokagua masharti mengi ya ingizo
- [ ] Fanya mazoezi ya mazoezi ya Josh Comeau ya [operator lookup](https://joshwcomeau.com/operator-lookup/)
- [ ] Boresha msimbo uliopo kutumia muundo wa masharti unaofaa zaidi
- [ ] Soma tathmini ya kukata mkato na athari za utendaji
### 🌟 **Mabadiliko Yako ya Mwezi Mzima**
- [ ] Jifunze masharti magumu yaliyomo ndani na dumisha usomeaji wa msimbo
- [ ] Tengeneza programu yenye mantiki ya maamuzi ya hali ya juu
- [ ] Changia wazi kwa kuboresha mantiki ya masharti katika miradi iliyopo
- [ ] Fundisha mtu mwingine juu ya miundo tofauti ya masharti na lini ya kutumia kila moja
- [ ] Chunguza mbinu za programu zenye kazi za mantiki ya masharti
- [ ] Tengeneza mwongozo wa kibinafsi kwa mbinu bora za masharti
### 🏆 **Ukaguzi wa Mwisho wa Bingwa wa Uamuzi**
**Sherehekea ubingwa wako wa kufikiri kwa mantiki:**
- Ni mantiki gani ngumu ya maamuzi uliyotransisha kwa mafanikio?
- Ni muundo gani wa masharti unahisi kuwa wa asili kwako na kwa nini?
- Je, kujifunza kuhusu waendeshaji wa mantiki kumebadilisha vipi njia yako ya kutatua matatizo?
- Ni programu gani halisi ingefaidika na mantiki ya maamuzi ya hali ya juu?
```mermaid
journey
title Maendeleo Yako ya Fikiria Kimantiki
section Leo
Mchanganyiko wa Boolean: 3: You
Ufahamu wa If-Else: 4: You
Kutambua Kisanii: 5: You
section Wiki Hii
Masharti Changamano: 4: You
Utaalamu wa Switch: 5: You
Mchanganyiko wa Kimantiki: 5: You
section Mwezi Ujao
Mifumo ya Juu: 5: You
Uelewa wa Utendaji: 5: You
Kufundisha Wengine: 5: You
```
> 🧠 **Umebobea sana katika sanaa ya uamuzi wa kidigitali!** Kila programu ya kuingiliana hutegemea mantiki ya masharti kujibu kwa busara kwa vitendo vya mtumiaji na hali zinazobadilika. Sasa unaelewa jinsi ya kufanya programu zako kufikiri, kutathmini, na kuchagua majibu yenye maana. Msingi huu wa mantiki utaendesha kila programu yenye nguvu utakayojenga! 🎉
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kiarifu cha Kukataa**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upotoshaji. Hati asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo halali. Kwa taarifa muhimu, tafsiri ya mtaalamu wa binadamu inapendekezwa. Hatuwajibiki kwa kutoelewana au tafsiri potofu zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,226 +1,401 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9197f8af0fef9be6e81d4dbda23c7e7d",
"translation_date": "2025-10-24T19:11:15+00:00",
"original_hash": "1710a50a519a6e4a1b40a5638783018d",
"translation_date": "2026-01-07T01:28:42+00:00",
"source_file": "2-js-basics/4-arrays-loops/README.md",
"language_code": "sw"
}
-->
# Misingi ya JavaScript: Arrays na Loops
# Misingi ya JavaScript: Mfululizo na Mizunguko
![Misingi ya JavaScript - Arrays](../../../../translated_images/webdev101-js-arrays.439d7528b8a294558d0e4302e448d193f8ad7495cc407539cc81f1afe904b470.sw.png)
![JavaScript Basics - Arrays](../../../../translated_images/webdev101-js-arrays.439d7528b8a29455.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
## Maswali ya Awali ya Somo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/13)
```mermaid
journey
title Safari Yako ya Mambo ya Mstari na Mizunguko
section Misingi ya Mstari
Kuunda Mizunguko: 5: You
Kupata Vipengele: 4: You
Mbinu za Mstari: 5: You
section Uwezo wa Mizunguko
Mizunguko ya For: 4: You
Mizunguko ya While: 5: You
Sarufi ya Kisasa: 4: You
section Usindikaji Data
Mstari + Mizunguko: 5: You
Matumizi Halisi: 4: You
Uboreshaji wa Utendaji: 5: You
```
## Jaribio la Kabla ya Darasa
[Jaribio la kabla ya darasa](https://ff-quizzes.netlify.app/web/quiz/13)
Umewahi kujiuliza jinsi tovuti zinavyoweza kufuatilia vitu vya kikapu cha ununuzi au kuonyesha orodha ya marafiki wako? Hapo ndipo arrays na loops zinapokuja. Arrays ni kama vyombo vya kidijitali vinavyohifadhi vipande vingi vya taarifa, wakati loops zinakusaidia kufanya kazi na data hiyo kwa ufanisi bila kuandika nambari ya kurudia.
Umewahi kujiuliza jinsi tovuti zinavyofuatilia vitu vilivyomo kwenye kikapu cha ununuzi au kuonyesha orodha ya marafiki zako? Hapo ndipo mfululizo na mizunguko vinapoingia kazi. Mfululizo ni kama makontena ya kidigitali ambayo hugharamia vipande vingi vya taarifa, wakati mizunguko hukuwezesha kufanya kazi na data hiyo yote kwa ufanisi bila kuandika msimbo mrefu wa kurudia.
Pamoja, dhana hizi mbili zinaunda msingi wa kushughulikia taarifa katika programu zako. Utajifunza jinsi ya kuhamia kutoka kuandika kila hatua moja kwa mkono hadi kuunda nambari ya busara na yenye ufanisi inayoweza kushughulikia mamia au hata maelfu ya vitu haraka.
Kwa pamoja, dhana hizi mbili zinaunda msingi wa kushughulikia taarifa katika programu zako. Utajifunza kutoka kuandika kila hatua kwa mkono hadi kuunda msimbo mzuri, wenye ufanisi unaoweza kushughulikia mamia au hata maelfu ya vitu haraka.
Mwisho wa somo hili, utaelewa jinsi ya kutekeleza kazi ngumu za data kwa mistari michache tu ya nambari. Hebu tuangalie dhana hizi muhimu za programu.
Mwisho wa somo hili, utaelewa jinsi ya kutekeleza kazi tata za data kwa mistari michache tu ya msimbo. Tuchunguze dhana hizo muhimu za programu.
[![Arrays](https://img.youtube.com/vi/1U4qTyq02Xw/0.jpg)](https://youtube.com/watch?v=1U4qTyq02Xw "Arrays")
[![Loops](https://img.youtube.com/vi/Eeh7pxtTZ3k/0.jpg)](https://www.youtube.com/watch?v=Eeh7pxtTZ3k "Loops")
> 🎥 Bonyeza picha hapo juu kwa video kuhusu arrays na loops.
> 🎥 Bonyeza picha zilizo juu kwa video kuhusu mfululizo na mizunguko.
> Unaweza kuchukua somo hili kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-arrays/?WT.mc_id=academic-77807-sagibbon)!
## Arrays
```mermaid
mindmap
root((Usindikaji Data))
Arrays
Structure
Sarafu za mabano za mraba
Uandishi wa kuanzia sifuri
Ukubwa unaobadilika
Operations
push/pop
shift/unshift
indexOf/includes
Types
Safu za nambari
Safu za maandishi
Aina mchanganyiko
Loops
For Loops
Kuonyesha marejeleo
Usindikaji safu
Mtiririko unaotabirika
While Loops
Kwa msingi wa masharti
Marejeleo yasiyojulikana
Ingizo la mtumiaji
Modern Syntax
for...of
forEach
Mbinu za kazi
Applications
Data Analysis
Takwimu
Kuchuja
Mabadiliko
User Interfaces
Orodha
Menyu
Matunzio
```
## Mfululizo
Fikiria arrays kama kabati la kuhifadhi faili za kidijitali - badala ya kuhifadhi hati moja kwa kila droo, unaweza kupanga vitu vingi vinavyohusiana katika chombo kimoja kilichopangwa. Kwa maneno ya programu, arrays hukuruhusu kuhifadhi vipande vingi vya taarifa katika kifurushi kimoja kilichopangwa.
Fikiria mfululizo kama kabati ya kuhifadhi dijitali - badala ya kuhifadhi hati moja kwa kisanduku, unaweza kupanga vitu vingine vingi vinavyohusiana kwenye kontena moja lililopangwa. Kwa maneno ya programu, mfululizo hukuruhusu kuhifadhi vipande vingi vya taarifa kwa kifurushi kimoja kilichopangwa.
Ikiwa unajenga maktaba ya picha, unasimamia orodha ya kazi za kufanya, au unafuatilia alama za juu katika mchezo, arrays hutoa msingi wa upangaji wa data. Hebu tuone jinsi zinavyofanya kazi.
Iwe unajenga maktaba ya picha, kusimamia orodha ya kazi za kufanywa, au kufuatilia alama za juu katika mchezo, mfululizo hutoa msingi wa upangaji wa data. Tuchunguze jinsi zinavyofanya kazi.
✅ Arrays zipo kila mahali! Je, unaweza kufikiria mfano wa array katika maisha halisi, kama vile safu ya paneli za jua?
Mfululizo upo kila mahali! Unaweza kufikiria mfano wa maisha halisi wa mfululizo, kama mfululizo wa paneli za jua?
### Kuunda Arrays
### Kuunda Mfululizo
Kuunda array ni rahisi sana - tumia mabano ya mraba!
Kuunda mfululizo ni rahisi sana - tumia mabano ya mraba!
```javascript
// Empty array - like an empty shopping cart waiting for items
// Safu tupu - kama kisha ya ununuzi tupu ikisubiri vitu
const myArray = [];
```
**Nini kinatokea hapa?**
Umeunda chombo tupu kwa kutumia mabano ya mraba `[]`. Fikiria kama rafu ya maktaba tupu - iko tayari kuhifadhi vitabu vyovyote unavyotaka kupanga hapo.
Umeunda kontena tupu ukitumia mabano hayo `[]`. Fikiria kama rafu tupu ya maktaba - iko tayari kuhifadhi vitabu vyovyote unavyotaka kupanga hapo.
Unaweza pia kujaza array yako na maadili ya awali moja kwa moja:
Unaweza pia kujaza mfululizo wako na maadili ya mwanzo kutoka mwanzo kabisa:
```javascript
// Your ice cream shop's flavor menu
// Orodha ya ladha za duka lako la barafu
const iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
// A user's profile info (mixing different types of data)
// Taarifa za wasifu wa mtumiaji (mchanganyiko wa aina mbalimbali za data)
const userData = ["John", 25, true, "developer"];
// Test scores for your favorite class
// Alama za mtihani kwa somo lako unalolipenda
const scores = [95, 87, 92, 78, 85];
```
**Mambo ya kuvutia ya kuzingatia:**
- Unaweza kuhifadhi maandishi, nambari, au hata maadili ya kweli/siyo kweli katika array moja
**Mambo mazuri ya kuona:**
- Unaweza kuhifadhi maandishi, nambari, au hata maadili ya kweli/silimu katika mfululizo mmoja
- Tenganisha kila kipengee kwa koma - rahisi!
- Arrays ni kamilifu kwa kuweka taarifa zinazohusiana pamoja
### Kuweka Nambari ya Array
- Mfululizo ni mzuri kudumisha taarifa zinazohusiana pamoja
```mermaid
flowchart LR
A["📦 Massimu"] --> B["Unda [ ]"]
A --> C["Hifadhi Vitu Vizuri"]
A --> D["Fikia kwa Nambari ya Index"]
B --> B1["const arr = []"]
B --> B2["const arr = [1,2,3]"]
C --> C1["Nambari"]
C --> C2["Mizani"]
C --> C3["Booleans"]
C --> C4["Aina Mchanganyiko"]
D --> D1["arr[0] = ya kwanza"]
D --> D2["arr[1] = ya pili"]
D --> D3["arr[2] = ya tatu"]
E["📊 Nambari ya Index"] --> E1["Index 0: Ya Kwanza"]
E --> E2["Index 1: Ya Pili"]
E --> E3["Index 2: Ya Tatu"]
E --> E4["Index n-1: Ya Mwisho"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
```
### Kuingiza Na Kupanua Mfululizo
Hapa kuna kitu ambacho kinaweza kuonekana cha ajabu mwanzoni: arrays huweka nambari ya vipengee vyake kuanzia 0, si 1. Hii nambari ya kuanzia 0 ina mizizi yake katika jinsi kumbukumbu ya kompyuta inavyofanya kazi - imekuwa desturi ya programu tangu siku za mwanzo za lugha za programu kama C. Kila nafasi katika array inapata nambari yake ya anwani inayoitwa **index**.
Hapa kuna jambo ambalo linaweza kuonekana la ajabu mwanzoni: mfululizo huhesabu vipengee vyake kuanzia 0, sio 1. Uhifadhi huu wa nambari kuanzia sifuri una asili yake kutoka jinsi kumbukumbu za kompyuta zinavyofanya kazi - imekuwa desturi ya programu tangu enzi za mapema za lugha kama C. Kila nafasi katika mfululizo ina nambari yake ya saraka inayoitwa **index**.
| Index | Thamani | Maelezo |
|-------|-------|-------------|
| 0 | "Chocolate" | Kipengee cha kwanza |
| 1 | "Strawberry" | Kipengee cha pili |
| 2 | "Vanilla" | Kipengee cha tatu |
| 3 | "Pistachio" | Kipengee cha nne |
| 4 | "Rocky Road" | Kipengee cha tano |
| 0 | "Chocolate" | Kipengee cha Kwanza |
| 1 | "Strawberry" | Kipengee cha Pili |
| 2 | "Vanilla" | Kipengee cha Tatu |
| 3 | "Pistachio" | Kipengee cha Nne |
| 4 | "Rocky Road" | Kipengee cha Tano |
✅ Je, inakushangaza kwamba arrays huanza na index ya sifuri? Katika baadhi ya lugha za programu, indexes huanza na 1. Kuna historia ya kuvutia kuhusu hili, ambayo unaweza [kusoma kwenye Wikipedia](https://en.wikipedia.org/wiki/Zero-based_numbering).
✅ Je, unashangazwa kwamba mfululizo huanza kwa index ya sifuri? Katika baadhi ya lugha za programu, indexes huanza kwa 1. Kuna historia ya kuvutia kuhusu hili, ambayo unaweza [kusoma kwenye Wikipedia](https://en.wikipedia.org/wiki/Zero-based_numbering).
**Kupata Vipengee vya Array:**
**Kupata Vipengee vya Mfululizo:**
```javascript
const iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
// Access individual elements using bracket notation
console.log(iceCreamFlavors[0]); // "Chocolate" - first element
console.log(iceCreamFlavors[2]); // "Vanilla" - third element
console.log(iceCreamFlavors[4]); // "Rocky Road" - last element
// Pata vipengele binafsi kwa kutumia noti ya mabano
console.log(iceCreamFlavors[0]); // "Chocolate" - kipengele cha kwanza
console.log(iceCreamFlavors[2]); // "Vanilla" - kipengele cha tatu
console.log(iceCreamFlavors[4]); // "Rocky Road" - kipengele cha mwisho
```
**Kufafanua kinachotokea hapa:**
- **Inatumia** noti ya mabano ya mraba na nambari ya index kupata vipengee
- **Inarudisha** thamani iliyohifadhiwa katika nafasi maalum ya array
- **Inaanza** kuhesabu kutoka 0, ikifanya kipengee cha kwanza kuwa index 0
**Kuvunja kinachotokea hapa:**
- **Inatumia** notation ya mabano ya mraba pamoja na nambari ya index kupata vipengee
- **Inarudisha** thamani iliyohifadhiwa katika nafasi hiyo maalum ya mfululizo
- **Huanza** kuhesabu kutoka 0, ikifanya kipengee cha kwanza kuwa index 0
**Kubadilisha Vipengee vya Array:**
**Kurekebisha Vipengee vya Mfululizo:**
```javascript
// Change an existing value
// Badilisha thamani iliyopo
iceCreamFlavors[4] = "Butter Pecan";
console.log(iceCreamFlavors[4]); // "Butter Pecan"
// Add a new element at the end
// Ongeza kipengele kipya mwishoni
iceCreamFlavors[5] = "Cookie Dough";
console.log(iceCreamFlavors[5]); // "Cookie Dough"
```
**Katika mfano hapo juu, tumefanya:**
- **Kubadilisha** kipengee katika index 4 kutoka "Rocky Road" hadi "Butter Pecan"
- **Kuongeza** kipengee kipya "Cookie Dough" katika index 5
- **Kupanua** urefu wa array moja kwa moja wakati wa kuongeza zaidi ya mipaka ya sasa
**Juu hapo, tumefanya:**
- **Tume badilisha** kipengee cha index 4 kutoka "Rocky Road" kuwa "Butter Pecan"
- **Tume ongeza** kipengee kipya "Cookie Dough" kwenye index 5
- **Tume panua** urefu wa mfululizo moja kwa moja wakati wa kuongeza zaidi ya mipaka ya sasa
### Urefu wa Array na Mbinu za Kawaida
### Urefu wa Mfululizo na Mbinu Muhimu
Arrays huja na mali na mbinu zilizojengwa ndani zinazofanya kazi na data kuwa rahisi zaidi.
Mfululizo huja na mali na mbinu zilizojengwa ndani zinazorahisisha kazi na data.
**Kupata Urefu wa Array:**
**Kupata Urefu wa Mfululizo:**
```javascript
const iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
console.log(iceCreamFlavors.length); // 5
// Length updates automatically as array changes
// Urefu unasasishwa kiotomatiki wakati safu inabadilika
iceCreamFlavors.push("Mint Chip");
console.log(iceCreamFlavors.length); // 6
```
**Mambo muhimu ya kukumbuka:**
- **Inarudisha** idadi ya jumla ya vipengee katika array
- **Inasasisha** moja kwa moja wakati vipengee vinaongezwa au kuondolewa
- **Inatoa** hesabu ya nguvu inayofaa kwa loops na uthibitisho
**Pointi muhimu ya kukumbuka:**
- **Huiarudisha** idadi ya vipengee vyote vilivyomo mfululizoni
- **Huvunjika** moja kwa moja wakati vipengee vinaongezwa au kuondolewa
- **Hutoa** hesabu hai inayotumika kwa mizunguko na uthibitishaji
**Mbinu Muhimu za Array:**
**Mbinu Muhimu za Mfululizo:**
```javascript
const fruits = ["apple", "banana", "orange"];
// Add elements
fruits.push("grape"); // Adds to end: ["apple", "banana", "orange", "grape"]
fruits.unshift("strawberry"); // Adds to beginning: ["strawberry", "apple", "banana", "orange", "grape"]
// Ongeza vipengele
fruits.push("grape"); // Inaongeza mwishoni: ["tufaha", "ndizi", "chungwa", "zabibu"]
fruits.unshift("strawberry"); // Inaongeza mwanzoni: ["strawberry", "tufaha", "ndizi", "chungwa", "zabibu"]
// Remove elements
const lastFruit = fruits.pop(); // Removes and returns "grape"
const firstFruit = fruits.shift(); // Removes and returns "strawberry"
// Ondoa vipengele
const lastFruit = fruits.pop(); // Inaondoa na kurudisha "zabibu"
const firstFruit = fruits.shift(); // Inaondoa na kurudisha "strawberry"
// Find elements
const index = fruits.indexOf("banana"); // Returns 1 (position of "banana")
const hasApple = fruits.includes("apple"); // Returns true
// Tafuta vipengele
const index = fruits.indexOf("banana"); // Inarudisha 1 (nafasi ya "ndizi")
const hasApple = fruits.includes("apple"); // Inarudisha kweli
```
**Kuelewa mbinu hizi:**
- **Inaongeza** vipengee na `push()` (mwisho) na `unshift()` (mwanzo)
- **Inaondoa** vipengee na `pop()` (mwisho) na `shift()` (mwanzo)
- **Inatafuta** vipengee na `indexOf()` na inakagua uwepo na `includes()`
- **Inarudisha** maadili muhimu kama vipengee vilivyotolewa au nambari za nafasi
✅ Jaribu mwenyewe! Tumia console ya kivinjari chako kuunda na kudhibiti array ya ubunifu wako.
## Loops
Fikiria adhabu maarufu kutoka kwa riwaya za Charles Dickens ambapo wanafunzi walilazimika kuandika mistari mara kwa mara kwenye ubao. Fikiria kama ungeweza kumwambia mtu "andika sentensi hii mara 100" na ikafanyika moja kwa moja. Hivyo ndivyo loops zinavyofanya kwa nambari yako.
Loops ni kama kuwa na msaidizi asiyechoka ambaye anaweza kurudia kazi bila makosa. Ikiwa unahitaji kuangalia kila kipengee katika kikapu cha ununuzi au kuonyesha picha zote katika albamu, loops hushughulikia kurudia kwa ufanisi.
JavaScript inatoa aina kadhaa za loops za kuchagua. Hebu tuchunguze kila moja na kuelewa wakati wa kuitumia.
### For Loop
- **Inaongeza** vipengee na `push()` (mwisho) na `unshift()` (mwanzoni)
- **Inaondoa** vipengee na `pop()` (mwisho) na `shift()` (mwanzoni)
- **Inatafuta** vipengee na `indexOf()` na huthibitisha kuwepo na `includes()`
- **Huirudisha** maadili ya maana kama vipengee vilivyoondolewa au index za nafasi
✅ Jaribu mwenyewe! Tumia konsole ya kivinjari chako kuunda na kubadilisha mfululizo wa uumbaji wako.
### 🧠 **Kagua Misingi ya Mfululizo: Kupanga Data Yako**
**Jaribu uelewa wako wa mfululizo:**
- Kwa nini unadhani mfululizo huanza kuhesabu kutoka 0 badala ya 1?
- Nini hutokea ukijaribu kupata index isiyopo (kama `arr[100]` kwenye mfululizo wa vipengee 5)?
- Unaweza kufikiria matukio matatu ya maisha halisi ambapo mfululizo utakuwa na maana?
```mermaid
stateDiagram-v2
[*] --> EmptyArray: const arr = []
EmptyArray --> WithItems: Ongeza vipengele
WithItems --> Accessing: Tumia nambari za kufikia
Accessing --> Modifying: Badilisha thamani
Modifying --> Processing: Tumia mbinu
WithItems --> WithItems: push(), unshift()
Processing --> Processing: pop(), shift()
note right of Accessing
Uainishaji unaanzia sifuri
arr[0] = kipengele cha kwanza
end note
note right of Processing
Mbinu zilizojengewa ndani
Uendeshaji wa nguvu
end note
```
> **Uelewaji wa maisha halisi**: Mfululizo upo kila mahali katika programu! Mikataba ya mitandao ya kijamii, mikapu ya ununuzi, maktaba za picha, nyimbo za playlist - yote ni mfululizo nyuma ya mandhari!
## Mizunguko
Fikiria adhabu maarufu kutoka riwaya za Charles Dickens ambapo wanafunzi walilazimishwa kuandika mistari mara kwa mara kwenye mbao. Fikiria kama ungeweza tu kumuamuru mtu "andika sentensi hii mara 100" na ikatendeka moja kwa moja. Hicho ndicho mizunguko hufanya kwa msimbo wako.
Mizunguko ni kama kuwa na msaidizi asiyechoka ambaye anaweza kurudia kazi bila makosa. Iwe unahitaji kuangalia kila kipengee kwenye kikapu cha ununuzi au kuonyesha picha zote kwenye albamu, mizunguko hugharamia kurudia kwa ufanisi.
JavaScript hutoa aina kadhaa za mizunguko ya kuchagua. Tuchunguze kila moja na kuelewa lini kuwatumia.
```mermaid
flowchart TD
A["🔄 Aina za Mizunguko"] --> B["Mzunguko wa For"]
A --> C["Mzunguko wa While"]
A --> D["Mzunguko wa For...of"]
A --> E["Njia ya forEach"]
B --> B1["Mizunguko inayojulikana"]
B --> B2["Kuinua kwa kaunta"]
B --> B3["for(init; condition; increment)"]
C --> C1["Mizunguko isiyojulikana"]
C --> C2["Kuinua kwa masharti"]
C --> C3["while(condition)"]
D --> D1["Za kisasa ES6+"]
D --> D2["Kizunguko cha safu"]
D --> D3["for(item of array)"]
E --> E1["Mtindo wa kazi"]
E --> E2["Njia ya safu"]
E --> E3["array.forEach(callback)"]
F["⏰ Wakati wa Kutumia"] --> F1["Kwa: Kuhesabu, viashiria"]
F --> F2["While: Ingizo la mtumiaji, kutafuta"]
F --> F3["For...of: Kizunguko rahisi"]
F --> F4["forEach: Uprogramu wa kazi"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
### Mdundo wa For
`for` loop ni kama kuweka timer - unajua hasa mara ngapi unataka kitu kitokee. Ni ya mpangilio mzuri na ya kutabirika, ambayo inafanya kuwa kamilifu wakati unafanya kazi na arrays au unahitaji kuhesabu vitu.
Mdundo wa `for` ni kama kuweka kengele ya muda - unajua angalau mara ngapi unataka kitu kitokee. Ni mpangilio mzuri na unaoweza kutegemewa, hivyo ni bora wakati unafanya kazi na mfululizo au unahitaji kuhesabu vitu.
**Muundo wa For Loop:**
**Muundo wa Mdundo wa For:**
| Sehemu | Kusudi | Mfano |
| Kipengele | Kusudi | Mfano |
|-----------|---------|----------|
| **Uanzishaji** | Huanzisha mwanzo | `let i = 0` |
| **Hali** | Wakati wa kuendelea | `i < 10` |
| **Ongezeko** | Jinsi ya kusasisha | `i++` |
| **Kuanza** | Sawa ya kuanza | `let i = 0` |
| **Masharti** | Wakati wa kuendelea | `i < 10` |
| **Kuongeza** | Jinsi ya kusasisha | `i++` |
```javascript
// Counting from 0 to 9
// Kuhesabu kutoka 0 hadi 9
for (let i = 0; i < 10; i++) {
console.log(`Count: ${i}`);
}
// More practical example: processing scores
// Mfano wa vitendo zaidi: kushughulikia alama
const testScores = [85, 92, 78, 96, 88];
for (let i = 0; i < testScores.length; i++) {
console.log(`Student ${i + 1}: ${testScores[i]}%`);
}
```
**Hatua kwa hatua, kinachotokea:**
- **Inaanzisha** variable ya kuhesabu `i` kuwa 0 mwanzoni
- **Inakagua** hali `i < 10` kabla ya kila mzunguko
- **Inatekeleza** block ya nambari wakati hali ni kweli
- **Inaongeza** `i` kwa 1 baada ya kila mzunguko na `i++`
- **Inasimama** wakati hali inakuwa si kweli (wakati `i` inafikia 10)
✅ Endesha nambari hii kwenye console ya kivinjari. Nini kinatokea unapofanya mabadiliko madogo kwenye counter, hali, au usemi wa mzunguko? Je, unaweza kuifanya iende kinyume, ikitengeneza hesabu ya kurudi nyuma?
**Hatua kwa hatua, hii ndicho kinachotokea:**
- **Inaanzisha** kigezo cha kuhesabu `i` kwa 0 mwanzoni
- **Inakagua** sharti `i < 10` kabla ya kila mizunguko
- **Inatekeleza** msimbo muda sharti liko kweli
- **Inaongeza** `i` kwa 1 baada ya kila mzunguko kwa `i++`
- **Inasimama** wakati sharti linapokuwa si kweli (wakati `i` inafikia 10)
✅ Endesha msimbo huu kwenye konsole ya kivinjari. Nini hutokea unapoanzisha mabadiliko madogo kwa kigezo cha kuhesabu, sharti, au usemaji wa mizunguko? Unaweza kulifanya lifanye nyuma, likitengeneza kuhesabu chini?
### 🗓️ **Kagua Ujuzi wa Mdundo wa For: Kurudia kwa Kudhibitiwa**
**Chunguza uelewa wako wa mdundo wa for:**
- Ni sehemu tatu gani za mdundo wa for, na kila moja hufanyaje?
- Ungeweza aje kuzunguka mfululizo nyuma?
- Nini hutokea ikiwa utasahau sehemu ya kuongeza (`i++`)?
```mermaid
flowchart TD
A["🚀 Anza Mzunguko wa For"] --> B["Anzisha: let i = 0"]
B --> C{"Hali: i < array.length?"}
C -->|true| D["Tekeleza sehemu ya msimbo"]
D --> E["Ongeza: i++"]
E --> C
C -->|false| F["✅ Toka kwenye mzunguko"]
G["📋 Mifumo ya Kawaida"] --> G1["for(let i=0; i<n; i++)"]
G --> G2["for(let i=n-1; i>=0; i--)"]
G --> G3["for(let i=0; i<arr.length; i+=2)"]
style A fill:#e3f2fd
style F fill:#e8f5e8
style G fill:#fff3e0
```
> **Hekima ya Mdundo:** Mizunguko ya for ni bora wakati unajua mara ngapi hasa unahitaji kurudia kitu. Ni chaguo maarufu zaidi kwa usindikaji wa mfululizo!
### While Loop
### Mdundo wa While
`while` loop ni kama kusema "endelea kufanya hivi hadi..." - huenda usijue hasa mara ngapi itakimbia, lakini unajua wakati wa kusimama. Ni kamilifu kwa vitu kama kuuliza mtumiaji maoni hadi atakapokupa unachohitaji, au kutafuta data hadi upate unachotafuta.
Mdundo wa `while` ni kama kusema "endelea kufanya hivi hadi..." - huenda usijue mara ngapi utaendesha, lakini unajua lini kusimama. Ni bora kwa mambo kama kuuliza mtumiaji kuingiza data hadi ape yale unayohitaji, au kutafuta kwenye data hadi upate unachotafuta.
**Tabia za While Loop:**
- **Inaendelea** kutekeleza mradi hali ni kweli
- **Inahitaji** usimamizi wa mikono wa variable yoyote ya kuhesabu
- **Inakagua** hali kabla ya kila mzunguko
- **Ina hatari** ya loops zisizo na mwisho ikiwa hali haitakuwa si kweli
**Sifa za Mdundo wa While:**
- **Huendelea** kutekeleza mradi sharti ni kweli
- **Inahitaji** usimamizi wa mikono wa vigezo vyovyote vya kuhesabu
- **Inakagua** sharti kabla ya kila mzunguko
- **Ina hatari** ya mizunguko isiyoisha kama sharti halitawahi kuwa si kweli
```javascript
// Basic counting example
// Mfano wa kuhesabu wa msingi
let i = 0;
while (i < 10) {
console.log(`While count: ${i}`);
i++; // Don't forget to increment!
i++; // Usisahau kuongeza!
}
// More practical example: processing user input
// Mfano zaidi wa matumizi: kusindika maingizo ya mtumiaji
let userInput = "";
let attempts = 0;
const maxAttempts = 3;
@ -236,85 +411,143 @@ if (attempts >= maxAttempts) {
```
**Kuelewa mifano hii:**
- **Inasimamia** variable ya kuhesabu `i` kwa mikono ndani ya mwili wa loop
- **Inaongeza** counter ili kuzuia loops zisizo na mwisho
- **Inaonyesha** matumizi ya vitendo na maoni ya mtumiaji na kikomo cha majaribio
- **Inajumuisha** mifumo ya usalama ili kuzuia utekelezaji usio na mwisho
- **Inasimamia** kigezo cha kuhesabu `i` kwa mkono ndani ya mwili wa mzunguko
- **Inaongeza** kigezo kuzuia mizunguko isiyoisha
- **Inaonyesha** matumizi ya vitendo kwa data ya mtumiaji na kikomo cha majaribio
- **Inajumuisha** vipengele vya usalama kuzuia utekelezaji usioisha
### ♾️ **Kagua Uelewa wa Mdundo wa While: Kurudia Kunategemea Sharti**
**Jaribu uelewa wako wa mdundo wa while:**
- Hatari kuu je unapotumia mizunguko ya while ni ipi?
- Ungechagua lini mdundo wa while badala ya for?
- Unawezaje kuzuia mizunguko isiyoisha?
```mermaid
flowchart LR
A["🔄 While vs For"] --> B["Mzunguko wa While"]
A --> C["Mzunguko wa For"]
B --> B1["Kurudiwa zisizojulikana"]
B --> B2["Inayotegemea hali"]
B --> B3["Ingizo la mtumiaji, kutafuta"]
B --> B4["⚠️ Hatari: midoli isiyoisha"]
C --> C1["Kurudiwa kujulikana"]
C --> C2["Inayotegemea kaunta"]
C --> C3["Uchakataji wa safu"]
C --> C4["✅ Salama: mwisho unaotarajiwa"]
D["🛡️ Vidokezo vya Usalama"] --> D1["Daima badilisha kigezo cha hali"]
D --> D2["Jumuisha masharti ya kukimbia"]
D --> D3["Weka mipaka ya juu ya kurudiwa"]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#ffebee
```
> **Usalama kwanza:** Mizunguko ya while ni yenye nguvu lakini inahitaji usimamizi wa makini wa masharti. Hakikisha sharti lako la mzunguko hatimaye litakuwa si kweli!
### Njia za Kisasa za Loop
### Mbinu za Kisasa za Mizunguko
JavaScript inatoa syntax ya kisasa ya loop inayoweza kufanya nambari yako iwe rahisi kusoma na kupunguza makosa.
JavaScript hutoa sintaksia za kisasa za mizunguko ambazo zinaweza kufanya msimbo wako usomeke vizuri na usiwe na makosa.
**For...of Loop (ES6+):**
**Mwendo wa For...of (ES6+):**
```javascript
const colors = ["red", "green", "blue", "yellow"];
// Modern approach - cleaner and safer
// Njia ya kisasa - safi zaidi na salama
for (const color of colors) {
console.log(`Color: ${color}`);
}
// Compare with traditional for loop
// Linganisha na mzunguko wa for wa jadi
for (let i = 0; i < colors.length; i++) {
console.log(`Color: ${colors[i]}`);
}
```
**Faida kuu za for...of:**
- **Inaondoa** usimamizi wa index na makosa ya off-by-one
- **Inatoa** ufikiaji wa moja kwa moja kwa vipengee vya array
- **Inaboresha** usomaji wa nambari na kupunguza ugumu wa syntax
- **Huondoa** usimamizi wa index pamoja na makosa ya kuhesabu moja kwa moja
- **Hutoa** ufikiaji wa moja kwa moja kwa vipengee vya mfululizo
- **Huboresha** usomaji wa msimbo na kupunguza ugumu wa sintaksia
**Njia ya forEach:**
**Mbinu ya forEach:**
```javascript
const prices = [9.99, 15.50, 22.75, 8.25];
// Using forEach for functional programming style
// Kutumia forEach kwa mtindo wa programu ya kazi
prices.forEach((price, index) => {
console.log(`Item ${index + 1}: $${price.toFixed(2)}`);
});
// forEach with arrow functions for simple operations
// forEach na michoro ya mshale kwa shughuli rahisi
prices.forEach(price => console.log(`Price: $${price}`));
```
**Unachohitaji kujua kuhusu forEach:**
- **Inatekeleza** kazi kwa kila kipengee cha array
- **Inatoa** thamani ya kipengee na index kama vigezo
- **Haiwezi** kusimamishwa mapema (tofauti na loops za jadi)
- **Inarudisha** undefined (haitengenezi array mpya)
✅ Kwa nini ungechagua for loop dhidi ya while loop? Watazamaji 17K walikuwa na swali sawa kwenye StackOverflow, na baadhi ya maoni [yanaweza kuwa ya kuvutia kwako](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript).
- **Hutekeleza** kazi kwa kila kipengee cha mfululizo
- **Hutoa** thamani ya kipengee na index kama vigezo
- **Haiwezi** kusimamishwa mapema (tofauti na mizunguko ya kawaida)
- **Hurejesha** undefined (haitoi mfululizo mpya)
✅ Kwanini utachagua mdundo wa for badala ya while? Watazamaji 17K walikuwa na swali sawa StackOverflow, na baadhi ya maoni [yanaweza kuwa ya kuvutia kwako](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript).
### 🎨 **Kagua Sintaksia za Kisasa za Mizunguko: Kukumbatia ES6+**
**Kagua uelewa wako wa JavaScript ya kisasa:**
- Faida za `for...of` juu ya mizunguko ya for ya kawaida ni zipi?
- Ungependa lini bado kutumia mizunguko ya for ya kawaida?
- Tofauti ni ipi kati ya `forEach` na `map`?
```mermaid
quadrantChart
title Mwongozo wa Uchaguzi wa Mzunguko
x-axis Kawaida --> Kisasa
y-axis Rahisi --> Ngumu
quadrant-1 Kisasa Ngumu
quadrant-2 Kawaida Ngumu
quadrant-3 Kawaida Rahisi
quadrant-4 Kisasa Rahisi
Traditional For: [0.2, 0.7]
While Loop: [0.3, 0.6]
For...of: [0.8, 0.3]
forEach: [0.9, 0.4]
Array Methods: [0.8, 0.8]
```
> **Mwelekeo wa kisasa:** Sintaksia ya ES6+ kama `for...of` na `forEach` inazidi kuwa njia inayopendekezwa kwa kurudia mfululizo kwa sababu ni safi na haina makosa!
## Loops na Arrays
## Mizunguko na Mfululizo
Kuchanganya arrays na loops huunda uwezo wa kushughulikia data kwa nguvu. Mchanganyiko huu ni msingi wa kazi nyingi za programu, kutoka kuonyesha orodha hadi kuhesabu takwimu.
Kuunganisha mfululizo na mizunguko kunaunda uwezo mkubwa wa usindikaji data. Mchanganyiko huu ni msingi wa kazi nyingi za programu, kutoka kuonyesha orodha hadi kuhesabu takwimu.
**Usindikaji wa Kawaida wa Array:**
**Usindikaji wa Mfululizo wa Kiasili:**
```javascript
const iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
// Classic for loop approach
// Njia ya zamani ya mzunguko wa for
for (let i = 0; i < iceCreamFlavors.length; i++) {
console.log(`Flavor ${i + 1}: ${iceCreamFlavors[i]}`);
}
// Modern for...of approach
// Njia ya kisasa ya for...of
for (const flavor of iceCreamFlavors) {
console.log(`Available flavor: ${flavor}`);
}
```
**Hebu tuelewe kila mbinu:**
- **Inatumia** mali ya urefu wa array kuamua mipaka ya loop
- **Inapata** vipengee kwa index katika loops za jadi za for
- **Inatoa** ufikiaji wa moja kwa moja wa vipengee katika loops za for...of
- **Inasindika** kila kipengee cha array mara moja tu
**Tuelewe kila njia:**
- **Inatumia** mali ya urefu wa mfululizo kuamua mpaka wa mzunguko
- **Inapata** vipengee kwa index katika mizunguko ya for ya kiasili
- **Hutoa** ufikiaji wa moja kwa moja kwa vipengee katika mizunguko ya for...of
- **Inashughulikia** kila kipengee cha mfululizo mara moja tu
**Mfano wa Usindikaji wa Data wa Vitendo:**
**Mfano wa Kazi halisi ya Usindikaji Data:**
```javascript
const studentGrades = [85, 92, 78, 96, 88, 73, 89];
@ -322,7 +555,7 @@ let total = 0;
let highestGrade = studentGrades[0];
let lowestGrade = studentGrades[0];
// Process all grades with a single loop
// Tafuta alama zote kwa mzunguko mmoja
for (let i = 0; i < studentGrades.length; i++) {
const grade = studentGrades[i];
total += grade;
@ -342,40 +575,66 @@ console.log(`Highest: ${highestGrade}`);
console.log(`Lowest: ${lowestGrade}`);
```
**Hivi ndivyo nambari hii inavyofanya kazi:**
- **Inaanzisha** vigezo vya kufuatilia kwa jumla na viwango vya juu na vya chini
- **Inasindika** kila alama kwa loop moja yenye ufanisi
- **Inakusanya** jumla kwa hesabu ya wastani
- **Inafuatilia** thamani za juu na za chini wakati wa mzunguko
- **Inahesabu** takwimu za mwisho baada ya kukamilika kwa loop
✅ Jaribu kuzunguka array ya ubunifu wako mwenyewe kwenye console ya kivinjari chako.
**Hapa ni jinsi msimbo huu unavyofanya kazi:**
- **Inaanzisha** vigezo vya kufuatilia jumla na viwango
- **Inasindika** kila alama kwa mzunguko mmoja wenye ufanisi
- **Inakusanya** jumla kwa ajili ya hesabu ya wastani
- **Inafuatilia** viwango vya juu na chini wakati wa mzunguko
- **Inahesabu** takwimu za mwisho baada ya mzunguko kumalizika
✅ Jaribu kuzunguka mfululizo uliouunda mwenyewe kwenye konsole ya kivinjari chako.
```mermaid
flowchart TD
A["📦 Data ya Orodha"] --> B["🔄 Usindikaji wa Mzunguko"]
B --> C["📈 Matokeo"]
A1["[85, 92, 78, 96, 88]"] --> A
B --> B1["Hesabu jumla"]
B --> B2["Tafuta chini/juu"]
B --> B3["Hesabu vigezo"]
B --> B4["Badilisha data"]
C --> C1["Wastani: 87.8"]
C --> C2["Kuuza: 96"]
C --> C3["Kupita: 5/5"]
C --> C4["Daraja za barua"]
D["⚡ Mifumo ya Usindikaji"] --> D1["Ujumlishaji (jumla)"]
D --> D2["Ulinganishaji (chini/juu)"]
D --> D3["Uchujaji (vigezo)"]
D --> D4["Ramani (mabadiliko)"]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#f3e5f5
```
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya Msaidizi wa GitHub Copilot 🚀
Tumia hali ya Agent kukamilisha changamoto ifuatayo:
Tumia hali ya Msaidizi kumaliza changamoto ifuatayo:
**Maelezo:** Tengeneza kazi ya kina ya usindikaji wa data inayochanganya arrays na loops kuchambua seti ya data na kutoa maarifa muhimu.
**Maelezo:** Jenga kazi kuu ya usindikaji data inayounganisha mfululizo na mizunguko kuchambua seti ya data na kutoa taarifa za maana.
**Maelekezo:** Unda kazi inayoitwa `analyzeGrades` inayochukua array ya vitu vya alama za wanafunzi (kila moja ikiwa na mali za jina na alama) na inarudisha kitu chenye takwimu ikiwa ni pamoja na alama ya juu zaidi, alama ya chini zaidi, wastani wa alama, idadi ya wanafunzi waliopasi (alama >= 70), na array ya majina ya wanafunzi waliopata alama juu ya wastani. Tumia angalau aina mbili tofauti za loop katika suluhisho lako.
**Mwito:** Unda kazi iitwayo `analyzeGrades` inayopokea mfululizo wa vitu vya alama za wanafunzi (kila kikiwa na mali za jina na alama) na kurejesha kitu chenye takwimu ikiwa ni pamoja na alama ya juu zaidi, alama ya chini zaidi, alama ya wastani, idadi ya wanafunzi waliopitisha (alama >= 70), na mfululizo wa majina ya wanafunzi waliopata zaidi ya wastani. Tumia angalau aina mbili tofauti za mizunguko katika suluhisho lako.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [hali ya msaidizi](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
JavaScript hutoa mbinu kadhaa za kisasa za safu ambazo zinaweza kubadilisha mizunguko ya jadi kwa kazi maalum. Chunguza [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach), [for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of), [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map), [filter](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), na [reduce](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce).
JavaScript inatoa mbinu kadhaa za kisasa za array zinazoweza kuchukua nafasi ya loops za jadi kwa kazi maalum. Chunguza [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach), [for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of), [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map), [filter](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), na [reduce](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce).
**Changamoto yako:** Rekebisha mfano wa alama za wanafunzi kwa kutumia angalau mbinu tatu tofauti za array. Angalia jinsi nambari inavyokuwa safi na rahisi kusoma kwa syntax ya kisasa ya JavaScript.
**Changamoto yako:** Rekebisha mfano wa alama za wanafunzi ukitumia mbinu tatu tofauti za safu. Angalia jinsi msimbo unavyokuwa safi zaidi na rahisi kusomeka kwa kutumia sintaksia ya kisasa ya JavaScript.
## Maswali ya Baada ya Somo
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/14)
## Mtihani Baada ya Mafunzo
[Mtihani baada ya mafunzo](https://ff-quizzes.netlify.app/web/quiz/14)
## Mapitio na Kujifunza Binafsi
## Mapitio & Kujifunza Binafsi
Arrays katika JavaScript zina mbinu nyingi zilizoambatanishwa nazo, ambazo ni muhimu sana kwa usindikaji wa data. [Soma kuhusu mbinu hizi](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) na jaribu baadhi yao (kama push, pop, slice na splice) kwenye array ya ubunifu wako.
Safu katika JavaScript zina mbinu nyingi zilizoambatanishwa nazo, ambazo ni muhimu sana kwa usindikaji wa data. [Soma kuhusu mbinu hizi](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) na jaribu baadhi zao (kama vile push, pop, slice na splice) kwenye safu uliyoitengeneza mwenyewe.
## Kazi ya Nyumbani
@ -383,5 +642,109 @@ Arrays katika JavaScript zina mbinu nyingi zilizoambatanishwa nazo, ambazo ni mu
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
## 📊 **Muhtasari wa Zana Zako za Safu & Mizunguko**
```mermaid
graph TD
A["🎯 Uwezo wa Mifugo na Mizunguko"] --> B["📦 Msingi wa Mifugo"]
A --> C["🔄 Aina za Mizunguko"]
A --> D["🔗 Usindikaji wa Data"]
A --> E["🎨 Mbinu za Kisasa"]
B --> B1["Uundaji: [ ]"]
B --> B2["Kuweka alama: arr[0]"]
B --> B3["Njia: push, pop"]
B --> B4["Sifa: urefu"]
C --> C1["Kwa: Marudio yanayojulikana"]
C --> C2["Wakati: Kulingana na hali"]
C --> C3["Kwa...ya: Ufikiaji wa moja kwa moja"]
C --> C4["forEach: Kazi"]
D --> D1["Hesabu za takwimu"]
D --> D2["Mabadiliko ya data"]
D --> D3["Uchujaji & utafutaji"]
D --> D4["Usindikaji wa wakati halisi"]
E --> E1["Fungua mishale"]
E --> E2["Mnyororo wa njia"]
E --> E3["Uharibifu"]
E --> E4["Vitenzi vya templeti"]
F["💡 Faida Muhimu"] --> F1["Usimamizi wa data kwa ufanisi"]
F --> F2["Kupunguza urudiaji wa msimbo"]
F --> F3["Suluhisho zinazoweza kupanuka"]
F --> F4["Sintaksia safi zaidi"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
```
---
## 🚀 Ratiba Yako ya Ustadi wa Safu & Mizunguko
### ⚡ **Kile Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Tengeneza safu ya filamu zako unazopenda na pata vipengele maalum
- [ ] Andika for loop inayohesabu kutoka 1 hadi 10
- [ ] Jaribu changamoto ya mbinu za kisasa za safu kutoka somo
- [ ] Fanya mazoezi ya kuorodhesha safu kwenye console ya kivinjari chako
### 🎯 **Kile Unachoweza Kufanikisha Saa Hii**
- [ ] Kamilisha mtihani baada ya somo na pitia dhana zozote ngumu
- [ ] Tengeneza kifumbuzi kamili cha tathmini ya alama kutoka changamoto ya GitHub Copilot
- [ ] Tengeneza kikapu rahisi cha ununuzi kinachoongeza na kuondoa vitu
- [ ] Fanya mazoezi ya kubadilisha aina tofauti za mizunguko
- [ ] Jaribu mbinu za safu kama `push`, `pop`, `slice`, na `splice`
### 📅 **Safari Yako ya Siku Mmoja la Usindikaji Data**
- [ ] Kamilisha kazi ya "Loop an Array" na maboresho ya ubunifu
- [ ] Tengeneza programu ya orodha ya kufanya kazi ukitumia safu na mizunguko
- [ ] Tengeneza kalkuleta rahisi ya takwimu kwa data za nambari
- [ ] Fanya mazoezi na [mbinu za safu za MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)
- [ ] Tengeneza galeri ya picha au kiolesura cha orodha ya muziki
- [ ] Chunguza programu ya kifasihi kwa kutumia `map`, `filter`, na `reduce`
### 🌟 **Mabadiliko Yako ya Mwezi Mmoja**
- [ ] Jifunze mbinu za hali ya juu za safu na uboreshaji wa utendaji
- [ ] Tengeneza dashibodi kamili ya kuona data
- [ ] Changia miradi ya chanzo huria inayohusiana na usindikaji data
- [ ] Fafanua kwa mtu mwingine kuhusu safu na mizunguko kwa mifano ya vitendo
- [ ] Tengeneza maktaba binafsi ya kazi zinazoweza kutumika tena za usindikaji data
- [ ] Chunguza algoriti na miundo ya data inayojengwa juu ya safu
### 🏆 **Ukaguzi wa Mwisho wa Bingwa wa Usindikaji Data**
**Sherehekea ustadi wako wa safu na mizunguko:**
- Ni operesheni gani ya safu ambayo imekuwa ya muhimu zaidi kwa matumizi halisi uliyojifunza?
- Aina gani ya mzunguko unahisi ni rahisi zaidi kwako na kwa nini?
- Je, uelewa wa safu na mizunguko umebadilisha vipi mtazamo wako wa kupanga data?
- Ni kazi gani ngumu ya usindikaji data ungependa kushughulikia ijayo?
```mermaid
journey
title Ukuaji Wako wa Usindikaji Data
section Leo
Array Confusion: 3: You
Loop Basics: 4: You
Index Understanding: 5: You
section Wiki Hii
Method Mastery: 4: You
Efficient Processing: 5: You
Modern Syntax: 5: You
section Mwezi Ujao
Complex Algorithms: 5: You
Performance Optimization: 5: You
Teaching Others: 5: You
```
> 📦 **Umefungua nguvu ya kupanga na kusindika data!** Safu na mizunguko ni msingi wa karibu kila programu utakayo tengeneza. Kuanzia orodha rahisi hadi uchambuzi wa data mgumu, sasa una zana za kushughulikia taarifa kwa ufanisi na kwa ustadi. Kila tovuti yenye mwendo, programu ya simu, na programu inayotegemea data hutegemea dhana hizi za msingi. Karibu katika dunia ya usindikaji data wenye uwezo wa kupanuka! 🎉
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kunywa nia**:
Nyaraka hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kufanikisha usahihi, tafadhali fahamu kuwa tafsiri za moja kwa moja zinaweza kuwa na makosa au usahihi mdogo. Nyaraka ya asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa habari muhimu, tafsiri ya kitaalamu inayofanywa na watu inashauriwa. Sisi hatuwezi kuwajibika kwa kutoelewana au tafsiri potofu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,47 +1,92 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "20c72cf2e5b0050d38ca3cb14a75a9df",
"translation_date": "2025-10-24T19:29:42+00:00",
"original_hash": "3fcfa99c4897e051b558b5eaf1e8cc74",
"translation_date": "2026-01-07T02:00:37+00:00",
"source_file": "3-terrarium/1-intro-to-html/README.md",
"language_code": "sw"
}
-->
# Mradi wa Terrarium Sehemu ya 1: Utangulizi wa HTML
![Utangulizi wa HTML](../../../../translated_images/webdev101-html.4389c2067af68e98280c1bde52b6c6269f399eaae3659b7c846018d8a7b0bbd9.sw.png)
```mermaid
journey
title Safari Yako ya Kujifunza HTML
section Foundation
Create HTML file: 3: Student
Add DOCTYPE: 4: Student
Structure document: 5: Student
section Content
Add metadata: 4: Student
Include images: 5: Student
Organize layout: 5: Student
section Semantics
Use proper tags: 4: Student
Enhance accessibility: 5: Student
Build terrarium: 5: Student
```
![Utangulizi wa HTML](../../../../translated_images/webdev101-html.4389c2067af68e98.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
HTML, au HyperText Markup Language, ni msingi wa kila tovuti uliyowahi kutembelea. Fikiria HTML kama mifupa inayotoa muundo kwa kurasa za wavuti inafafanua wapi maudhui yanakwenda, jinsi yanavyopangwa, na kila kipande kinawakilisha nini. Wakati CSS baadaye itapamba HTML yako kwa rangi na mpangilio, na JavaScript italeta uhai kwa mwingiliano, HTML hutoa muundo muhimu unaowezesha kila kitu kingine.
Katika somo hili, utaunda muundo wa HTML kwa kiolesura cha terrarium ya mtandaoni. Mradi huu wa vitendo utakufundisha dhana za msingi za HTML huku ukijenga kitu kinachovutia kwa macho. Utajifunza jinsi ya kupanga maudhui kwa kutumia vipengele vya semantic, kufanya kazi na picha, na kuunda msingi wa programu ya wavuti inayoweza kuingiliana.
Mwisho wa somo hili, utakuwa na ukurasa wa HTML unaofanya kazi unaoonyesha picha za mimea katika safu zilizopangwa, tayari kwa kupambwa katika somo linalofuata. Usijali ikiwa inaonekana rahisi mwanzoni hiyo ndiyo hasa HTML inapaswa kufanya kabla ya CSS kuongeza mwonekano wa kuvutia.
## Maswali ya Kabla ya Somo
HTML, au HyperText Markup Language, ni msingi wa kila tovuti uliyoitembelea. Fikiria HTML kama mfupa wa mifupa unaotoa muundo kwa kurasa za wavuti inaeleza wapi maudhui yanapaswa kuwekwa, jinsi yanavyopangwa, na kila kipande kinachowakilisha nini. Ingawa CSS baadaye itafunika HTML yako kwa rangi na mpangilio, na JavaScript itakuleta uhai kupitia mwingiliano, HTML hutoa muundo muhimu unaofanya kila kitu kingine kuwa chawezekana.
Katika somo hili, utaunda muundo wa HTML kwa ajili ya kiolesura cha terrarium pepe. Mradi huu wa vitendo utakufundisha dhana za msingi za HTML huku ukijenga kitu kinachovutia kwa macho. Utajifunza jinsi ya kupanga maudhui kwa kutumia vipengele vya maana, kufanya kazi na picha, na kuunda msingi wa programu ya wavuti yenye mwingiliano.
Mwisho wa somo hili, utakuwa na ukurasa wa HTML unaofanya kazi unaoonyesha picha za mimea katika safu zilizopangwa vizuri, tayari kwa urembo katika somo lijalo. Usijali kama inaonekana rahisi mwanzoni hiyo ndio HTML inavyopaswa kufanya kabla ya CSS kuongeza urembo wa kuona.
```mermaid
mindmap
root((HTML Fundamentals))
Structure
DOCTYPE Declaration
HTML Element
Head Section
Body Content
Elements
Tags & Attributes
Self-closing Tags
Nested Elements
Block vs Inline
Content
Text Elements
Images
Containers (div)
Lists
Semantics
Meaningful Tags
Accessibility
Screen Readers
SEO Benefits
Best Practices
Proper Nesting
Valid Markup
Descriptive Alt Text
Organized Structure
```
## Jaribio la Kabla ya Mhadhara
[Maswali ya kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/15)
[Jaribio kabla ya mhadhara](https://ff-quizzes.netlify.app/web/quiz/15)
> 📺 **Tazama na Jifunze**: Angalia video hii ya muhtasari wa kusaidia
> 📺 **Tazama na Jifunze**: Angalia muhtasari huu wa video unaosaidia
>
> [![Video ya Misingi ya HTML](https://img.youtube.com/vi/1TvxJKBzhyQ/0.jpg)](https://www.youtube.com/watch?v=1TvxJKBzhyQ)
> [![Video za Msingi wa HTML](https://img.youtube.com/vi/1TvxJKBzhyQ/0.jpg)](https://www.youtube.com/watch?v=1TvxJKBzhyQ)
## Kuandaa Mradi Wako
Kabla ya kuanza kuandika msimbo wa HTML, hebu tuandae mazingira sahihi ya kazi kwa mradi wako wa terrarium. Kuunda muundo wa faili ulioandaliwa tangu mwanzo ni tabia muhimu itakayokusaidia katika safari yako ya maendeleo ya wavuti.
Kabla hatujaingia kwenye msimbo wa HTML, hebu tuandae nafasi iliyofaa ya kazi kwa ajili ya mradi wako wa terrarium. Kuunda muundo wa faili uliopangwa vizuri tangu mwanzo ni tabia muhimu itakayokuhudumia vyema katika safari yako ya maendeleo ya wavuti.
### Kazi: Unda Muundo wa Mradi Wako
Utaunda folda maalum kwa mradi wako wa terrarium na kuongeza faili yako ya kwanza ya HTML. Hapa kuna njia mbili unazoweza kutumia:
Utaunda folda maalum kwa ajili ya mradi wako wa terrarium na kuongeza faili yako ya kwanza ya HTML. Hapa kuna njia mbili unazoweza kutumia:
**Chaguo 1: Kutumia Visual Studio Code**
1. Fungua Visual Studio Code
2. Bonyeza "File" → "Open Folder" au tumia `Ctrl+K, Ctrl+O` (Windows/Linux) au `Cmd+K, Cmd+O` (Mac)
3. Unda folda mpya inayoitwa `terrarium` na uchague
4. Katika paneli ya Explorer, bonyeza ikoni ya "New File"
5. Peana jina faili yako `index.html`
2. Bofya "File" → "Open Folder" au tumia `Ctrl+K, Ctrl+O` (Windows/Linux) au `Cmd+K, Cmd+O` (Mac)
3. Unda folda mpya iitwayo `terrarium` na uichague
4. Katika dirisha la Explorer, bofya ikoni ya "New File"
5. Panga faili yako `index.html`
![VS Code Explorer ikionyesha uundaji wa faili mpya](../../../../translated_images/vs-code-index.e2986cf919471eb984a0afef231380c8b132b000635105f2397bd2754d1b689c.sw.png)
![Msafiri wa VS Code unaonyesha uundaji wa faili mpya](../../../../translated_images/vs-code-index.e2986cf919471eb9.sw.png)
**Chaguo 2: Kutumia Amri za Terminal**
```bash
@ -52,47 +97,72 @@ code index.html
```
**Hivi ndivyo amri hizi zinavyofanikisha:**
- **Inaunda** saraka mpya inayoitwa `terrarium` kwa mradi wako
- **Inasogea** ndani ya saraka ya terrarium
- **Inaunda** faili tupu ya `index.html`
- **Inafungua** faili katika Visual Studio Code kwa kuhariri
- **Unda** saraka mpya iitwayo `terrarium` kwa ajili ya mradi wako
- **Ingiza** saraka ya terrarium
- **Unda** faili tupu `index.html`
- **Fungua** faili hiyo ndani ya Visual Studio Code kwa ajili ya kuhariri
> 💡 **Kidokezo cha Kitaalamu**: Jina la faili `index.html` ni maalum katika maendeleo ya wavuti. Wakati mtu anapotembelea tovuti, vivinjari huangalia moja kwa moja `index.html` kama ukurasa wa chaguo-msingi wa kuonyesha. Hii inamaanisha URL kama `https://mysite.com/projects/` itahudumia faili ya `index.html` kutoka folda ya `projects` bila hitaji la kutaja jina la faili kwenye URL.
> 💡 **Ushauri wa Pro**: Jina la faili `index.html` ni la kipekee katika maendeleo ya wavuti. Wakati mtu anapotembelea tovuti, vivinjari huangalia moja kwa moja faili `index.html` kama ukurasa wa chaguo msaada kuonyesha. Hii ina maana URL kama `https://mysite.com/projects/` itahudumia faili `index.html` kutoka folda ya `projects` bila hitaji la kuweka jina la faili kwenye URL.
## Kuelewa Muundo wa Hati ya HTML
Kila hati ya HTML hufuata muundo maalum ambao vivinjari vinahitaji kuelewa na kuonyesha kwa usahihi. Fikiria muundo huu kama barua rasmi ina vipengele vinavyohitajika kwa mpangilio maalum vinavyosaidia mpokeaji (katika kesi hii, kivinjari) kushughulikia maudhui ipasavyo.
Hebu tuanze kwa kuongeza msingi muhimu ambao kila hati ya HTML inahitaji.
Kila hati ya HTML hutegemea muundo maalum unaohitajika na vivinjari kuelewa na kuonyesha kwa usahihi. Fikiria muundo huu kama barua rasmi ina vipengele vinavyohitajika kwa mpangilio maalum vinavyosaidia mpokeaji (hii ni vivinjari) kusindika maudhui ipasavyo.
```mermaid
flowchart TD
A["<!DOCTYPE html>"] --> B["<html>"]
B --> C["<head>"]
C --> D["<title>"]
C --> E["<meta charset>"]
C --> F["<meta viewport>"]
B --> G["<body>"]
G --> H["<h1> Kichwa"]
G --> I["<div> Makontena"]
G --> J["<img> Picha"]
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#fff3e0
style G fill:#e8f5e8
```
Tuanze kwa kuongeza msingi muhimu ambao kila hati ya HTML inahitaji.
### Tamko la DOCTYPE na Kipengele Kikuu
### Tamko la DOCTYPE na Kipengele cha Mizizi
Mistari miwili ya kwanza ya faili yoyote ya HTML hutumika kama "utambulisho" wa hati kwa kivinjari:
Mistari miwili ya kwanza ya faili yoyote ya HTML hutoa "utangulizi" wa hati kwa kivinjari:
```html
<!DOCTYPE html>
<html></html>
```
**Kuelewa kile msimbo huu unachofanya:**
- **Inatangaza** aina ya hati kama HTML5 kwa kutumia `<!DOCTYPE html>`
- **Inaunda** kipengele kikuu `<html>` ambacho kitakuwa na maudhui yote ya ukurasa
- **Inaweka** viwango vya kisasa vya wavuti kwa uonyeshaji sahihi wa kivinjari
- **Inahakikisha** uonyeshaji thabiti katika vivinjari na vifaa tofauti
**Kuelewa kinachofanywa na msimbo huu:**
- **Tangaza** aina ya hati kama HTML5 kwa kutumia `<!DOCTYPE html>`
- **Tengeneza** kipengele cha mizizi `<html>` ambacho kitaweka maudhui yote ya ukurasa
- **Weka** viwango vya wavuti vya kisasa kwa ajili ya uonyesho sahii wa kivinjari
- **Hakikisha** uonyesho thabiti kati ya vivinjari na vifaa tofauti
> 💡 **Ushauri wa VS Code**: Weka alama juu ya lebo yoyote ya HTML ndani ya VS Code kuona habari zinazosaidia kutoka MDN Web Docs, ikiwa ni pamoja na mifano ya matumizi na maelezo ya muafaka wa kivinjari.
> 📚 **Jifunze Zaidi**: Tamko la DOCTYPE linazuia vivinjari kuingia "modus wa kasoro," ulio tumika kuunga mkono tovuti za zamani sana. Maendeleo ya wavuti ya kisasa hutumia tamko rahisi la `<!DOCTYPE html>` kuhakikisha [uonyesho unaozingatia viwango](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode).
> 💡 **Kidokezo cha VS Code**: Peleka mshale juu ya tagi yoyote ya HTML katika VS Code ili kuona maelezo ya kusaidia kutoka MDN Web Docs, ikiwa ni pamoja na mifano ya matumizi na maelezo ya utangamano wa kivinjari.
### 🔄 **Kukagua Kipengele cha Mafunzo**
**Pumzika na Fikiria**: Kabla ya kuendelea, hakikisha unaelewa:
- ✅ Kwa nini kila hati ya HTML inahitaji tamko la DOCTYPE
- ✅ Kipengele cha mizizi `<html>` kina nini ndani yake
- ✅ Jinsi muundo huu unavyosaidia vivinjari kuonyesha kurasa kwa usahihi
> 📚 **Jifunze Zaidi**: Tamko la DOCTYPE huzuia vivinjari kuingia katika "hali ya quirks," ambayo ilitumika kusaidia tovuti za zamani sana. Maendeleo ya kisasa ya wavuti hutumia tamko rahisi `<!DOCTYPE html>` kuhakikisha [uonyeshaji unaozingatia viwango](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode).
**Jaribio la Haraka la Kujikokotoa**: Je, unaweza kuelezea kwa maneno yako mwenyewe maana ya "uonyesho unaozingatia viwango"?
## Kuongeza Metadata Muhimu ya Hati
## Kuongeza Metadata Muhimu za Hati
Sehemu ya `<head>` ya hati ya HTML ina taarifa muhimu ambayo vivinjari na injini za utafutaji zinahitaji, lakini ambayo wageni hawaoni moja kwa moja kwenye ukurasa. Fikiria kama "maelezo ya nyuma ya pazia" yanayosaidia ukurasa wako kufanya kazi ipasavyo na kuonekana kwa usahihi katika vifaa na majukwaa tofauti.
Sehemu ya `<head>` ya hati ya HTML ina habari muhimu ambayo vivinjari na injini za utafutaji zinahitaji, lakini wageni hawaiioni moja kwa moja kwenye ukurasa. Fikiria kama habari "nyuma ya pazia" inayosaidia ukurasa wako wa wavuti kufanya kazi vizuri na kuonekana kwa usahihi kwenye vifaa na majukwaa tofauti.
Metadata hii inaambia vivinjari jinsi ya kuonyesha ukurasa wako, ni usimbaji wa herufi gani wa kutumia, na jinsi ya kushughulikia ukubwa wa skrini tofauti yote ni muhimu kwa kuunda kurasa za wavuti za kitaalamu na zinazoweza kufikiwa.
Metadata hii inawaambia vivinjari jinsi ya kuonyesha ukurasa wako, ni encoding gani ya herufi itumike, na jinsi ya kushughulikia ukubwa tofauti wa skrini zote ni muhimu kwa kuunda kurasa za wavuti za kitaalamu na zinazo patikana.
### Kazi: Ongeza Kichwa cha Hati
### Kazi: Ongeza Sehemu ya Kichwa cha Hati
Weka sehemu hii ya `<head>` kati ya tagi zako za kufungua na kufunga `<html>`:
Tumia sehemu hii ya `<head>` kati ya lebo yako ya kufungua na kufunga `<html>`:
```html
<head>
@ -103,28 +173,28 @@ Weka sehemu hii ya `<head>` kati ya tagi zako za kufungua na kufunga `<html>`:
</head>
```
**Kufafanua kile kila kipengele kinachofanikisha:**
- **Inaweka** kichwa cha ukurasa kinachoonekana kwenye tabo za kivinjari na matokeo ya utafutaji
- **Inataja** usimbaji wa herufi wa UTF-8 kwa uonyeshaji sahihi wa maandishi duniani kote
- **Inahakikisha** utangamano na matoleo ya kisasa ya Internet Explorer
- **Inaseti** muundo wa mwitikio kwa kuweka viewport inayolingana na upana wa kifaa
- **Inadhibiti** kiwango cha kuanza cha zoom kuonyesha maudhui kwa ukubwa wa asili
**Kuvaa vipengele hivi vinavyofanikisha:**
- **Weka** kichwa cha ukurasa kinachoonekana kwenye tabia za kivinjari na matokeo ya utafutaji
- **Taja** encoding ya herufi UTF-8 kwa uonyesho sahihi wa maandishi dunia nzima
- **Hakikisha** muafaka na matoleo ya kisasa ya Internet Explorer
- **Panga** muundo unaojulikana kwa kuweka viewport ili iendane na upana wa kifaa
- **Dhibiti** kiwango cha mviringo wa kuanzishwa ili kuonyesha maudhui kwa ukubwa wa asili
> 🤔 **Fikiria Hili**: Nini kitatokea ikiwa utaweka tagi ya meta ya viewport kama hii: `<meta name="viewport" content="width=600">`? Hii italazimisha ukurasa kuwa na upana wa pikseli 600 kila wakati, ikivunja muundo wa mwitikio! Jifunze zaidi kuhusu [usanidi sahihi wa viewport](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag).
> 🤔 **Fikiria Hili**: Kutatokea nini kama utaweka meta tag ya viewport kama hii: `<meta name="viewport" content="width=600">`? Hii italazimisha ukurasa daima kuwa na upana wa pixel 600, ikivunja muundo unaopokelewa! Jifunze zaidi kuhusu [mpangilio sahihi wa viewport](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag).
## Kujenga Mwili wa Hati
Kipengele cha `<body>` kina maudhui yote yanayoonekana ya ukurasa wako wa wavuti kila kitu ambacho watumiaji wataona na kuingiliana nacho. Wakati sehemu ya `<head>` ilitoa maelekezo kwa kivinjari, sehemu ya `<body>` ina maudhui halisi: maandishi, picha, vitufe, na vipengele vingine vinavyounda kiolesura chako cha mtumiaji.
Kipengele cha `<body>` kina maudhui yote yanayoonekana ya ukurasa wako wa wavuti kila kitu watumiaji wataona na kushirikiana nacho. Wakati sehemu ya `<head>` ilitoa maelekezo kwa kivinjari, sehemu ya `<body>` ina maudhui halisi: maandishi, picha, vitufe, na vipengele vingine vinavyounda kiolesura chako cha mtumiaji.
Hebu tuongeze muundo wa mwili na kuelewa jinsi tagi za HTML zinavyofanya kazi pamoja kuunda maudhui yenye maana.
Tuweke muundo wa mwili na kuelewa jinsi lebo za HTML zinavyofanya kazi pamoja kuunda maudhui yenye maana.
### Kuelewa Muundo wa Tagi za HTML
### Kuelewa Muundo wa Lebo za HTML
HTML hutumia tagi za jozi kufafanua vipengele. Tagi nyingi zina tagi ya kufungua kama `<p>` na tagi ya kufunga kama `</p>`, na maudhui katikati: `<p>Hello, world!</p>`. Hii huunda kipengele cha aya kinachobeba maandishi "Hello, world!".
HTML hutumia lebo za jozi kuainisha vipengele. Lebo nyingi zina lebo ya ufunguzi kama `<p>` na lebo ya kufunga kama `</p>`, na maudhui kati yao: `<p>Hello, world!</p>`. Hii huunda kipengele cha aya chenye maandishi "Hello, world!".
### Kazi: Ongeza Kipengele cha Mwili
Sasisha faili yako ya HTML ili kujumuisha kipengele cha `<body>`:
Sasisha faili yako ya HTML kujumuisha kipengele cha `<body>`:
```html
<!DOCTYPE html>
@ -139,136 +209,179 @@ Sasisha faili yako ya HTML ili kujumuisha kipengele cha `<body>`:
</html>
```
**Hivi ndivyo muundo huu kamili unavyotoa:**
- **Inaweka** mfumo wa msingi wa hati ya HTML5
- **Inajumuisha** metadata muhimu kwa uonyeshaji sahihi wa kivinjari
- **Inaunda** mwili tupu tayari kwa maudhui yako yanayoonekana
- **Inafuata** mazoea bora ya maendeleo ya wavuti ya kisasa
**Huu muundo kamili unatoa:**
- **Imeweka** mfumo wa msingi wa hati ya HTML5
- **Inajumuisha** metadata muhimu kwa uonyesho sahihi wa kivinjari
- **Imetengeneza** mwili tupu tayari kwa maudhui yako yanayoonekana
- **Inafuata** mbinu bora za maendeleo ya wavuti za kisasa
Sasa uko tayari kuongeza vipengele vinavyoonekana vya terrarium yako. Tutatumia vipengele vya `<div>` kama vyombo vya kupanga sehemu tofauti za maudhui, na vipengele vya `<img>` kuonyesha picha za mimea.
Sasa uko tayari kuongeza vipengele vinavyoonekana vya terrarium yako. Tutatumia vipengele vya `<div>` kama vyombo vya kuandaa sehemu tofauti za maudhui, na vipengele vya `<img>` kuonyesha picha za mimea.
### Kufanya Kazi na Picha na Vyombo vya Mpangilio
### Kufanya kazi na Picha na Vyombo vya Mpangilio
Picha ni maalum katika HTML kwa sababu zinatumia tagi za "kujifunga". Tofauti na vipengele kama `<p></p>` vinavyofunika maudhui, tagi ya `<img>` ina taarifa zote zinazohitajika ndani ya tagi yenyewe kwa kutumia sifa kama `src` kwa njia ya faili ya picha na `alt` kwa upatikanaji.
Picha ni maalum katika HTML kwa sababu hutumia lebo za "kujifunga" yenyewe. Tofauti na vipengele kama `<p></p>` vinavyozunguka maudhui, lebo `<img>` ina taarifa zote inazohitaji ndani ya lebo yenyewe kwa kutumia sifa kama `src` kwa njia ya faili ya picha na `alt` kwa upatikanaji.
Kabla ya kuongeza picha kwenye HTML yako, utahitaji kupanga faili za mradi wako ipasavyo kwa kuunda folda ya picha na kuongeza michoro ya mimea.
Kabla ya kuongeza picha kwenye HTML yako, utahitaji kupanga faili zako za mradi vizuri kwa kuunda saraka ya picha na kuongeza picha za mimea.
**Kwanza, andaa picha zako:**
1. Unda folda inayoitwa `images` ndani ya folda ya mradi wako wa terrarium
2. Pakua picha za mimea kutoka [folda ya suluhisho](../../../../3-terrarium/solution/images) (picha 14 za mimea kwa jumla)
3. Nakili picha zote za mimea kwenye folda yako mpya ya `images`
1. Unda saraka iitwayo `images` ndani ya folda ya mradi wako wa terrarium
2. Pakua picha za mimea kutoka [saraka ya suluhisho](../../../../3-terrarium/solution/images) (picha 14 za mimea jumla)
3. Nakili picha zote za mimea ndani ya saraka yako mpya ya `images`
### Kazi: Unda Mpangilio wa Kuonyesha Mimea
### Kazi: Unda Mpangilio wa Onyesho la Mimea
Sasa ongeza picha za mimea zilizopangwa katika safu mbili kati ya tagi zako za `<body></body>`:
Sasa ongeza picha za mimea zilizopangwa katika safu mbili kati ya lebo zako za `<body></body>`:
```html
<div id="page">
<div id="left-container" class="container">
<div class="plant-holder">
<img class="plant" alt="plant" id="plant1" src="../../../../translated_images/plant1.d87946a2ca70cc4316bda6e6c3af7210fbe9ada5539a7885141a9ce0efaf7be3.sw.png" />
<img class="plant" alt="plant" id="plant1" src="../../../../translated_images/plant1.d87946a2ca70cc43.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant2" src="../../../../translated_images/plant2.8daa1606c9c1ad896bb171212c7d1d882e504b76b8ec3a2d1c337d775cf50dc3.sw.png" />
<img class="plant" alt="plant" id="plant2" src="../../../../translated_images/plant2.8daa1606c9c1ad89.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant3" src="../../../../translated_images/plant3.8b0d484381a2a2a77c5c06ad97ab6ae5b7023da8c6c7678b0183bc0e46ea17a7.sw.png" />
<img class="plant" alt="plant" id="plant3" src="../../../../translated_images/plant3.8b0d484381a2a2a7.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant4" src="../../../../translated_images/plant4.656e16ae1df37be2af5f4e7b5ab6c5decc432c3d3ec2eb98b904ddbecad49db0.sw.png" />
<img class="plant" alt="plant" id="plant4" src="../../../../translated_images/plant4.656e16ae1df37be2.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant5" src="../../../../translated_images/plant5.2b41b9355f11ebccd62d327f5f14e56531ecda9c6f970bc89e386ee9f0273bb0.sw.png" />
<img class="plant" alt="plant" id="plant5" src="../../../../translated_images/plant5.2b41b9355f11ebcc.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant6" src="../../../../translated_images/plant6.3d1827d03b6569946be13ae5da1f32947ae56732638a43757a7c616a6adccc5d.sw.png" />
<img class="plant" alt="plant" id="plant6" src="../../../../translated_images/plant6.3d1827d03b656994.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant7" src="../../../../translated_images/plant7.8152c302ac97f621a6c595bdf3939103568f9efc7d3b06a0f02a1ea66f479de0.sw.png" />
<img class="plant" alt="plant" id="plant7" src="../../../../translated_images/plant7.8152c302ac97f621.sw.png" />
</div>
</div>
<div id="right-container" class="container">
<div class="plant-holder">
<img class="plant" alt="plant" id="plant8" src="../../../../translated_images/plant8.38d6428174ffa850a47cd1b81d528fa528adda7d23f3ae0bb42f4a27356ca5e6.sw.png" />
<img class="plant" alt="plant" id="plant8" src="../../../../translated_images/plant8.38d6428174ffa850.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant9" src="../../../../translated_images/plant9.f0e38d3327c37fc29cd2734d48d20c2cf69300898ece6d46708829e02ce540e3.sw.png" />
<img class="plant" alt="plant" id="plant9" src="../../../../translated_images/plant9.f0e38d3327c37fc2.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant10" src="../../../../translated_images/plant10.b159d6d6e985595f56d86b4b38061b8e7b4c9969c210c199fe967269cf935e7f.sw.png" />
<img class="plant" alt="plant" id="plant10" src="../../../../translated_images/plant10.b159d6d6e985595f.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant11" src="../../../../translated_images/plant11.2a03a1c2ec8ea84ef3a80c06cc6883f3960fbb669f2c0b0bd824ba33d7eb7d32.sw.png" />
<img class="plant" alt="plant" id="plant11" src="../../../../translated_images/plant11.2a03a1c2ec8ea84e.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant12" src="../../../../translated_images/plant12.60e9b53e538fbaf3e5797ebf800acb483baf5639e6cf378292ac2321ab8a5ea9.sw.png" />
<img class="plant" alt="plant" id="plant12" src="../../../../translated_images/plant12.60e9b53e538fbaf3.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant13" src="../../../../translated_images/plant13.07a51543c820bcf57f67a9a6c0acbd6211ff795e2e67a42a9718224534e95fab.sw.png" />
<img class="plant" alt="plant" id="plant13" src="../../../../translated_images/plant13.07a51543c820bcf5.sw.png" />
</div>
<div class="plant-holder">
<img class="plant" alt="plant" id="plant14" src="../../../../translated_images/plant14.6e486371ba7d36ba3520d9828887993cb4c3edad8bdd8ff9b1b315717ff8cb63.sw.png" />
<img class="plant" alt="plant" id="plant14" src="../../../../translated_images/plant14.6e486371ba7d36ba.sw.png" />
</div>
</div>
</div>
```
**Hatua kwa hatua, hivi ndivyo kinachotokea katika msimbo huu:**
- **Inaunda** chombo kikuu cha ukurasa na `id="page"` kushikilia maudhui yote
- **Inaseti** vyombo viwili vya safu: `left-container` na `right-container`
- **Inapanga** mimea 7 katika safu ya kushoto na mimea 7 katika safu ya kulia
- **Inafunika** kila picha ya mmea katika div ya `plant-holder` kwa nafasi ya mtu binafsi
- **Inatumia** majina ya darasa yanayofanana kwa upambaji wa CSS katika somo linalofuata
- **Inapeana** vitambulisho vya kipekee kwa kila picha ya mmea kwa mwingiliano wa JavaScript baadaye
- **Inajumuisha** njia sahihi za faili zinazoelekeza kwenye folda ya picha
> 🤔 **Fikiria Hili**: Angalia kwamba picha zote kwa sasa zina maandishi ya alt sawa "plant". Hili si bora kwa upatikanaji. Watumiaji wa skrini za kusoma wangesikia "plant" ikirudiwa mara 14 bila kujua mmea maalum kila picha inaonyesha. Je, unaweza kufikiria maandishi bora zaidi ya alt kwa kila picha?
> 📝 **Aina za Vipengele vya HTML**: Vipengele vya `<div>` ni "block-level" na vinachukua upana kamili, wakati vipengele vya `<span>` ni "inline" na vinachukua upana unaohitajika tu. Unadhani nini kingetokea ikiwa ungebadilisha tagi zote za `<div>` kuwa tagi za `<span>`?
Kwa msimbo huu ulioongezwa, mimea itaonekana kwenye skrini, ingawa haitakuwa na mwonekano mzuri bado hiyo ndiyo kazi ya CSS katika somo linalofuata! Kwa sasa, una msingi thabiti wa HTML unaopanga maudhui yako ipasavyo na kufuata mazoea bora ya upatikanaji.
## Kutumia HTML ya Semantic kwa Upatikanaji
HTML ya semantic inamaanisha kuchagua vipengele vya HTML kulingana na maana na kusudi lake, si tu mwonekano wake. Unapotumia markup ya semantic, unawasiliana muundo na maana ya maudhui yako kwa vivinjari, injini za utafutaji, na teknolojia za kusaidia kama skrini za kusoma.
Mbinu hii inafanya tovuti zako ziweze kufikiwa zaidi na watumiaji wenye ulemavu na husaidia injini za utafutaji kuelewa maudhui yako vizuri. Ni kanuni ya msingi ya maendeleo ya wavuti ya kisasa inayounda uzoefu bora kwa kila mtu.
**Hatua kwa hatua, hii ndiyo kinachotokea katika msimbo huu:**
- **Unda** chombo kikuu cha ukurasa kwa `id="page"` kushikilia maudhui yote
- **Weka** vyombo viwili vya safu: `left-container` na `right-container`
- **Panga** mimea 7 katika safu ya kushoto na mimea 7 katika safu ya kulia
- **Zungusha** kila picha ya mmea katika div ya `plant-holder` kwa upangaji wa mtu binafsi
- **Tumia** majina ya darasa yanayolingana kwa urembo wa CSS kwenye somo lijalo
- **Pangilia** vitambulisho vya kipekee kwa kila picha ya mmea kwa ajili ya mwingiliano wa JavaScript baadaye
- **Jumuisha** njia sahihi za faili kuelekeza kwenye saraka ya picha
> 🤔 **Fikiria Hili**: Tambua kuwa picha zote kwa sasa zina maandishi sawa ya alt "plant". Hii si bora kwa upatikanaji. Watumiaji wa wasomaji wa skrini wangesikia "plant" zikirudiwa mara 14 bila kujua mmea gani picha kila moja inaonyesha. Je, unaweza kufikiria maandishi bora ya alt ya kuelezea picha hii?
> 📝 **Aina za Vipengele vya HTML**: Vipengele vya `<div>` ni vya "ngazi ya kugawanyika" na huchukua upana mzima, wakati vipengele vya `<span>` ni vya "ndani" na huchukua upana unaohitajika tu. Unaweza kufikiria kutokee nini kama utabadilisha lebos zote za `<div>` kuwa `<span>`?
### 🔄 **Kukagua Kipengele cha Mafunzo**
**Kuelewa Muundo**: Chukua muda kuangalia muundo wako wa HTML:
- ✅ Je, unaweza kutambua vyombo vikuu katika mpangilio wako?
- ✅ Je, unaelewa kwa nini kila picha ina kitambulisho cha kipekee?
- ✅ Unaelezaje kusudi la div za `plant-holder`?
**Ukaguzi wa Kuona**: Fungua faili yako ya HTML kwa kivinjari. Unapaswa kuona:
- Orodha rahisi ya picha za mimea
- Picha zilizopangwa katika safu mbili
- Muundo rahisi, usio na urembo
**Kumbuka**: Muonekano huu wa kawaida ndio HTML inavyopaswa kuonekana kabla ya urembo wa CSS!
Kwa alama hii iliyoongezwa, mimea itaonekana kwenye skrini, ingawa haitakuwa imerekebishwa vyema bado hiyo ni kazi ya CSS katika somo lijalo! Kwa sasa, una msingi thabiti wa HTML unaopanga maudhui yako kwa usahihi na kufuata mbinu bora za upatikanaji.
## Kutumia HTML ya Kimaana kwa Upatikanaji
HTML ya kimaana ina maana ya kuchagua vipengele vya HTML kwa msingi wa maana na kusudi lao, si kwa muonekano tu. Unapojumuisha lebo za maana, unawasilisha muundo na maana ya maudhui yako kwa vivinjari, injini za utafutaji, na teknolojia za msaada kama wasomaji wa skrini.
```mermaid
flowchart TD
A[Unahitaji kuongeza maudhui?] --> B{Ni aina gani?}
B -->|Kichwa kikuu| C["<h1>"]
B -->|Kichwa kidogo| D["<h2>, <h3>, etc."]
B -->|Aya| E["<p>"]
B -->|Orodha| F["<ul>, <ol>"]
B -->|Uongozaji| G["<nav>"]
B -->|Makala| H["<article>"]
B -->|Sehemu| I["<section>"]
B -->|Kifungashio cha jumla| J["<div>"]
C --> K[Wasikilizaji wa skrini hutoza kama kichwa kikuu]
D --> L[Hutengeneza mtiririko sahihi wa vichwa]
E --> M[Hutoa nafasi nzuri ya maandishi]
F --> N[Inuwezesha njia za haraka za kuvinjari orodha]
G --> O[Hutambua alama za uongozaji]
H --> P[Inaonyesha maudhui ya pekee]
I --> Q[Huweka maudhui yanayohusiana pamoja]
J --> R[Tumia tu wakati hakuna lebo ya semantiki inafaa]
style C fill:#4caf50
style D fill:#4caf50
style E fill:#4caf50
style F fill:#4caf50
style G fill:#2196f3
style H fill:#2196f3
style I fill:#2196f3
style J fill:#ff9800
```
Njia hii inafanya tovuti zako zipatikane kwa urahisi zaidi kwa watumiaji wenye ulemavu na husaidia injini za utafutaji kuelewa maudhui yako vyema zaidi. Ni kanuni ya msingi ya maendeleo ya wavuti ya kisasa inayounda uzoefu bora kwa kila mtu.
### Kuongeza Kichwa cha Ukurasa cha Semantic
### Ongeza Kichwa cha Ukurasa cha Kimaana
Hebu tuongeze kichwa sahihi kwa ukurasa wako wa terrarium. Weka mstari huu mara tu baada ya tagi yako ya kufungua `<body>`:
Tuweke kichwa kinachofaa kwa ukurasa wako wa terrarium. Tumia mstari huu mara tu baada ya lebo yako ya kufungua `<body>`:
```html
<h1>My Terrarium</h1>
```
**Kwa nini markup ya semantic ni muhimu:**
- **Inasaidia** skrini za kusoma kuvinjari na kuelewa muundo wa ukurasa
- **Inaboresha** uboreshaji wa injini za utafutaji (SEO) kwa kufafanua uongozi wa maudhui
- **Inaboresha** upatikanaji kwa watumiaji wenye ulemavu wa kuona au tofauti za utambuzi
- **Inaunda** uzoefu bora wa mtumiaji katika vifaa na majukwaa yote
- **Inafuata** viwango vya wavuti na mazoea bora kwa maendeleo ya kitaalamu
**Kwa nini lebo za maana ni muhimu:**
- **Husaidia** wasomaji wa skrini kuvinjari na kuelewa muundo wa ukurasa
- **Boresha** uboreshaji wa injini za utafutaji (SEO) kwa kuweka uwazi wa hatua za maudhui
- **Boresha** upatikanaji kwa watumiaji wenye ulemavu wa kuona au tofauti za akili
- **Unda** uzoefu mzuri wa mtumiaji kwenye vifaa na majukwaa yote
- **Fuata** viwango vya wavuti na mbinu bora za maendeleo ya kitaalamu
**Mifano ya chaguo za semantic vs. zisizo za semantic:**
**Mifano ya chaguo za maana dhidi ya zisizo za maana:**
| Kusudi | ✅ Chaguo la Semantic | ❌ Chaguo Lisilo la Semantic |
|--------|-----------------------|-----------------------------|
| Kichwa kikuu | `<h1>Title</h1>` | `<div class="big-text">Title</div>` |
| Uvinjari | `<nav><ul><li></li></ul></nav>` | `<div class="menu"><div></div></div>` |
| Kusudi | ✅ Chaguo la Kimaana | ❌ Chaguo Lisilo la Kimaana |
|---------|-------------------|---------------------------|
| Kichwa Kikuu | `<h1>Title</h1>` | `<div class="big-text">Title</div>` |
| Usafirishaji | `<nav><ul><li></li></ul></nav>` | `<div class="menu"><div></div></div>` |
| Kitufe | `<button>Click me</button>` | `<span onclick="...">Click me</span>` |
| Maudhui ya makala | `<article><p></p></article>` | `<div class="content"><div></div></div>` |
> 🎥 **Tazama Kwa Vitendo**: Tazama [jinsi skrini za kusoma zinavyoshirikiana na kurasa za wavuti](https://www.youtube.com/watch?v=OUDV1gqs9GA) kuelewa kwa nini markup ya semantic ni muhimu kwa upatikanaji. Angalia jinsi muundo sahihi wa HTML unavyosaidia watumiaji kuvinjari kwa ufanisi.
> 🎥 **Tazama Ikitendeka**: Tazama [jinsi wasomaji wa skrini wanavyoshirikiana na kurasa za wavuti](https://www.youtube.com/watch?v=OUDV1gqs9GA) kuelewa kwa nini lebo za maana ni muhimu kwa upatikanaji. Angalia jinsi muundo sahihi wa HTML unavyosaidia watumiaji kuvinjari kwa ufanisi.
## Kuunda Chombo cha Terrarium
## Kuunda Kifungasha cha Terrarium
Sasa hebu tuongeze muundo wa HTML kwa terrarium yenyewe chombo cha glasi ambapo mimea hatimaye itawekwa. Sehemu hii inaonyesha dhana muhimu: HTML hutoa muundo, lakini bila upambaji wa CSS, vipengele hivi havitaonekana bado.
Sasa tuongeze muundo wa HTML kwa terrarium yenyewe chombo cha kioo ambapo mimea hatimaye itawekwa. Sehemu hii inaonyesha dhana muhimu: HTML hutoa muundo, lakini bila urembo wa CSS, vipengele hivi havitaonekana bado.
Markup ya terrarium hutumia majina ya darasa yanayoelezea ambayo yatafanya upambaji wa CSS kuwa rahisi kuelewa na kudumisha katika somo linalofuata.
Alama za terrarium zinatumia majina ya darasa ya kueleza ambayo yatafanya urembo wa CSS kuwa wa busara na unaoweza kudumishwa katika somo lijalo.
### Kazi: Ongeza Muundo wa Terrarium
Weka markup hii juu ya tagi ya mwisho ya `</div>` (kabla ya tagi ya kufunga ya chombo cha ukurasa):
Tumia alama hii juu ya lebo ya mwisho ya `</div>` (kabla ya lebo ya kufunga ya chombo cha ukurasa):
```html
<div id="terrarium">
@ -283,83 +396,200 @@ Weka markup hii juu ya tagi ya mwisho ya `</div>` (kabla ya tagi ya kufunga ya c
```
**Kuelewa muundo huu wa terrarium:**
- **Inaunda** chombo kikuu cha terrarium na kitambulisho cha kipekee kwa upambaji
- **Inafafanua** vipengele tofauti kwa kila sehemu ya kuona (juu, kuta, udongo, chini)
- **Inajumuisha** vipengele vilivyowekwa ndani kwa athari za mwangaza wa glasi (vipengele vya glossy)
- **Inatumia** majina ya darasa yanayoelezea yanayoonyesha wazi kusudi la kila kipengele
- **Inatayarisha** muundo kwa upambaji wa CSS ambao utaunda mwonekano wa glasi ya terrarium
- **Unda** chombo kuu cha terrarium chenye kitambulisho cha kipekee kwa ajili ya urembo
- **Inabainisha** vipengele tofauti kwa kila sehemu ya kuona (juu, kuta, udongo, chini)
- **Inajumuisha** vipengele vilivyo ndani kwa athari za mwangaza wa glasi (vipengele vyenye kung'aa)
- **Inatumia** majina ya darasa yenye maelezo yanayoonyesha wazi madhumuni ya kila kipengele
- **Inatayarisha** muundo kwa ajili ya mtindo wa CSS utakaounda muonekano wa terrarium ya glasi
> 🤔 **Umeona Kitu?**: Hata kama umeongeza markup hii, huwezi kuona kitu kipya kwenye ukurasa! Hii inaonyesha kwa ukamilifu jinsi HTML inavyotoa muundo wakati CSS inatoa muonekano. Vipengele hivi vya `<div>` vipo lakini bado havina mtindo wa kuona hiyo itakuja katika somo lijalo!
```mermaid
flowchart TD
A[Hati ya HTML] --> B[Kichwa cha Hati]
A --> C[Mwili wa Hati]
B --> D[Kipengele cha Kichwa]
B --> E[Meta Charset]
B --> F[Meta Viewport]
C --> G[Kichwa Kikuu]
C --> H[Kontena la Ukurasa]
H --> I[Kontena la Kushoto lenye mimea 7]
H --> J[Kontena la Kulia lenye mimea 7]
H --> K[Muundo wa Terarimu]
style A fill:#e1f5fe
style B fill:#fff3e0
style C fill:#e8f5e8
style H fill:#f3e5f5
```
### 🔄 **Ukaguzi wa Mafunzo**
**Uwezo wa Muundo wa HTML**: Kabla ya kuendelea, hakikisha unaweza:
- ✅ Eleza tofauti kati ya muundo wa HTML na muonekano wa kuona
- ✅ Tambua vipengele vya semantic na visivyo semantic vya HTML
- ✅ Eleza jinsi markup sahihi inavyosaidia upatikanaji
- ✅ Tambua muundo kamili wa mti wa waraka
> 🤔 **Angalia Kitu?**: Ingawa umeongeza markup hii, huoni kitu kipya kwenye ukurasa! Hii inaonyesha kikamilifu jinsi HTML inavyotoa muundo wakati CSS inatoa mwonekano. Vipengele hivi vya `<div>` vipo lakini havina upambaji wa kuona bado hiyo inakuja katika somo linalofuata!
**Jaribu Kuelewa Kwako**: Jaribu kufungua faili yako ya HTML kwenye kivinjari bila JavaScript na CSS. Hii inaonyesha muundo wa semantic safi uliounda!
---
## Changamoto ya Wakala wa GitHub Copilot
## Changamoto ya GitHub Copilot Agent
Tumia hali ya Agent kukamilisha changamoto ifuatayo:
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
**Maelezo:** Unda muundo wa semantic wa HTML kwa sehemu ya mwongozo wa utunzaji wa mimea ambao unaweza kuongezwa kwenye mradi wa terrarium.
**Maelezo:** Unda muundo wa HTML wa semantic kwa sehemu ya mwongozo wa utunzaji wa mimea ambayo inaweza kuongezwa kwenye mradi wa terrarium.
**Maelezo:** Unda sehemu ya HTML ya kimantiki inayojumuisha kichwa kikuu "Mwongozo wa Utunzaji Mimea", sehemu ndogo tatu zenye vichwa "Kumwagilia", "Mahitaji ya Mwanga", na "Utunzaji wa Udongo", kila moja ikiwa na aya ya maelezo kuhusu utunzaji wa mimea. Tumia vitambulisho vya HTML vya kimantiki kama `<section>`, `<h2>`, `<h3>`, na `<p>` kuunda muundo ipasavyo.
**Amri:** Unda sehemu ya semantic ya HTML inayojumuisha kichwa kuu "Mwongozo wa Utunzaji wa Mimea", sehemu tatu ndogo zilizo na vichwa "Kumwagilia", "Mahitaji ya Mwangaza", na "Utunzaji wa Udongo", kila moja ikiwa na aya ya maelezo kuhusu utunzaji wa mimea. Tumia lebo sahihi za semantic za HTML kama `<section>`, `<h2>`, `<h3>`, na `<p>` kupanga yaliyomo ipasavyo.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## Changamoto ya Historia ya HTML
## Changamoto ya Kuchunguza Historia ya HTML
**Kujifunza Kuhusu Mageuzi ya Wavuti**
**Kujifunza Kuhusu Mabadiliko ya Wavuti**
HTML imebadilika sana tangu Tim Berners-Lee alipoanzisha kivinjari cha kwanza cha wavuti huko CERN mwaka 1990. Baadhi ya vitambulisho vya zamani kama `<marquee>` sasa vimeachwa kwa sababu havifanyi kazi vizuri na viwango vya kisasa vya upatikanaji na kanuni za muundo unaojibika.
HTML imeendelea sana tangu Tim Berners-Lee alipotengeneza kivinjari cha kwanza cha wavuti CERN mwaka 1990. Lebo za zamani kama `<marquee>` sasa zimefutwa kwa sababu hazifanyi kazi vizuri na viwango vya kisasa vya upatikanaji na kanuni za muundo unaojibu.
**Jaribu Jaribio Hili:**
1. Kwa muda, funika kichwa chako cha `<h1>` ndani ya kitambulisho cha `<marquee>`: `<marquee><h1>Terrarium Yangu</h1></marquee>`
1. Kwa muda usifunge kichwa chako cha `<h1>` ndani ya lebo ya `<marquee>`: `<marquee><h1>My Terrarium</h1></marquee>`
2. Fungua ukurasa wako kwenye kivinjari na angalia athari ya kusogea
3. Fikiria kwa nini kitambulisho hiki kiliachwa (dokezo: fikiria kuhusu uzoefu wa mtumiaji na upatikanaji)
4. Ondoa kitambulisho cha `<marquee>` na urudi kwenye alama ya kimantiki
**Maswali ya Kutafakari:**
- Je, kichwa kinachosogea kinaweza kuathirije watumiaji wenye ulemavu wa kuona au hisia za mwendo?
- Ni mbinu gani za kisasa za CSS zinaweza kufanikisha athari za kuona zinazofanana kwa njia inayopatikana zaidi?
- Kwa nini ni muhimu kutumia viwango vya wavuti vya sasa badala ya vipengele vilivyoachwa?
3. Fikiria kwa nini lebo hii ilifutwa (kibukizi: fikiria uzoefu wa mtumiaji na upatikanaji)
4. Ondoa lebo ya `<marquee>` na rudi kwenye markup ya semantic
Gundua zaidi kuhusu [vipengele vya HTML vilivyopitwa na wakati na vilivyoachwa](https://developer.mozilla.org/docs/Web/HTML/Element#Obsolete_and_deprecated_elements) ili kuelewa jinsi viwango vya wavuti vinavyobadilika kuboresha uzoefu wa mtumiaji.
**Maswali ya Tafakari:**
- Je, kichwa kinachosogea kinaweza kunaathiri vipi watumiaji wenye matatizo ya kuona au hisia za mwendo?
- Ni mbinu gani za kisasa za CSS zinaweza kuleta athari kama hizi kwa upatikanaji bora?
- Kwa nini ni muhimu kutumia viwango vya wavuti vya sasa badala ya vipengele vilivyofutwa?
Tafuta zaidi kuhusu [vipengele vya HTML vilivyotumika na vilivyofutwa](https://developer.mozilla.org/docs/Web/HTML/Element#Obsolete_and_deprecated_elements) kuelewa jinsi viwango vya wavuti vinavyoendelea kuboresha uzoefu wa mtumiaji.
## Jaribio Baada ya Somo
## Mtihani wa Baada ya Somo
[Jaribio baada ya somo](https://ff-quizzes.netlify.app/web/quiz/16)
[Mtihani wa baada ya somo](https://ff-quizzes.netlify.app/web/quiz/16)
## Mapitio na Kujisomea
## Ukaguzi & Kujifunza Binafsi
**Kuimarisha Maarifa Yako ya HTML**
**Zidi Ujuzi Wako wa HTML**
HTML imekuwa msingi wa wavuti kwa zaidi ya miaka 30, ikibadilika kutoka lugha rahisi ya alama za hati hadi jukwaa la kisasa la kujenga programu za maingiliano. Kuelewa mageuzi haya husaidia kuthamini viwango vya kisasa vya wavuti na kufanya maamuzi bora ya maendeleo.
HTML imekuwa msingi wa wavuti kwa zaidi ya miaka 30, ikibadilika kutoka lugha rahisi ya uandikaji waraka hadi jukwaa lenye ustadi wa kujenga programu za mwingiliano. Kuelewa mabadiliko haya kunakusaidia kuthamini viwango vya wavuti vya kisasa na kufanya maamuzi bora ya maendeleo.
**Njia Zinazopendekezwa za Kujifunza:**
1. **Historia na Mageuzi ya HTML**
- Tafiti ratiba ya HTML kutoka toleo la 1.0 hadi HTML5
- Chunguza kwa nini baadhi ya vitambulisho viliachwa (upatikanaji, urafiki wa simu, utunzaji)
- Chunguza vipengele vya HTML vinavyoibuka na mapendekezo
1. **Historia na Maendeleo ya HTML**
- Fanya utafiti wa ratiba kutoka HTML 1.0 hadi HTML5
- Chunguza kwa nini lebo fulani zimefutwa (upatikanaji, urafiki wa simu, uratibu)
- Tafuta vipengele vipya vya HTML na mapendekezo
2. **Uchunguzi wa Kina wa HTML ya Kimantiki**
- Soma orodha kamili ya [vipengele vya kimantiki vya HTML5](https://developer.mozilla.org/docs/Web/HTML/Element)
- Fanya mazoezi ya kutambua wakati wa kutumia `<article>`, `<section>`, `<aside>`, na `<main>`
2. **Uchunguzi wa Semantic HTML**
- Soma orodha kamili ya [vipengele vya semantic vya HTML5](https://developer.mozilla.org/docs/Web/HTML/Element)
- Jifunze kutambua lini kutumia `<article>`, `<section>`, `<aside>`, na `<main>`
- Jifunze kuhusu sifa za ARIA kwa upatikanaji ulioimarishwa
3. **Maendeleo ya Kisasa ya Wavuti**
- Chunguza [kuunda tovuti zinazojibika](https://docs.microsoft.com/learn/modules/build-simple-website/?WT.mc_id=academic-77807-sagibbon) kwenye Microsoft Learn
- Elewa jinsi HTML inavyounganishwa na CSS na JavaScript
- Jifunze kuhusu utendaji wa wavuti na mbinu bora za SEO
3. **Maendeleo ya Wavuti ya Kisasa**
- Tafuta [kujenga tovuti zinazo reagiza](https://docs.microsoft.com/learn/modules/build-simple-website/?WT.mc_id=academic-77807-sagibbon) kwenye Microsoft Learn
- Elewa jinsi HTML inavyounganika na CSS na JavaScript
- Jifunze kuhusu ufanisi wa wavuti na mbinu bora za SEO
**Maswali ya Tafakari:**
- Ndege gani za HTML zilizofutwa ulizogundua, na kwa nini ziliondolewa?
- Ni vipengele vipya vya HTML vilivyo pendekezwa kwa matoleo yajayo ni vipi?
- HTML ya semantic huchangia vipi upatikanaji wa wavuti na SEO?
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua DevTools (F12) na angalia muundo wa HTML wa tovuti unayopenda
- [ ] Tengeneza faili rahisi ya HTML kwa lebo za msingi: `<h1>`, `<p>`, na `<img>`
- [ ] Thibitisha HTML yako kwa kutumia W3C HTML Validator mtandaoni
- [ ] Jaribu kuongeza maoni kwenye HTML yako kwa kutumia `<!-- maoni -->`
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Kamilisha mtihani wa baada ya somo na pima dhana za semantic HTML
- [ ] Unda tovuti rahisi kuhusu wewe mwenyewe kwa muundo sahihi wa HTML
- [ ] Jaribu ngazi tofauti za vichwa na lebo za uandikaji wa maandishi
- [ ] Ongeza picha na viungo kwa mazoezi ya kuingiza multimedia
- [ ] Fanya utafiti wa vipengele vya HTML5 ambavyo hujajaribu bado
### 📅 **Safari Yako ya HTML Kwa Wiki Nzima**
- [ ] Kamilisha kazi ya mradi wa terrarium kwa markup ya semantic
- [ ] Unda tovuti inayoweza kupatikana kwa kutumia maelezo na majukumu ya ARIA
- [ ] Fanya mazoezi ya uundaji wa fomu kwa aina mbalimbali za pembejeo
- [ ] Chunguza APIs za HTML5 kama localStorage au geolocation
- [ ] Soma mifumo ya HTML ya kujibu na muundo wa kwanza kwa simu
- [ ] Pitia msimbo wa HTML wa watengenezaji wengine kwa mbinu bora
### 🌟 **Msingi Wako wa Wavuti Kwa Mwezi Mzima**
- [ ] Tengeneza tovuti ya wasifu inaonyesha umahiri wako wa HTML
- [ ] Jifunze templating ya HTML kwa mfumo kama Handlebars
- [ ] Changia miradi ya chanzo wazi kwa kuboresha nyaraka za HTML
- [ ] Jifunze dhana za juu za HTML kama vipengele maalum
- [ ] Unganisha HTML na mifumo ya CSS na maktaba za JavaScript
- [ ] Fundisha wengine wanaojifunza misingi ya HTML
## 🎯 Ratiba Yako ya Umahiri wa HTML
```mermaid
timeline
title Mchakato wa Kujifunza HTML
section Msingi (Dakika 5)
Muundo wa Nyaraka: Tamko la DOCTYPE
: Kielelezo cha mzizi cha HTML
: Uelewa wa Kichwa dhidi ya Mwili
section Metadata (Dakika 10)
Labe Muhimu za Meta: Usimbaji wa herufi
: Usanidi wa eneo la kuangalia
: Ulinganifu wa kivinjari
section Uundaji wa Maudhui (Dakika 15)
Uingiza Picha: Njia sahihi za faili
: Umuhimu wa maandishi mbadala
: Lebo zinazofunga kiotomatiki
section Mpangilio wa Mpangilio (Dakika 20)
Mkakati wa Kontena: Vipengele vya Div kwa muundo
: Uutambulisho wa darasa na ID
: Mlinganyo wa kipengele kilicho ndani
section Utaalamu wa Semantiki (Dakika 30)
Alama Zenye Maana: Mlinganyo wa vichwa
: Utungaji wa msikilizaji wa skrini
: Mbinu bora za upatikanaji
section Dhana Zaidi (Saa 1)
Sifa za HTML5: Vipengele vya kisasa vya semantiki
: Sifa za ARIA
: Mambo ya kuzingatia utendaji
section Ujuzi wa Kitaalamu (Wiki 1)
Mpangilio wa Kanuni: Mifumo ya muundo wa faili
: Alama zinazoweza kudumishwa
: Ushirikiano wa timu
section Kiwango cha Mtaalam (Mwezi 1)
Viwango vya Mtandao vya Kisasa: Uboreshaji wa hatua kwa hatua
: Ulinganifu wa kivinjari mbalimbali
: Sasisho za maalum za HTML
```
### 🛠️ Muhtasari wa Zana Zako za HTML
Baada ya kumaliza somo hili, sasa una:
- **Muundo wa Waraka**: Msingi kamili wa HTML5 na DOCTYPE sahihi
- **Markup ya Semantic**: Lebo zenye maana zinazoongeza upatikanaji na SEO
- **Uingiliaji wa Picha**: Mpangilio sahihi wa faili na mazoea ya maandishi mbadala
- **Mabenki ya Mpangilio**: Matumizi ya kimkakati ya divs na majina ya darasa yenye maelezo
- **Uelewa wa Upatikanaji**: Kuelewa urambazaji wa wasikilizaji wa skrini
- **Viwango vya Kisasa**: Mazoea ya sasa ya HTML5 na ujuzi wa lebo zilizofutwa
- **Msingi wa Mradi**: Msingi imara wa mtindo wa CSS na mwingiliano wa JavaScript
**Maswali ya Kutafakari:**
- Ni vitambulisho vipi vya HTML vilivyoachwa ulivyogundua, na kwa nini viliondolewa?
- Ni vipengele vipya vya HTML vinavyopendekezwa kwa matoleo yajayo?
- HTML ya kimantiki inachangiaje katika upatikanaji wa wavuti na SEO?
**Hatua Inayofuata**: Muundo wako wa HTML uko tayari kwa mtindo wa CSS! Msingi wa semantic uliouunda utafanya somo lijalo kuwa rahisi kuelewa.
## Kazi
## Kazi ya Nyumbani
[Fanya mazoezi ya HTML yako: Unda muundo wa blogu](assignment.md)
[Zoezi la HTML: Jenga mfano wa blogi](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kiasi cha Majumla**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kwamba tafsiri za otomatiki zinaweza kuwa na makosa au kasoro. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya kibinadamu inashauriwa. Hatuwajibiki kwa kutoelewana au tafsiri potovu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,87 +1,141 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "92c4431eac70670b0450b02c1d11279a",
"translation_date": "2025-10-24T19:28:30+00:00",
"original_hash": "e39f3a4e3bcccf94639e3af1248f8a4d",
"translation_date": "2026-01-07T02:04:10+00:00",
"source_file": "3-terrarium/2-intro-to-css/README.md",
"language_code": "sw"
}
-->
# Mradi wa Terrarium Sehemu ya 2: Utangulizi wa CSS
![Utangulizi wa CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a200d79e7257e5e450408d8ea97f5b531d31b2e3976317338ee.sw.png)
```mermaid
journey
title Safari Yako ya Mtindo wa CSS
section Msingi
Linki faili la CSS: 3: Student
Elewa cascade: 4: Student
Jifunze urithi: 4: Student
section Wachagua
Lengo la elementi: 4: Student
Mifumo ya darasa: 5: Student
Uwezo wa ID: 5: Student
section Muundo
Weka elementi: 4: Student
Unda vyombo: 5: Student
Jenga terrarium: 5: Student
section Piga mswaki
Ongeza athari za kuona: 5: Student
Muundo unaojibu: 5: Student
Mwangaza wa glasi: 5: Student
```
![Utangulizi wa CSS](../../../../translated_images/webdev101-css.3f7af5991bf53a20.sw.png)
> Sketchnote na [Tomomi Imura](https://twitter.com/girlie_mac)
Unakumbuka jinsi HTML ya terrarium yako ilivyokuwa rahisi sana? CSS ndiyo tunayotumia kubadilisha muundo huo wa kawaida kuwa kitu kinachovutia machoni.
Ikiwa HTML ni kama kujenga fremu ya nyumba, basi CSS ni kila kitu kinachofanya nyumba hiyo ihisi kama nyumbani - rangi za ukuta, mpangilio wa samani, taa, na jinsi vyumba vinavyoungana. Fikiria jinsi Jumba la Versailles lilianza kama nyumba ya uwindaji rahisi, lakini kwa umakini wa mapambo na mpangilio, likabadilika kuwa moja ya majengo mazuri zaidi duniani.
Leo, tutabadilisha terrarium yako kutoka kuwa ya kazi tu hadi kuwa ya kuvutia. Utajifunza jinsi ya kuweka vipengele kwa usahihi, kuunda mpangilio unaojibu ukubwa tofauti wa skrini, na kuunda mvuto wa kuona unaofanya tovuti kuvutia.
Mwisho wa somo hili, utaona jinsi mtindo wa kimkakati wa CSS unavyoweza kuboresha mradi wako kwa kiasi kikubwa. Hebu tuongeze mtindo kwenye terrarium yako.
## Maswali ya Awali ya Somo
Kumbuka jinsi terrarium yako ya HTML ilivyoonekana ya kawaida? CSS ndio tunapobadilisha muundo huo rahisi kuwa kitu kinachovutia kwa macho.
Kama HTML ni kama kujenga fremu ya nyumba, basi CSS ni kila kitu kinachofanya iwe nyumbani - rangi za rangi, upangaji wa samani, mwanga, na jinsi vyumba vinavyolimbikizana. Fikiria jinsi Ikulu ya Versailles ilivyoanza kama chumba cha uwindaji rahisi, lakini makini katika mapambo na upangaji kulitawanya kuwa moja ya majengo mazuri zaidi duniani.
Leo, tutabadilisha terrarium yako kutoka kuwa ya kawaida hadi kuwa nzuri. Utajifunza jinsi ya kuweka vipengele kwa usahihi, kufanya mipangilio itafakari ukubwa tofauti wa skrini, na kuunda mvuto wa kuona unaofanya tovuti kuwa za kuvutia.
Mwisho wa somo hili, utaona jinsi mtindo wa CSS uliofikirika unaweza kuboresha mradi wako kwa kiasi kikubwa. Hebu tunaongeze mtindo kwenye terrarium yako.
```mermaid
mindmap
root((Misingi ya CSS))
Cascade
Sheria za Utaftaji Maalum
Urithi
Kipaumbele cha Kufuata
Utatuzi wa Migongano
Selectors
Matag za Vipengele
Madarasa (.class)
Vitambulisho (#id)
Mchanganyiko
Box Model
Margini
Mipaka
Ufungaji
Yaliyomo
Layout
Uwekaji
Aina za Kuonyesha
Flexbox
Gridi
Visual Effects
Rangi
Vivuli
Mabadiliko
Michoro
Responsive Design
Maswali ya Vyombo vya Habari
Vitengo Rahisi
Meta ya Angalia
Simu Kwanza
```
## Mtihani Kabla ya Mafunzo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/17)
[Mtihani kabla ya mafunzo](https://ff-quizzes.netlify.app/web/quiz/17)
## Kuanza na CSS
## Kuanzisha na CSS
CSS mara nyingi hufikiriwa kama "kufanya vitu viwe vizuri," lakini ina madhumuni mapana zaidi. CSS ni kama kuwa mkurugenzi wa filamu - unadhibiti si tu jinsi kila kitu kinavyoonekana, bali pia jinsi kinavyosogea, kinavyoitikia mwingiliano, na kinavyobadilika kulingana na hali tofauti.
CSS mara nyingi huhesabiwa kama "kufanya mambo yawe mazuri," lakini ina matumizi makubwa zaidi. CSS ni kama kuwa mkurugenzi wa filamu - una controlar si tu jinsi kila kitu kinavyoonekana, bali jinsi kinavyosogea, kinavyojibu mwingiliano, na kinavyobadilika kulingana na hali.
CSS ya kisasa ina uwezo mkubwa sana. Unaweza kuandika msimbo unaobadilisha mpangilio kiotomatiki kwa simu, vidonge, na kompyuta za mezani. Unaweza kuunda michoro laini inayowaongoza watumiaji kwenye sehemu zinazohitajika. Matokeo yanaweza kuwa ya kuvutia sana wakati kila kitu kinapofanya kazi pamoja.
CSS ya kisasa ina uwezo mkubwa sana. Unaweza kuandika msimbo unaoendana na mipangilio ya simu, vidonge, na kompyuta za mezani. Unaweza kuunda michoro laini inayowiongoza watumiaji mahali panapohitajika. Matokeo yanaweza kuwa ya kushangaza wakati kila kitu kinapofanya kazi pamoja.
> 💡 **Ushauri wa Kitaalamu**: CSS inaendelea kubadilika na vipengele vipya na uwezo. Daima angalia [CanIUse.com](https://caniuse.com) ili kuthibitisha usaidizi wa kivinjari kwa vipengele vipya vya CSS kabla ya kuvitumia katika miradi ya uzalishaji.
> 💡 **Ushauri wa Mtaalamu**: CSS inaendelea kubadilika mara kwa mara na vipengele vipya na uwezo mpya. Daima angalia [CanIUse.com](https://caniuse.com) kuthibitisha msaada wa kivinjari kwa vipengele vipya vya CSS kabla ya kuvitumia kwenye miradi ya uzalishaji.
**Haya ndiyo tutakayofanikiwa katika somo hili:**
- **Kuunda** muundo kamili wa kuona kwa terrarium yako kwa kutumia mbinu za kisasa za CSS
- **Kuchunguza** dhana za msingi kama cascade, urithi, na vichagua vya CSS
- **Kutumia** mikakati ya mpangilio na nafasi inayojibu
- **Kujenga** kontena la terrarium kwa kutumia maumbo na mitindo ya CSS
**Hivi ndivyo tutakavyofanikisha somo hili:**
- **Kuunda** muundo kamilifu wa kuona kwa terrarium yako kwa kutumia mbinu za kisasa za CSS
- **Kuchambua** dhana za msingi kama mtiririko, urithi, na wachaguzi wa CSS
- **Kutekeleza** mikakati ya upangaji unaojibu na mipangilio
- **Kujenga** chombo cha terrarium kwa kutumia maumbo na mitindo ya CSS
### Sharti
### Mahitaji ya Awali
Unapaswa kuwa umekamilisha muundo wa HTML wa terrarium yako kutoka somo la awali na uwe tayari kuipamba.
Unapaswa kuwa umekamilisha muundo wa HTML wa terrarium yako kutoka somo lililopita na kuwa tayari kuupamba.
> 📺 **Rasilimali ya Video**: Tazama video hii ya maelezo
> 📺 **Rasilimali ya Video**: Tazama video hii ya mwongozo wa msaada
>
> [![Mafunzo ya Msingi ya CSS](https://img.youtube.com/vi/6yIdOIV9p1I/0.jpg)](https://www.youtube.com/watch?v=6yIdOIV9p1I)
> [![CSS Basics Tutorial](https://img.youtube.com/vi/6yIdOIV9p1I/0.jpg)](https://www.youtube.com/watch?v=6yIdOIV9p1I)
### Kuandaa Faili Yako ya CSS
### Kuweka Faili Yako la CSS
Kabla ya kuanza kupamba, tunahitaji kuunganisha CSS na HTML yetu. Muunganisho huu unaiambia kivinjari wapi pa kupata maelekezo ya mitindo kwa terrarium yetu.
Kabla hatujaweza kuanza kupamba, tunahitaji kuunganisha CSS na HTML yetu. Muunganisho huu unaambia kivinjari wapi kupata maagizo ya mitindo kwa terrarium yetu.
Katika folda ya terrarium yako, unda faili mpya inayoitwa `style.css`, kisha uiunganishe kwenye sehemu ya `<head>` ya hati yako ya HTML:
Katika folda ya terrarium yako, tengeneza faili mpya iitwayo `style.css`, kisha iunganishe katika sehemu ya `<head>` ya hati yako ya HTML:
```html
<link rel="stylesheet" href="./style.css" />
```
**Hii ndiyo kazi ya msimbo huu:**
- **Kuunda** muunganisho kati ya faili zako za HTML na CSS
**Hivi ndivyo msimbo huu unavyofanya kazi:**
- **Kuunda** muunganisho kati ya faili za HTML na CSS zako
- **Kuambia** kivinjari kupakia na kutumia mitindo kutoka `style.css`
- **Kutumia** sifa ya `rel="stylesheet"` kuonyesha kuwa hii ni faili ya CSS
- **Kutumia** sifa `rel="stylesheet"` kubainisha hii ni faili la CSS
- **Kurejelea** njia ya faili kwa `href="./style.css"`
## Kuelewa Cascade ya CSS
## Kuelewa Mtiririko wa CSS
Umewahi kujiuliza kwa nini CSS inaitwa "Cascading" Style Sheets? Mitindo inashuka kama maporomoko ya maji, na wakati mwingine inagongana.
Je, umewahi kujiuliza kwa nini CSS inaitwa "Cascading" Style Sheets? Mitindo hutiririka chini kama maji ya mto, na wakati mwingine hugongana.
Fikiria jinsi miundo ya amri ya kijeshi inavyofanya kazi - amri ya jumla inaweza kusema "wanajeshi wote wavae kijani," lakini amri maalum kwa kikosi chako inaweza kusema "vani mavazi ya sherehe ya bluu kwa hafla." Maelekezo maalum zaidi yanapewa kipaumbele. CSS inafuata mantiki sawa, na kuelewa hierarkia hii hufanya utatuzi kuwa rahisi zaidi.
Fikiria jinsi jeshi linavyofanya agizo la kijeshi - agizo la mkuu linaweza kusema "wanajeshi wote vaa kijani," lakini agizo mahususi kwa kikosi chako linaweza kusema "vaa sare za bluu kwa sherehe." Maelekezo mahususi yanashinda. CSS hufuata mantiki kama hiyo, na kuelewa ngazi hii hufanya utatuzi wa matatizo kuwa rahisi.
### Kujaribu Kipaumbele cha Cascade
### Kujaribu Kipaumbele cha Mtiririko
Hebu tuone cascade ikifanya kazi kwa kuunda mgongano wa mitindo. Kwanza, ongeza mtindo wa ndani kwenye tagi yako ya `<h1>`:
Tuchunguze mtiririko kwa kuunda mgongano wa mtindo. Kwanza, ongeza mtindo wa moja kwa moja kwenye lebo `<h1>` yako:
```html
<h1 style="color: red">My Terrarium</h1>
```
**Kazi ya msimbo huu:**
- **Kutumia** rangi nyekundu moja kwa moja kwenye kipengele cha `<h1>` kwa kutumia mtindo wa ndani
- **Kutumia** sifa ya `style` kuingiza CSS moja kwa moja kwenye HTML
- **Kuunda** sheria ya mtindo yenye kipaumbele cha juu zaidi kwa kipengele hiki maalum
**Hivi msimbo huu unavyofanya:**
- **Unaweka** rangi nyekundu moja kwa moja kwa kipengele `<h1>` kwa mtindo wa ndani
- **Kutumia** sifa ya `style` kuweka CSS ndani kabisa ya HTML
- **Kuunda** sheria ya mtindo yenye kipaumbele cha juu kabisa kwa kipengele hiki maalum
Kisha, ongeza sheria hii kwenye faili yako ya `style.css`:
Kisha, ongeza sheria hii kwenye faili lako la `style.css`:
```css
h1 {
@ -89,29 +143,50 @@ h1 {
}
```
**Katika hapo juu, tumefanya:**
**Katika hapo juu, tumekuwa:**
- **Kufafanua** sheria ya CSS inayolenga vipengele vyote vya `<h1>`
- **Kuweka** rangi ya maandishi kuwa bluu kwa kutumia stylesheet ya nje
- **Kuweka** rangi ya maandishi kuwa samawati kwa kutumia karatasi ya mitindo ya nje
- **Kuunda** sheria ya kipaumbele cha chini ikilinganishwa na mitindo ya ndani
**Uhakiki wa Maarifa**: Ni rangi gani inaonekana kwenye programu yako ya wavuti? Kwa nini rangi hiyo inashinda? Je, unaweza kufikiria hali ambapo unaweza kutaka kuondoa mitindo?
> 💡 **Mpangilio wa Kipaumbele cha CSS (cha juu hadi cha chini):**
**Tambua Maarifa**: Ni rangi gani inaonekana kwenye programu yako ya wavuti? Kwa nini rangi hiyo inashinda? Unaweza kufikiria hali gani ambapo ungependa kubadili mitindo?
```mermaid
flowchart TD
A["Kivinjari kinakutana na kipengele h1"] --> B{"Angalia mitindo ya mstari moja kwa moja"}
B -->|Imepatikana| C["style='rangi: nyekundu'"]
B -->|Hakuna| D{"Angalia sheria za ID"}
C --> E["Weka rangi nyekundu (pointi 1000)"]
D -->|Imepatikana| F["#heading { rangi: kijani }"]
D -->|Hakuna| G{"Angalia sheria za darasa"}
F --> H["Weka rangi ya kijani (pointi 100)"]
G -->|Imepatikana| I[".title { rangi: buluu }"]
G -->|Hakuna| J{"Angalia sheria za kipengele"}
I --> K["Weka rangi ya buluu (pointi 10)"]
J -->|Imepatikana| L["h1 { rangi: zambarau }"]
J -->|Hakuna| M["Tumia chaguo-msingi cha kivinjari"]
L --> N["Weka rangi ya zambarau (pointi 1)"]
style C fill:#ff6b6b
style F fill:#51cf66
style I fill:#339af0
style L fill:#9775fa
```
> 💡 **Orodha ya Kipaumbele cha CSS (kutoka juu hadi chini):**
> 1. **Mitindo ya ndani** (sifa ya style)
> 2. **IDs** (#myId)
> 3. **Classes** (.myClass) na sifa
> 4. **Vichagua vya vipengele** (h1, div, p)
> 5. **Chaguo-msingi za kivinjari**
> 2. **Vitambulisho** (#myId)
> 3. **Madarasa** (.myClass) na sifa
> 4. **Wachaguzi wa vipengele** (h1, div, p)
> 5. **Mazingira ya kivinjari**
## Urithi wa CSS kwa Vitendo
## Urithi wa CSS Katika Vitendo
Urithi wa CSS hufanya kazi kama maumbile - vipengele hurithi mali fulani kutoka kwa vipengele vya mzazi wao. Ikiwa utaweka familia ya fonti kwenye kipengele cha mwili, maandishi yote ndani yake hutumia fonti hiyo hiyo kiotomatiki. Ni sawa na jinsi sura ya kipekee ya familia ya Habsburg ilivyoonekana kwa vizazi bila kuainishwa kwa kila mtu binafsi.
Urithi wa CSS hufanya kazi kama vinasaba - vipengele virithi mali fulani kutoka kwa vipengee vyao vya mzazi. Ikiwa utaweka familia ya font kwenye kipengele cha mwili, maandishi yote ndani yake hutumia font hiyo moja kwa moja. Hii ni kama jinsi mwili wa kipekee wa familia ya Habsburg ulivyobaki kwa vizazi bila kuainishwa kwa kila mtu kando kando.
Hata hivyo, si kila kitu kinachorithiwa. Mitindo ya maandishi kama fonti na rangi inarithiwa, lakini mali za mpangilio kama margins na borders hazirithiwi. Kama vile watoto wanaweza kurithi sifa za mwili lakini si chaguo za mitindo za wazazi wao.
Hata hivyo, si kila kitu hurithiwa. Mitindo ya maandishi kama fonti na rangi hurithiwa, lakini mali za mipangilio kama mipaka na mipaka siyo. Kama watoto wanaweza kurithi sifa za mwili lakini si mitindo ya mavazi ya wazazi wao.
### Kuona Urithi wa Fonti
### Kuangalia Urithi wa Fonti
Hebu tuone urithi ukifanya kazi kwa kuweka familia ya fonti kwenye kipengele cha `<body>`:
Tuchunguze urithi kwa kuweka familia ya font kwenye kipengele cha `<body>`:
```css
body {
@ -119,31 +194,46 @@ body {
}
```
**Kufafanua kinachotokea hapa:**
**Kuvunja kile kinachotokea hapa:**
- **Kuweka** familia ya fonti kwa ukurasa mzima kwa kulenga kipengele cha `<body>`
- **Kutumia** stack ya fonti na chaguo za akiba kwa usaidizi bora wa kivinjari
- **Kutumia** fonti za kisasa za mfumo zinazovutia kwenye mifumo tofauti ya uendeshaji
- **Kuhakikisha** vipengele vyote vya watoto vinarithia fonti hii isipokuwa vimezuiliwa maalum
- **Kutumia** orodha ya fonti na chaguo la kurudisha nyuma kwa msaada bora wa vivinjari
- **Kuongeza** fonti za mfumo wa kisasa zinazoonekana vizuri kwenye mifumo tofauti ya uendeshaji
- **Kuhakikisha** vipengele vyote vya watoto virithia fonti hii isipokuwa vikaangaliwe pia
Fungua zana za msanidi wa kivinjari chako (F12), nenda kwenye kichupo cha Vipengele, na kagua kipengele chako cha `<h1>`. Utaona kuwa kinarithia familia ya fonti kutoka kwa mwili:
Fungua zana za maendeleo za kivinjari chako (F12), nenda kwenye tab ya Elements, na kagua kipengele chako cha `<h1>`. Utaona kinarithi familia ya fonti kutoka kwa mwili:
![fonti iliyorithiwa](../../../../translated_images/1.cc07a5cbe114ad1d4728c35134584ac1b87db688eff83cf75985cf31fe0ed95c.sw.png)
![inherited font](../../../../translated_images/1.cc07a5cbe114ad1d.sw.png)
**Jaribio la Kujaribu**: Jaribu kuweka mali nyingine zinazorithiwa kwenye `<body>` kama `color`, `line-height`, au `text-align`. Ni nini kinachotokea kwa kichwa chako na vipengele vingine?
**Jaribu**: Jaribu kuweka mali nyingine zinazorithiwa kwenye `<body>` kama `color`, `line-height`, au `text-align`. Nini kinakutokea kwa kichwa chako na vipengele vingine?
> 📝 **Mali Zinazorithiwa ni Pamoja na**: `color`, `font-family`, `font-size`, `line-height`, `text-align`, `visibility`
> 📝 **Mali Zinazorithiwa Zinajumuisha**: `color`, `font-family`, `font-size`, `line-height`, `text-align`, `visibility`
>
> **Mali Zisizorithiwa ni Pamoja na**: `margin`, `padding`, `border`, `width`, `height`, `position`
> **Mali Zisizorithiwa Zinajumuisha**: `margin`, `padding`, `border`, `width`, `height`, `position`
### 🔄 **Ukaguzi wa Mafunzo**
**Uelewa wa Msingi wa CSS**: Kabla ya kuingia kwa wachaguzi, hakikisha unajua:
- ✅ Eleza tofauti kati ya mtiririko na urithi
- ✅ Tabiri ni mtindo gani utashinda kwenye mgongano wa uelekeo mahususi
- ✅ Tambua mali gani hurithiwa kutoka kwa vipengele vya mzazi
- ✅ Unganisha faili za CSS kwa HTML ipasavyo
## Kumiliki Vichagua vya CSS
**Jaribio la Haraka**: Ikiwa una mitindo hii, rangi gani itakuwa kwenye `<h1>` ndani ya `<div class="special">`?
```css
div { color: blue; }
.special { color: green; }
h1 { color: red; }
```
*Jibu: Nyekundu (mchaguo wa kipengele unamulika h1 moja kwa moja)*
Vichagua vya CSS ni njia yako ya kulenga vipengele maalum kwa mitindo. Vinavyofanya kazi kama kutoa maelekezo sahihi - badala ya kusema "nyumba," unaweza kusema "nyumba ya bluu yenye mlango mwekundu kwenye Mtaa wa Maple."
## Kujua Kusoma Wachaguzi wa CSS
CSS hutoa njia tofauti za kuwa maalum, na kuchagua kichagua sahihi ni kama kuchagua zana inayofaa kwa kazi. Wakati mwingine unahitaji kupamba kila mlango katika mtaa, na wakati mwingine mlango mmoja tu maalum.
Wachaguzi wa CSS ni njia yako ya kulenga vipengele maalum kwa ajili ya mitindo. Hufanya kazi kama kutoa maelekezo sahihi - badala ya kusema "nyumba," unaweza kusema "nyumba ya buluu yenye mlango mwekundu kwenye Mtaa wa Maple."
### Vichagua vya Vipengele (Tagi)
CSS hutoa njia tofauti za kuwa mahususi, na kuchagua mchaguo sahihi ni kama kuchagua chombo kinachofaa kwa kazi. Wakati mwingine unahitaji kupamba kila mlango katika jirani, na wakati mwingine mlango mmoja tu.
Vichagua vya vipengele vinatarget vipengele vya HTML kwa jina la tagi yao. Vinavyofaa kwa kuweka mitindo ya msingi inayotumika kwa upana kwenye ukurasa wako:
### Wachaguzi wa Vipengele (Tags)
Wachaguzi wa vipengele hulenga vipengele vya HTML kwa jina la lebo yao. Ni bora kwa kuweka mitindo ya msingi inayotumika kote ukurasa wako:
```css
body {
@ -161,18 +251,18 @@ h1 {
```
**Kuelewa mitindo hii:**
- **Kuweka** typografia thabiti kwenye ukurasa mzima kwa kichagua cha `body`
- **Kuondoa** margins na padding za chaguo-msingi za kivinjari kwa udhibiti bora
- **Kupamba** vipengele vyote vya kichwa kwa rangi, mpangilio, na nafasi
- **Kutumia** vitengo vya `rem` kwa ukubwa wa fonti unaoweza kubadilika na kupatikana
- **Weka** tahajia thabiti kwenye ukurasa mzima kwa kutumia chaguzi ya `body`
- **Ondoa** mipaka na padding za kivinjari kwa udhibiti bora
- **Pamba** vipengele vyote vya kichwa kwa rangi, muafaka, na nafasi
- **Tumia** vitengo vya `rem` kwa ukubwa unaoweza kubadilika na unaopatikana kirahisi
Wakati vichagua vya vipengele vinafanya kazi vizuri kwa mitindo ya jumla, utahitaji vichagua maalum zaidi kupamba vipengele vya kibinafsi kama mimea katika terrarium yako.
Wachaguzi wa vipengele hufanya kazi vizuri kwa mitindo ya jumla, lakini utahitaji wachaguzi mahususi zaidi kupamba vipengele kama mimea katika terrarium yako.
### Vichagua vya ID kwa Vipengele Maalum
### Wachaguzi wa ID kwa Vipengele Maalum
Vichagua vya ID vinatumia alama ya `#` na vinatarget vipengele vyenye sifa maalum ya `id`. Kwa kuwa IDs lazima ziwe za kipekee kwenye ukurasa, vinavyofaa kwa kupamba vipengele vya kibinafsi, maalum kama kontena za mimea za kushoto na kulia.
Wachaguzi wa ID hutumia alama ya `#` na hulenga vipengele vyenye sifa maalum za `id`. Kwa sababu IDs lazima ziwe za kipekee kwenye ukurasa, ni nzuri kwa kupamba vipengele binafsi kama vyombo vya mimea vya kushoto na kulia.
Hebu tuunde mitindo kwa kontena za upande za terrarium yetu ambapo mimea itaishi:
Tufanye mitindo ya chombo cha terrarium upande ambako mimea itaishi:
```css
#left-container {
@ -198,16 +288,16 @@ Hebu tuunde mitindo kwa kontena za upande za terrarium yetu ambapo mimea itaishi
}
```
**Hii ndiyo kazi ya msimbo huu:**
- **Kuweka** kontena kwenye kingo za kushoto na kulia kwa kutumia nafasi ya `absolute`
- **Kutumia** vitengo vya `vh` (urefu wa viewport) kwa urefu unaojibu ukubwa wa skrini
- **Kutumia** `box-sizing: border-box` ili padding ijumuishwe katika upana wa jumla
- **Kuondoa** vitengo vya `px` visivyo vya lazima kutoka kwa thamani za sifuri kwa msimbo safi zaidi
- **Kuweka** rangi ya mandharinyuma laini inayovutia zaidi machoni kuliko kijivu mkali
**Hili msimbo hufanikisha:**
- **Weka** vyombo pembezoni kushoto na kulia kwa kutumia upangaji wa `absolute`
- **Tumia** vitengo vya `vh` (urefu wa dirisha) kwa urefu unaojibadilisha kulingana na ukubwa wa skrini
- **Tumia** `box-sizing: border-box` ili padding ijumuishwe katika upana mzima
- **Ondoa** vitengo visivyohitajika vya `px` kwenye thamani za sifuri kwa msimbo safi
- **Weka** rangi ya nyuma laini inayopendeza zaidi kuliko kijivu kizito
**Changamoto ya Ubora wa Msimbo**: Angalia jinsi CSS hii inavyokiuka kanuni ya DRY (Usirudie Mwenyewe). Je, unaweza kuiboresha kwa kutumia ID na darasa?
**Changamoto ya Ubora wa Msimbo**: Angalia jinsi CSS hii inavunja kanuni ya DRY (Usijirudie). Unaweza kuiboresha kwa kutumia ID na darasa kwa pamoja?
**Njia iliyoboreshwa:**
**Mbinu Iliyoimarishwa:**
```html
<div id="left-container" class="container"></div>
<div id="right-container" class="container"></div>
@ -233,26 +323,26 @@ Hebu tuunde mitindo kwa kontena za upande za terrarium yetu ambapo mimea itaishi
}
```
### Vichagua vya Darasa kwa Mitindo Inayoweza Kutumika Tena
### Wachaguzi wa Madarasa kwa Mitindo Inayoweza Kutumika Tena
Vichagua vya darasa vinatumia alama ya `.` na vinavyofaa unapohitaji kutumia mitindo sawa kwa vipengele vingi. Tofauti na IDs, madarasa yanaweza kutumika tena katika HTML yako, na kuyafanya kuwa bora kwa mifumo ya mitindo thabiti.
Wachaguzi wa darasa hutumia alama ya `.` na ni bora unapotaka kutumia mitindo ile ile kwa vipengele vingi. Tofauti na IDs, madarasa yanaweza kutumika tena katika HTML yako, na kufanya iwe rahisi kuunda mitindo inayolingana.
Katika terrarium yetu, kila mmea unahitaji mitindo sawa lakini pia unahitaji nafasi ya kipekee. Tutatumia mchanganyiko wa madarasa kwa mitindo ya pamoja na IDs kwa nafasi ya kipekee.
Katika terrarium yetu, kila mmea unahitaji mitindo sawa lakini pia unahitaji upangaji wa kipekee. Tutatumia mchanganyiko wa madarasa kwa mitindo ya pamoja na IDs kwa upangaji wa kipekee.
**Hii ndiyo muundo wa HTML kwa kila mmea:**
```html
<div class="plant-holder">
<img class="plant" alt="Decorative plant for terrarium" id="plant1" src="../../../../translated_images/plant1.d18b18ffe73da18f8b1ac7aba73b4050af52f4a0c9174aeac464b85123fc2850.sw.png" />
<img class="plant" alt="Decorative plant for terrarium" id="plant1" src="../../../../translated_images/plant1.d18b18ffe73da18f.sw.png" />
</div>
```
**Vipengele muhimu vilivyoelezwa:**
- **Kutumia** `class="plant-holder"` kwa mitindo thabiti ya kontena kwa mimea yote
- **Kutumia** `class="plant"` kwa mitindo na tabia ya picha ya pamoja
- **Kujumuisha** `id="plant1"` ya kipekee kwa nafasi ya kibinafsi na mwingiliano wa JavaScript
- **Kutoa** maandishi ya alt yenye maelezo kwa upatikanaji wa wasomaji wa skrini
**Vipengele muhimu vinaelezwa:**
- **Tumia** `class="plant-holder"` kwa mitindo thabiti ya chombo kwa mimea yote
- **Tumia** `class="plant"` kwa mtindo wa picha na tabia zinazoshirikiwa
- **Mojawapo** `id="plant1"` kwa upangaji wa binafsi na mwingiliano wa JavaScript
- **Toa** maelezo ya alt kwa ufikivu kwa wasomaji wa skrini
Sasa ongeza mitindo hii kwenye faili yako ya `style.css`:
Sasa ongeza mitindo hii kwenye faili lako la `style.css`:
```css
.plant-holder {
@ -274,37 +364,53 @@ Sasa ongeza mitindo hii kwenye faili yako ya `style.css`:
}
```
**Kufafanua mitindo hii:**
- **Kuunda** nafasi ya jamaa kwa kontena la mmea ili kuanzisha muktadha wa nafasi
- **Kuweka** kila kontena la mmea kwa urefu wa 13%, kuhakikisha mimea yote inatoshea wima bila kusogeza
- **Kusogeza** kontena kidogo kushoto ili kuzingatia mimea vizuri ndani ya kontena zao
- **Kuruhusu** mimea kupanuka kwa majibu kwa kutumia mali za `max-width` na `max-height`
- **Kutumia** `z-index` kuweka mimea juu ya vipengele vingine katika terrarium
- **Kuongeza** athari ya hover laini na mabadiliko ya CSS kwa mwingiliano bora wa mtumiaji
**Fikra Muhimu**: Kwa nini tunahitaji vichagua vyote `.plant-holder` na `.plant`? Nini kingetokea ikiwa tungejaribu kutumia kimoja tu?
> 💡 **Mfumo wa Ubunifu**: Kontena (`.plant-holder`) inadhibiti mpangilio na nafasi, wakati maudhui (`.plant`) yanadhibiti mwonekano na upanuzi. Mgawanyo huu hufanya msimbo uwe rahisi kudumisha na kubadilika.
## Kuelewa Nafasi ya CSS
Nafasi ya CSS ni kama kuwa mkurugenzi wa jukwaa la tamthilia - unadhibiti wapi kila mwigizaji anasimama na jinsi wanavyosogea kwenye jukwaa. Wengine hufuata mpangilio wa kawaida, wakati wengine wanahitaji nafasi maalum kwa athari ya kipekee.
Mara unapofahamu nafasi, changamoto nyingi za mpangilio zinakuwa rahisi kudhibiti. Unahitaji bar ya urambazaji inayobaki juu wakati watumiaji wanapokoroga? Nafasi inashughulikia hilo. Unataka tooltip inayojitokeza mahali maalum? Hilo pia ni nafasi.
### Thamani Tano za Nafasi
| Thamani ya Nafasi | Tabia | Matumizi |
**Kuvunja mitindo hii:**
- **Tengeneza** upangaji wa relative kwa chombo cha mmea kuanzisha muktadha wa upangaji
- **Weka** kila chombo cha mmea kuwa na urefu wa 13%, kuhakikisha mimea yote ina nafasi wima bila kusogea
- **Inamaisha** vidhibiti kadhaa ili kuhamia kidogo kushoto kuonyesha mimea vizuri ndani ya vyombo
- **Ruhusu** mimea kubadilika kwa urefu na upana na mali za `max-width` na `max-height`
- **Tumia** `z-index` kuweka mimea juu ya vipengele vingine vya terrarium
- **Ongeza** athari ya hover kwa mabadiliko ya CSS kwa mwingiliano bora
**Fikra Muhimu**: Kwa nini tunahitaji wachaguzi `.plant-holder` na `.plant` wote wawili? Nini kingetokea kama tungetumia mmoja tu?
> 💡 **Mfano wa Ubunifu**: Chombo (`.plant-holder`) hukontroli upangaji na mahali, wakati maudhui (`.plant`) hukontroli muonekano na ukubwa. Ugawaji huu hufanya msimbo kuwa rahisi kudhibiti na kubadilika.
## Kuelewa Uwepo wa CSS
Uwepo wa CSS ni kama kuwa mwongozaji wa jukwaa la tamthilia - unaamrisha kila mhusika apatikane wapi na jinsi anavyosogea jukwaani. Baadhi ya waigizaji hufuata mpangilio wa kawaida, wengine wanahitaji upangaji maalum kwa athari ya riadha.
Mara unapojifunza kuweka maeneo, changamoto nyingi za upangaji hutarajika. Unahitaji bar ya urambazaji inayobaki juu wakati watumiaji wanapokata? Uwepo hufanya hivyo. Unataka vidokezo vya msaada vinaonekana mahali fulani? Hilo ni uwepo pia.
### Maadili Matano ya Uwepo
```mermaid
quadrantChart
title Mbinu ya Uwekaji CSS
x-axis Mtiririko wa Nyaraka --> Kuondolewa kwenye Mtiririko
y-axis Nafasi Imobishaji --> Udhibiti Sahihi
quadrant-1 Kamili
quadrant-2 Imewekewa
quadrant-3 Imobishaji
quadrant-4 Kushikamana
Static: [0.2, 0.2]
Relative: [0.3, 0.6]
Absolute: [0.8, 0.8]
Fixed: [0.9, 0.7]
Sticky: [0.5, 0.9]
```
| Thamani ya Uwepo | Tabia | Matumizi |
|----------------|----------|----------|
| `static` | Mtiririko wa kawaida, inapuuzia juu/kushoto/kulia/chini | Mpangilio wa kawaida wa hati |
| `relative` | Imewekwa kulingana na nafasi yake ya kawaida | Marekebisho madogo, kuunda muktadha wa nafasi |
| `absolute` | Imewekwa kulingana na mzazi wa karibu aliyewekwa | Uwekaji sahihi, overlays |
| `fixed` | Imewekwa kulingana na viewport | Bar za urambazaji, vipengele vinavyosogea |
| `sticky` | Hubadilika kati ya relative na fixed kulingana na koroga | Vichwa vinavyoshikamana wakati wa koroga |
| `static` | Mtiririko wa kawaida, haizingatii top/left/right/bottom | Mpangilio wa kawaida wa hati |
| `relative` | Iko kulingana na nafasi yake ya kawaida | Marekebisho madogo, kuanzisha muktadha wa upangaji |
| `absolute` | Iko kulingana na mzazi aliye na nafasi | Uwekaji sahihi, kuweka kwa tabaka juu |
| `fixed` | Iko kulingana na dirisha la kivinjari | Mabaa za urambazaji, vipengele vinavyoelea |
| `sticky` | Hubadilika kati ya relative na fixed kulingana na kusogea | Vichwa vinavyoshikamana wakati wa kusogea |
### Nafasi katika Terrarium Yetu
### Uwepo Katika Terrarium Yetu
Terrarium yetu inatumia mchanganyiko wa kimkakati wa aina za nafasi kuunda mpangilio unaotakiwa:
Terrarium yetu inatumia mchanganyiko wa kimkakati wa aina za uwepo kuunda upangaji unaotakiwa:
```css
/* Container positioning */
@ -326,25 +432,61 @@ Terrarium yetu inatumia mchanganyiko wa kimkakati wa aina za nafasi kuunda mpang
}
```
**Kuelewa mkakati wa nafasi:**
- **Kontena za absolute** zinatolewa kutoka mtiririko wa kawaida wa hati na zimewekwa kwenye kingo za skrini
- **Wamiliki wa mimea wa relative** huunda muktadha wa nafasi huku wakibaki katika mtiririko wa hati
- **Mimea ya absolute** inaweza kuwekwa kwa usahihi ndani ya kontena zao za relative
- **Mchanganyiko huu** unaruhusu mimea kupangwa wima huku ikipatikana kwa nafasi ya kibinafsi
**Kuelewa mikakati ya upangaji:**
- **Vyombo vya absolute** vinatolewa kutoka mtiririko wa kawaida wa hati na kuwekwa pembezoni mwa skrini
- **Vito vya mmea vya relative** huanzisha muktadha wa upangaji huku vikibaki katika mtiririko wa hati
- **Mimea ya absolute** inaweza kuwekwa kwa usahihi ndani ya vyombo vya relative
- **Mchanganyiko huu** huruhusu mimea kuwirirana wima huku ikiwa imepangwa binafsi
> 🎯 **Kwa Nini Hii Ni Muhimu**: Vipengele vya `plant` vinahitaji uwepo wa absolute ili viweze kubebeka katika somo lijalo. Uwepo wa absolute unawatoza kutoka kwenye mtiririko wa kawaida, kufanya mwingiliano wa buruta-na-acha uwezekane.
> 🎯 **Kwa Nini Hili Ni Muhimu**: Vipengele vya `plant` vinahitaji nafasi ya absolute ili viweze kuvutwa katika somo linalofuata. Nafasi ya absolute inavitenganisha kutoka mtiririko wa kawaida wa mpangilio, na kufanya mwingiliano wa kuvuta na kuacha uwezekane.
**Jaribu**: Badilisha thamani za uwepo na uangalie matokeo:
- Nini kitakachotokea ikiwa utabadilisha `.container` kutoka `absolute` kuwa `relative`?
- Je, mpangilio hubadilika vipi ikiwa `.plant-holder` inatumia `absolute` badala ya `relative`?
- Nini hutokea unapotumia `.plant` kwa upangilio wa `relative`?
**Jaribio la Kujaribu**: Jaribu kubadilisha thamani za nafasi na uone matokeo:
- Nini kinatokea ikiwa unabadilisha `.container` kutoka `absolute` hadi `relative`?
- Mpangilio unabadilika vipi ikiwa `.plant-holder` inatumia `absolute` badala ya `relative`?
- Nini kinatokea unapobadilisha `.plant` hadi nafasi ya `relative`?
### 🔄 **Ukaguzi wa Kifahari**
**Ukomavu wa Kuweka Nafasi za CSS**: Simama kidogo kuthibitisha uelewa wako:
- ✅ Je, unaweza kueleza kwa nini mimea inahitaji upangilio wa absolute kwa ajili ya buruta-na-acha?
- ✅ Je, unaelewa jinsi vyombo vya relative vinavyounda muktadha wa upangilio?
- ✅ Kwa nini vyombo vya pembeni hutumia upangilio wa absolute?
- ✅ Nini kingetokea kama ungeondoa kabisa tamko za position?
**Unganisho wa Ulimwengu Halisi**: Fikiria jinsi upangilio wa CSS unavyolingana na mpangilio wa ulimwengu halisi:
- **Static**: Vitabu kwenye rafu (mpangilio wa kawaida)
- **Relative**: Kusogeza kidogo kitabu lakini kuhifadhi nafasi yake
- **Absolute**: Kuweka alama ya kitabu kwenye ukurasa maalum
- **Fixed**: Kumbukumbu ya kubandika ambayo inaonekana wakati unaendelea kurasa
## Kujenga Terrarium kwa CSS
Sasa tutajenga chupa ya kioo kwa kutumia CSS pekee - bila picha au programu ya michoro.
Sasa tutaandika chupa ya kioo kwa kutumia CSS tu - hakuna picha au programu ya michoro inayohitajika.
Kuunda kioo kinachoonekana halisi, vivuli, na athari za kina kwa kutumia upangilio na uwazi kunaonyesha uwezo wa kuona wa CSS. Mbinu hii inaiga jinsi wakamishi wa Bauhaus walivyotumia maumbo rahisi ya kijiometri kuunda miundo changa, mizuri. Ukichukua hatua hizi, utaona mbinu za CSS nyuma ya muundo mwingi wa wavuti.
```mermaid
flowchart LR
A[Kofia ya Chupa] --> E[Terrarium Kamili]
B[kuta za Chupa] --> E
C[Safu ya Uto] --> E
D[Msingi wa Chupa] --> E
F[Madhara ya Kioo] --> E
A1["Upana wa 50%<br/>Urefu wa 5%<br/>Msimamo wa Juu"] --> A
B1["Upana wa 60%<br/>Urefu wa 80%<br/>Vikono Vilivyopinda<br/>Uwazi wa 0.5"] --> B
C1["Upana wa 60%<br/>Urefu wa 5%<br/>Kahawia Mwekundu<br/>Safi ya Chini"] --> C
D1["Upana wa 50%<br/>Urefu wa 1%<br/>Msimamo wa Chini"] --> D
F1["Kivuli Kidogo<br/>Uwazi<br/>Upangaji wa Z-index"] --> F
style E fill:#d1e1df,stroke:#3a241d
style A fill:#e8f5e8
style B fill:#e8f5e8
style C fill:#8B4513
style D fill:#e8f5e8
```
### Kuunda Vipengele vya Chupa ya Kioo
Kuunda kioo kinachoonekana halisi, vivuli, na athari za kina kwa kutumia nafasi na uwazi kunaonyesha uwezo wa kuona wa CSS. Mbinu hii inaakisi jinsi wasanifu wa harakati ya Bauhaus walivyotumia maumbo rahisi ya kijiometri kuunda miundo tata, yenye uzuri. Mara unapofahamu kanuni hizi, utatambua mbinu za CSS nyuma ya miundo mingi ya
Tujenge chupa ya terrarium hatua kwa hatua. Kila sehemu inatumia nafasi ya moja kwa moja na ukubwa wa asilimia kwa muundo unaojibika:
Hebu tujenge chupa ya terrarium sehemu kwa sehemu. Kila sehemu inatumia upangilio wa absolute na ukubwa wa asilimia kwa ajili ya muundo unaojibadilisha:
```css
.jar-walls {
@ -397,88 +539,197 @@ Tujenge chupa ya terrarium hatua kwa hatua. Kila sehemu inatumia nafasi ya moja
```
**Kuelewa ujenzi wa terrarium:**
- **Inatumia** vipimo vya asilimia kwa upanuzi unaojibika kwenye ukubwa wote wa skrini
- **Inaweka** vipengele kwa nafasi ya moja kwa moja ili kuviweka na kuviunganisha kwa usahihi
- **Inatumia** thamani tofauti za uwazi ili kuunda athari ya uwazi wa glasi
- **Inatekeleza** tabaka za `z-index` ili mimea ionekane ndani ya chupa
- **Inaongeza** kivuli cha kisanduku na pembe za mviringo zilizoboreshwa kwa mwonekano halisi zaidi
- **Inatumia** vipimo vya asilimia kwa ajili ya upanuzi wa kiotomatiki katika saizi zote za skrini
- **Inaweka** vitu kwa absolute ili kupachika na kuoanisha ipasavyo
- **Inatumia** thamani tofauti za uwazi kutengeneza athari ya uwazi wa kioo
- **Inatekeleza** uwanja wa `z-index` ili mimea ionekane ndani ya chupa
- **Inaongeza** kivuli kidogo cha sanduku na mviringo ulio boreshwa kwa muonekano wa kweli zaidi
### Muundo Unaobadilika na Asilimia
### Muundo Jibu kwa Asilimia
Angalia jinsi vipimo vyote vinavyotumia asilimia badala ya thamani za pikseli zilizowekwa:
Zingatia jinsi vipimo vyote vinavyo tumia asilimia badala ya pixels imara:
**Kwa nini hili ni muhimu:**
- **Inahakikisha** terrarium inapanuka kwa uwiano kwenye ukubwa wowote wa skrini
- **Inadumisha** uhusiano wa kuona kati ya vipengele vya chupa
- **Inatoa** uzoefu thabiti kutoka simu za mkononi hadi skrini kubwa za kompyuta
- **Inaruhusu** muundo kubadilika bila kuvunja mpangilio wa kuona
- **Hakikisha** terrarium inakua kwa ulinganifu kwenye saizi yoyote ya skrini
- **Iendeleze** uhusiano wa kuona kati ya vipengele vya chupa
- **Toa** uzoefu wa kudumu kutoka simu za mkononi hadi skrini kubwa za kompyuta
- **Ruhusu** muundo kubadilika bila kuvunja mpangilio wa kuona
### Vitengo vya CSS Katika Matendo
Tunatumia vitengo vya `rem` kwa border-radius, ambavyo vinaendana na ukubwa wa fonti ya mizizi. Hii huunda miundo inayopatikana zaidi ambayo inaheshimu upendeleo wa fonti wa mtumiaji. Jifunze zaidi kuhusu [vitengo vya CSS vinavyohusiana](https://www.w3.org/TR/css-values-3/#font-relative-lengths) katika maelezo rasmi.
### Vipimo vya CSS kwa Vitendo
**Jaribio la Kuona**: Jaribu kubadilisha thamani hizi na tazama matokeo:
- Badilisha uwazi wa chupa kutoka 0.5 hadi 0.8 hii huathirije muonekano wa kioo?
- Badilisha rangi ya udongo kutoka `#3a241d` hadi `#8B4513` athari gani ya kuona inaleta?
- Badilisha `z-index` ya udongo kuwa 2 ni nini kinatokea kwa mipako?
Tunatumia vipimo vya `rem` kwa pembe za mviringo, ambavyo vinapanuka kulingana na ukubwa wa fonti ya mzizi. Hii inaunda miundo inayopatikana zaidi inayoheshimu mapendeleo ya fonti ya mtumiaji. Jifunze zaidi kuhusu [vipimo vya jamaa vya CSS](https://www.w3.org/TR/css-values-3/#font-relative-lengths) katika maelezo rasmi.
### 🔄 **Ukaguzi wa Kifahari**
**Uelewa wa Muundo wa Kuona wa CSS**: Thibitisha uelewa wako wa muundo wa CSS:
- ✅ Jinsi vipimo vya asilimia vinavyounda muundo unaojibadilisha?
- ✅ Kwa nini uwazi huunda athari ya uwazi wa kioo?
- ✅ Kazi gani inachezwa na z-index katika mipako ya vitu?
- ✅ Thamani za border-radius huunda sura ya chupa vipi?
**Jaribio la Kuona**: Jaribu kubadilisha thamani hizi na uone athari:
- Badilisha uwazi wa chupa kutoka 0.5 hadi 0.8 hili linaathiri vipi mwonekano wa glasi?
- Rekebisha rangi ya udongo kutoka `#3a241d` hadi `#8B4513` athari ya kuona ni ipi?
- Badilisha `z-index` ya udongo hadi 2 nini kinatokea kwa tabaka?
**Kanuni ya Muundo**: Zingatia jinsi tunavyojenga picha ngumu kutoka maumbo rahisi:
1. **Mraba****Melee za mviringo** → **Vipengele vya chupa**
2. **Rangi zenye tambarare****Uwazi** → **Athari ya kioo**
3. **Vitu vya mtu binafsi****Muundo wenye mipako** → **Muonekano wa 3D**
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Agent kumaliza changamoto ifuatayo:
**Maelezo:** Unda uhuishaji wa CSS unaofanya mimea ya terrarium kuyumba taratibu, ikionyesha athari ya upepo wa asili. Hii itakusaidia kufanya mazoezi ya uhuishaji wa CSS, mabadiliko, na keyframes huku ukiboresha mvuto wa kuona wa terrarium yako.
**Maelezo:** Tengeneza mzunguko wa CSS unaofanya mimea ya terrarium kupepesa polepole kutoka pande zote mbili, kuiga athari ya upepo wa asili. Hii itakusaidia kufundisha mizunguko ya CSS, mabadiliko, na keyframes huku ukiboresha mvuto wa kuona wa terrarium yako.
**Kichocheo:** Ongeza uhuishaji wa keyframe za CSS ili kufanya mimea kwenye terrarium kuyumba taratibu kutoka upande mmoja hadi mwingine. Unda uhuishaji wa kuyumba unaozungusha kila mmea kidogo (digrii 2-3) kushoto na kulia kwa muda wa sekunde 3-4, na uitumie kwa darasa la `.plant`. Hakikisha uhuishaji unarudia bila kikomo na una kazi ya kupunguza kwa mwendo wa asili.
**Agizo:** Ongeza mizunguko ya CSS kwa kutumia keyframes ili kufanya mimea ndani ya terrarium kupepesa polepole kutoka upande mmoja hadi mwingine. Tengeneza mzunguko wa kupiga mzunguko kidogo (nyingi 2-3 digrii) kushoto na kulia kwa muda wa sekunde 3-4, na uanze kwa darasa la `.plant`. Hakikisha mzunguko unaendelea bila mwisho na unatumia kazi ya kupunguza kasi kwa mwendo wa asili.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto: Kuongeza Mwangaza wa Glasi
## 🚀 Changamoto: Kuongeza Mwangaza wa Kioo
Uko tayari kuboresha terrarium yako kwa mwangaza halisi wa glasi? Mbinu hii itaongeza kina na uhalisia kwenye muundo.
Je, uko tayari kuboresha terrarium yako kwa mwangaza wa kioo halisi? Mbinu hii itaongeza kina na uhalisia kwa muundo.
Utaunda mwangaza mdogo unaoonyesha jinsi mwanga unavyorejea kwenye uso wa glasi. Mbinu hii ni sawa na jinsi wachoraji wa Renaissance kama Jan van Eyck walivyotumia mwanga na mwangaza kufanya glasi iliyochorwa ionekane ya pande tatu. Hivi ndivyo unavyolenga:
Utaunda mwanga mdogo unaoiga jinsi mwanga unavyoakisi uso wa kioo. Mbinu hii ni sawa na jinsi wachoraji wa Renaissance kama Jan van Eyck walivyotumia mwanga na mng'ao kuifanya kioo chenye mchoro kuonekana cha tatu-kidimensioni. Haya ndio unayolenga:
![terrarium iliyokamilika](../../../../translated_images/terrarium-final.2f07047ffc597d0a06b06cab28a77801a10dd12fdb6c7fc630e9c40665491c53.sw.png)
![terrarium iliyokamilika](../../../../translated_images/terrarium-final.2f07047ffc597d0a.sw.png)
**Changamoto yako:**
- **Unda** maumbo madogo meupe au yenye rangi nyepesi kwa mwangaza wa glasi
- **Yapange** kimkakati upande wa kushoto wa chupa
- **Tumia** uwazi na athari za ukungu zinazofaa kwa mwangaza halisi wa mwanga
- **Tumia** `border-radius` kuunda maumbo ya asili, kama mapovu
- **Jaribu** na gradients au kivuli cha kisanduku kwa uhalisia ulioimarishwa
- **Tengeneza** maumbo madogo meupe au yenye rangi nyepesi ya mviringo kwa mwanga wa kioo
- **Weka** kwa mkakati upande wa kushoto wa chupa
- **Tumia** uwazi unaofaa na athari za blur kwa mwanga halisi unaoakisiwa
- **Tumia** `border-radius` kuunda maumbo ya kiasili, kama matone
- **Jaribu** mitawanyiko au kivuli cha sanduku kwa uhalisia ulioboreshwa
## Jaribio Baada ya Somo
## Mtihani wa Baada ya Mfululizo
[Jaribio baada ya somo](https://ff-quizzes.netlify.app/web/quiz/18)
[Mtihani wa baada ya mfululizo](https://ff-quizzes.netlify.app/web/quiz/18)
## Panua Maarifa Yako ya CSS
## Panua Uelewa wako wa CSS
CSS inaweza kuhisi kuwa ngumu mwanzoni, lakini kuelewa dhana hizi za msingi kunatoa msingi thabiti kwa mbinu za hali ya juu zaidi.
CSS inaweza kuonekana ngumu mwanzoni, lakini kuelewa dhana hizi za msingi hutoa msingi imara kwa mbinu ngumu zaidi.
**Maeneo yako ya kujifunza CSS yanayofuata:**
- **Flexbox** - hurahisisha mpangilio na usambazaji wa vipengele
- **CSS Grid** - hutoa zana zenye nguvu za kuunda mpangilio changamano
- **CSS Variables** - hupunguza kurudia na kuboresha usimamizi
- **Muundo unaojibika** - huhakikisha tovuti zinafanya kazi vizuri kwenye ukubwa tofauti wa skrini
**Maeneo yako yafuatayo ya kujifunza CSS:**
- **Flexbox** - huwezesha urahisi wa kuoanisha na kugawa vitu
- **CSS Grid** - huleta zana zenye nguvu za kuunda mipangilio tata
- **Vigezo vya CSS** - hupunguza rudia na kuboresha utunzaji
- **Muundo unaojibadilisha** - huhakikisha tovuti zinafanya kazi vyema kwa saizi tofauti za skrini
### Rasilimali za Kujifunza kwa Vitendo
### Rasilimali za Kujifunza Shirikishi
Fanya mazoezi ya dhana hizi kwa michezo hii ya kuvutia, ya vitendo:
- 🐸 [Flexbox Froggy](https://flexboxfroggy.com/) - Jifunze Flexbox kupitia changamoto za kufurahisha
- 🌱 [Grid Garden](https://codepip.com/games/grid-garden/) - Jifunze CSS Grid kwa kulima karoti za mtandaoni
- 🎯 [CSS Battle](https://cssbattle.dev/) - Jaribu ujuzi wako wa CSS kwa changamoto za usimbaji
Fanya mazoezi na dhana hizi kupitia michezo yenye burudani, yenye ushawishi:
- 🐸 [Flexbox Froggy](https://flexboxfroggy.com/) - Jifunze Flexbox kwa changamoto za kufurahisha
- 🌱 [Grid Garden](https://codepip.com/games/grid-garden/) - Jifunze CSS Grid kwa kukuza karoti wa mtandaoni
- 🎯 [CSS Battle](https://cssbattle.dev/) - Jaribu ujuzi wako wa CSS kwa changamoto za msimbo
### Kujifunza Zaidi
Kwa misingi kamili ya CSS, kamilisha moduli hii ya Microsoft Learn: [Pamba programu yako ya HTML kwa CSS](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
Kwa msingi mpana wa CSS, maliza moduli hii ya Microsoft Learn: [Acha HTML yako ionekane kwa CSS](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
### ⚡ **Kile Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua DevTools na chunguza mitindo ya CSS kwenye tovuti yoyote ukiitumia paneli ya Vipengele
- [ ] Tengeneza faili rahisi la CSS na uilinke kwa ukurasa wa HTML
- [ ] Jaribu kubadilisha rangi kwa njia tofauti: hex, RGB, na rangi zilizopewa majina
- [ ] Fanya mazoezi ya sanduku kwa kuongeza padding na margin kwa div
### 🎯 **Kile Unachoweza Kufanikisha Saa Hii**
- [ ] Maliza mtihani wa baada ya masomo na hakiki msingi wa CSS
- [ ] Pamba ukurasa wako wa HTML kwa fonti, rangi, na nafasi
- [ ] Tengeneza mpangilio rahisi kwa kutumia flexbox au grid
- [ ] Jaribu mabadiliko ya CSS kwa athari laini
- [ ] Fanya mazoezi ya muundo unaojibadilisha kwa kutumia media queries
### 📅 **Safari yako ya Wiki ya CSS**
- [ ] Kamilisha kazi ya mtindo wa terrarium kwa ubunifu
- [ ] Jifunze CSS Grid kwa kujenga mpangilio wa picha za makumbusho
- [ ] Jifunza mitindo ya CSS kuleta muundo wako uhai
- [ ] Gundua preprocessors za CSS kama Sass au Less
- [ ] Soma kanuni za muundo na zitumie kwa CSS yako
- [ ] Chambua na uirudie tena mitindo yenye mvuto unayopata mtandaoni
### 🌟 **Ukomavu wako wa Mwezi Mzima wa Muundo**
- [ ] Jenga mfumo kamili wa muundo wa tovuti unaojibadilisha
- [ ] Jifunze CSS-in-JS au mifumo ya utility-first kama Tailwind
- [ ] Changia miradi ya chanzo huria na maboresho ya CSS
- [ ] Pitisha ujuzi wa CSS wa hali ya juu kama mali maalum za CSS na containment
- [ ] Unda maktaba za vipengele vinavyotumika tena kwa CSS ya moduli
- [ ] Fundisha wengine wanaojifunza CSS na kushiriki maarifa ya muundo
## 🎯 Ratiba Yako ya Ukomavu wa CSS
```mermaid
timeline
title Mchakato wa Kujifunza CSS
section Msingi (dakika 10)
File Connection: Unganisha CSS na HTML
: Elewa kanuni za cascade
: Jifunze mambo ya urithi
section Wachaguzi (dakika 15)
Targeting Elements: Wachaguzi wa elementi
: Mifumo ya darasa
: Umaalum wa ID
: Kombinat za mchanganyiko
section Mfano wa Sanduku (dakika 20)
Layout Fundamentals: Mipaka na padding
: Sifa za mipaka
: Ukubwa wa maudhui
: Tabia ya box-sizing
section Uwekaji (dakika 25)
Element Placement: Static dhidi ya relative
: Uwekaji wa kisababu
: Kuweka tabaka kwa z-index
: Vitengo vinavyojirekebisha
section Ubunifu wa Kuonekanwa (dakika 30)
Styling Mastery: Rangi na uwazi
: Mwingu na athari
: Mabadiliko
: Sifa za mabadiliko
section Ubunifu Unaobadilika (dakika 45)
Multi-Device Support: Maswali ya media
: Mipangilio inayobadilika
: Mbinu ya kuanzia simu ya mkononi
: Ubora wa viewport
section Mbinu Zinazoendelea (wiki 1)
Modern CSS: Mipangilio ya Flexbox
: Mifumo ya CSS Grid
: Sifa za kawaida
: Kufunga vigezo vya mvivu
section Ujuzi wa Kitaalamu (mwezi 1)
CSS Architecture: Mifumo ya vipengele
: Msimbo unaoweza kudumishwa
: Uboreshaji wa utendaji
: Ulinganifu wa mzunguko wa kivinjari
```
### 🛠️ Muhtasari wa Kifaa chako cha CSS
Baada ya kumaliza somo hili, sasa una:
- **Uelewa wa Cascade**: Jinsi mitindo inavyorithi na kubatilisha kila mmoja
- **Ukomavu wa Chagua**: Lengo sahihi kwa vipengele, madarasa, na IDs
- **Ujuzi wa Upangilio**: Kuweka vitu kwa mikakati na mipako
- **Muundo wa Kuona**: Kuunda athari za kioo, vivuli, na ufanisi wa uwazi
- **Mbinu za Kujibadilisha**: Mipangilio ya asilimia inayobadilika kwa skrini yoyote
- **Utaratibu wa Msimbo**: Muundo wa CSS safi na rahisi kutunza
- **Mienendo ya Kisasa**: Matumizi ya vitengo vinavyohusiana na muundo unaopatikana zaidi
**Hatua Zifuatazo**: Terrarium yako sasa ina muundo (HTML) na mtindo (CSS). Somo la mwisho litaongeza mwingiliano kwa JavaScript!
## Kazi ya Nyumbani
## Kazi
[Uboreshaji wa CSS](assignment.md)
[CSS Refactoring](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Utangulizi wa Hati**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kufanikisha usahihi, tafadhali fahamu kwamba tafsiri za moja kwa moja zinaweza kuwa na makosa au upotoshaji. Hati asili kwa lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu sana, tafsiri ya mtaalamu wa lugha ya kibinadamu inashauriwa. Hatutopewa lawama kwa kutokuelewana au upotoshaji unaotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,45 +1,30 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7965cd2bc5dc92ad888dc4c6ab2ab70a",
"translation_date": "2025-08-28T04:12:52+00:00",
"original_hash": "bc5c5550f79d10add90ce419ee34abb3",
"translation_date": "2026-01-07T01:18:40+00:00",
"source_file": "3-terrarium/README.md",
"language_code": "sw"
}
-->
# Terrarium Yangu: Mradi wa kujifunza kuhusu HTML, CSS, na udhibiti wa DOM kwa kutumia JavaScript 🌵🌱
## Tuma Terrarium yako
Mradi mdogo wa kuburuta na kudondosha. Kwa kutumia HTML, JS, na CSS kidogo, utaweza kujenga kiolesura cha wavuti, kukipamba, na hata kuongeza mwingiliano mbalimbali wa chaguo lako.
![terrarium yangu](../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.sw.png)
# Masomo
1. [Utangulizi wa HTML](./1-intro-to-html/README.md)
2. [Utangulizi wa CSS](./2-intro-to-css/README.md)
3. [Utangulizi wa DOM na JS Closures](./3-intro-to-DOM-and-closures/README.md)
## Shukrani
Imeandikwa kwa ♥️ na [Jen Looper](https://www.twitter.com/jenlooper)
Terrarium iliyoundwa kwa kutumia CSS ilihamasishwa na jar ya kioo ya Jakub Mandra [codepen](https://codepen.io/Rotarepmi/pen/rjpNZY).
Sanaa ya michoro imechorwa kwa mkono na [Jen Looper](http://jenlooper.com) kwa msaada wa Procreate.
## Chapisha Terrarium Yako
Unaweza kuchapisha, au kuweka terrarium yako mtandaoni kwa kutumia Azure Static Web Apps.
Unaweza kutuma, au kuchapisha Terrarium yako kwenye wavuti ukitumia **Azure Static Web Apps**.
1. Fanya fork ya repo hii
2. Bonyeza kitufe hiki
2. Bonyeza kitufe hiki 👇
[![Kitufe cha Chapisha kwa Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/?feature.customportal=false&WT.mc_id=academic-77807-sagibbon#create/Microsoft.StaticApp)
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.StaticApp)
3. Fuata hatua za mwongozo wa kuunda programu yako. Hakikisha unaweka mzizi wa programu kuwa ama `/solution` au mzizi wa msimbo wako. Hakuna API katika programu hii, kwa hivyo usijali kuhusu kuongeza hiyo. Folda ya github itaundwa kwenye repo yako ya fork ambayo itasaidia huduma za ujenzi za Azure Static Web Apps kujenga na kuchapisha programu yako kwenye URL mpya.
3. Fuata mchawi wa usanidi kuunda programu yako.
- Weka **App root** iwe `/solution` au mzizi wa msimbo wako.
- Hakuna API katika programu hii, hivyo unaweza kuruka usanidi wa API.
- Folda ya `.github` itaumbwa moja kwa moja kusaidia Azure Static Web Apps kujenga na kuchapisha programu yako.
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kitanzi cha maelezo**:
Nyaraka hii imefasiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za moja kwa moja zinaweza kuwa na makosa au upotoshaji. Nyaraka ya asili katika lugha yake asilia inapaswa kuchukuliwa kama chanzo halali. Kwa taarifa za muhimu sana, tafsiri ya kitaalamu ya binadamu inashauriwa. Hatubeba dhamana kwa maelezo yaliyokosewa au tafsiri potofu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Mradi mdogo wa kuburudisha akili kwa kuburuta na kudondosha. Kwa kutumia HTML, JS, na CSS kidogo, unaweza kujenga kiolesura cha wavuti, kukipamba, na kuongeza mwingiliano.
![terrarium yangu](../../../../translated_images/screenshot_gray.0c796099a1f9f25e40aa55ead81f268434c00af30d7092490759945eda63067d.sw.png)
![terrarium yangu](../../../../translated_images/screenshot_gray.0c796099a1f9f25e.sw.png)
## Shukrani

@ -1,48 +1,290 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5adea7059676fcdb1b546ccd54c956c2",
"translation_date": "2025-10-24T19:38:11+00:00",
"original_hash": "efa2ab875b8bb5a7883816506da6b6d2",
"translation_date": "2026-01-07T01:17:47+00:00",
"source_file": "4-typing-game/README.md",
"language_code": "sw"
}
-->
# Programu Inayoendeshwa na Matukio - Jenga Mchezo wa Kuandika
# Programu Inayochochewa na Matukio - Jenga Mchezo wa Kuandika
```mermaid
journey
title Safari Yako ya Maendeleo ya Mchezo wa Kuandika
section Msingi
Panga muundo wa mchezo: 3: Student
Tengeneza kiolesura cha mtumiaji: 4: Student
Sanidi vipengele vya HTML: 4: Student
section Ufanisi
Shughulikia ingizo la mtumiaji: 4: Student
Fuatilia muda: 5: Student
Hesabu usahihi: 5: Student
section Sifa
Ongeza maoni ya kuona: 5: Student
Tekeleza mantiki ya mchezo: 5: Student
Boresha uzoefu: 5: Student
```
## Utangulizi
Hili ni jambo ambalo kila msanidi programu analijua lakini mara chache huzungumzia: kuandika haraka ni uwezo wa kipekee! 🚀 Fikiria - kadri unavyoweza kuhamisha mawazo yako kutoka kwenye ubongo hadi kwenye mhariri wa msimbo kwa haraka, ndivyo ubunifu wako unavyoweza kutiririka zaidi. Ni kama kuwa na njia ya moja kwa moja kati ya mawazo yako na skrini.
Hapa ni kitu ambacho kila mtengenezaji anajua lakini mara chache husema: kuandika kwa haraka ni nguvu ya ajabu! 🚀 Fikiria - unavyoweza kuhamisha mawazo yako kutoka kichwani mwako hadi mhariri wa msimbo kwa haraka, ndivyo ubunifu wako unavyoweza kuendelea. Ni kama kuwa na bomba la moja kwa moja kati ya mawazo yako na skrini.
Unataka kujua mojawapo ya njia bora za kuboresha ujuzi huu? Umeipata - tutatengeneza mchezo!
```mermaid
pie title Vipengele vya Mchezo
"Mrejesho wa Wakati Halisi" : 25
"Ufuatiliaji wa Utendaji" : 20
"Kiolesura cha Mtumiaji Shirikishi" : 20
"Mfumo wa Saa ya Kucheza" : 15
"Usimamizi wa Nukuu" : 10
"Maonyesho ya Matokeo" : 10
```
Unataka kujua mojawapo ya njia bora za kuboresha ujuzi huu? Uliweza - tutajenga mchezo!
> Hebu tuunde mchezo wa kuandika wa kuvutia pamoja!
```mermaid
flowchart LR
A[Mchezaji anaanza mchezo] --> B[Nukuu ya bahati inaonyeshwa]
B --> C[Mchezaji anaandika herufi]
C --> D{Herufi ni sahihi?}
D -->|Ndiyo| E[Onyesho la kijani]
D -->|Hapana| F[Onyesho la nyekundu]
E --> G[Badilisha usahihi]
F --> G
G --> H{Nukuu imekamilika?}
H -->|Hapana| C
H -->|Ndiyo| I[Hesabu WPM]
I --> J[Onyesha matokeo]
J --> K[Cheza tena?]
K -->|Ndiyo| B
K -->|Hapana| L[Mchezo umekwisha]
style A fill:#e1f5fe
style D fill:#fff3e0
style E fill:#e8f5e8
style F fill:#ffebee
style I fill:#f3e5f5
```
> Tuwekeze pamoja mchezo mzuri wa kuandika!
Uko tayari kutumia ujuzi wote wa JavaScript, HTML, na CSS ambao umekuwa ukijifunza? Tutatengeneza mchezo wa kuandika ambao utakupa changamoto kwa nukuu za nasibu kutoka kwa mpelelezi maarufu [Sherlock Holmes](https://en.wikipedia.org/wiki/Sherlock_Holmes). Mchezo utafuatilia jinsi unavyoandika haraka na kwa usahihi - na ni wa kuvutia zaidi kuliko unavyoweza kufikiria!
Ume tayari kutumia ujuzi wote wa JavaScript, HTML, na CSS ambao umekuwa ukijifunza? Tutajenga mchezo wa kuandika utakayekupa changamoto na nukuu za nasibu kutoka kwa mchunguzi maarufu [Sherlock Holmes](https://en.wikipedia.org/wiki/Sherlock_Holmes). Mchezo utahesabu kasi na usahihi wa maandishi yako - na niamini, ni kitendawili zaidi kuliko unavyoweza kufikiria!
```mermaid
mindmap
root((Typing Game Development))
User Interface
Input Elements
Visual Feedback
Responsive Design
Accessibility
Game Logic
Quote Selection
Timer Management
Accuracy Tracking
Score Calculation
Event Handling
Keyboard Input
Button Clicks
Real-time Updates
Game State Changes
Performance Metrics
Maneno Kwa Dakika
Usahihi wa Herufi
Ufuatiliaji wa Makosa
Onyesho la Maendeleo
User Experience
Maoni Mara Moja
Maelekezo Wazi
Yaliyovutia
Mfumo wa Mafanikio
```
![demo](../../../4-typing-game/images/demo.gif)
## Unachohitaji Kujua
## Kile Utakachohitaji Kujua
Kabla hatujaanza, hakikisha unajiamini na dhana hizi (usijali ikiwa unahitaji ukumbusho wa haraka - sote tumewahi kuwa hapo!):
```mermaid
flowchart TD
A[Kitendo cha Mtumiaji] --> B{Aina ya Tukio?}
B -->|Bonyeza Funguo| C[Tukio la Kibodi]
B -->|Bonyeza Kitufe| D[Tukio la Panya]
B -->|Muda| E[Tukio la Muda]
C --> F[Kagua Herufi]
D --> G[Anza/Rudisha Michezo]
E --> H[Sabisha Muda]
F --> I{Ni Sahihi?}
I -->|Ndio| J[Onyesha Kwa Kijani]
I -->|Hapana| K[Onyesha Kwa Nyekundu]
J --> L[Sasisha Alama]
K --> L
L --> M[Kagua Hali ya Michezo]
G --> N[Tengeneza Nukuu Mpya]
H --> O[Onyesha Muda]
M --> P{Mchezo Umeisha?}
P -->|Ndio| Q[Onyesha Matokeo]
P -->|Hapana| R[Endelea na Mchezo]
style A fill:#e1f5fe
style F fill:#e8f5e8
style I fill:#fff3e0
style Q fill:#f3e5f5
```
Kabla hatujaingia ndani, hakikisha umeelewa dhana hizi (usijali kama unahitaji kujikumbusha haraka - sote tumepitia hapo!):
- Kuunda sehemu ya kuingiza maandishi na vidhibiti vya kitufe
- CSS na kuweka mitindo kwa kutumia madarasa
- Kutengeneza kudhibiti maandishi na vifungo
- CSS na kuweka mitindo kwa kutumia madaraja
- Misingi ya JavaScript
- Kuunda array
- Kuunda namba ya nasibu
- Kupata muda wa sasa
- Kutengeneza safu (array)
- Kutengeneza namba ya bahati nasibu
- Kupata wakati wa sasa
Ikiwa mojawapo ya haya inaonekana kuwa ngumu kidogo, ni sawa kabisa! Wakati mwingine njia bora ya kuimarisha maarifa yako ni kwa kuingia kwenye mradi na kujifunza unavyosonga mbele.
Kama mojawapo ya haya inahisi imechakaa kidogo, hiyo ni sawa kabisa! Wakati mwingine njia bora ya kuimarisha ujuzi ni kuingia kwenye mradi na kubaini mambo unavyokwenda.
## Hebu Tujenge Hili!
### 🔄 **Ukaguzi wa Kina wa Kitaaluma**
**Tathmini ya Msingi**: Kabla ya kuanza maendeleo, hakikisha unaelewa:
- ✅ Jinsi fomu za HTML na vipengele vya input vinavyofanya kazi
- ✅ Madaraja ya CSS na mitindo ya mabadiliko
- ✅ Wasikilizaji na washughulikiaji wa matukio ya JavaScript
- ✅ Uendeshaji wa safu na uchaguzi wa nasibu
- ✅ Kupima muda na hesabu
[Kuunda mchezo wa kuandika kwa kutumia programu inayoendeshwa na matukio](./typing-game/README.md)
**Jaribio la Haraka la Kujitathmini**: Je, unaweza kuelezea jinsi dhana hizi zinavyofanya kazi pamoja katika mchezo wa mwingiliano?
- **Matukio** huchochewa wakati watumiaji wanapotenda na vipengele
- **Washughulikiaji** hushughulikia matukio hayo na kusasisha hali ya mchezo
- **CSS** hutoa mrejesho wa kuona kwa vitendo vya mtumiaji
- **Kupima muda** husaidia kupima utendaji na maendeleo ya mchezo
## Credits
```mermaid
quadrantChart
title Maendeleo ya Ujuzi wa Mchezo wa Kuandika
x-axis Mwanzo --> Mtaalamu
y-axis Imara --> Shirikishi
quadrant-1 Michezo ya Juu
quadrant-2 Programu za Wakati Halisi
quadrant-3 Kurasa za Msingi
quadrant-4 Tovuti Shirikishi
HTML Forms: [0.3, 0.2]
CSS Styling: [0.4, 0.3]
Event Handling: [0.7, 0.8]
Game Logic: [0.8, 0.9]
Performance Tracking: [0.9, 0.7]
```
## Hebu Tujenge Kitu Hiki!
[Kutengeneza mchezo wa kuandika kwa kutumia programu inayochochewa na matukio](./typing-game/README.md)
### ⚡ **Unaweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua konsole ya kivinjari chako na jaribu kusikiliza matukio ya kibodi kwa kutumia `addEventListener`
- [ ] Tengeneza ukurasa rahisi wa HTML wenye uga wa kuingiza na jaribu kugundua maandishi yanayoingizwa
- [ ] Fanya mazoezi ya uendeshaji wa mistari kwa kulinganisha maandishi yaliyotumwa na maandishi lengwa
- [ ] Jaribu `setTimeout` kuelewa kazi za muda
### 🎯 **Unaweza Kufanikisha Saa Hii**
- [ ] Maliza mtihani baada ya somo na uelewe programu inayochochewa na matukio
- [ ] Jenga toleo la msingi la mchezo wa kuandika na uthibitishaji wa maneno
- [ ] Ongeza mrejesho wa kuona kwa kuandika sahihi na makosa
- [ ] Tekeleza mfumo rahisi wa alama kulingana na kasi na usahihi
- [ ] Pamba mchezo wako kwa CSS ili kuufanya uonekane mzuri
### 📅 **Maendeleo yako ya Mchezo kwa Wiki nzima**
- [ ] Maliza mchezo kamili wa kuandika na vipengele vyote na utengenezaji
- [ ] Ongeza viwango vya ugumu kwa utofauti wa maneno
- [ ] Tekeleza ufuatiliaji wa takwimu za mtumiaji (WPM, usahihi kwa muda)
- [ ] Tengeneza athari za sauti na michoro kwa uzoefu bora wa mtumiaji
- [ ] Fanya mchezo wako ujibadilike kwa simu za mkononi na vifaa vya kugusa
- [ ] Shiriki mchezo wako mtandaoni na ukusanye maoni kutoka kwa watumiaji
### 🌟 **Maendeleo yako ya Mchezo wa Miezi Kadhaa**
- [ ] Jenga michezo mingi ikichunguza mifumo tofauti ya mwingiliano
- [ ] Jifunze kuhusu mizunguko ya mchezo, usimamizi wa hali, na uboreshaji wa utendaji
- [ ] Changia kwenye miradi ya maendeleo ya michezo ya chanzo huria
- [ ] Shikilia dhana za hali ya juu za muda na michoro laini
- [ ] Tengeneza jalada la miradi inayoonyesha programu mbalimbali zinazoingiliana
- [ ] Telekeza wengine wanaopenda maendeleo ya michezo na mwingiliano wa watumiaji
## 🎯 Muda wa Kumiliki Mchezo wako wa Kuandika
```mermaid
timeline
title Maendeleo ya Kujifunza Kuunda Michezo
section Setup (dakika 10)
Project Structure: Msingi wa HTML
: Usanidi wa mtindo wa CSS
: Uundaji wa faili la JavaScript
section User Interface (dakika 20)
Interactive Elements: Sehemu za kuingiza
: Kontrol za vitufe
: Eneo la kuonyesha
: Mpangilio unaojibu
section Event Handling (dakika 25)
User Interaction: Matukio ya kibodi
: Matukio ya panya
: Maoni ya wakati halisi
: Usimamizi wa hali
section Game Logic (dakika 30)
Core Functionality: Uundaji wa nukuu
: Ulinganishaji wa wahusika
: Hesabu ya usahihi
: Utekelezaji wa timer
section Performance Tracking (dakika 35)
Metrics & Analytics: Hesabu ya WPM
: Ufuatiliaji wa makosa
: Uonyesho wa maendeleo
: Kuonyesha matokeo
section Polish & Enhancement (dakika 45)
User Experience: Maoni ya kuona
: Athari za sauti
: Michoro ya mienendo
: Sifa za upatikanaji
section Advanced Features (wiki 1)
Extended Functionality: Ngazi za ugumu
: Jedwali la viongozi
: Nukuu maalum
: Chaguo nyingi-mchezaji
section Professional Skills (mwezi 1)
Game Development: Uboreshaji wa utendaji
: Miundo ya msimbo
: Mikakati ya kujaribu
: Mifumo ya kuanzisha
```
### 🛠️ Muhtasari wa Zana zako za Maendeleo ya Mchezo
Baada ya kumaliza mradi huu, utakuwa umejifunza:
- **Programu Inayochochewa na Matukio**: Kiolesura cha mtumiaji kinachojibu kwa upendeleo wa kuingiza
- **Mrejesho wa Wakati Halisi**: Sasisho za kuona na utendaji mara moja
- **Upimaji wa Utendaji**: Mfumo sahihi wa muda na alama
- **Usimamizi wa Hali ya Mchezo**: Kudhibiti mtiririko wa programu na uzoefu wa mtumiaji
- **Ubunifu wa Kuingiliana**: Kuunda uzoefu wa mtumiaji unaovutia na kueneza uraibu
- **APIs za Kisasa za Wavuti**: Kutumia uwezo wa kivinjari kwa mwingiliano tajiri
- **Mifumo ya Ufikiaji**: Ubunifu wa kushirikisha watumiaji wote
**Matumizi Halisi**: Ujuzi huu unatumiwa moja kwa moja kwa:
- **Programu za Wavuti**: Kiolesura chochote cha mwingiliano au dashibodi
- **Programu za Elimu**: Majukwaa ya kujifunza na zana za tathmini ya ujuzi
- **Zana za Ufanisi**: Wahariri wa maandishi, IDEs, na programu za ushirikiano
- **Sekta ya Michezo**: Michezo ya kivinjari na burudani za kuingiliana
- **Maendeleo ya Simu**: Kiolesura kinachogusa na usimamizi wa ishara
**Kipindi Kinachofuata**: Uko tayari kuchunguza mifumo ya mchezo ya hali ya juu, mifumo ya wachezaji wengi kwa wakati mmoja, au programu tata za mwingiliano!
## Mawasiliano
Imeandikwa kwa ♥️ na [Christopher Harrison](http://www.twitter.com/geektrainer)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tangazo la Majeruhi**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa habari muhimu, tafsiri bora ya binadamu mtaalamu inapendekezwa. Hatuwajibiki kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,116 +1,115 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "e6b75e5b8caae906473a8a09d77b7121",
"translation_date": "2025-10-24T19:38:20+00:00",
"original_hash": "da8bc72041a2bb3826a54654ee1a8844",
"translation_date": "2026-01-07T01:58:59+00:00",
"source_file": "4-typing-game/typing-game/README.md",
"language_code": "sw"
}
-->
# Kuunda mchezo kwa kutumia matukio
Je, umewahi kujiuliza jinsi tovuti zinavyotambua unapobofya kitufe au kuandika kwenye kisanduku cha maandishi? Hiyo ni uchawi wa programu inayotegemea matukio! Njia bora ya kujifunza ujuzi huu muhimu ni kwa kujenga kitu cha manufaa - mchezo wa kasi ya kuandika ambao unaitikia kila unapoandika.
Je, umewahi kujiuliza jinsi tovuti zinavyojua wakati unabonyeza kitufe au kuandika kwenye kisanduku cha maandishi? Hiyo ni uchawi wa programu zinazotegemea matukio! Ni njia gani bora zaidi ya kujifunza ujuzi huu muhimu kuliko kujenga kitu cha manufaa - mchezo wa kasi ya kuandika unaojibu kila kitufe unachobonyeza.
Utaona moja kwa moja jinsi vivinjari vya wavuti vinavyowasiliana na msimbo wako wa JavaScript. Kila unapobofya, kuandika, au kusogeza kipanya chako, kivinjari kinatuma ujumbe mdogo (tunaviita matukio) kwa msimbo wako, na unapata kuamua jinsi ya kujibu!
Utashuhudia kwa moja kwa moja jinsi vivinjari vya wavuti "husema" na msimbo wako wa JavaScript. Kila unapobonyeza, kuandika, au kusogeza panya wako, kivinjari kinatuma ujumbe mdogo (tunaziita matukio) kwa msimbo wako, na wewe unaamua jinsi ya kuyajibu!
Tunapomaliza hapa, utakuwa umeunda mchezo halisi wa kuandika ambao unafuatilia kasi na usahihi wako. Muhimu zaidi, utaelewa dhana za msingi zinazowezesha kila tovuti ya maingiliano ambayo umewahi kutumia. Twende kazi!
Tukimaliza hapa, utaweza kuunda mchezo halisi wa kuandika unaofuata kasi yako na usahihi. Zaidi ya hayo, utaelewa dhana za msingi zinazochochea kila tovuti ya mwingiliano uliyoitumia. Hebu tuanze!
## Maswali ya awali ya somo
## Jaribio la Kabla ya Forekezi
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/21)
[Jaribio la kabla ya forekezi](https://ff-quizzes.netlify.app/web/quiz/21)
## Programu inayotegemea matukio
## Programu zinazoendeshwa na Matukio
Fikiria programu au tovuti unayoipenda - ni nini kinachofanya ionekane hai na itikivu? Yote inahusu jinsi inavyoitikia unachofanya! Kila kubofya, kugusa, kusogeza, au kuandika huunda kile tunachokiita "tukio," na hapo ndipo uchawi halisi wa maendeleo ya wavuti hutokea.
Fikiria kuhusu programu au tovuti unayopenda - ni nini hufanya ihisi hai na inayojibu? Yote ni kuhusu jinsi inavyojibu unacho fanya! Kila bonyeza, kugusa, kuvinjari, au kubonyeza kitufe huunda kile tunachokiita "tukio," na hapo ndipo uchawi halisi wa maendeleo ya wavuti hutokea.
Hii ndiyo inafanya programu kwa wavuti kuwa ya kuvutia: hatujui ni lini mtu atabofya kitufe hicho au kuanza kuandika kwenye kisanduku cha maandishi. Wanaweza kubofya mara moja, kusubiri dakika tano, au labda wasibofye kabisa! Kutotabirika huku kunamaanisha tunahitaji kufikiria tofauti kuhusu jinsi tunavyoandika msimbo wetu.
Hapa ndipo programu kwa wavuti inavyopendeza: hatujui lini mtu atabonyeza kitufe hicho au kuanza kuandika kwenye kisanduku cha maandishi. Wanaweza kubonyeza mara moja, kusubiri dakika tano, au labda wasibonye kabisa! Hali hii isiyotabirika inamaanisha tunahitaji kufikiria tofauti kuhusu jinsi tunavyoandika msimbo wetu.
Badala ya kuandika msimbo unaoendeshwa kutoka juu hadi chini kama mapishi, tunaandika msimbo unaosubiri kwa subira kitu kitokee. Ni sawa na jinsi waendeshaji wa telegrafi katika miaka ya 1800 walivyokaa karibu na mashine zao, tayari kujibu mara tu ujumbe ulipokuja kupitia waya.
Badala ya kuandika msimbo unaoendeshwa kutoka juu hadi chini kama mapishi, tunaandika msimbo unaosubiri kwa subira jambo lifanyike. Ni sawa na jinsi wafanyakazi wa telegrafu katika karne ya 1800 walivyokaa karibu na mashine zao, tayari kujibu mara moja ujumbe utakapopita kwenye waya.
Kwa hivyo tukio ni nini hasa? Kwa urahisi, ni kitu kinachotokea! Unapobofya kitufe - hicho ni tukio. Unapoandika herufi - hicho ni tukio. Unaposogeza kipanya chako - hicho ni tukio kingine.
Kwa hivyo tukio ni nini hasa? Kwa ufupi, ni kitu kinachotokea! Unapobonyeza kitufe - hicho ni tukio. Unapobonyeza herufi - hicho ni tukio. Unapokusogeza panya - hicho ni tukio lingine.
Programu inayotegemea matukio inatuwezesha kuandaa msimbo wetu kusikiliza na kujibu. Tunaunda kazi maalum zinazoitwa **wasikilizaji wa matukio** ambazo husubiri kwa subira vitu maalum kutokea, kisha huanza kufanya kazi wakati vinapotokea.
Programu zinazoendeshwa na matukio zinaturuhusu kuandaa msimbo wetu kusikiliza na kujibu. Tunaunda kazi maalum zinazojulikana kama **wasikilizaji wa matukio** wanaosubiri kwa subira mambo maalum yatokee, kisha huchukua hatua wakati yanapotokea.
Fikiria wasikilizaji wa matukio kama kuwa na kengele ya mlango kwa msimbo wako. Unaweka kengele ya mlango (`addEventListener()`), unaiambia sauti gani isikilize (kama 'click' au 'keypress'), na kisha unataja nini kitokee mtu anapobonyeza kengele hiyo (kazi yako maalum).
Fikiria wasikilizaji wa matukio kama kuwa na dhooribell kwa msimbo wako. Unaweka dhooribell (`addEventListener()`), unaeleza sauti gani kusikiliza (kama 'click' au 'keypress'), na kisha unafafanua kinachotakiwa kutokea mtu akibonyeza dhooribell hiyo (kazi yako maalum).
**Hivi ndivyo wasikilizaji wa matukio hufanya kazi:**
- **Husikiliza** vitendo maalum vya mtumiaji kama kubofya, kuandika, au kusogeza kipanya
- **Hutekeleza** msimbo wako maalum tukio lililotajwa linapotokea
- **Huitikia** mara moja kwa maingiliano ya mtumiaji, kuunda uzoefu wa bila mshono
- **Hushughulikia** matukio mengi kwenye kipengele kimoja kwa kutumia wasikilizaji tofauti
- **Husikiliza** hatua za matumizi kama bonyeza, kubonyeza vitufe, au kusogeza panya
- **Hutekeleza** msimbo wako maalum wakati tukio linaloelezwa linapotokea
- **Hujibu** mara moja kwa mwingiliano wa mtumiaji, kuunda uzoefu usio na mshono
- **Hudumia** matukio mengi kwenye kipengele kimoja kwa wasikilizaji tofauti
> **NOTE:** Inafaa kuangazia kuna njia nyingi za kuunda wasikilizaji wa matukio. Unaweza kutumia kazi zisizo na majina, au kuunda zile zenye majina. Unaweza kutumia njia za mkato mbalimbali, kama kuweka mali ya `click`, au kutumia `addEventListener()`. Katika zoezi letu tutazingatia `addEventListener()` na kazi zisizo na majina, kwani ni mbinu inayotumiwa sana na watengenezaji wa wavuti. Pia ni rahisi zaidi, kwani `addEventListener()` inafanya kazi kwa matukio yote, na jina la tukio linaweza kutolewa kama parameter.
> **NOTE:** Inafaa kusisitiza kuna njia nyingi za kuunda wasikilizaji wa matukio. Unaweza kutumia kazi zisizo na majina, au kuunda zilizo na majina. Unaweza kutumia mbinu fupi kama kuweka sifa ya `click`, au kutumia `addEventListener()`. Katika mazoezi yetu tutazingatia `addEventListener()` na kazi zisizo na majina, kwani ni mbinu inayotumika zaidi na ni rahisi zaidi, kwa sababu `addEventListener()` hufanya kazi kwa matukio yote, na jina la tukio linaweza kutolewa kama kigezo.
### Matukio ya kawaida
Wakati vivinjari vya wavuti vinatoa matukio kadhaa tofauti unayoweza kusikiliza, programu nyingi za maingiliano hutegemea tu matukio machache muhimu. Kuelewa matukio haya ya msingi kutakupa msingi wa kujenga maingiliano ya mtumiaji ya hali ya juu.
Wakati vivinjari vya wavuti vinatoa matukio mengi tofauti unayoweza kusikiliza, programu nyingi za mwingiliano hutegemea idadi ndogo ya matukio muhimu. Kuelewa matukio haya ya msingi kutakupa msingi wa kuunda mwingiliano wa watumiaji yanayozidi kuwa ya hali ya juu.
Kuna [matukio kadhaa](https://developer.mozilla.org/docs/Web/Events) yanayopatikana kwako kusikiliza unapounda programu. Kimsingi chochote mtumiaji anachofanya kwenye ukurasa huinua tukio, ambalo linakupa nguvu nyingi kuhakikisha wanapata uzoefu unaotaka. Kwa bahati nzuri, kwa kawaida utahitaji matukio machache tu. Hapa kuna machache ya kawaida (pamoja na mawili tutakayoyatumia tunapounda mchezo wetu):
Kuna [matukio mengi](https://developer.mozilla.org/docs/Web/Events) unayoweza kusikiliza wakati unaunda programu. Kimsingi kitu chochote mtumiaji anachofanya ukurasa huhusisha tukio, kinachokupa nguvu kubwa kuhakikisha wanapata uzoefu unaotaka. Kwa bahati nzuri, mara nyingi unahitaji tu idadi ndogo ya matukio. Haya ni baadhi ya yanayotumika sana (pamoja na mawili tutakayoyatumia tunapounda mchezo wetu):
| Tukio | Maelezo | Matumizi ya Kawaida |
|-------|-------------|------------------|
| `click` | Mtumiaji alibofya kitu | Vitufe, viungo, vipengele vya maingiliano |
| `contextmenu` | Mtumiaji alibofya kipanya cha kulia | Menyu maalum za kubofya kulia |
| `select` | Mtumiaji alichagua maandishi fulani | Uhariri wa maandishi, operesheni za kunakili |
| `input` | Mtumiaji aliingiza maandishi fulani | Uthibitishaji wa fomu, utafutaji wa papo hapo |
| `click` | Mtumiaji amebonyeza kitu | Vitufe, viungo, vitu vinavyoingiliana |
| `contextmenu` | Mtumiaji amebonyeza kitufe cha kulia cha panya | Menyu za kubonyeza kulia maalum |
| `select` | Mtumiaji amechagua baadhi ya maandishi | Uhariri wa maandishi, nakala |
| `input` | Mtumiaji ameingiza maandishi | Uhakiki wa fomu, utafutaji wa papo hapo |
**Kuelewa aina hizi za matukio:**
- **Husababisha** wakati watumiaji wanapofanya maingiliano maalum kwenye ukurasa wako
- **Huchochea** wakati watumiaji wanaingiliana na vitu maalum kwenye ukurasa wako
- **Hutoa** taarifa za kina kuhusu kitendo cha mtumiaji kupitia vitu vya tukio
- **Huwezesha** kuunda programu za wavuti zinazotikia na za maingiliano
- **Hufanya kazi** kwa uthabiti kwenye vivinjari na vifaa tofauti
- **Huruhusu** kuunda programu za wavuti zinazojibu na kuingiliana
- **Hufanya kazi** kwa kuaminika katika vivinjari na vifaa tofauti
## Kuunda mchezo
Sasa kwa kuwa unaelewa jinsi matukio yanavyofanya kazi, hebu tuweke maarifa hayo katika vitendo kwa kujenga kitu cha manufaa. Tutaunda mchezo wa kasi ya kuandika unaoonyesha utunzaji wa matukio huku ukikusaidia kukuza ujuzi muhimu wa mtengenezaji.
Sasa umeelewa jinsi matukio yanavyofanya kazi, hebu tumia ujuzi huo kwa vitendo kwa kuunda kitu cha manufaa. Tutaunda mchezo wa kasi ya kuandika unaoonyesha usimamizi wa matukio huku ukikusaidia kukuza ujuzi muhimu wa msanidi programu.
Tunaenda kuunda mchezo ili kuchunguza jinsi matukio yanavyofanya kazi katika JavaScript. Mchezo wetu utajaribu ujuzi wa kuandika wa mchezaji, ambao ni mojawapo ya ujuzi unaopuuzwa sana ambao watengenezaji wote wanapaswa kuwa nao. Ukweli wa kufurahisha: mpangilio wa kibodi ya QWERTY tunayotumia leo ulitengenezwa katika miaka ya 1870 kwa mashine za kuandika - na ujuzi mzuri wa kuandika bado ni muhimu kwa watengenezaji leo! Mtiririko wa jumla wa mchezo utaonekana hivi:
Tutaunda mchezo kuchunguza jinsi matukio yanavyofanya kazi katika JavaScript. Mchezo wetu utapima ujuzi wa mtumiaji wa kuandika, ambao ni mojawapo ya ujuzi usiofahamuwa vya kutosha ambao waendelezaji wote wanapaswa kuwa nao. Ukweli wa kufurahisha: mpangilio wa kibodi wa QWERTY tunao tumia leo ulitengenezwa kweli miaka ya 1870 kwa mashine za kuandika - na ujuzi mzuri wa kuandika bado ni wa thamani kwa waandishi wa programu leo! Mzunguko wa jumla wa mchezo utakuwa kama huu:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
A[Mchezaji bonyeza Anza] --> B[Thibitisho la nasibu linaonyeshwa]
B --> C[Mchezaji anaandika kwenye kisanduku cha maandishi]
C --> D{Neno limekamilika?}
D -->|Ndiyo| E[Alama neno lifuatalo]
D -->|Hapana| F{Ni sahihi hadi sasa?}
F -->|Ndiyo| G[Endelea na mtindo wa kawaida]
F -->|Hapana| H[Onyesha mtindo wa makosa]
E --> I{Thibitisho limekamilika?}
I -->|Hapana| C
I -->|Ndiyo| J[Onyesha ujumbe wa mafanikio pamoja na muda]
G --> C
H --> C
```
**Hivi ndivyo mchezo wetu utakavyofanya kazi:**
- **Unaanza** wakati mchezaji anapobofya kitufe cha kuanza na kuonyesha nukuu ya nasibu
- **Unafuatilia** maendeleo ya kuandika ya mchezaji neno kwa neno papo hapo
- **Unasisitiza** neno la sasa ili kuelekeza umakini wa mchezaji
- **Unatoa** maoni ya kuona mara moja kwa makosa ya kuandika
- **Unahesabu** na kuonyesha muda wa jumla nukuu inapokamilika
- **Unaanza** mtumiaji anapobonyeza kitufe cha kuanza na kuonyesha nukuu ya nasibu
- **Hufuata** maendeleo ya mtu kuandika maneno moja baada ya jingine kwa wakati halisi
- **Huweka** neno linaloandikwa sasa kwa ajili ya kuzingatia mtumiaji
- **Hutoa** maoni ya mara moja kwa makosa ya uandishi
- **Hesabu** na onyesha jumla ya wakati pale nukuu inapokamilika
Hebu tujenge mchezo wetu, na tujifunze kuhusu matukio!
Hebu tuchangamke kujenga mchezo wetu, na kujifunza kuhusu matukio!
### Muundo wa faili
Kabla ya kuanza kuandika msimbo, hebu tuwe na mpangilio mzuri! Kuwa na muundo safi wa faili tangu mwanzo kutakuokoa kutoka kwa maumivu ya kichwa baadaye na kufanya mradi wako uwe wa kitaalamu zaidi. 😊
Kabla hatujaanza kuandika msimbo, hebu tuandike mpangilio! Kuwa na muundo safi wa faili tangu mwanzo kutakuokoa kichwa baadaye na kufanya mradi wako kuwa wa kitaalamu. 😊
Tutaweka mambo rahisi na faili tatu tu: `index.html` kwa muundo wa ukurasa wetu, `script.js` kwa mantiki yote ya mchezo wetu, na `style.css` ili kufanya kila kitu kionekane vizuri. Hii ni trio ya kawaida inayowezesha wavuti nyingi!
Tutafanya mambo kuwa rahisi na faili tatu tu: `index.html` kwa muundo wa ukurasa wetu, `script.js` kwa mantiki yote ya mchezo, na `style.css` kufanya kila kitu kiwe kivutio. Hii ni timu maarufu inayowezesha sehemu kubwa za wavuti!
**Unda folda mpya kwa kazi yako kwa kufungua console au dirisha la terminal na kutoa amri ifuatayo:**
**Unda folda mpya kwa ajili ya kazi yako kwa kufungua dirisha la console au terminal na kuingiza amri ifuatayo:**
```bash
# Linux or macOS
# Linux au macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Hivi ndivyo amri hizi zinavyofanya:**
- **Inaunda** saraka mpya inayoitwa `typing-game` kwa faili za mradi wako
- **Inasogeza** moja kwa moja kwenye saraka mpya iliyoundwa
- **Inaandaa** nafasi safi ya kazi kwa maendeleo ya mchezo wako
**Hivi ndivyo amri hizi zinavyofanya kazi:**
- **Unda** saraka mpya iitwayo `typing-game` kwa faili zako za mradi
- **Ingiza** saraka hiyo mpya moja kwa moja
- **Weka** mazingira safi ya kazi kwa ajili ya maendeleo ya mchezo wako
**Fungua Visual Studio Code:**
@ -119,37 +118,37 @@ code .
```
**Amri hii:**
- **Inazindua** Visual Studio Code katika saraka ya sasa
- **Inafungua** folda ya mradi wako kwenye mhariri
- **Inatoa** ufikiaji wa zana zote za maendeleo unazohitaji
- **Anzisha** Visual Studio Code kwenye saraka iliyo sasa
- **Fungua** folda ya mradi wako katika mhariri
- **Toa** upatikanaji wa zana zote za maendeleo utakazohitaji
**Ongeza faili tatu kwenye folda katika Visual Studio Code kwa majina yafuatayo:**
- `index.html` - Inayo muundo na maudhui ya mchezo wako
- `script.js` - Inashughulikia mantiki yote ya mchezo na wasikilizaji wa matukio
- `style.css` - Inafafanua mwonekano wa kuona na mtindo
**Ongeza faili tatu kwenye saraka hiyo katika Visual Studio Code kwa majina yafuatayo:**
- `index.html` - Ina muundo na maudhui ya mchezo wako
- `script.js` - Hudhibiti mantiki yote ya mchezo na wasikilizaji wa matukio
- `style.css` - Huweka muonekano wa kuona na mtindo
## Unda kiolesura cha mtumiaji
## Tengeneza kiolesura cha mtumiaji
Sasa hebu tujenge jukwaa ambapo hatua zote za mchezo wetu zitatokea! Fikiria hili kama kubuni jopo la kudhibiti kwa chombo cha anga - tunahitaji kuhakikisha kila kitu ambacho wachezaji wetu wanahitaji kiko mahali wanapotarajia kiwe.
Sasa hebu tujeleze jukwaa ambalo kila kitendo cha mchezo chetu kitafanyika! Fikiria hii kama kubuni paneli ya udhibiti kwa ajili ya meli ya anga - tunahitaji kuhakikisha kila kitu ambacho wachezaji wetu wanahitaji kipo mahali wanavyotarajia.
Hebu tuangalie ni nini mchezo wetu unahitaji. Ikiwa ungekuwa unacheza mchezo wa kuandika, ungependa kuona nini kwenye skrini? Hivi ndivyo tutakavyohitaji:
Hebu tufahamu mambo ambayo mchezo wetu unahitaji kweli. Ikiwa ungefanya mchezo wa kuandika, ungependa nini kuona kwenye skrini? Hivi ndivyo tutakavyohitaji:
| Kipengele cha UI | Kusudi | Kipengele cha HTML |
|------------------|--------|--------------------|
| Onyesho la Nukuu | Linaonyesha maandishi ya kuandika | `<p>` na `id="quote"` |
| Eneo la Ujumbe | Linaonyesha hali na ujumbe wa mafanikio | `<p>` na `id="message"` |
| Ingizo la Maandishi | Ambapo wachezaji wanaandika nukuu | `<input>` na `id="typed-value"` |
| Kitufe cha Kuanza | Kinaanzisha mchezo | `<button>` na `id="start"` |
|------------|---------|-------------|
| Onyesho la Nukuu | Inaonyesha maandishi ya kuandika | `<p>` na `id="quote"` |
| Eneo la Ujumbe | Inaonyesha hali na ujumbe wa mafanikio | `<p>` na `id="message"` |
| Kuingiza Maandishi | Mahali wachezaji wanaandika nukuu | `<input>` na `id="typed-value"` |
| Kitufe cha Kuanza | Huanzisha mchezo | `<button>` na `id="start"` |
**Kuelewa muundo wa UI:**
- **Inaandaa** maudhui kwa mantiki kutoka juu hadi chini
- **Inatoa** vitambulisho vya kipekee kwa vipengele kwa kulenga JavaScript
- **Inatoa** mpangilio wa kuona ulio wazi kwa uzoefu bora wa mtumiaji
- **Inajumuisha** vipengele vya HTML vya kimantiki kwa ufikivu
- **Panga** maudhui kwa mantiki kutoka juu hadi chini
- **Toa** vitambulisho maalum kwa vipengele kwa ajili ya lengo la JavaScript
- **Toa** uongozi wazi wa mtazamo kwa uzoefu mzuri wa mtumiaji
- **Jumuisha** vipengele vya HTML vya kihisia kwa upatikanaji
Kila moja ya hivi itahitaji vitambulisho ili tuweze kufanya kazi navyo katika JavaScript yetu. Pia tutaongeza marejeleo ya faili za CSS na JavaScript tunazotaka kuunda.
Kila moja ya hizo itahitaji IDs ili tuweze kushughulikia katika JavaScript yetu. Pia tutaongeza marejeleo kwa faili za CSS na JavaScript tutakazounda.
Unda faili mpya inayoitwa `index.html`. Ongeza HTML ifuatayo:
Unda faili jipya linaloitwa `index.html`. Ongeza HTML ifuatayo:
```html
<!-- inside index.html -->
@ -172,52 +171,52 @@ Unda faili mpya inayoitwa `index.html`. Ongeza HTML ifuatayo:
</html>
```
**Kufafanua kile muundo huu wa HTML unachokamilisha:**
- **Inaunganisha** stylesheet ya CSS kwenye `<head>` kwa mtindo
- **Inaunda** kichwa wazi na maelekezo kwa watumiaji
- **Inaanzisha** aya za nafasi na vitambulisho maalum kwa maudhui ya nguvu
- **Inajumuisha** uwanja wa ingizo na sifa za ufikivu
- **Inatoa** kitufe cha kuanza kuanzisha mchezo
- **Inapakia** faili ya JavaScript mwishoni kwa utendaji bora
**Kuvunja kile muundo huu wa HTML unachofanikisha:**
- **Unganisha** karatasi ya mtindo ya CSS ndani ya `<head>` kwa mtindo
- **Unda** kichwa wazi na maelekezo kwa watumiaji
- **Weka** aya za ajira na IDs maalum kwa maudhui ya mabadiliko
- **Jumuisha** uwanja wa kuingiza na sifa za upatikanaji
- **Toa** kitufe cha kuanza ili kuanzisha mchezo
- **Pakia** faili ya JavaScript mwishoni kwa ufanisi bora
### Zindua programu
### Anzisha programu
Kuijaribu programu yako mara kwa mara wakati wa maendeleo hukusaidia kugundua masuala mapema na kuona maendeleo yako papo hapo. Live Server ni zana ya thamani sana ambayo huonyesha upya kivinjari chako kila unapohifadhi mabadiliko, na kufanya maendeleo kuwa bora zaidi.
Kujaribu programu yako mara kwa mara wakati wa maendeleo kunakusaidia kugundua matatizo mapema na kuona maendeleo yako papo hapo. Live Server ni zana ya thamani inayoendelea kusasisha kivinjari chako kila mara unapo hifadhi mabadiliko, hivyo kuongeza ufanisi kwa maendeleo.
Ni bora kila wakati kuendeleza hatua kwa hatua ili kuona jinsi mambo yanavyoonekana. Hebu tuzindue programu yetu. Kuna kiendelezi kizuri cha Visual Studio Code kinachoitwa [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) ambacho kitaendesha programu yako kwa ndani na kuonyesha upya kivinjari kila unapohifadhi.
Daima ni bora kuendeleza hatua kwa hatua kuona jinsi mambo yanavyoonekana. Hebu tuzindue programu yetu. Kuna upanuzi mzuri wa Visual Studio Code unaoitwa [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) ambao utakuhudumia programu yako mahali hapa na kusasisha kivinjari kwa kila hifadhi.
**Sakinisha [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) kwa kufuata kiungo na kubofya Sakinisha:**
**Sakinisha [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) kwa kufuata kiungo na kubonyeza Install:**
**Hivi ndivyo kinachotokea wakati wa usakinishaji:**
- **Inachochea** kivinjari chako kufungua Visual Studio Code
- **Inaelekeza** kupitia mchakato wa usakinishaji wa kiendelezi
- **Inaweza kuhitaji** kuwasha upya Visual Studio Code ili kukamilisha usanidi
**Hivi ndivyo inavyotokea wakati wa usakinishaji:**
- **Inakuomba** kivinjari wako kufungua Visual Studio Code
- **Inakuongoza** kupitia mchakato wa usakinishaji wa upanuzi
- **Inaweza kuhitaji** kuwasha upya Visual Studio Code ili kukamilisha
**Mara baada ya kusakinishwa, katika Visual Studio Code, bofya Ctrl-Shift-P (au Cmd-Shift-P) kufungua paleti ya amri:**
**Mara baada ya kusakinishwa, ndani ya Visual Studio Code, bonyeza Ctrl-Shift-P (au Cmd-Shift-P) kufungua menyu ya amri:**
**Kuelewa paleti ya amri:**
- **Inatoa** ufikiaji wa haraka kwa amri zote za VS Code
- **Inatafuta** amri unapoandika
**Kuelewa menyu ya amri:**
- **Inatoa** upatikanaji wa haraka kwa amri zote za VS Code
- **Inatafuta** amri wakati unavyoandika
- **Inatoa** njia za mkato za kibodi kwa maendeleo ya haraka
**Andika "Live Server: Open with Live Server":**
**Kile Live Server inachofanya:**
- **Inaanzisha** seva ya maendeleo ya ndani kwa mradi wako
- **Inaonyesha upya** kivinjari kiotomatiki unapohifadhi faili
- **Inahudumia** faili zako kutoka URL ya ndani (kawaida `localhost:5500`)
**Kile Live Server hufanya:**
- **Anzisha** seva ya maendeleo ya ndani kwa mradi wako
- **Husasisha** kivinjari moja kwa moja unapohifadhi faili
- **Inatumikia** faili zako kutoka URL ya ndani (kawaida `localhost:5500`)
**Fungua kivinjari na nenda kwenye `https://localhost:5500`:**
**Fungua kivinjari na nenda `https://localhost:5500`:**
Sasa unapaswa kuona ukurasa uliouunda! Hebu tuongeze utendaji fulani.
Sasa unapaswa kuona ukurasa uliouunda! Hebu tukae tukaongeze utendaji.
## Ongeza CSS
Sasa hebu tufanye mambo yaonekane vizuri! Maoni ya kuona yamekuwa muhimu kwa kiolesura cha mtumiaji tangu siku za mwanzo za kompyuta. Katika miaka ya 1980, watafiti waligundua kuwa maoni ya kuona ya papo hapo yanaboresha sana utendaji wa mtumiaji na kupunguza makosa. Hiyo ndiyo hasa tunayotaka kuunda.
Sasa hebu tufanye mambo yaoneke vizuri! Maoni ya kuona yamekuwa muhimu kwa violesura vya mtumiaji tangu mwanzo wa kompyuta. Katika miaka ya 1980, watafiti waligundua kuwa maoni ya papo hapo ya kuona huongeza utendaji wa mtumiaji na kupunguza makosa kwa kiasi kikubwa. Hicho ndivyo hasa tutakachounda.
Mchezo wetu unahitaji kuwa wazi kabisa kuhusu kinachotokea. Wachezaji wanapaswa kujua mara moja ni neno gani wanapaswa kuandika, na wakifanya kosa, wanapaswa kuliona mara moja. Hebu tuunde mtindo rahisi lakini mzuri:
Mchezo wetu unahitaji kuwa wazi kabisa kuhusu kinachotokea. Wachezaji wanapaswa mara moja kujua neno wanapaswa kuandika, na wakifanya kosa, wanapaswa kuliona mara moja. Hebu tengeneze mtindo rahisi lakini wenye ufanisi:
Unda faili mpya inayoitwa `style.css` na ongeza sintaksia ifuatayo.
Unda faili mpya linaloitwa `style.css` na ongeza sintaksia ifuatayo.
```css
/* inside style.css */
@ -232,59 +231,59 @@ Unda faili mpya inayoitwa `style.css` na ongeza sintaksia ifuatayo.
```
**Kuelewa madarasa haya ya CSS:**
- **Inasisitiza** neno la sasa kwa mandharinyuma ya rangi ya manjano kwa mwongozo wa kuona wazi
- **Inaashiria** makosa ya kuandika kwa rangi ya mandharinyuma ya coral nyepesi
- **Inatoa** maoni ya papo hapo bila kuvuruga mtiririko wa kuandika wa mtumiaji
- **Inatumia** rangi zinazotofautiana kwa ufikivu na mawasiliano ya kuona wazi
- **Huangazia** neno linaloandikwa kwa sasa kwa msingi wa njano kwa mwongozo wa kuona
- **Hutoa ishara** za makosa ya kuandika kwa rangi ya kuvutia ya coral nyepesi
- **Hutoa maoni** ya papo hapo bila kuathiri mtiririko wa kuandika wa mtumiaji
- **Inatumia** rangi zinazopinga kwa upatikanaji na mawasiliano wazi ya kuona
✅ Kuhusu CSS unaweza kupanga ukurasa wako jinsi unavyopenda. Chukua muda kidogo na ufanye ukurasa uonekane wa kuvutia:
✅ Kuhusu CSS unaweza kupanga ukurasa wako kwa njia yoyote unayopenda. Chukua muda kidogo na fanya ukurasa uonekane kuvutia zaidi:
- Chagua fonti tofauti
- Paka rangi vichwa
- Tia rangi vichwani
- Badilisha ukubwa wa vitu
## JavaScript
Hapa ndipo mambo yanapokuwa ya kuvutia! 🎉 Tuna muundo wetu wa HTML na mtindo wa CSS, lakini kwa sasa mchezo wetu ni kama gari zuri bila injini. JavaScript itakuwa injini hiyo - ndiyo inafanya kila kitu kifanye kazi na kuitikia kile wachezaji wanachofanya.
Hapa ndipo mambo yanapoanza kuvutia! 🎉 Tuna muundo wa HTML na mtindo wa CSS, lakini kwa sasa mchezo wetu ni kama gari zuri bila injini. JavaScript itakuwa injini hiyo - ndicho kinachofanya kila kitu kifanye kazi na kujibu kile wachezaji hufanya.
Hapa ndipo utaona uumbaji wako ukija hai. Tutaangazia hatua kwa hatua ili usihisi kuzidiwa:
Hapa ndipo utaona uumbaji wako ukiamka kwa uhai. Tutaenda hatua kwa hatua ili usihisi mzigo:
| Hatua | Kusudi | Unachojifunza |
| Hatua | Kusudi | Kile Utakachojifunza |
|------|---------|------------------|
| [Unda constants](../../../../4-typing-game/typing-game) | Sanidi nukuu na marejeleo ya DOM | Usimamizi wa vigezo na uteuzi wa DOM |
| [Wasikilizaji wa matukio kuanza mchezo](../../../../4-typing-game/typing-game) | Shughulikia uanzishaji wa mchezo | Utunzaji wa matukio na masasisho ya UI |
| [Wasikilizaji wa matukio ya kuandika](../../../../4-typing-game/typing-game) | Shughulikia ingizo la mtumiaji papo hapo | Uthibitishaji wa ingizo na maoni ya nguvu |
| [Unda constants](../../../../4-typing-game/typing-game) | Panga nukuu na marejeleo ya DOM | Usimamizi wa variable na uchaguzi wa DOM |
| [Msikilizaji wa tukio kuanzisha mchezo](../../../../4-typing-game/typing-game) | Shughulikia kuanzishwa kwa mchezo | Usimamizi wa tukio na masasisho ya UI |
| [Msikilizaji wa tukio la uandishi](../../../../4-typing-game/typing-game) | Chakata ingizo la mtumiaji kwa wakati halisi | Uthibitishaji wa ingizo na maoni ya nguvu |
**Mbinu hii iliyopangwa inakusaidia:**
- **Kupanga** msimbo wako katika sehemu za kimantiki na zinazoweza kudhibitiwa
- **Kujenga** utendaji hatua kwa hatua kwa urahisi wa kurekebisha makosa
- **Kuelewa** jinsi sehemu tofauti za programu yako zinavyofanya kazi pamoja
- **Kuunda** mifumo inayoweza kutumika tena kwa miradi ya baadaye
**Njia hii ya muundo hukusaidia:**
- **Pangilia** msimbo wako katika sehemu za mantiki, rahisi kusimamia
- **Jenga** utendaji kidogo kidogo kwa urahisi wa kutatua matatizo
- **Elewa** jinsi sehemu tofauti za programu yako zinavyofanya kazi pamoja
- **Tengeneza** mifumo ya matumizi ya baadaye
Lakini kwanza, unda faili mpya inayoitwa `script.js`.
Lakini kwanza, unda faili mpya linaloitwa `script.js`.
### Ongeza constants
Kabla ya kuingia kwenye hatua, hebu tukusanye rasilimali zetu zote! Kama vile jinsi kituo cha udhibiti wa misheni cha NASA kinavyoseti mifumo yao yote ya ufuatiliaji kabla ya uzinduzi, ni rahisi zaidi unapokuwa na kila kitu kimeandaliwa na tayari. Hii inatuokoa kutoka kwa kutafuta vitu baadaye na husaidia kuzuia makosa ya maandishi.
Kabla hatujaingia kwenye hatua, hebu tuchukue rasilimali zetu zote! Kama vile maafisa wa NASA wanavyounda mifumo yao ya ufuatiliaji kabla ya uzinduzi, ni rahisi sana unapokuwa na kila kitu kimeandaliwa tayari. Hii hutuhifadhi kutoka kwenye shaka na hupunguza makosa ya kuandika.
Hivi ndivyo tunavyohitaji kuandaa kwanza:
Hapa kuna tunachotakiwa kuweka kwanza:
| Aina ya Data | Kusudi | Mf
| Array ya nukuu | Hifadhi nukuu zote zinazowezekana kwa mchezo | `['Nukuu 1', 'Nukuu 2', ...]` |
| Kundi la maneno | Gawanya nukuu ya sasa katika maneno ya pekee | `['Wakati', 'wewe', 'una', ...]` |
| Kielezo cha maneno | Fuatilia neno ambalo mchezaji anaandika | `0, 1, 2, 3...` |
| Muda wa kuanza | Hesabu muda uliopita kwa ajili ya alama | `Date.now()` |
| Aina ya Data | Kusudi | Mfano |
| Array of quotes | Hifadhi nukuu zote zinazowezekana kwa mchezo | `['Quote 1', 'Quote 2', ...]` |
| Word array | Gawanya nukuu ya sasa kuwa maneno binafsi | `['When', 'you', 'have', ...]` |
| Word index | Fuata ni neno gani mchezaji anaandika | `0, 1, 2, 3...` |
| Start time | Hesabu muda uliopita kwa ajili ya pointi | `Date.now()` |
**Tutahitaji pia marejeleo ya vipengele vya UI vyetu:**
| Kipengele | ID | Kusudi |
|-----------|----|--------|
| Ingizo la maandishi | `typed-value` | Ambapo wachezaji wanaandika |
**Pia tutahitaji rejea kwa vipengele vyetu vya UI:**
| Element | ID | Kusudi |
|---------|----|---------|
| Ingizo la maandishi | `typed-value` | Mahali ambapo wachezaji wanaandika |
| Onyesho la nukuu | `quote` | Inaonyesha nukuu ya kuandika |
| Eneo la ujumbe | `message` | Inaonyesha masasisho ya hali |
```javascript
// inside script.js
// all of our quotes
// ndani ya script.js
// nukuu zetu zote
const quotes = [
'When you have eliminated the impossible, whatever remains, however improbable, must be the truth.',
'There is nothing more deceptive than an obvious fact.',
@ -294,143 +293,143 @@ const quotes = [
'Nothing clears up a case so much as stating it to another person.',
'Education never ends, Watson. It is a series of lessons, with the greatest for the last.',
];
// store the list of words and the index of the word the player is currently typing
// hifadhi orodha ya maneno na nambari ya neno ambalo mchezaji analiandika kwa sasa
let words = [];
let wordIndex = 0;
// the starting time
// wakati wa kuanzia
let startTime = Date.now();
// page elements
// vipengele vya ukurasa
const quoteElement = document.getElementById('quote');
const messageElement = document.getElementById('message');
const typedValueElement = document.getElementById('typed-value');
```
**Kufafanua kile ambacho msimbo huu wa kuanzisha unakamilisha:**
- **Huhifadhi** kundi la nukuu za Sherlock Holmes kwa kutumia `const` kwa sababu nukuu hazitabadilika
- **Huanza** kufuatilia vigezo kwa kutumia `let` kwa sababu thamani hizi zitabadilika wakati wa mchezo
- **Huchukua** marejeleo ya vipengele vya DOM kwa kutumia `document.getElementById()` kwa ufikiaji wa haraka
- **Huandaa** msingi wa utendaji wa mchezo wote kwa majina ya vigezo yaliyo wazi na ya kuelezea
- **Hupanga** data na vipengele vinavyohusiana kwa mantiki kwa urahisi wa matengenezo ya msimbo
**Kuvunja kile ambacho msimbo huu wa mpangilio hufanikisha:**
- **Hifadhi** safu ya nukuu za Sherlock Holmes kwa kutumia `const` kwa sababu nukuu hazitabadilika
- **Anzisha** vigezo vya ufuatiliaji kwa kutumia `let` kwa sababu thamani hizi zitabadilika wakati wa mchezo
- **Kamata** rejea kwa vipengele vya DOM kwa kutumia `document.getElementById()` kwa upatikanaji mzuri
- **Weka msingi** wa utendakazi wote wa mchezo kwa majina ya vigezo yenye maelezo wazi
- **Panga** data na vipengele vinavyohusiana kwa mpangilio wa mantiki kwa ajili ya matengenezo rahisi ya msimbo
✅ Endelea na ongeza nukuu zaidi kwenye mchezo wako
> 💡 **Kidokezo cha Kitaalamu**: Tunaweza kupata vipengele wakati wowote tunapotaka kwenye msimbo kwa kutumia `document.getElementById()`. Kwa sababu tutarejelea vipengele hivi mara kwa mara, tutakwepa makosa ya herufi kwa kutumia vigezo vya kudumu. Mfumo kama [Vue.js](https://vuejs.org/) au [React](https://reactjs.org/) unaweza kukusaidia kusimamia msimbo wako kwa urahisi zaidi.
> 💡 **Mshauri Mzuri**: Tunaweza kupata vipengele wakati wowote tunapotaka katika msimbo kwa kutumia `document.getElementById()`. Kwa sababu tutarejea vipengele hivi mara kwa mara tutazingatia makosa ya tahajia kwa kutumia constants. Mfumo kama [Vue.js](https://vuejs.org/) au [React](https://reactjs.org/) unaweza kusaidia kusimamia msimbo wako kwa kituo kimoja.
>
**Kwa nini mbinu hii inafanya kazi vizuri:**
- **Huzuia** makosa ya herufi wakati wa kurejelea vipengele mara nyingi
- **Huboresha** usomaji wa msimbo kwa majina ya vigezo yaliyoelezea
- **Huwezesha** msaada bora wa IDE kwa kukamilisha kiotomatiki na ukaguzi wa makosa
- **Hufanya** mabadiliko ya msimbo kuwa rahisi ikiwa ID za vipengele zitabadilika baadaye
**Hapa ndiyo sababu njia hii inafanya kazi vizuri sana:**
- **Zuia** makosa ya tahajia wakati wa kurejea vipengele mara nyingi
- **Boresha** usomaji wa msimbo kwa majina ya constants yenye maelezo
- **Wezesha** msaada bora wa IDE na ukamilishaji wa msimbo na ukaguzi wa makosa
- **Fanya** urahisi wa kurekebisha msimbo ikiwa ID za vipengele zitabadilika baadaye
Chukua dakika moja kutazama video kuhusu kutumia `const`, `let` na `var`
Chukua dakika kuangalia video ya matumizi ya `const`, `let` na `var`
[![Aina za vigezo](https://img.youtube.com/vi/JNIXfGiDWM8/0.jpg)](https://youtube.com/watch?v=JNIXfGiDWM8 "Aina za vigezo")
> 🎥 Bofya picha hapo juu kwa video kuhusu vigezo.
> 🎥 Bonyeza picha hapo juu kwa video kuhusu vigezo.
### Ongeza mantiki ya kuanza
Hapa ndipo kila kitu kinapokamilika! 🚀 Unakaribia kuandika msikilizaji wa tukio halisi, na kuna kitu kinachoridhisha sana kuhusu kuona msimbo wako ukijibu kubofya kwa kitufe.
Hapa ndipo kila kitu kinaungana! 🚀 Unakaribia kuandika msikilizaji wa tukio la kweli la kwanza, na kuna kitu kinachoridhisha sana kuona msimbo wako ukijibu bonyeza la kitufe.
Fikiria: mahali fulani, mchezaji atabofya kitufe cha "Anza", na msimbo wako unahitaji kuwa tayari kwao. Hatuna wazo watakapobofya - inaweza kuwa mara moja, inaweza kuwa baada ya kuchukua kahawa - lakini watakapofanya hivyo, mchezo wako utaanza.
Fikiria hivi: mahali fulani, mchezaji atabonyeza kitufe cha "Anza", na msimbo wako unahitaji kuwa tayari kwao. Hatujui lini watabonyeza - inaweza kuwa mara moja, inaweza kuwa baada ya kupata kahawa - lakini wanapofanya hivyo, mchezo wako unaanza.
Wakati mtumiaji anapobofya `start`, tunahitaji kuchagua nukuu, kuandaa kiolesura cha mtumiaji, na kuandaa ufuatiliaji wa neno la sasa na muda. Hapo chini kuna JavaScript unayohitaji kuongeza; tunajadili baada ya kizuizi cha msimbo.
Mara mteja atabonyeza `start`, tunahitaji kuchagua nukuu, kupanga interface ya mtumiaji, na kuweka ufuatiliaji wa neno la sasa na muda. Hapa chini ni JavaScript utakayohitaji kuongeza; tunajadili baada ya blokki ya script.
```javascript
// at the end of script.js
// mwishoni mwa script.js
document.getElementById('start').addEventListener('click', () => {
// get a quote
// pata nukuu
const quoteIndex = Math.floor(Math.random() * quotes.length);
const quote = quotes[quoteIndex];
// Put the quote into an array of words
// Weka nukuu ndani ya orodha ya maneno
words = quote.split(' ');
// reset the word index for tracking
// futa kiashiria cha neno kwa ajili ya kufuatilia
wordIndex = 0;
// UI updates
// Create an array of span elements so we can set a class
// masasisho ya UI
// Unda orodha ya vipengele vya span ili tuweze kuweka darasa
const spanWords = words.map(function(word) { return `<span>${word} </span>`});
// Convert into string and set as innerHTML on quote display
// Badilisha kuwa mfuatano wa herufi na weka kama innerHTML kwenye onyesho la nukuu
quoteElement.innerHTML = spanWords.join('');
// Highlight the first word
// Toa mwanga kwa neno la kwanza
quoteElement.childNodes[0].className = 'highlight';
// Clear any prior messages
// Safisha ujumbe wowote wa awali
messageElement.innerText = '';
// Setup the textbox
// Clear the textbox
// Andaa kisanduku cha maandishi
// Safisha kisanduku cha maandishi
typedValueElement.value = '';
// set focus
// weka umakini
typedValueElement.focus();
// set the event handler
// weka mshughulikiaji wa matukio
// Start the timer
// Anza kengele ya muda
startTime = new Date().getTime();
});
```
**Hebu tufafanue msimbo katika sehemu za kimantiki:**
**Tuvunje msimbo katika sehemu za mantiki:**
**📊 Ufuatiliaji wa Maneno:**
- **Huchagua** nukuu ya nasibu kwa kutumia `Math.floor()` na `Math.random()` kwa utofauti
- **Hubadilisha** nukuu kuwa kundi la maneno ya pekee kwa kutumia `split(' ')`
- **Huanza upya** `wordIndex` hadi 0 kwa kuwa wachezaji huanza na neno la kwanza
- **Huandaa** hali ya mchezo kwa raundi mpya
**📊 Mpangilio wa Ufuatiliaji wa Maneno:**
- **Chagua** nukuu ya bahati nasibu kwa kutumia `Math.floor()` na `Math.random()` kwa utofauti
- **Badilisha** nukuu kuwa safu ya maneno binafsi kwa kutumia `split(' ')`
- **Rejesha** `wordIndex` hadi 0 kwa sababu wachezaji huanza na neno la kwanza
- **Tayarisha** hali ya mchezo kwa raundi mpya
**🎨 Muundo wa UI na Onyesho:**
- **Huunda** kundi la vipengele vya `<span>`, likifunika kila neno kwa muundo wa pekee
- **Huunganisha** vipengele vya span kuwa mnyororo mmoja kwa ajili ya kusasisha DOM kwa ufanisi
- **Huangazia** neno la kwanza kwa kuongeza darasa la CSS `highlight`
- **Husafisha** ujumbe wowote wa mchezo uliopita ili kutoa mwanzo safi
**🎨 Mpangilio wa UI na Onyesho:**
- **Tengeneza** safu ya vipengele vya `<span>`, uzungushe kila neno kwa mtindo wa binafsi
- **Unganisha** vipengele vya span kuwa mfuatano mmoja kwa ajili ya kuboresha ufanisi wa kusasisha DOM
- **Toa mwangaza** kwa neno la kwanza kwa kuongeza darasa la CSS `highlight`
- **Futa** ujumbe wowote wa mchezo uliopita ili kutoa mwonekano safi
**⌨️ Maandalizi ya Kisanduku cha Maandishi:**
- **Husafisha** maandishi yoyote yaliyopo kwenye kisanduku cha ingizo
- **Huweka umakini** kwenye kisanduku cha maandishi ili wachezaji waanze kuandika mara moja
- **Huandaa** eneo la ingizo kwa kikao kipya cha mchezo
**⌨️ Maandalizi ya Sanduku la Maandishi:**
- **Futa** maandishi yoyote yaliyopo kwenye sehemu ya ingizo
- **Weka fokus** kwenye sanduku la maandishi ili wachezaji waanze kuandika mara moja
- **Tayarisha** eneo la ingizo kwa ajili ya kikao kipya cha mchezo
**⏱️ Uanzishaji wa Kipima Muda:**
- **Huchukua** alama ya muda ya sasa kwa kutumia `new Date().getTime()`
- **Huwezesha** hesabu sahihi ya kasi ya kuandika na muda wa kukamilisha
- **Huanza** ufuatiliaji wa utendaji kwa kikao cha mchezo
**⏱️ Anzishaji la Kipimo cha Muda:**
- **Kamata** saa ya sasa kwa kutumia `new Date().getTime()`
- **Wezesha** hesabu sahihi ya kasi ya kuandika na muda wa kumaliza
- **Anzisha** ufuatiliaji wa utendaji kwa kipindi cha mchezo
### Ongeza mantiki ya kuandika
Hapa ndipo tunashughulikia moyo wa mchezo wetu! Usijali ikiwa hii inaonekana kuwa nyingi mwanzoni - tutapitia kila kipande, na mwishowe, utaona jinsi ilivyo mantiki.
Hapa ndipo tunakabiliana na moyo wa mchezo wetu! Usijali kama hii inaonekana ngumu mwanzoni - tutapitia kila kipande, na mwishowe, utaelewa jinsi ilivyo ya mantiki.
Tunachojenga hapa ni cha kisasa kabisa: kila wakati mtu anapoandika herufi, msimbo wetu utachunguza kile walichoandika, kuwapa maoni, na kuamua nini kinapaswa kutokea baadaye. Ni sawa na jinsi programu za maneno za mapema kama WordStar katika miaka ya 1970 zilivyotoa maoni ya wakati halisi kwa waandishi.
Tunachojenga hapa ni hali ya hali ya juu: kila mara mtu anapoandika herufi, msimbo wetu utaangalia alichoandika, kuwatumia mrejesho, na kuamua kinachofuata. Hii ni sawa na jinsi programu za mapema za kuandika kama WordStar katika miaka ya 1970 zilivyotoa mrejesho wa wakati halisi kwa waandishi.
```javascript
// at the end of script.js
// mwishoni mwa script.js
typedValueElement.addEventListener('input', () => {
// Get the current word
// Pata neno la sasa
const currentWord = words[wordIndex];
// get the current value
// pata thamani ya sasa
const typedValue = typedValueElement.value;
if (typedValue === currentWord && wordIndex === words.length - 1) {
// end of sentence
// Display success
// mwisho wa sentensi
// Onyesha mafanikio
const elapsedTime = new Date().getTime() - startTime;
const message = `CONGRATULATIONS! You finished in ${elapsedTime / 1000} seconds.`;
messageElement.innerText = message;
} else if (typedValue.endsWith(' ') && typedValue.trim() === currentWord) {
// end of word
// clear the typedValueElement for the new word
// mwisho wa neno
// futa typedValueElement kwa neno jipya
typedValueElement.value = '';
// move to the next word
// hamia kwenye neno lifuatalo
wordIndex++;
// reset the class name for all elements in quote
// weka upya jina la darasa kwa vitu vyote katika nukuu
for (const wordElement of quoteElement.childNodes) {
wordElement.className = '';
}
// highlight the new word
// washa neno jipya
quoteElement.childNodes[wordIndex].className = 'highlight';
} else if (currentWord.startsWith(typedValue)) {
// currently correct
// highlight the next word
// sasa hivi sahihi
// washa neno lifuatalo
typedValueElement.className = '';
} else {
// error state
// hali ya kosa
typedValueElement.className = 'error';
}
});
@ -438,117 +437,176 @@ typedValueElement.addEventListener('input', () => {
**Kuelewa mtiririko wa mantiki ya kuandika:**
Kazi hii hutumia mbinu ya mfululizo, ikichunguza hali kutoka maalum zaidi hadi ya jumla zaidi. Hebu tufafanue kila hali:
Kazi hii inatumia mbinu ya mtiririko wa hali, ikikagua masharti kutoka mahali panapobainika vizuri hadi pana zaidi. Tuvunje kila tukio:
```mermaid
flowchart TD
A[Player types character] --> B[Get current word and typed value]
B --> C{Quote complete?}
C -->|Yes| D[Show completion message with time]
C -->|No| E{Word complete with space?}
E -->|Yes| F[Clear input, move to next word, update highlight]
E -->|No| G{Typing correctly so far?}
G -->|Yes| H[Remove error styling]
G -->|No| I[Show error styling]
A[Mchezaji anaandika herufi] --> B[Pata neno la sasa na thamani iliyowekwa]
B --> C{Nukuu imekamilika?}
C -->|Ndiyo| D[Onyesha ujumbe wa kukamilisha na muda]
C -->|Hapana| E{Neno limekamilika kwa nafasi?}
E -->|Ndiyo| F[Futa ingizo, nenda kwenye neno linalofuata, sasisha msisitizo]
E -->|Hapana| G{Unaandika vizuri hadi sasa?}
G -->|Ndiyo| H[Ondoa mtindo wa kosa]
G -->|Hapana| I[Onyesha mtindo wa kosa]
```
**🏁 Nukuu Imekamilika (Hali ya 1):**
- **Huchunguza** ikiwa thamani iliyoandikwa inalingana na neno la sasa NA tuko kwenye neno la mwisho
- **Huhesabu** muda uliopita kwa kutoa muda wa kuanza kutoka muda wa sasa
- **Hubadilisha** milisekunde kuwa sekunde kwa kugawa kwa 1,000
- **Huonyesha** ujumbe wa pongezi na muda wa kukamilisha
**✅ Neno Limekamilika (Hali ya 2):**
- **Hugundua** kukamilika kwa neno wakati ingizo linaishia na nafasi
- **Huhakiki** kwamba ingizo lililokatwa linalingana na neno la sasa kabisa
- **Husafisha** kisanduku cha ingizo kwa neno linalofuata
- **Husonga mbele** hadi neno linalofuata kwa kuongeza `wordIndex`
- **Husasisha** muonekano wa kuangazia kwa kuondoa madarasa yote na kuangazia neno jipya
**📝 Kuandika Kwa Mchakato (Hali ya 3):**
- **Huhakikisha** kwamba neno la sasa linaanza na kile kilichoandikwa hadi sasa
- **Huondoa** muundo wowote wa makosa ili kuonyesha ingizo ni sahihi
- **Huruhusu** kuendelea kuandika bila usumbufu
**❌ Hali ya Makosa (Hali ya 4):**
- **Husababisha** wakati maandishi yaliyoandikwa hayalingani na mwanzo wa neno linalotarajiwa
- **Hutumia** darasa la CSS la makosa ili kutoa maoni ya haraka ya kuona
- **Husaidia** wachezaji kutambua na kurekebisha makosa haraka
**🏁 Nukuu Imekamilika (Tukio la 1):**
- **Angalia** kama maadili yaliyotangazwa yanaendana na neno la sasa NA tuko kwenye neno la mwisho
- **Hesabu** muda uliopita kwa kutoa muda wa kuanza kutoka kwa saa ya sasa
- **Badilisha** millisekunde kuwa sekunde kwa kugawanya kwa 1,000
- **Onyesha** ujumbe wa pongezi na muda wa kumaliza
**✅ Neno Limekamilika (Tukio la 2):**
- **Gundua** kukamilika kwa neno wakati ingizo limeshuhudia nafasi mwishoni
- **Thibitisha** kuwa ingizo lililokataliwa linaendana na neno la sasa kabisa
- **Futa** sehemu ya ingizo kwa neno lijalo
- **Endeleza** kwenda kwa neno lijalo kwa kuongeza `wordIndex`
- **Sasisha** mwangaza wa kuona kwa kuondoa madarasa yote na kuangazia neno jipya
**📝 Kuandika Inaendelea (Tukio la 3):**
- **Thibitisha** kuwa neno la sasa linaanzia yale yaliyoandikwa hadi sasa
- **Ondoa** mtindo wa kosa ili kuonyesha ingizo ni sahihi
- **Ruhusu** kuendelea kuandika bila kuzuiwa
**❌ Hali ya Kosa (Tukio la 4):**
- **Anzisha** wakati maandishi yaliyoandikwa hayaendani na mwanzo wa neno linalotarajiwa
- **Ongeza** darasa la CSS la kosa kutoa mrejesho wa kuona papo hapo
- **Msaidia** wachezaji kutambua na kurekebisha makosa haraka
## Jaribu programu yako
Tazama ulichofanikiwa! 🎉 Umejenga mchezo halisi wa kuandika kutoka mwanzo kwa kutumia programu inayotegemea matukio. Chukua muda kuthamini hilo - hili si jambo dogo!
Tazama umefanya nini! 🎉 Umeunda mchezo halisi wa kuandika kutoka mwanzo kwa kutumia uendeshaji wa matukio. Chukua muda kushukuru hilo - si kazi ndogo!
Sasa ni awamu ya majaribio! Je, itafanya kazi kama inavyotarajiwa? Je, tulikosa kitu? Hili ndilo jambo: ikiwa kitu hakifanyi kazi kikamilifu mara moja, hilo ni jambo la kawaida kabisa. Hata watengenezaji wenye uzoefu hupata hitilafu katika msimbo wao mara kwa mara. Ni sehemu ya mchakato wa maendeleo!
Sasa ni wakati wa kupima! Je, itafanya kazi kama inavyotarajiwa? Je, tumepoteza kitu? Hii ni kweli: ikiwa kitu hakitafanyika kikamilifu mara moja, ni kawaida sana. Hata waendeshaji wa programu wenye uzoefu hupata makosa katika msimbo wao mara kwa mara. Ni sehemu ya mchakato wa maendeleo!
Bofya `start`, na anza kuandika! Inapaswa kuonekana kama uhuishaji tuliouona hapo awali.
Bonyeza `start`, na anza kuandika! Inapaswa kuonekana kama mhuisho tulioona awali.
![Uhuishaji wa mchezo ukiwa kazini](../../../../4-typing-game/images/demo.gif)
![Animation of the game in action](../../../../4-typing-game/images/demo.gif)
**Nini cha kujaribu katika programu yako:**
- **Huhakikisha** kwamba kubofya Anza kunaonyesha nukuu ya nasibu
- **Huthibitisha** kwamba kuandika kunaangazia neno la sasa kwa usahihi
- **Huchunguza** kwamba muundo wa makosa unaonekana kwa kuandika vibaya
- **Huhakikisha** kwamba kukamilisha maneno kunasonga mbele kwa kuangazia kwa usahihi
- **Hujaribu** kwamba kumaliza nukuu kunaonyesha ujumbe wa kukamilisha na muda
**Jifunze nini katika programu yako:**
- **Thibitisha** kuwa bonyeza Anza linaonyesha nukuu ya bahati nasibu
- **Hakikisha** kuandika kunaonyesha mwangaza sahihi wa neno la sasa
- **Angalia** kuwa mtindo wa kosa unaonekana ikiwa maandishi ni yasiyo sahihi
- **Hakiki** kuwa kukamilisha maneno kunaongeza mwangaza ipasavyo
- **Jaribu** kuwa kumaliza nukuu kunaonyesha ujumbe wa kumaliza na muda
**Vidokezo vya kawaida vya kutatua matatizo:**
- **Angalia** koni ya kivinjari (F12) kwa makosa ya JavaScript
- **Hakikisha** kwamba majina yote ya faili yanalingana kabisa (yanahusiana na herufi kubwa na ndogo)
- **Hakikisha** Live Server inaendesha na inasasisha ipasavyo
- **Jaribu** nukuu tofauti ili kuthibitisha uteuzi wa nasibu unafanya kazi
**Vidokezo vya kawaida vya utatuzi:**
- **Angalia** console ya kivinjari (F12) kwa makosa ya JavaScript
- **Thibitisha** majina ya faili yote ni sahihi (yanazingatia herufi kwa herufi)
- **Hakikisha** Live Server inafanya kazi na kusasisha vizuri
- **Jaribu** nukuu tofauti ili kuthibitisha kuchaguwa bahati nasibu kufanyika
---
## Changamoto ya Wakala wa GitHub Copilot 🎮
## Changamoto ya GitHub Copilot Agent 🎮
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Agent kumaliza changamoto ifuatayo:
**Maelezo:** Panua mchezo wa kuandika kwa kutekeleza mfumo wa ugumu unaobadilika kulingana na utendaji wa mchezaji. Changamoto hii itakusaidia kufanya mazoezi ya kushughulikia matukio ya hali ya juu, uchambuzi wa data, na masasisho ya UI ya nguvu.
**Maelezo:** Ongeza mfumo wa ugumu wa mchezo wa kuandika unaobadilika kulingana na utendaji wa mchezaji. Changamoto hii itakusaidia kufanya mazoezi ya uendeshaji wa matukio ulioimarishwa, uchambuzi wa data, na masasisho ya UI yanayobadilika.
**Maelekezo:** Unda mfumo wa kurekebisha ugumu wa mchezo wa kuandika ambao:
1. Unafuatilia kasi ya kuandika ya mchezaji (maneno kwa dakika) na asilimia ya usahihi
2. Unabadilika kiotomatiki hadi viwango vitatu vya ugumu: Rahisi (nukuu rahisi), Kati (nukuu za sasa), Ngumu (nukuu ngumu na alama za uakifishi)
3. Unaonyesha kiwango cha ugumu wa sasa na takwimu za mchezaji kwenye UI
4. Unatekeleza kaunta ya mfululizo inayoongeza ugumu baada ya maonyesho mazuri matatu mfululizo
5. Unaongeza maoni ya kuona (rangi, uhuishaji) kuonyesha mabadiliko ya ugumu
**Onyo:** Unda mfumo wa kurekebisha ugumu wa mchezo wa kuandika ambao:
1. Unafuata kasi ya kuandika mchezaji (maneno kwa dakika) na asilimia ya usahihi
2. Unabadilika moja kwa moja kwa ngazi tatu: Rahisi (nukuu rahisi), Kati (nukuu za sasa), Gumu (nukuu ngumu zilizo na alama za uandishi)
3. Unaonyesha ngazi ya ugumu wa sasa na takwimu za mchezaji kwenye UI
4. Unaweka kihesabu cha mkondo kinachoongezeka ugumu baada ya utendaji mzuri mara 3 mfululizo
5. Unaongeza mrejesho wa kuona (rangi, mienendo) kuashiria mabadiliko ya ugumu
Ongeza vipengele vya HTML vinavyohitajika, mitindo ya CSS, na kazi za JavaScript ili kutekeleza kipengele hiki. Jumuisha utunzaji sahihi wa makosa na hakikisha mchezo unabaki kupatikana na lebo za ARIA zinazofaa.
Ongeza vipengele vya HTML vinavyohitajika, mitindo ya CSS, na kazi za JavaScript kutekeleza kipengele hiki. Jumuisha usimamizi mzuri wa makosa na hakikisha mchezo unabaki wa kirafiki kwa kutumia lebo za ARIA zinazofaa.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Uko tayari kuboresha mchezo wako wa kuandika? Jaribu kutekeleza vipengele hivi vya hali ya juu ili kuongeza uelewa wako wa kushughulikia matukio na uendeshaji wa DOM:
Uko tayari kuongeza mchezo wako wa kuandika hatua nyingine? Jaribu kutekeleza vipengele hivi vya hali ya juu ili kupanua uelewa wako wa uendeshaji wa matukio na usanifu wa DOM:
**Ongeza utendaji zaidi:**
| Kipengele | Maelezo | Ujuzi Utakaofanya Mazoezi |
|-----------|---------|--------------------------|
| **Udhibiti wa Ingizo** | Zima msikilizaji wa tukio la `input` baada ya kukamilika, na uwashe tena wakati kitufe kinabofya | Usimamizi wa matukio na udhibiti wa hali |
| **Usimamizi wa Hali ya UI** | Zima kisanduku cha maandishi wakati mchezaji anamaliza nukuu | Udhibiti wa mali za DOM |
| **Kisanduku cha Mazungumzo** | Onyesha kisanduku cha mazungumzo na ujumbe wa mafanikio | Mifumo ya UI ya hali ya juu na upatikanaji |
| **Mfumo wa Alama za Juu** | Hifadhi alama za juu kwa kutumia `localStorage` | API za hifadhi ya kivinjari na uhifadhi wa data |
|---------|-------------|------------------------|
| **Udhibiti wa Ingizo** | Zima msikilizaji wa tukio la `input` baada ya kumaliza, na uiruhusu tena wakati kitufe kinabonyezwa | Usimamizi wa matukio na hali |
| **Usimamizi wa Hali ya UI** | Zima sanduku la maandishi mchezaji anapomaliza nukuu | Usanifu wa mali za DOM |
| **Sogezisho la Dirisha** | Onyesha dirisha la mazungumzo la modali lenye ujumbe wa mafanikio | Mifumo ya hali ya juu ya UI na upatikanaji |
| **Mfumo wa Alama za Juu** | Hifadhi alama bora kwa kutumia `localStorage` | API za hifadhi ya kivinjari na uthabiti wa data |
**Vidokezo vya kutekeleza:**
- **Fanya utafiti** wa `localStorage.setItem()` na `localStorage.getItem()` kwa hifadhi ya kudumu
- **Jifunze** kuongeza na kuondoa wasikilizaji wa matukio kwa nguvu wakati wowote
- **Chunguza** vipengele vya HTML vya dialog au mitindo ya modali ya CSS
- **Zingatia** upatikanaji unapo zimezimwa na kuruhusiwa vidhibiti vya fomu
## Jaribio la Baada ya Mafunzo
[Jaribio la baada ya mafunzo](https://ff-quizzes.netlify.app/web/quiz/22)
**Vidokezo vya utekelezaji:**
- **Tafiti** `localStorage.setItem()` na `localStorage.getItem()` kwa uhifadhi wa kudumu
- **Fanya mazoezi** ya kuongeza na kuondoa wasikilizaji wa matukio kwa nguvu
- **Chunguza** vipengele vya HTML vya mazungumzo au mifumo ya modal ya CSS
- **Fikiria** upatikanaji wakati wa kuzima na kuwasha vidhibiti vya fomu
---
## Jaribio la Baada ya Somo
## 🚀 Mzunguko wako wa Ujuzi wa Mchezo wa Kuandika
### ⚡ **Unachoweza Kufanya Dakika 5 Zijazo**
- [ ] Jaribu mchezo wako wa kuandika kwa nukuu tofauti kuhakikisha unafanya kazi vizuri
- [ ] Jaribu kubadilisha mtindo wa CSS - jaribu kubadilisha rangi za mwangaza na kosa
- [ ] Fungua DevTools za kivinjari chako (F12) na uangalie Consol wakati wa kucheza
- [ ] Jikaze kumaliza nukuu haraka iwezekanavyo
### ⏰ **Unachoweza Kufanikisha Saa hii**
- [ ] Ongeza nukuu zaidi kwenye safu (labda kutoka vitabu au filamu unazopenda)
- [ ] Tekeleza mfumo wa alama bora kwenye localStorage uliotajwa sehemu ya changamoto
- [ ] Unda kitambuzi cha maneno kwa dakika kinachoonyesha baada ya kila mchezo
- [ ] Ongeza sauti za kuandika sahihi, makosa, na kumaliza
### 📅 **Safari Yako ya Wiki Nzima**
- [ ] Tengeneza toleo la wachezaji wengi ambapo marafiki wanaweza kushindana kwa pamoja
- [ ] Tengeneza ngazi tofauti za ugumu kwa nukuu zenye ugumu tofauti
- [ ] Ongeza upau wa maendeleo unaoonyesha ni sehemu gani ya nukuu imekamilika
- [ ] Tekeleza akaunti za watumiaji na ufuatiliaji wa takwimu binafsi
- [ ] Tengeneza mandhari maalum na ruhusu watumiaji kuchagua mtindo wanapendelea
### 🗓️ **Mabadiliko Yako ya Mwezi Mzima**
- [ ] Unda kozi ya kuandika yenye masomo yanayofundisha taratibu kuweka vidole sehemu sahihi
- [ ] Tengeneza uchambuzi unaoonyesha herufi au maneno yanayosababisha makosa zaidi
- [ ] Ongeza msaada wa lugha tofauti na mpangilio tofauti wa kibodi
- [ ] Unganisha na API za elimu kutafuta nukuu kutoka kwa hifadhidata za fasihi
- [ ] Chapisha mchezo wako ulioboreshwa wa kuandika kwa wengine kutumia na kufurahia
### 🎯 **Ukaguzi wa Mwisho wa Tafakari**
**Kabla hauendi mbele, chukua muda kusherehekea:**
- Ni tukio gani lililokufurahisha zaidi wakati unakuwa na mchezo huu?
- Unahisije kuhusu uendeshaji wa matukio sasa tofauti na ulipokuwa unaanza?
- Ni kipengele kipi unachotamani kuongeza kuufanya mchezo huu kuwa wako wa kipekee?
- Unawezaje kutumia dhana za uendeshaji wa matukio kwenye miradi mingine?
[Jaribio la baada ya somo](https://ff-quizzes.netlify.app/web/quiz/22)
```mermaid
journey
title Safari Yetu ya Kujiamini katika Kuprogramu Matukio
section Leo
Kuelewa Matukio: 3: You
Kuunda UI: 4: You
Kuandika Wasikilizaji wa Matukio: 5: You
section Wiki Hii
Kuongeza Vipengele: 4: You
Kurekebisha Makosa: 5: You
Kuboresha UX: 4: You
section Mwezi Ujao
Kuunda Programu Zinazochanganya: 5: You
Kuelekeza Wengine: 5: You
Kuunda Mifumo: 5: You
```
> 🌟 **Kumbuka**: Umeweza moja ya dhana kuu zinazowezesha tovuti na programu yoyote isiyokuwa na mshono. Uendeshaji wa matukio ndio unaofanya mtandao kuhisi hai na unaojibu. Kila mara unapoona menyu ya kunjuzi, fomu inayokagua wakati unapoandika, au mchezo unaojibu bonyeza zako, sasa unaelewa uchawi nyuma yake. Haujifunzi tu kuandika msimbo - unajifunza kuunda uzoefu unaohisi wa asili na kuvutia! 🎉
---
## Mapitio na Kujisomea
## Pitia & Jifunze Wewe Mwingine
Soma kuhusu [matukio yote yanayopatikana](https://developer.mozilla.org/docs/Web/Events) kwa msanidi programu kupitia kivinjari cha wavuti, na fikiria hali ambazo ungetumia kila moja.
Soma kuhusu [matukio yote yanayopatikana](https://developer.mozilla.org/docs/Web/Events) kwa mtengenezaji kupitia kivinjari cha wavuti, na zingatia matukio ambapo ungetumia kila moja.
## Kazi ya Nyumbani
## Kazi ya Nyumba
[Unda mchezo mpya wa kibodi](assignment.md)
[Tengeneza mchezo mpya wa kibodi](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Maelezo ya Kumbuka**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za otomatiki zinaweza kuwa na makosa au kasoro. Hati ya awali katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha uhakika. Kwa taarifa muhimu sana, tafsiri ya mwanadamu mtaalamu inashauriwa. Hatunawajibiki kwa kutoelewana au tafsiri potofu zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,177 +1,279 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "33a875c522f237a2026e4653240dfc07",
"translation_date": "2025-10-24T19:47:13+00:00",
"original_hash": "00aa85715e1efd4930c17a23e3012e69",
"translation_date": "2026-01-07T01:47:15+00:00",
"source_file": "5-browser-extension/1-about-browsers/README.md",
"language_code": "sw"
}
-->
# Mradi wa Kiendelezi cha Kivinjari Sehemu ya 1: Yote Kuhusu Vivinjari
# Mradi wa Kiongezi cha Kivinjari Sehemu 1: Yote Kuhusu Vivinjari
![Sketchnote ya Kivinjari](../../../../translated_images/browser.60317c9be8b7f84adce43e30bff8d47a1ae15793beab762317b2bc6b74337c1a.sw.jpg)
```mermaid
journey
title Safari Yako ya Maendeleo ya Kiendelezi cha Kivinjari
section Foundation
Understand browsers: 3: Student
Learn extension types: 4: Student
Setup development: 4: Student
section Development
Build interface: 4: Student
Add functionality: 5: Student
Handle data: 5: Student
section Integration
Test in browser: 5: Student
Debug issues: 4: Student
Polish experience: 5: Student
```
![Browser sketchnote](../../../../translated_images/browser.60317c9be8b7f84a.sw.jpg)
> Sketchnote na [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
## Maswali ya Awali ya Somo
## Mtihani wa Kabla ya Mahadhara
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/23)
[Mtihani wa kabla ya mhadhara](https://ff-quizzes.netlify.app/web/quiz/23)
### Utangulizi
Viendelezi vya kivinjari ni programu ndogo zinazoboresha uzoefu wako wa kuvinjari mtandao. Kama maono ya awali ya Tim Berners-Lee ya mtandao wa maingiliano, viendelezi vinaongeza uwezo wa kivinjari zaidi ya kutazama nyaraka tu. Kutoka kwa wasimamizi wa nywila wanaolinda akaunti zako hadi wachukua rangi wanaosaidia wabunifu kupata vivuli kamili, viendelezi hutatua changamoto za kila siku za kuvinjari.
Viendelezi vya kivinjari ni programu ndogo ndogo zinazoboresha uzoaji wako wa wavuti. Kama vile maono ya awali ya Tim Berners-Lee ya wavuti yenye mwingiliano, viendelezi huongeza uwezo wa kivinjari zaidi ya kutazama tu hati rahisi. Kuanzia wasimamizi wa nywila wanaohifadhi akaunti zako salama hadi wachukuaji wa rangi wanaosaidia wabunifu kuchukua vivuli kamili, viendelezi hutatua changamoto za kila siku za kuvinjari.
Kabla ya kujenga kiendelezi chako cha kwanza, hebu tuelewe jinsi vivinjari vinavyofanya kazi. Kama Alexander Graham Bell alivyohitaji kuelewa usambazaji wa sauti kabla ya kubuni simu, kujua misingi ya kivinjari kutakusaidia kuunda viendelezi vinavyoungana vizuri na mifumo ya kivinjari iliyopo.
Kabla ya tujenge kiendelezi chako cha kwanza, hebu tuelewe jinsi vivinjari vinavyofanya kazi. Kama Alexander Graham Bell alivyohitaji kuelewa usambazaji wa sauti kabla ya kugundua simu, kujua misingi ya kivinjari kutakusaidia kuunda viendelezi vinavyoelewana kwa urahisi na mifumo ya kivinjari iliyopo.
Mwisho wa somo hili, utaelewa usanifu wa kivinjari na utaanza kujenga kiendelezi chako cha kwanza.
Mwisho wa somo hili, utakuwa umeelewa usanifu wa kivinjari na kuanza kujenga kiendelezi chako cha kwanza.
## Kuelewa Vivinjari vya Mtandao
```mermaid
mindmap
root((Kompyuta muundo wa kivinjari))
Core Components
Rendering Engine
JavaScript Engine
Network Stack
Storage APIs
User Interface
Address Bar
Tab Management
Bookmarks
Extension Icons
Extension System
Manifest Files
Content Scripts
Background Pages
Popup Windows
Security Model
Same-Origin Policy
Permissions API
Content Security
Isolated Worlds
Development Tools
DevTools Integration
Debug Console
Performance Monitor
Extension Inspector
```
## Kuelewa Vivinjari vya Wavuti
Kivinjari cha mtandao kimsingi ni mfasiri wa nyaraka wa hali ya juu. Unapoandika "google.com" kwenye upau wa anwani, kivinjari hufanya mfululizo wa operesheni ngumu - kuomba maudhui kutoka kwa seva duniani kote, kisha kuchambua na kuonyesha msimbo huo kuwa kurasa za wavuti za maingiliano unazoziona.
Kivinjari cha wavuti ni kimsingi mfasiri wa hati kilichosindikwa kwa ustadi. Unapoandika "google.com" kwenye upau wa anuani, kivinjari hufanya mfululizo wa operesheni ngumu - kuomba maudhui kutoka kwa seva duniani kote, kisha kusoma na kuonyesha msimbo huo katika kurasa za wavuti zinazoshirikika unazoziona.
Mchakato huu unafanana na jinsi kivinjari cha kwanza cha mtandao, WorldWideWeb, kilivyoundwa na Tim Berners-Lee mnamo 1990 ili kufanya nyaraka zilizounganishwa kupatikana kwa kila mtu.
Mchakato huu unaendana na jinsi kivinjari cha kwanza cha wavuti, WorldWideWeb, kilivyotengenezwa na Tim Berners-Lee mwaka 1990 ili kufanya hati zilizo na viungo zivukewe na watu wote.
**Historia kidogo**: Kivinjari cha kwanza kilikuwa kinaitwa 'WorldWideWeb' na kilitengenezwa na Sir Timothy Berners-Lee mnamo 1990.
**Historia Kidogo**: Kivinjari cha kwanza kilikuwa kinaitwa 'WorldWideWeb' na kilifanywa na Sir Timothy Berners-Lee mwaka 1990.
![vivinjari vya awali](../../../../translated_images/earlybrowsers.d984b711cdf3a42ddac919d46c4b5ca7232f68ccfbd81395e04e5a64c0015277.sw.jpg)
![early browsers](../../../../translated_images/earlybrowsers.d984b711cdf3a42d.sw.jpg)
> Baadhi ya vivinjari vya awali, kupitia [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
### Jinsi Vivinjari Vinavyosindika Maudhui ya Mtandao
### Jinsi Vivinjari Vinavyosindika Maudhui ya Wavuti
Mchakato kati ya kuandika URL na kuona ukurasa wa wavuti unahusisha hatua kadhaa zilizoratibiwa ambazo hufanyika ndani ya sekunde:
Mchakato kati ya kuingiza URL na kuona ukurasa wa wavuti unahusisha hatua kadhaa za kuratibu zinazotokea ndani ya sekunde chache:
```mermaid
sequenceDiagram
participant User
participant Browser
participant Extension
participant DNS
participant Server
User->>Browser: Types URL and presses Enter
Browser->>DNS: Looks up server IP address
DNS->>Browser: Returns IP address
Browser->>Server: Requests web page content
Server->>Browser: Sends HTML, CSS, and JavaScript
Browser->>User: Renders complete web page
User->>Browser: Andika URL na bonyeza Ingia
Browser->>Extension: Chochea tukio la beforeRequest
Extension->>Extension: Angalia kama URL inahitaji mabadiliko
Browser->>DNS: Tafuta anwani ya IP ya seva
DNS->>Browser: Rudisha anwani ya IP
Browser->>Server: Ombi la maudhui ya ukurasa wa wavuti
Server->>Browser: Tuma HTML, CSS, na JavaScript
Browser->>Extension: Chochea tukio la beforeResponse
Extension->>Extension: Badilisha maudhui ikiwa kuna hitaji
Browser->>User: Onyesha ukurasa wa wavuti kamili
Extension->>User: Onyesha masasisho ya UI ya ugani
```
**Hapa ni kile mchakato huu unachofanikisha:**
- **Hubadilisha** URL inayosomwa na binadamu kuwa anwani ya IP ya seva kupitia utafutaji wa DNS
- **Huanzisha** muunganisho salama na seva ya wavuti kwa kutumia itifaki za HTTP au HTTPS
- **Huoomba** maudhui mahususi ya ukurasa wa wavuti kutoka kwa seva
- **Hupokea** alama za HTML, mitindo ya CSS, na msimbo wa JavaScript kutoka kwa seva
- **Huonyesha** maudhui yote kwenye ukurasa wa wavuti unaoshirikika unaoonekanwa
**Hiki ndicho mchakato huu unakamilisha:**
- **Kutafsiri** URL inayosomeka na binadamu kuwa anwani ya IP ya seva kupitia utafutaji wa DNS
- **Kuanzisha** muunganisho salama na seva ya mtandao kwa kutumia itifaki za HTTP au HTTPS
- **Kuomba** maudhui maalum ya ukurasa wa wavuti kutoka kwa seva
- **Kupokea** alama za HTML, mitindo ya CSS, na msimbo wa JavaScript kutoka kwa seva
- **Kuonyesha** maudhui yote kuwa ukurasa wa wavuti wa maingiliano unaouona
### Vipengele Muhimu vya Kivinjari
### Vipengele Vikuu vya Kivinjari
Vivinjari vya kisasa vinatoa vipengele vingi ambavyo watengenezaji wa viendelezi wanaweza kutumia:
Vivinjari vya kisasa vinatoa vipengele vingi ambavyo waendelezaji wa viendelezi wanaweza kutumia:
| Kipengele | Kusudi | Fursa za Kiendelezi |
|-----------|--------|---------------------|
| **Injini ya Kuonyesha** | Inaonyesha HTML, CSS, na JavaScript | Marekebisho ya maudhui, sindikizo la mitindo |
| **Injini ya JavaScript** | Inatekeleza msimbo wa JavaScript | Msimbo maalum, mwingiliano wa API |
| **Hifadhi ya Ndani** | Huokoa data kwa ndani | Mapendeleo ya mtumiaji, data iliyohifadhiwa |
| **Stack ya Mtandao** | Inashughulikia maombi ya mtandao | Ufuatiliaji wa maombi, uchambuzi wa data |
| **Mfumo wa Usalama** | Hulinda watumiaji dhidi ya maudhui hatarishi | Uchujaji wa maudhui, uboreshaji wa usalama |
|---------|---------|------------------------|
| **Menginele wa Uonyesho** | Huuonyesha HTML, CSS, na JavaScript | Ubadilishaji wa maudhui, kuingiza mitindo |
| **Menginele wa JavaScript** | Hutekeleza msimbo wa JavaScript | Skripti maalum, mwingiliano na API |
| **Hifadhi ya Ndani** | Kuhifadhi data kwa ndani | Mapendeleo ya mtumiaji, data iliyohifadhiwa |
| **Jumuiya ya Mtandao** | Kushughulikia maombi ya wavuti | Ufuatiliaji wa maombi, uchambuzi wa data |
| **Mfumo wa Usalama** | Kulinda watumiaji dhidi ya maudhui ya hatari | Kichujio cha maudhui, maboresho ya usalama |
**Kuelewa vipengele hivi kunakusaidia:**
- **Kutambua** wapi kiendelezi chako kinaweza kuongeza thamani zaidi
- **Kuchagua** API sahihi za kivinjari kwa utendaji wa kiendelezi chako
- **Kubuni** viendelezi vinavyofanya kazi kwa ufanisi na mifumo ya kivinjari
- **Kuhakikisha** kiendelezi chako kinafuata mazoea bora ya usalama wa kivinjari
- **Tambua** mahali kiendelezi chako kinaweza kuongeza thamani zaidi
- **Chagua** API sahihi za kivinjari kwa utendaji wa kiendelezi chako
- **Buni** viendelezi vinavyofanya kazi kwa ufanisi na mifumo ya kivinjari
- **Hakikisha** kiendelezi chako kinafuata mbinu bora za usalama wa kivinjari
### Mambo ya Kuzingatia Katika Maendeleo ya Viendelezi vya Vivinjari Tofauti
### Mawazo Kuhusu Uundaji wa Viendelezi Kwa Vivinjari Tofauti
Vivinjari tofauti hutekeleza viwango kwa tofauti ndogo, sawa na jinsi lugha tofauti za programu zinaweza kushughulikia algorithimu moja kwa njia tofauti. Chrome, Firefox, na Safari kila moja ina sifa za kipekee ambazo watengenezaji wanapaswa kuzingatia wakati wa kuendeleza viendelezi.
Vivinjari tofauti hutekeleza viwango kwa tofauti ndogo ndogo, kama ilivyo kwa lugha tofauti za programu zinazoweza kushughulikia algorithimu hiyo hiyo kwa njia tofauti. Chrome, Firefox, na Safari kila moja ina sifa za kipekee ambazo waendelezaji wanapaswa kuzingatia wakati wa uundaji wa kiendelezi.
> 💡 **Ushauri wa Kitaalamu**: Tumia [caniuse.com](https://www.caniuse.com) kuangalia teknolojia za mtandao zinazoungwa mkono katika vivinjari tofauti. Hii ni muhimu unapopanga vipengele vya kiendelezi chako!
> 💡 **Ushauri Mkuu**: Tumia [caniuse.com](https://www.caniuse.com) kuchunguza ni teknolojia gani za wavuti zinazoendeshwa kwenye vivinjari tofauti. Hii ni muhimu sana unapopanga vipengele vya kiendelezi chako!
**Mambo muhimu ya kuzingatia katika maendeleo ya viendelezi:**
- **Jaribu** kiendelezi chako katika vivinjari vya Chrome, Firefox, na Edge
- **Badilisha** kwa API za viendelezi vya kivinjari tofauti na fomati za manifest
- **Shughulikia** sifa za utendaji na vizuizi tofauti vya kivinjari
- **Toa** mbadala kwa vipengele maalum vya kivinjari ambavyo vinaweza kuwa havipatikani
**Mambo yanayozingatiwa kwa uundaji wa viendelezi:**
- **Jaribu** kiendelezi chako kwenye vivinjari vya Chrome, Firefox, na Edge
- **Linganya** na API za viendelezi na muundo wa maelezo za vivinjari tofauti
- **Shughulikia** sifa tofauti za ufanisi na vikwazo
- **Toa** mbadala kwa vipengele maalum vya kivinjari ambavyo huenda havipatikani
**Uchambuzi wa Takwimu**: Unaweza kubaini vivinjari vinavyopendwa na watumiaji wako kwa kusakinisha vifurushi vya uchambuzi katika miradi yako ya maendeleo ya mtandao. Takwimu hizi zinakusaidia kuzingatia vivinjari vya kuunga mkono kwanza.
**Uchambuzi wa Takwimu**: Unaweza kubaini ni vivinjari gani watumiaji wako wanapendelea kwa kufunga vifurushi vya takwimu katika miradi yako ya maendeleo ya wavuti. Hii data inakusaidia kipaumbele ni vivinjari gani vya kuunga mkono kwanza.
## Kuelewa Viendelezi vya Kivinjari
Viendelezi vya kivinjari hutatua changamoto za kawaida za kuvinjari mtandao kwa kuongeza utendaji moja kwa moja kwenye kiolesura cha kivinjari. Badala ya kuhitaji programu tofauti au mchakato mgumu, viendelezi hutoa ufikiaji wa haraka wa zana na vipengele.
Viendelezi vya kivinjari hutatua changamoto za kawaida za kuvinjari kwa kuongeza utendaji moja kwa moja kwenye interface ya kivinjari. Badala ya kuhitaji programu tofauti au taratibu tata, viendelezi hutoa ufikiaji wa haraka kwa zana na vipengele.
Dhana hii inaendana na namna waanzilishi wa kompyuta wa zamani kama Douglas Engelbart walivyoona kuongeza uwezo wa binadamu kwa teknolojia - viendelezi huimarisha utendaji wa msingi wa kivinjari chako.
```mermaid
quadrantChart
title Aina za Viongezi vya Vivinjari
x-axis Rahisi --> Ngumu
y-axis Matumizi Binafsi --> Vifaa vya Kitaalamu
quadrant-1 Vifaa vya Waendelezaji
quadrant-2 Suluhisho za Kampuni
quadrant-3 Vifaa vya Binafsi
quadrant-4 Programu za Uzalishaji
Ad Blockers: [0.3, 0.2]
Password Managers: [0.7, 0.3]
Color Pickers: [0.4, 0.8]
Code Formatters: [0.8, 0.9]
Note Taking: [0.6, 0.5]
Video Downloaders: [0.5, 0.2]
Time Trackers: [0.7, 0.6]
Screenshot Tools: [0.4, 0.4]
```
**Makundi maarufu ya viendelezi na faida zao:**
- **Zana za Ufanisi**: Wasimamizi wa kazi, programu za kuchukua maelezo, na waandishi wa muda wanaokusaidia kuwa na mpangilio
- **Maboresho ya Usalama**: Wasimamizi wa nywila, vizuizi vya matangazo, na zana za faragha zinazolinda data yako
- **Zana za Mwaendelezaji**: Waumbaji wa msimbo, wachukuaji rangi, na zana za urekebishaji zinazorahisisha maendeleo
- **Maboresho ya Maudhui**: Modu za kusoma, vipakua video, na zana za picha zinaboresha uzoaji wako wa wavuti
Dhana hii inafanana na jinsi waanzilishi wa kompyuta wa mapema kama Douglas Engelbart walivyotazamia kuongeza uwezo wa binadamu kwa teknolojia - viendelezi vinaongeza utendaji wa msingi wa kivinjari chako.
**Swali la Tafakari**: Ni viendelezi vipi vya kivinjari unavyopenda? Hufanya kazi gani maalum, na unaboreshaje uzoaji wako wa wavuti?
**Makundi maarufu ya viendelezi na faida zake:**
- **Zana za Uzalishaji**: Wasimamizi wa kazi, programu za kuchukua maelezo, na vifuasi vya muda vinavyokusaidia kubaki na mpangilio
- **Uboreshaji wa Usalama**: Wasimamizi wa nywila, vizuizi vya matangazo, na zana za faragha zinazolinda data yako
- **Zana za Watengenezaji**: Wapangaji wa msimbo, wachukua rangi, na zana za kutatua hitilafu zinazorahisisha maendeleo
- **Uboreshaji wa Maudhui**: Njia za kusoma, vipakuzi vya video, na zana za kuchukua picha za skrini zinazoboresha uzoefu wako wa mtandao
### 🔄 **Kukagua Kielelezo cha Mafunzo**
**Kuelewa Usanifu wa Kivinjari**: Kabla ya kuhamia kwa uundaji wa kiendelezi, hakikisha unaweza:
- ✅ Eleza jinsi vivinjari vinavyosindika maombi ya wavuti na kuonyesha maudhui
- ✅ Tambua vipengele kuu vya usanifu wa kivinjari
- ✅ Elewa jinsi viendelezi vinavyounganishwa na utendaji wa kivinjari
- ✅ Tambua mfano wa usalama unaowalinda watumiaji
**Swali la Kutafakari**: Ni viendelezi vipi vya kivinjari unavyovipenda? Ni kazi gani maalum wanazofanya, na jinsi gani wanaboresha uzoefu wako wa kuvinjari?
**Jaribio la Haraka Lawe Mwendo**: Je, unaweza kufuatilia njia kutoka kuandika URL hadi kuona ukurasa wa wavuti?
1. **Utafutaji wa DNS** hubadilisha URL kuwa anwani ya IP
2. **Ombi la HTTP** hupata maudhui kutoka seva
3. **Uchambuzi** husindika HTML, CSS, na JavaScript
4. **Uonyesho** huuonyesha ukurasa wa mwisho
5. **Viendelezi** vinaweza kubadilisha maudhui katika hatua mbalimbali
## Kusakinisha na Kusimamia Viendelezi
## Kufunga na Kudhibiti Viendelezi
Kuelewa mchakato wa usakinishaji wa kiendelezi husaidia kutarajia uzoefu wa mtumiaji wakati watu wanaposakinisha kiendelezi chako. Mchakato wa usakinishaji umestandadishwa katika vivinjari vya kisasa, na tofauti ndogo katika muundo wa kiolesura.
Kuelewa mchakato wa usakinishaji wa kiendelezi hukusaidia kutarajia uzoaji wa mtumiaji wakati watu wanaposakinisha kiendelezi chako. Mchakato wa usakinishaji umeboreshwa kwa vivinjari vya kisasa, na tofauti ndogo ndogo katika muundo wa interface.
![picha ya skrini ya kivinjari cha Edge ikionyesha ukurasa wa edge://extensions uliofunguliwa na menyu ya mipangilio iliyofunguliwa](../../../../translated_images/install-on-edge.d68781acaf0b3d3dada8b7507cde7a64bf74b7040d9818baaa9070668e819f90.sw.png)
![screenshot of the Edge browser showing the open edge://extensions page and open settings menu](../../../../translated_images/install-on-edge.d68781acaf0b3d3d.sw.png)
> **Muhimu**: Hakikisha kuwasha hali ya msanidi programu na kuruhusu viendelezi kutoka maduka mengine unapojaribu viendelezi vyako mwenyewe.
> **Muhimu**: Hakikisha umeamilisha mode ya mwendelezaji na kuruhusu viendelezi kutoka maduka mengine wakati unajaribu viendelezi vyako binafsi.
### Mchakato wa Usakinishaji wa Kiendelezi cha Maendeleo
### Mchakato wa Usakinishaji wa Kiendelezi wa Maendeleo
Unapokuwa unajenga na kujaribu viendelezi vyako mwenyewe, fuata mtiririko huu wa kazi:
Unapokuwa ukitengeneza na kujaribu viendelezi vyako, fuata mtiririko huu:
```mermaid
flowchart TD
A[Andika Msimbo] --> B[Jenga Kiendelezi]
B --> C{Usakinishaji wa Kwanza?}
C -->|Ndiyo| D[Pakia Bila Kukunjwa]
C -->|Hapana| E[Rejesha Kiendelezi]
D --> F[Jaribu Ufanisi]
E --> F
F --> G{Inafanya Kazi Sawasawa?}
G -->|Hapana| H[Tatua Masuala]
G -->|Ndiyo| I[Tayari kwa Watumiaji]
H --> A
I --> J[Chapisha Duka]
style A fill:#e1f5fe
style F fill:#e8f5e8
style I fill:#f3e5f5
style J fill:#fff3e0
```
```bash
# Step 1: Build your extension
# Hatua ya 1: Jenga kifungu chako cha kuongeza kazi
npm run build
```
**Hiki ndicho amri hii inakamilisha:**
- **Inakusanya** msimbo wako wa chanzo kuwa faili zinazofaa kwa kivinjari
- **Inapakia** moduli za JavaScript kuwa vifurushi vilivyoboreshwa
- **Inazalisha** faili za mwisho za kiendelezi katika folda ya `/dist`
- **Inatayarisha** kiendelezi chako kwa usakinishaji na majaribio
**Kile amri hii inachofanikisha:**
- **Inakusanya** msimbo wako wa chanzo kuwa faili zinazoweza kutumiwa na kivinjari
- **Inachanganya** moduli za JavaScript katika vifurushi vilivyobinafsishwa
- **Inatengeneza** faili za mwisho za kiendelezi kwenye folda ya `/dist`
- **Inatayarisha** kiendelezi chako kwa ajili ya usakinishaji na majaribio
**Hatua ya 2: Nenda kwenye Viendelezi vya Kivinjari**
**Hatua ya 2: Nenda kwa Viendelezi vya Kivinjari**
1. **Fungua** ukurasa wa usimamizi wa viendelezi wa kivinjari chako
2. **Bonyeza** kitufe cha "Mipangilio na zaidi" (ikoni ya `...`) juu kulia
3. **Chagua** "Viendelezi" kutoka kwenye menyu ya kushuka
2. **Bofya** kitufe cha "Mipangilio na zaidi" (ikoni ya `...`) juu kulia
3. **Chagua** "Viendelezi" kwenye menyu inayoshuka
**Hatua ya 3: Pakia Kiendelezi Chako**
- **Kwa usakinishaji mpya**: Chagua `load unpacked` na uchague folda yako ya `/dist`
- **Kwa masasisho**: Bonyeza `reload` karibu na kiendelezi chako kilichosakinishwa tayari
- **Kwa majaribio**: Washa "Hali ya Msanidi Programu" ili kufikia vipengele vya ziada vya kutatua hitilafu
- **Kwa usakinishaji mpya**: Chagua `load unpacked` na chagua folda yako ya `/dist`
- **Kwa masasisho**: Bofya `reload` karibu na kiendelezi kilichosakinishwa tayari
- **Kwa majaribio**: Washa "Developer mode" ili kupata vipengele vya ziada vya urekebishaji makosa
### Usakinishaji wa Kiendelezi cha Uzalishaji
> ✅ **Kumbuka**: Maelekezo haya ya maendeleo ni mahsusi kwa viendelezi unavyotengeneza mwenyewe. Ili kusakinisha viendelezi vilivyochapishwa, tembelea maduka rasmi ya viendelezi vya kivinjari kama [Microsoft Edge Add-ons store](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home).
> ✅ **Kumbuka**: Maelekezo haya ya maendeleo ni kwa viendelezi unavyoviunda mwenyewe. Kusakinisha viendelezi vilivyochapishwa, tembelea maduka rasmi ya viendelezi vya kivinjari kama [Microsoft Edge Add-ons store](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home).
**Kuelewa tofauti:**
- **Usakinishaji wa maendeleo** hukuruhusu kujaribu viendelezi ambavyo havijachapishwa wakati wa maendeleo
- **Usakinishaji wa maduka** hutoa viendelezi vilivyokaguliwa, vilivyochapishwa na masasisho ya kiotomatiki
- **Sideloading** huruhusu usakinishaji wa viendelezi kutoka nje ya maduka rasmi (inahitaji hali ya msanidi programu)
- **Usakinishaji wa maendeleo** hukuwezesha kujaribu viendelezi visivyohamasishwa wakati wa maendeleo
- **Usakinishaji wa maduka** hutoa viendelezi vilivyoidhinishwa, vilivyochapishwa na masasisho ya moja kwa moja
- **Sideloading** huruhusu usakinishaji wa viendelezi kutoka nje ya maduka rasmi (inahitaji mode ya mwendelezaji)
## Kujenga Kiendelezi chako cha Alama ya Uzalishaji wa Kaboni
## Kujenga Kiendelezi Chako cha Athari ya Kaboni
Tutaunda kiendelezi cha kivinjari kinachoonyesha alama ya uzalishaji wa kaboni ya matumizi ya nishati ya eneo lako. Mradi huu unaonyesha dhana muhimu za maendeleo ya kiendelezi huku ukitengeneza zana ya vitendo kwa uelewa wa mazingira.
Tutaunda kiendelezi cha kivinjari kinachoonyesha athari ya kaboni ya matumizi ya nishati ya eneo lako. Mradi huu unaonyesha dhana za msingi za uundaji wa viendelezi wakati unaunda zana yenye maana ya uelewa wa mazingira.
Mbinu hii inafuata kanuni ya "kujifunza kwa kufanya" ambayo imeonekana kuwa na ufanisi tangu nadharia za elimu za John Dewey - kuunganisha ujuzi wa kiufundi na matumizi ya maana ya ulimwengu halisi.
Njia hii inafuata kanuni ya "kujifunza kwa kufanya" ambayo imeonyesha ufanisi tangu nadharia za elimu za John Dewey - kuchanganya ujuzi wa kiufundi na matumizi halisi ya maisha.
### Mahitaji ya Mradi
Kabla ya kuanza maendeleo, hebu tukusanye rasilimali na utegemezi unaohitajika:
**Ufikiaji wa API Inayohitajika:**
- **[CO2 Signal API key](https://www.co2signal.com/)**: Weka anwani yako ya barua pepe ili upokee ufunguo wako wa bure wa API
- **[Msimbo wa Eneo](http://api.electricitymap.org/v3/zones)**: Tafuta msimbo wa eneo lako kwa kutumia [Ramani ya Umeme](https://www.electricitymap.org/map) (kwa mfano, Boston hutumia 'US-NEISO')
**Ufikiaji wa API Unahitajika:**
- **[API ya CO2 Signal key](https://www.co2signal.com/)**: Ingiza anuani yako ya barua pepe kupokea kiapi chako cha bure
- **[Msimbo wa Mkoa](http://api.electricitymap.org/v3/zones)**: Tafuta msimbo wa mkoa wako kwa kutumia [Electricity Map](https://www.electricitymap.org/map) (kwa mfano, Boston hutumia 'US-NEISO')
**Zana za Maendeleo:**
- **[Node.js na NPM](https://www.npmjs.com)**: Zana ya usimamizi wa kifurushi kwa kusakinisha utegemezi wa mradi
- **[Msimbo wa kuanzia](../../../../5-browser-extension/start)**: Pakua folda ya `start` ili kuanza maendeleo
- **[Node.js na NPM](https://www.npmjs.com)**: Zana za usimamizi wa vifurushi kwa kusakinisha utegemezi wa mradi
- **[Msimbo wa kuanzia](../../../../5-browser-extension/start)**: Pakua folda `start` kuanza maendeleo
**Jifunze Zaidi**: Boresha ujuzi wako wa usimamizi wa kifurushi kwa moduli hii [ya kina ya kujifunza](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
**Jifunze Zaidi**: Boresha ujuzi wako wa usimamizi wa vifurushi kwa kutumia [moduli kamili ya Kujifunza](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
### Kuelewa Muundo wa Mradi
Kuelewa muundo wa mradi husaidia kupanga kazi za maendeleo kwa ufanisi. Kama jinsi Maktaba ya Alexandria ilivyopangwa kwa urahisi wa upatikanaji wa maarifa, msingi wa msimbo uliopangwa vizuri hufanya maendeleo kuwa rahisi:
Kuelewa muundo wa mradi kunasaidia kupanga kazi za maendeleo kwa ufanisi. Kama vile Maktaba ya Alexandria ilivyopangwa kwa urahisi wa upatikanaji maarifa, msingi wa msimbo ulio pangiliwa vizuri hufanya maendeleo kuwa rahisi:
```
project-root/
@ -180,40 +282,42 @@ project-root/
│ ├── index.html # User interface markup
│ ├── background.js # Background script functionality
│ └── main.js # Compiled JavaScript bundle
└── src/ # Source development files
└── index.js # Your main JavaScript code
├── src/ # Source development files
│ └── index.js # Your main JavaScript code
├── package.json # Project dependencies and scripts
└── webpack.config.js # Build configuration
```
**Kuchambua kile kila faili inakamilisha:**
- **`manifest.json`**: **Inafafanua** metadata ya kiendelezi, ruhusa, na sehemu za kuingilia
- **`index.html`**: **Inaunda** kiolesura cha mtumiaji kinachoonekana wakati watumiaji wanapobonyeza kiendelezi chako
- **`background.js`**: **Inashughulikia** kazi za nyuma na wasikilizaji wa matukio ya kivinjari
- **`main.js`**: **Inajumuisha** msimbo wa mwisho wa JavaScript baada ya mchakato wa kujenga
- **`src/index.js`**: **Inahifadhi** msimbo wako mkuu wa maendeleo unaokusanywa kuwa `main.js`
**Kuvunja kile kila faili hufanikisha:**
- **`manifest.json`**: **Hufafanua** metadata ya kiendelezi, ruhusa, na njia za kuingia
- **`index.html`**: **Hutengeneza** interface ya mtumiaji inayoonekana wakati watumiaji wanabofya kiendelezi chako
- **`background.js`**: **Hushughulikia** kazi za nyuma na wasikilizaji wa matukio ya kivinjari
- **`main.js`**: **Inayo** msimbo wa mwisho wa JavaScript baada ya mchakato wa kujenga
- **`src/index.js`**: **Nyumba** ya msimbo wako mkuu wa maendeleo unaokusanywa katika `main.js`
> 💡 **Ushauri wa Mpangilio**: Hifadhi ufunguo wako wa API na msimbo wa eneo katika maelezo salama kwa urahisi wa marejeleo wakati wa maendeleo. Utahitaji maadili haya kujaribu utendaji wa kiendelezi chako.
> 💡 **Ushauri wa Mpangilio**: Hifadhi kitufe chako cha API na msimbo wa mkoa katika noti salama kwa urahisi wa marejeleo wakati wa maendeleo. Utahitaji thamani hizi kujaribu utendaji wa kiendelezi chako.
**Kumbuka Usalama**: Kamwe usijumuishe funguo za API au hati nyeti kwenye hifadhi yako ya msimbo. Tutakuonyesha jinsi ya kushughulikia hizi kwa usalama katika hatua zinazofuata.
**Kumbuka Usalama**: Kamwe usiweka taarifa za API au nyaraka nyeti kwenye hifadhi yako ya msimbo. Tutakuonyesha jinsi ya kuzisimamia kwa usalama katika hatua zinazofuata.
## Kuunda Kiolesura cha Kiendelezi
## Kuunda Interface ya Kiendelezi
Sasa tutaunda vipengele vya kiolesura cha mtumiaji. Kiendelezi kinatumia mbinu ya skrini mbili: skrini ya usanidi kwa usanidi wa awali na skrini ya matokeo kwa kuonyesha data.
Sasa tutajenga vipengele vya interface ya mtumiaji. Kiendelezi kinatumia njia ya skrini mbili: skrini ya usanidi kwa usanidi wa awali na skrini ya matokeo kwa maonyesho ya data.
Hii inafuata kanuni ya kufichua hatua kwa hatua inayotumika katika muundo wa kiolesura tangu siku za mwanzo za kompyuta - kufichua habari na chaguo kwa mpangilio wa kimantiki ili kuepuka kuwachosha watumiaji.
Hii inafuata kanuni ya kufunua hatua kwa hatua inayotumika katika ubunifu wa interface tangu enzi za kwanza za kompyuta - kufunua taarifa na chaguzi mfululizo kwa mantiki ili kuepuka kuzidi mtumiaji.
### Muhtasari wa Maoni ya Kiendelezi
**Skrini ya Usanidi** - Usanidi wa mtumiaji wa mara ya kwanza:
![picha ya skrini ya kiendelezi kilichokamilika kilichofunguliwa kwenye kivinjari, kikiwa na fomu yenye pembejeo za jina la eneo na ufunguo wa API.](../../../../translated_images/1.b6da8c1394b07491afeb6b2a8e5aca73ebd3cf478e27bcc9aeabb187e722648e.sw.png)
**Muonekano wa Usanidi** - usanidi kwa mtumiaji mara ya kwanza:
![screenshot of the completed extension open in a browser, displaying a form with inputs for region name and API key.](../../../../translated_images/1.b6da8c1394b07491.sw.png)
**Skrini ya Matokeo** - Onyesho la data ya alama ya uzalishaji wa kaboni:
![picha ya skrini ya kiendelezi kilichokamilika kikionyesha thamani za matumizi ya kaboni na asilimia ya mafuta ya kisukuku kwa eneo la US-NEISO.](../../../../translated_images/2.1dae52ff0804224692cd648afbf2342955d7afe3b0101b617268130dfb427f55.sw.png)
**Muonekano wa Matokeo** - maonyesho ya data ya athari ya kaboni:
![screenshot of the completed extension displaying values for carbon usage and fossil fuel percentage for the US-NEISO region.](../../../../translated_images/2.1dae52ff08042246.sw.png)
### Kuunda Fomu ya Usanidi
### Kujenga Fomu ya Usanidi
Fomu ya usanidi hukusanya data ya usanidi wa mtumiaji wakati wa matumizi ya awali. Mara tu imewekwa, habari hii hubaki katika hifadhi ya kivinjari kwa vipindi vya baadaye.
Fomu ya usanidi hukusanya data ya usanidi wa mtumiaji wakati wa matumizi ya kwanza. Baada ya kusanidiwa, taarifa hii huhifadhiwa kwenye hifadhi ya kivinjari kwa vipindi vijavyo.
Katika faili ya `/dist/index.html`, ongeza muundo huu wa fomu:
Katika faili `/dist/index.html`, ongeza muundo huu wa fomu:
```html
<form class="form-data" autocomplete="on">
@ -232,16 +336,16 @@ Katika faili ya `/dist/index.html`, ongeza muundo huu wa fomu:
</form>
```
**Hiki ndicho fomu hii inakamilisha:**
- **Inaunda** muundo wa fomu wa kimantiki na uhusiano sahihi wa lebo na pembejeo
- **Inaruhusu** utendaji wa kujaza kiotomatiki wa kivinjari kwa uzoefu bora wa mtumiaji
**Hii fomu inafanya yafuatayo:**
- **Inaunda** muundo wa fomu wa maana na lebo na ushirikiano sahihi wa pembejeo
- **Inawezesha** kazi ya kujaza kiotomatiki ya kivinjari kwa uzoaji bora wa mtumiaji
- **Inahitaji** sehemu zote mbili kujazwa kabla ya kuwasilisha kwa kutumia sifa ya `required`
- **Inaandaa** pembejeo na majina ya darasa yanayoelezea kwa urahisi wa mitindo na kulenga JavaScript
- **Inatoa** maelekezo wazi kwa watumiaji wanaoseti kiendelezi kwa mara ya kwanza
- **Inapanga** pembejeo kwa majina ya darasa yaliyoelezea kwa urahisi wa mtindo na kulenga JavaScript
- **Inatoa** maelekezo wazi kwa watumiaji wanaounda kiendelezi kwa mara ya kwanza
### Kuunda Onyesho la Matokeo
### Kujenga Onyesho la Matokeo
Kisha, unda eneo la matokeo litakaloonyesha data ya alama ya uzalishaji wa kaboni. Ongeza HTML hii chini ya fomu:
Ifuatayo, tengeneza eneo la matokeo litakaloonyesha data ya athari ya kaboni. Ongeza HTML hii chini ya fomu:
```html
<div class="result">
@ -257,40 +361,195 @@ Kisha, unda eneo la matokeo litakaloonyesha data ya alama ya uzalishaji wa kabon
</div>
```
**Kuchambua kile muundo huu unatoa:**
- **`loading`**: **Inaonyesha** ujumbe wa kupakia wakati data ya API inachukuliwa
- **`errors`**: **Inaonyesha** ujumbe wa hitilafu ikiwa maombi ya API yanashindwa au data si sahihi
- **`data`**: **Inashikilia** data ghafi kwa madhumuni ya kutatua hitilafu wakati wa maendeleo
- **`result-container`**: **Inawasilisha** habari ya alama ya uzalishaji wa kaboni iliyop
**Maelezo:** Boresha kiendelezi cha kivinjari kwa kuongeza uthibitishaji wa fomu na vipengele vya maoni ya mtumiaji ili kuboresha uzoefu wa mtumiaji wakati wa kuingiza funguo za API na misimbo ya eneo.
**Muhtasari wa kile muundo huu unatoa:**
- **`loading`**: **Inaonyesha** ujumbe wa kupakia wakati data za API zinapopatikana
- **`errors`**: **Inaonyesha** ujumbe wa makosa ikiwa simu za API zinashindwa au data si sahihi
- **`data`**: **Inahifadhi** data mbichi kwa madhumuni ya urekebishaji makosa wakati wa maendeleo
- **`result-container`**: **Inaonyesha** taarifa zilizopangwa za athari ya kaboni kwa watumiaji
- **`clear-btn`**: **Inaruhusu** watumiaji kubadilisha mkoa wao na kusanidi kiendelezi upya
### Kuanzisha Mchakato wa Kujenga
Sasa tuwe tukisakinisha utegemezi wa mradi na kujaribu mchakato wa kujenga:
```bash
npm install
```
**Mchakato huu wa usakinishaji unafanikisha:**
- **Inapakua** Webpack na utegemezi mwingine wa maendeleo ulioratibiwa kwenye `package.json`
- **Inapanga** zana ya kujenga kwa kukusanya JavaScript ya kisasa
- **Inatayarisha** mazingira ya maendeleo kwa ujenzi na majaribio ya kiendelezi
- **Inawezesha** kuchanganya msimbo, kuboresha, na sifa za kuendana na vivinjari tofauti
**Kazi:** Unda kazi za uthibitishaji za JavaScript ambazo zinakagua ikiwa sehemu ya funguo za API ina angalau herufi 20 na ikiwa msimbo wa eneo unafuata muundo sahihi (kama 'US-NEISO'). Ongeza maoni ya kuona kwa kubadilisha rangi ya mipaka ya pembejeo kuwa kijani kwa pembejeo sahihi na nyekundu kwa zisizo sahihi. Pia ongeza kipengele cha kubadili kuonyesha/kuficha funguo za API kwa usalama.
> 💡 **Uelewa wa Mchakato wa Kujenga**: Webpack huchanganya msimbo wako wa chanzo kutoka `/src/index.js` na kuuleta ndani ya `/dist/main.js`. Mchakato huu huimarisha msimbo wako kwa ajili ya uzalishaji na kuhakikisha ulinganifu na vivinjari.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
### Kuandika Jaribio la Maendeleo Yako
Katika hatua hii, unaweza kujaribu kiendelezi chako:
1. **Endesha** amri ya kujenga kuunda msimbo wako
2. **Pakia** ugani kwenye kivinjari chako ukitumia hali ya msanidi programu
3. **Thibitisha** kwamba fomu inaonyesha vizuri na inaonekana ya kitaalamu
4. **Kagua** kwamba vipengele vyote vya fomu vimepangiliwa kwa usahihi na vinafanya kazi
**Umefanikisha:**
- **Umejenga** muundo wa msingi wa HTML kwa ugani wako
- **Umetengeneza** vipindi vya usanidi na matokeo vyenye alama sahihi za semantiki
- **Umeanzisha** mtiririko wa kazi wa maendeleo wa kisasa ukitumia zana za viwango vya sekta
- **Umeandaa** msingi wa kuongeza utendaji wa mwingiliano wa JavaScript
### 🔄 **Ukaguzi wa Kifaransa**
**Maendeleo ya Maendeleo ya Ugani**: Thibitisha uelewa wako kabla ya kuendelea:
- ✅ Unaweza kuelezea kusudi la kila faili katika muundo wa mradi?
- ✅ Unaelewa jinsi mchakato wa kujenga unavyobadilisha msimbo wako wa chanzo?
- ✅ Kwa nini tunatenganisha usanidi na matokeo katika sehemu tofauti za UI?
- ✅ Jinsi gani muundo wa fomu unavyounga mkono matumizi na upatikanaji?
**Uelewa wa Mtiririko wa Maendeleo**: Sasa unapaswa kuwa na uwezo wa:
1. **Badilisha** HTML na CSS kwa kiolesura cha ugani wako
2. **Endesha** amri ya kujenga kuunda mabadiliko yako
3. **Pakia upya** ugani kwenye kivinjari chako kujaribu sasisho
4. **Rekebisha** shida ukitumia zana za msanidi programu wa kivinjari
Umekamilisha awamu ya kwanza ya maendeleo ya ugani wa kivinjari. Kama vile ndugu Wright walihitaji kwanza kuelewa angaa kabla ya kufikia kuruka, kuelewa dhana hizi za msingi kunakuandaa kujenga vipengele ngumu vya mwingiliano katika somo lijalo.
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Agent kutimiza changamoto ifuatayo:
**Maelezo:** Boresha ugani wa kivinjari kwa kuongezea uhalali wa fomu na vipengele vya mrejesho wa mtumiaji kuboresha uzoefu wa mtumiaji wakati wa kuingiza funguo za API na misimbo ya kanda.
**Mwongozo:** Tengeneza kazi za kuhalalisha JavaScript zinazokagua ikiwa uwanja wa ufunguo wa API una angalau herufi 20 na ikiwa msimbo wa kanda unazingatia muundo sahihi (kama 'US-NEISO'). Ongeza mrejesho wa kuona kwa kubadilisha rangi ya mipaka ya pembejeo kuwa kijani kwa pembejeo sahihi na nyekundu kwa zisizo sahihi. Pia ongeza kipengele cha kubadilisha kuonyesha/kuficha ufunguo wa API kwa madhumuni ya usalama.
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Angalia duka la viendelezi vya kivinjari na usakinishe moja kwenye kivinjari chako. Unaweza kuchunguza faili zake kwa njia za kuvutia. Unagundua nini?
Tazama duka la ugani wa kivinjari na usakinishe moja kwenye kivinjari chako. Unaweza kuchunguza faili zake kwa njia za kuvutia. Unagundua nini?
## Maswali ya Baada ya Somo
## Mtihani Baada ya Taaluma
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/24)
[Mtihani baada ya taaluma](https://ff-quizzes.netlify.app/web/quiz/24)
## Mapitio na Kujisomea
## Mapitio & Kujifunza Binafsi
Katika somo hili ulijifunza kidogo kuhusu historia ya kivinjari cha wavuti; tumia fursa hii kujifunza kuhusu jinsi wavumbuzi wa Mtandao wa Ulimwengu Wote walivyotazamia matumizi yake kwa kusoma zaidi kuhusu historia yake. Baadhi ya tovuti muhimu ni pamoja na:
Katika somo hili ulijifunza kidogo kuhusu historia ya kivinjari cha wavuti; tumia fursa hii kujifunza jinsi wavumbuzi wa World Wide Web walivyotazamia matumizi yake kwa kusoma zaidi kuhusu historia yake. Baadhi ya tovuti zenye msaada ni:
[Historia ya Vivinjari vya Wavuti](https://www.mozilla.org/firefox/browsers/browser-history/)
[Historia ya Mtandao](https://webfoundation.org/about/vision/history-of-the-web/)
[Historia ya Wavuti](https://webfoundation.org/about/vision/history-of-the-web/)
[Mazungumzo na Tim Berners-Lee](https://www.theguardian.com/technology/2019/mar/12/tim-berners-lee-on-30-years-of-the-web-if-we-dream-a-little-we-can-get-the-web-we-want)
## Kazi
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua ukurasa wa ugani wa Chrome/Edge (chrome://extensions) na chunguza ulio wasakinisha
- [ ] Tazama kichupo cha Mtandao cha DevTools cha kivinjari chako wakati wa kupakia ukurasa wa wavuti
- [ ] Jaribu kutazama chanzo cha ukurasa (Ctrl+U) kuona muundo wa HTML
- [ ] Kagua kipengele chochote cha ukurasa wa wavuti na badilisha CSS yake ndani ya DevTools
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Maliza mtihani baada ya somo na kuelewa misingi ya kivinjari
- [ ] Unda faili la msingi manifest.json kwa ugani wa kivinjari
- [ ] Jenga ugani rahisi "Hello World" unaoonyesha popup
- [ ] Jaribu kupakia ugani wako katika hali ya msanidi programu
- [ ] Chunguza nyaraka za ugani wa kivinjari kwa kivinjari unacholenga
### 📅 **Safari Yako ya Wiki Moja ya Ugani**
- [ ] Maliza ugani wa kivinjari unaofanya kazi na una matumizi halisi
- [ ] Jifunze kuhusu scripts za maudhui, scripts za nyuma, na mwingiliano wa popup
- [ ] Kuwa mtaalamu wa APIs za kivinjari kama hifadhi, tabs, na ujumbe
- [ ] Tumia muundo wa urafiki wa mtumiaji kwa ugani wako
- [ ] Jaribu ugani wako katika tovuti na mazingira tofauti
- [ ] Chapisha ugani wako kwenye duka la ugani la kivinjari
### 🌟 **Maendeleo Yako ya Mwezi wa Ugani wa Kivinjari**
- [ ] Jenga ugani nyingi zinazotatua matatizo tofauti ya watumiaji
- [ ] Jifunze APIs za kivinjari za kiwango cha juu na mbinu bora za usalama
- [ ] Changia miradi ya ugani wa kivinjari ya chanzo huria
- [ ] Zaidi ya kufuzu ufanisi wa kivinjari mbali mbali na kuongeza maendeleo polepole
- [ ] Tengeneza zana za maendeleo ya ugani na templeti kwa wengine
- [ ] Kuwa mtaalamu wa ugani wa kivinjari anayesaidia wasanidi programu wengine
## 🎯 Ratiba Yako ya Ujuzi wa Ugani wa Kivinjari
```mermaid
timeline
title Maendeleo ya Kuendeleza Kiongezi cha Kivinjari
section Msingi (dakika 15)
Browser Understanding: Muundo msingi
: Mchakato wa kuonyesha
: Vipengele vya kuunganishwa vya kiongezi
section Setup (dakika 20)
Development Environment: Muundo wa mradi
: Mipangilio ya zana za kujenga
: Hali ya mende wa kivinjari kwa watengenezaji
: Mchakato wa kupakia kiongezi
section Interface Design (dakika 25)
User Experience: Muundo wa HTML
: Ubunifu wa CSS
: Uhakiki wa fomu
: Ubunifu unaobadilika
section Core Functionality (dakika 35)
JavaScript Integration: Usimamizi wa matukio
: Mwingiliano na API
: Uhifadhi wa data
: Usimamizi wa makosa
section Browser APIs (dakika 45)
Platform Integration: Mfumo wa ruhusa
: API za uhifadhi
: Usimamizi wa tabo
: Menyu za muktadha
section Advanced Features (wiki 1)
Professional Extensions: Skripti za nyuma
: Skripti za maudhui
: Ulinganifu wa vivinjari mbalimbali
: Uboreshaji wa utendaji
section Publishing (wiki 2)
Distribution: Uwasilishaji duka
: Mchakato wa ukaguzi
: Maoni ya watumiaji
: Usimamizi wa masasisho
section Expert Level (mwezi 1)
Extension Ecosystem: API za hali ya juu
: Mbinu bora za usalama
: Vipengele vya biashara
: Uunganisho wa mfumo
```
### 🛠️ Muhtasari wa Zana Zako za Maendeleo ya Ugani
Baada ya kukamilisha somo hili, sasa una:
- **Maarifa ya Muundo wa Kivinjari**: Uelewa wa injini za uchoraji, mifumo ya usalama, na muunganisho wa ugani
- **Mazingira ya Maendeleo**: Zana za kisasa kama Webpack, NPM, na uwezo wa kuondoa hitilafu
- **Msingi wa UI/UX**: Muundo wa HTML wa semantiki na mifumo ya kufichua hatua kwa hatua
- **Uelewa wa Usalama**: Uelewa wa ruhusa za kivinjari na taratibu salama za maendeleo
- **Dhana za Kivinjari Nyingine**: Maarifa ya mambo ya ulinganifu na mbinu za upimaji
- **Muunganisho wa API**: msingi wa kufanya kazi na vyanzo vya data vya nje
- **Mtiririko wa Kazi wa Kitaaluma**: Taratibu za viwango vya sekta za maendeleo na upimaji
**Matumizi Halisi:** Hizi ujuzi hutumika moja kwa moja kwa:
- **Maendeleo ya Wavuti**: Programu za kurasa moja na programu za wavuti zinazoendelea
- **Programu za Desktop**: Electron na programu za desktop zinazotegemea wavuti
- **Maendeleo ya Simu**: Programu mseto na suluhisho za simu za wavuti
- **Zana za Shirika**: Programu za uzalishaji wa ndani na otomatiki ya mtiririko wa kazi
- **Chanzo Huria**: Kuchangia miradi ya ugani wa kivinjari na viwango vya wavuti
**Kiwambo Kinafuata:** Uko tayari kuongeza utendaji wa mwingiliano, kufanya kazi na APIs za kivinjari, na kuunda ugani unaotatua matatizo halisi ya watumiaji!
## Wajibu
[Badilisha muonekano wa kiendelezi chako](assignment.md)
[Badilisha mtindo wa ugani wako](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kiarifu cha Msamaha**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upotoshaji. Hati ya awali katika lugha yake asilia inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inashauriwa. Hatuna wajibu wowote kwa kutoelewana au tafsiri potofu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,43 +1,114 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8c8cd4af6086cc1d47e1d43aa4983d20",
"translation_date": "2025-10-24T19:45:28+00:00",
"original_hash": "2b6203a48c48d8234e0948353b47d84e",
"translation_date": "2026-01-07T01:43:34+00:00",
"source_file": "5-browser-extension/2-forms-browsers-local-storage/README.md",
"language_code": "sw"
}
-->
# Mradi wa Kiendelezi cha Kivinjari Sehemu ya 2: Unganisha API, tumia Hifadhi ya Ndani
## Jaribio la Kabla ya Somo
# Mradi wa Kiongezi cha Kivinjari Sehemu ya 2: Piga Simu API, tumia Hifadhi ya Ndani
```mermaid
journey
title Safari Yako ya Muunganisho wa API & Uhifadhi
section Msingi
Weka marejeo ya DOM: 3: Student
Ongeza wasikilizaji wa matukio: 4: Student
Shughulikia uwasilishaji wa fomu: 4: Student
section Usimamizi wa Data
Tekeleza uhifadhi wa ndani: 4: Student
Jenga miito ya API: 5: Student
Shughulikia shughuli zisizo za kawaida: 5: Student
section Uzoefu wa Mtumiaji
Ongeza usimamizi wa makosa: 5: Student
Tengeneza hali za upakiaji: 4: Student
Safisha mwingiliano: 5: Student
```
## Mtihani wa Kabla ya Maktaba
[Jaribio la kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/25)
[Mtihani wa kabla ya maktaba](https://ff-quizzes.netlify.app/web/quiz/25)
## Utangulizi
Unakumbuka kiendelezi cha kivinjari ulichokuwa ukijenga? Kwa sasa una fomu inayovutia, lakini ni ya static tu. Leo tutaihuisha kwa kuunganisha na data halisi na kuipa uwezo wa kukumbuka.
Fikiria kompyuta za kudhibiti misheni ya Apollo - hazikuonyesha tu taarifa za kudumu. Zilikuwa zikiwasiliana mara kwa mara na chombo cha anga, zikiweka data ya telemetry, na kukumbuka vigezo muhimu vya misheni. Hiyo ndiyo aina ya tabia ya nguvu tunayoijenga leo. Kiendelezi chako kitafikia mtandao, kuchukua data halisi ya mazingira, na kukumbuka mipangilio yako kwa mara nyingine.
Kuunganisha API kunaweza kuonekana kuwa ngumu, lakini ni kama kufundisha msimbo wako jinsi ya kuwasiliana na huduma nyingine. Ikiwa unachukua data ya hali ya hewa, mlisho wa mitandao ya kijamii, au taarifa za alama ya kaboni kama tutakavyofanya leo, yote ni kuhusu kuanzisha miunganisho hii ya kidijitali. Pia tutachunguza jinsi vivinjari vinavyoweza kuhifadhi taarifa - sawa na jinsi maktaba zilivyotumia katalogi za kadi kukumbuka mahali vitabu vinapohifadhiwa.
Mwisho wa somo hili, utakuwa na kiendelezi cha kivinjari kinachochukua data halisi, kuhifadhi mapendeleo ya mtumiaji, na kutoa uzoefu laini. Hebu tuanze!
✅ Fuata sehemu zilizoorodheshwa kwa namba kwenye faili husika ili kujua wapi pa kuweka msimbo wako.
## Sanidi vipengele vya kudhibiti katika kiendelezi
Kabla ya JavaScript yako kudhibiti kiolesura, inahitaji marejeleo ya vipengele maalum vya HTML. Fikiria kama darubini inavyohitaji kuelekezwa kwenye nyota fulani - kabla ya Galileo kusoma miezi ya Jupiter, alihitaji kuipata na kuielekeza Jupiter yenyewe.
Katika faili yako ya `index.js`, tutaunda `const` zinazokamata marejeleo ya kila kipengele muhimu cha fomu. Hii ni sawa na jinsi wanasayansi wanavyoweka lebo kwenye vifaa vyao - badala ya kutafuta maabara nzima kila wakati, wanaweza kufikia moja kwa moja wanachohitaji.
Kumbuka ule kiongezi cha kivinjari ulichianza kujenga? Hivi sasa una fomu nzuri inayovutia, lakini ni ya kawaida tu. Leo tutajifanya iishi kwa kuunganisha na data halisi na kuipatia kumbukumbu.
Fikiria kuhusu kompyuta za udhibiti wa misheni za Apollo - hazikuonyesha tu taarifa zilizo thibitishwa. Walikuwa wakizungumza kila mara na anga za nafasi, wakiandaa data za telemetri, na kukumbuka vigezo muhimu vya misheni. Hilo ndilo tabia ya mabadiliko tunayojenga leo. Kiongezi chako kitaenda mtandaoni, kuchukua data halisi za mazingira, na kukumbuka mipangilio yako kwa mara inayofuata.
Uunganishaji wa API unaweza kuonekana kuwa ngumu, lakini kwa kweli ni kufundisha msimbo wako jinsi ya kuwasiliana na huduma nyingine. Iwe unachukua data ya hali ya hewa, vyombo vya habari vya kijamii, au taarifa za athari za kaboni kama tutakavyofanya leo, yote ni juu ya kuanzisha uhusiano huu wa kidijitali. Pia tutajifunza jinsi vivinjari vinaweza kuhifadhi taarifa - kama vile maktaba zinavyotumia kadi za kumbukumbu kuhifadhi vitabu.
Mwisho wa somo hili, utakuwa na kiongezi cha kivinjari kinachochukua data halisi, kuhifadhi mapendeleo ya mtumiaji, na kutoa uzoefu mzuri. Hebu tuanze!
```mermaid
mindmap
root((Dynamic Extensions))
DOM Manipulation
Element Selection
Event Handling
State Management
UI Updates
Local Storage
Data Persistence
Key-Value Pairs
Session Management
User Preferences
API Integration
HTTP Requests
Authentication
Data Parsing
Error Handling
Async Programming
Promises
Async/Await
Error Catching
Non-blocking Code
User Experience
Loading States
Error Messages
Smooth Transitions
Data Validation
```
✅ Fuata sehemu zilizo na nambari katika faili husika ili kujua wapi uweke msimbo wako
## Tengeneza vipengele vya kudhibiti katika kiongezi
Kabla JavaScript yako inaweza kudhibiti interface, inahitaji marejeleo ya vipengele maalum vya HTML. Fikiria kama teleskofu inavyohitaji kuangazia nyota fulani - kabla Galileo hajasoma mwezi wa Jupiter, alilazimika kupata na kuangalia Jupiter yenyewe.
Katika faili yako `index.js`, tutaunda mabadiliko ya `const` yanayoshikilia marejeleo ya kila kipengele muhimu cha fomu. Hii ni kama vile wanasayansi wanavyochapa vifaa vyao - badala ya kutafuta kila sehemu ya maabara kila wakati, wanaweza kufikia moja kwa moja wanachohitaji.
```mermaid
flowchart LR
A[Kanuni ya JavaScript] --> B[document.querySelector]
B --> C[Vichujio vya CSS]
C --> D[Vipengele vya HTML]
D --> E[".form-data"]
D --> F[".region-name"]
D --> G[".api-key"]
D --> H[".loading"]
D --> I[".errors"]
D --> J[".result-container"]
E --> K[Kipengele cha Fomu]
F --> L[Sehemu ya Ingizo]
G --> M[Sehemu ya Ingizo]
H --> N[Kipengele cha UI]
I --> O[Kipengele cha UI]
J --> P[Kipengele cha UI]
style A fill:#e1f5fe
style D fill:#e8f5e8
style K fill:#fff3e0
style L fill:#fff3e0
style M fill:#fff3e0
```
```javascript
// form fields
// maeneo ya fomu
const form = document.querySelector('.form-data');
const region = document.querySelector('.region-name');
const apiKey = document.querySelector('.api-key');
// results
// matokeo
const errors = document.querySelector('.errors');
const loading = document.querySelector('.loading');
const results = document.querySelector('.result-container');
@ -47,17 +118,39 @@ const myregion = document.querySelector('.my-region');
const clearBtn = document.querySelector('.clear-btn');
```
**Hii ndiyo msimbo unavyofanya:**
- **Inakamata** vipengele vya fomu kwa kutumia `document.querySelector()` na vichagua vya darasa la CSS
- **Inaunda** marejeleo ya sehemu za kuingiza jina la eneo na API key
- **Inaanzisha** miunganisho na vipengele vya kuonyesha matokeo ya data ya matumizi ya kaboni
- **Inasanidi** ufikiaji wa vipengele vya UI kama viashiria vya kupakia na ujumbe wa makosa
- **Inahifadhi** kila marejeleo ya kipengele katika `const` kwa matumizi rahisi katika msimbo wako
**Hivi ndivyo msimbo huu unavyofanya:**
- **Kushika** vipengele vya fomu kwa kutumia `document.querySelector()` na wachambuzi wa darasa za CSS
- **Kuunda** marejeleo kwa sehemu za kuingiza taarifa kwa jina la eneo na kitufe cha API
- **Kuanzisha** muunganisho kwenye vipengele vya kuonyesha matokeo ya matumizi ya kaboni
- **Kuweka** ufikiaji kwenye vipengele vya UI kama viashirio vya upakiaji na ujumbe wa makosa
- **Kuhifadhi** kila marejeleo ya kipengele katika mabadiliko ya `const` kwa matumizi rahisi katika msimbo wako mzima
## Ongeza wasikilizaji wa matukio
Sasa tutafanya kiendelezi chako kijibu vitendo vya mtumiaji. Wasikilizaji wa matukio ni njia ya msimbo wako ya kufuatilia mwingiliano wa mtumiaji. Fikiria kama waendeshaji wa simu za mapema - walikuwa wakisikiliza simu zinazoingia na kuunganisha nyaya sahihi wakati mtu alitaka kufanya mawasiliano.
Sasa tutajifanya kiongezi chako kichukue hatua za mtumiaji. Wasikilizaji wa matukio ni njia yako ya msimbo kufuatilia mwingiliano wa mtumiaji. Fikiria kama watoa huduma wa simu za zamani waliokuwa wakisikia simu zinazoingia na kuunganisha mizunguko inayofaa mtu anapotaka kuanzisha mawasiliano.
```mermaid
sequenceDiagram
participant User
participant Form
participant JavaScript
participant API
participant Storage
User->>Form: Jaza eneo/ufunguo wa API
User->>Form: Bonyeza tuma
Form->>JavaScript: Ianzishe tukio la tuma
JavaScript->>JavaScript: handleSubmit(e)
JavaScript->>Storage: Hifadhi mapendeleo ya mtumiaji
JavaScript->>API: Pata data ya kaboni
API->>JavaScript: Rudisha data
JavaScript->>Form: Sasisha UI na matokeo
User->>Form: Bonyeza kitufe cha futa
Form->>JavaScript: Ianzishe tukio la bonyeza
JavaScript->>Storage: Futa data iliyohifadhiwa
JavaScript->>Form: Rejesha hali ya awali
```
```javascript
form.addEventListener('submit', (e) => handleSubmit(e));
clearBtn.addEventListener('click', (e) => reset(e));
@ -65,37 +158,47 @@ init();
```
**Kuelewa dhana hizi:**
- **Inaambatisha** msikilizaji wa kuwasilisha kwenye fomu inayochochea wakati watumiaji wanapobonyeza Enter au kuwasilisha
- **Inaunganisha** msikilizaji wa kubonyeza kwenye kitufe cha kufuta ili kuweka upya fomu
- **Inapitisha** kitu cha tukio `(e)` kwa kazi za kushughulikia kwa udhibiti wa ziada
- **Inaita** kazi ya `init()` mara moja ili kusanidi hali ya awali ya kiendelezi chako
- **Kuambatanisha** msikilizaji wa jibu fomu unaochochewa wakati watumiaji wanabonyeza Enter au kitufe cha kuwasilisha
- **Kuunganisha** msikilizaji wa bonyeza kwenye kitufe cha kufuta kwa ajili ya kuweka upya fomu
- **Kupitisha** kitu cha tukio `(e)` kwa kazi za kushughulikia matukio kwa udhibiti zaidi
- **Kupiga** kazi ya `init()` mara moja kuweka hali ya awali ya kiongezi chako
✅ Angalia matumizi ya syntax ya kazi fupi yenye mshale iliyotumika hapa. Njia hii ya kisasa ya JavaScript ni safi zaidi kuliko kazi za kawaida, lakini zote zinafanya kazi sawa!
✅ Angalia sintaksia fupi ya kazi ya mshale inayotumika hapa. Njia hii ya kisasa ya JavaScript ni safi zaidi kuliko maelezo ya kazi za jadi, lakini zote zinafanya kazi sawa!
### 🔄 **Kipimo cha Mafunzo**
**Kuelewa Kushughulikia Matukio**: Kabla ya kuanza upya, hakikisha unaweza:
- ✅ Eleza jinsi `addEventListener` inavyounganisha hatua za mtumiaji na kazi za JavaScript
- ✅ Elewa kwanini tunapitisha kitu cha tukio `(e)` kwa kazi za kushughulikia matukio
- ✅ Tofautisha kati ya matukio ya `submit` na `click`
- ✅ Eleza lini kazi ya `init()` huanzishwa na kwa nini
## Jenga kazi za uanzishaji na kuweka upya
**Jaribio la Haraka:** Nini kingetokea ukisahau `e.preventDefault()` katika kutuma fomu?
*Jibu: Ukurasa ungepakiwa upya, ukipoteza hali zote za JavaScript na kuingilia uzoefu wa mtumiaji*
Hebu tuunde mantiki ya uanzishaji kwa kiendelezi chako. Kazi ya `init()` ni kama mfumo wa urambazaji wa meli unaokagua vyombo vyake - inatambua hali ya sasa na kurekebisha kiolesura ipasavyo. Inakagua ikiwa mtu amewahi kutumia kiendelezi chako kabla na kupakia mipangilio yao ya awali.
## Jenga kazi za kuanzisha na kusafisha
Kazi ya `reset()` inawapa watumiaji mwanzo mpya - sawa na jinsi wanasayansi wanavyoweka upya vyombo vyao kati ya majaribio ili kuhakikisha data safi.
Hebu tujenge mantiki ya kuanzisha kwa kiongezi chako. Kazi ya `init()` ni kama mfumo wa urambazaji wa meli ukikagua vipimo vyake - huamua hali ya sasa na kurekebisha interface ipasavyo. Inahakikisha kama mtu amewahi kutumia kiongezi chako kabla na inapakia mipangilio yao ya awali.
Kazi ya `reset()` inawapa watumiaji mwanzo safi - kama wanasayansi wanavyoweka upya vifaa vyao kati ya majaribio ili kuhakikisha data safi.
```javascript
function init() {
// Check if user has previously saved API credentials
// Angalia ikiwa mtumiaji amehifadhi taarifa za API hapo awali
const storedApiKey = localStorage.getItem('apiKey');
const storedRegion = localStorage.getItem('regionName');
// Set extension icon to generic green (placeholder for future lesson)
// TODO: Implement icon update in next lesson
// Weka ikoni ya ugani kuwa kijani jumla (mahali pa kuweka kwa somo lijalo)
// TODO: Tekeleza sasisho la ikoni katika somo lijalo
if (storedApiKey === null || storedRegion === null) {
// First-time user: show the setup form
// Mtumiaji wa mara ya kwanza: onyesha fomu ya usanidi
form.style.display = 'block';
results.style.display = 'none';
loading.style.display = 'none';
clearBtn.style.display = 'none';
errors.textContent = '';
} else {
// Returning user: load their saved data automatically
// Mtumiaji anayerejea: pasha data yao iliyohifadhiwa moja kwa moja
displayCarbonUsage(storedApiKey, storedRegion);
results.style.display = 'none';
form.style.display = 'none';
@ -105,49 +208,72 @@ function init() {
function reset(e) {
e.preventDefault();
// Clear stored region to allow user to choose a new location
// Futa eneo lililohifadhiwa ili kumruhusu mtumiaji kuchagua eneo jipya
localStorage.removeItem('regionName');
// Restart the initialization process
// Anzisha upya mchakato wa kuanzisha
init();
}
```
**Kufafanua kinachotokea hapa:**
- **Inachukua** API key iliyohifadhiwa na eneo kutoka hifadhi ya ndani ya kivinjari
- **Inakagua** ikiwa huyu ni mtumiaji wa mara ya kwanza (hakuna hati zilizohifadhiwa) au mtumiaji anayerejea
**Kuvunja kile kinachotokea hapa:**
- **Inachukua** funguo za API na sehemu ya eneo zilizohifadhiwa katika hifadhi ya ndani ya kivinjari
- **Inakagua** kama huyu ni mtumiaji wa mara ya kwanza (hakuna taarifa zilizohifadhiwa) au mtumiaji anayerudi
- **Inaonyesha** fomu ya usanidi kwa watumiaji wapya na kuficha vipengele vingine vya kiolesura
- **Inapakia** data iliyohifadhiwa moja kwa moja kwa watumiaji wanaorejea na kuonyesha chaguo la kuweka upya
- **Inasimamia** hali ya kiolesura cha mtumiaji kulingana na data inayopatikana
- **Inapakia** data iliyohifadhiwa kiotomatiki kwa watumiaji wanaorudi na kuonyesha chaguo la kusafisha
- **Inasimamia** hali ya interface ya mtumiaji kulingana na data inayopatikana
**Dhana muhimu kuhusu Hifadhi ya Ndani:**
- **Inahifadhi** data kati ya vikao vya kivinjari (tofauti na hifadhi ya kikao)
- **Inahifadhi** data kama jozi za funguo-thamani kwa kutumia `getItem()` na `setItem()`
- **Inarudisha** `null` wakati hakuna data inayopatikana kwa funguo fulani
- **Inadumu** data kati ya vikao vya kivinjari (tofauti na hifadhi ya kikao)
- **Huhifadhi** data kama jozi za funguo na thamani kwa kutumia `getItem()` na `setItem()`
- **Rudisha** `null` wakati hakuna data kwa funguo fulani
- **Inatoa** njia rahisi ya kukumbuka mapendeleo na mipangilio ya mtumiaji
> 💡 **Kuelewa Hifadhi ya Kivinjari**: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage) ni kama kutoa kiendelezi chako kumbukumbu ya kudumu. Fikiria jinsi Maktaba ya kale ya Alexandria ilivyohifadhi maandiko - taarifa zilikuwa zinapatikana hata wakati wasomi waliondoka na kurudi.
> 💡 **Kuelewa Hifadhi ya Kivinjari**: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage) ni kama kumpa kiongezi chako kumbukumbu endelevu. Fikiria jinsi Maktaba ya Alexandria ilivyokuwa ikihifadhi mikanda - taarifa zilikuwa zikipatikana hata wanasayansi walipotoka na kurudi.
>
> **Tabia muhimu:**
> - **Inahifadhi** data hata baada ya kufunga kivinjari chako
> - **Inadumu** hata baada ya kuwasha upya kompyuta na kivinjari kuanguka
> **Sifa Muhimu:**
> - **Inadumu** data hata baada ya kufunga kivinjari
> - **Inadumu** kwa kuwasha upya kompyuta na kushindwa kwa kivinjari
> - **Inatoa** nafasi kubwa ya kuhifadhi mapendeleo ya mtumiaji
> - **Inatoa** ufikiaji wa haraka bila ucheleweshaji wa mtandao
> **Kumbuka Muhimu**: Kiendelezi chako cha kivinjari kina hifadhi yake ya ndani iliyotengwa ambayo ni tofauti na kurasa za kawaida za wavuti. Hii inatoa usalama na kuzuia migongano na tovuti nyingine.
Unaweza kuona data yako iliyohifadhiwa kwa kufungua Zana za Wasanidi wa Kivinjari (F12), kwenda kwenye kichupo cha **Application**, na kupanua sehemu ya **Local Storage**.
![Sehemu ya hifadhi ya ndani](../../../../translated_images/localstorage.472f8147b6a3f8d141d9551c95a2da610ac9a3c6a73d4a1c224081c98bae09d9.sw.png)
> - **Inatoa** upatikanaji wa papo hapo bila ucheleweshaji wa mtandao
> **Kumbuka Muhimu:** Kiongezi chako cha kivinjari kina hifadhi yake ya ndani iliyotengwa ambayo ni tofauti na kurasa za mtandao wa kawaida. Hii hutoa usalama na kuzuia migongano na tovuti nyingine.
Unaweza kuangalia data yako iliyohifadhiwa kwa kufungua Vifaa vya Mtengenezaji (F12), kwenda sehemu ya **Application**, na kupanua sehemu ya **Local Storage**.
```mermaid
stateDiagram-v2
[*] --> CheckStorage: Utendaji huanza
CheckStorage --> FirstTime: Hakuna data iliyohifadhiwa
CheckStorage --> Returning: Data imetambulika
FirstTime --> ShowForm: Onyesha fomu ya usanidi
ShowForm --> UserInput: Mtumiaji anaingiza data
UserInput --> SaveData: Hifadhi katika localStorage
SaveData --> FetchAPI: Pata data ya kaboni
Returning --> LoadData: Soma kutoka localStorage
LoadData --> FetchAPI: Pata data ya kaboni
FetchAPI --> ShowResults: Onyesha data
ShowResults --> UserAction: Mtumiaji anashirikiana
UserAction --> Reset: Kitufe cha wazi kimebonyezwa
UserAction --> ShowResults: Tazama data
Reset --> ClearStorage: Ondoa data iliyohifadhiwa
ClearStorage --> FirstTime: Rudi kwenye usanidi
```
![Dirisha la hifadhi ya ndani](../../../../translated_images/localstorage.472f8147b6a3f8d1.sw.png)
> ⚠️ **Tahadhari ya Usalama**: Katika programu za uzalishaji, kuhifadhi API keys katika LocalStorage kuna hatari za usalama kwa kuwa JavaScript inaweza kufikia data hii. Kwa madhumuni ya kujifunza, njia hii inafanya kazi vizuri, lakini programu halisi zinapaswa kutumia hifadhi salama ya upande wa seva kwa hati nyeti.
> ⚠️ **Tafakari za Usalama:** Katika programu za uzalishaji, kuhifadhi funguo za API ndani ya LocalStorage kuna hatari za usalama kwa sababu JavaScript inaweza kufikia data hii. Kwa madhumuni ya kujifunza, njia hii inafanya kazi vizuri, lakini programu halisi zinapaswa kutumia hifadhi salama upande wa seva kwa nyaraka nyeti.
## Shughulikia kuwasilisha fomu
## Shughulikia uwasilishaji wa fomu
Sasa tutashughulikia kinachotokea wakati mtu anawasilisha fomu yako. Kwa kawaida, vivinjari hurejesha ukurasa wakati fomu zinawasilishwa, lakini tutazuia tabia hii ili kuunda uzoefu laini zaidi.
Sasa tutashughulikia kinachotokea mtu anapowasilisha fomu yako. Kawaida, vivinjari hupakia upya ukurasa wakati fomu zinatumiwa, lakini tutazuia tabia hii kuleta uzoefu laini.
Njia hii inafanana na jinsi udhibiti wa misheni unavyoshughulikia mawasiliano ya chombo cha anga - badala ya kuweka upya mfumo mzima kwa kila mawasiliano, wanadumisha operesheni inayoendelea wakati wa kuchakata taarifa mpya.
Njia hii ni kama jinsi udhibiti wa misheni unavyoshughulikia mawasiliano ya anga za nafasi - badala ya kuweka upya mfumo mzima kwa kila mawasiliano, wanaendelea kufanya kazi kwa uendelevu huku wakichakata taarifa za mpya.
Unda kazi inayokamata tukio la kuwasilisha fomu na kuchukua maingizo ya mtumiaji:
Tengeneza kazi inayokamata tukio la kuwasilisha fomu na kutoa data ya mtumiaji:
```javascript
function handleSubmit(e) {
@ -156,93 +282,148 @@ function handleSubmit(e) {
}
```
**Katika hapo juu, tumefanya:**
- **Inazuia** tabia ya kawaida ya kuwasilisha fomu ambayo ingeweza kuonyesha upya ukurasa
- **Inachukua** maadili ya maingizo ya mtumiaji kutoka sehemu za API key na eneo
- **Inapitisha** data ya fomu kwa kazi ya `setUpUser()` kwa uchakataji
- **Inadumisha** tabia ya programu ya ukurasa mmoja kwa kuepuka kuonyesha upya ukurasa
**Hapa juu, tumefanya:**
- **Kuzuia** tabia ya kawaida ya uwasilishaji wa fomu ambayo ingepakia upya ukurasa
- **Kutoa** thamani za mtumiaji kutoka sehemu za funguo za API na eneo
- **Kupitisha** data ya fomu kwa kazi ya `setUpUser()` kwa usindikaji
- **Kudumisha** tabia ya programu ya ukurasa mmoja kwa kuepuka kufunga ukurasa
✅ Kumbuka kuwa sehemu za fomu yako ya HTML zinajumuisha sifa ya `required`, kwa hivyo kivinjari kinathibitisha moja kwa moja kwamba watumiaji wanatoa API key na eneo kabla ya kazi hii kuendeshwa.
✅ Kumbuka kuwa sehemu za fomu za HTML zina `required` ambayo kivinjari hutathmini kiotomatiki kama watumiaji wamejaza funguo zote za API na eneo kabla ya kazi hii kuendeshwa.
## Sanidi mapendeleo ya mtumiaji
## Weka mapendeleo ya mtumiaji
Kazi ya `setUpUser` inawajibika kwa kuhifadhi hati za mtumiaji na kuanzisha simu ya kwanza ya API. Hii inaunda mpito laini kutoka usanidi hadi kuonyesha matokeo.
Kazi ya `setUpUser` inawajibika kwa kuhifadhi nyaraka za mtumiaji na kuanzisha simu ya kwanza kwa API. Hii inaunda mabadiliko laini kutoka usanidi hadi kuonyesha matokeo.
```javascript
function setUpUser(apiKey, regionName) {
// Save user credentials for future sessions
// Hifadhi taarifa za mtumiaji kwa ajili ya vikao vijavyo
localStorage.setItem('apiKey', apiKey);
localStorage.setItem('regionName', regionName);
// Update UI to show loading state
// Sasisha UI kuonyesha hali ya mzigo
loading.style.display = 'block';
errors.textContent = '';
clearBtn.style.display = 'block';
// Fetch carbon usage data with user's credentials
// Pata data ya matumizi ya kaboni kwa kutumia taarifa za mtumiaji
displayCarbonUsage(apiKey, regionName);
}
```
**Hatua kwa hatua, kinachotokea hapa:**
- **Inahifadhi** API key na jina la eneo katika hifadhi ya ndani kwa matumizi ya baadaye
- **Inaonyesha** kiashiria cha kupakia ili kuwajulisha watumiaji kwamba data inachukuliwa
- **Inafuta** ujumbe wowote wa makosa uliopita kutoka kwa kiolesura
- **Inafichua** kitufe cha kufuta kwa watumiaji kuweka upya mipangilio yao baadaye
- **Inaanzisha** simu ya API kuchukua data halisi ya matumizi ya kaboni
**Hatua kwa hatua, hapa kinachotokea ni:**
- **Hifadhi** funguo za API na jina la eneo katika hifadhi ya ndani kwa matumizi ya baadaye
- **Onyesha** kiashirio cha upakiaji kuwajulisha watumiaji data inaendeshwa
- **Futa** ujumbe wowote wa kosa uliopo kwenye maonyesho
- **Fichua** kitufe cha kufuta kwa watumiaji kusafisha mipangilio yao baadaye
- **Anzisha** simu ya API kuchukua data halisi ya matumizi ya kaboni
Kazi hii inaunda uzoefu laini wa mtumiaji kwa kusimamia uhifadhi wa data na masasisho ya kiolesura cha mtumiaji kwa hatua moja iliyoratibiwa.
Kazi hii huunda uzoefu wa mtumiaji usio na mshono kwa kusimamia kuhifadhi data na masasisho ya interface kwa vitendo vinavyoratibiwa.
## Onyesha data ya matumizi ya kaboni
Sasa tutaiunganisha kiendelezi chako na vyanzo vya data vya nje kupitia API. Hii inabadilisha kiendelezi chako kutoka zana ya pekee kuwa kitu kinachoweza kufikia taarifa za wakati halisi kutoka mtandao mzima.
Sasa tutaunganisha kiongezi chako na vyanzo vya data za nje kupitia API. Hii hubadilisha kiongezi chako kuwa zana inayoweza kupata taarifa za wakati halisi kutoka mtandao mzima.
**Kuelewa API**
[API](https://www.webopedia.com/TERM/A/API.html) ni jinsi programu tofauti zinavyowasiliana. Fikiria kama mfumo wa telegraph uliounganisha miji ya mbali katika karne ya 19 - waendeshaji walikuwa wakituma maombi kwa vituo vya mbali na kupokea majibu na taarifa iliyotakiwa. Kila wakati unapotazama mitandao ya kijamii, kuuliza msaidizi wa sauti swali, au kutumia programu ya usafirishaji, API zinawezesha ubadilishanaji huu wa data.
**Dhana muhimu kuhusu REST API:**
[API](https://www.webopedia.com/TERM/A/API.html) ni jinsi programu tofauti zinavyowasiliana. Fikiria kama mfumo wa telegrafu uliounganisha miji ya mbali karne ya 19 - waendeshaji walituma maombi kwa vituo vya mbali na kupokea majibu yenye taarifa waliyoomba. Kila mara unapotazama mitandao ya kijamii, kuuliza msaidizi wa sauti swali, au kutumia app ya usafirishaji, API ndizo zinazoratibu kubadilishana data hizi.
```mermaid
flowchart TD
A[Nyongeza Yako] --> B[Mwisho wa HTTP]
B --> C[API ya Ishara ya CO2]
C --> D{Ombi Halali?}
D -->|Ndiyo| E[Chambua Hifadhidata]
D -->|Hapana| F[Rejea Hitilafu]
E --> G[Taarifa za Kaboni]
G --> H[Majibu ya JSON]
H --> I[Nyongeza Yako]
F --> I
I --> J[Sabisha UI]
subgraph "Ombi la API"
K[Vichwa: auth-token]
L[Vipengele: nambariNchi]
M[Njia: PATA]
end
subgraph "Jibu la API"
N[Mkazo wa Kaboni]
O[% Mafuta ya Fosili]
P[Muda wa Kurekodi]
end
style C fill:#e8f5e8
style G fill:#fff3e0
style I fill:#e1f5fe
```
**Dhana muhimu kuhusu REST APIs:**
- **REST** inasimama kwa 'Representational State Transfer'
- **Inatumia** mbinu za kawaida za HTTP (GET, POST, PUT, DELETE) kuingiliana na data
- **Inarudisha** data katika miundo inayotabirika, kawaida JSON
- **Inatoa** sehemu za mwisho za URL zinazojulikana kwa aina tofauti za maombi
- **Inatumia** mbinu za kawaida za HTTP (GET, POST, PUT, DELETE) kuwasiliana na data
- **Inarudisha** data kwa muundo unaotabirika, kawaida JSON
- **Inatoa** viunganishi vinavyotegemewa vinavyotegemea URL kwa aina tofauti za maombi
✅ [CO2 Signal API](https://www.co2signal.com/) tutakayotumia inatoa data ya wakati halisi ya nguvu ya kaboni kutoka kwa gridi za umeme duniani kote. Hii inasaidia watumiaji kuelewa athari za mazingira za matumizi yao ya umeme!
✅ [CO2 Signal API](https://www.co2signal.com/) tutakayotumia inatoa data za wakati halisi za uzito wa kaboni kutoka kwa gridi za umeme duniani kote. Hii inawasaidia watumiaji kuelewa athari za kimazingira za matumizi yao ya umeme!
> 💡 **Kuelewa JavaScript Asynchronous**: Neno [`async`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) linawezesha msimbo wako kushughulikia operesheni nyingi kwa wakati mmoja. Unapochukua data kutoka kwa seva, hutaki kiendelezi chako kizime kabisa - hiyo ingekuwa kama udhibiti wa trafiki ya anga kusimamisha operesheni zote wakati wa kusubiri ndege moja kujibu.
> 💡 **Kuelewa JavaScript Asynchronous**: Neno la [`async`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) linaruhusu msimbo wako kushughulikia shughuli nyingi kwa wakati mmoja. Unapochukua data kutoka kwa seva, hutaki kiongezi chako kizime - ingekuwa kama udhibiti wa usafiri wa anga kusimamisha shughuli zote kusubiri ndege moja ijibu.
>
> **Faida muhimu:**
> - **Inadumisha** usikivu wa kiendelezi wakati data inapakia
> - **Inaruhusu** msimbo mwingine kuendelea kutekelezwa wakati wa maombi ya mtandao
> - **Inaboresha** usomaji wa msimbo ikilinganishwa na mifumo ya callback ya jadi
> - **Inaruhusu** kushughulikia makosa kwa neema kwa masuala ya mtandao
> **Manufaa Muhimu:**
> - **Hudumisha** unyumbufu wa kiongezi wakati data inapakia
> - **Inaruhusu** msimbo mwingine kuendelea wakati maombi ya mtandao yanaendeshwa
> - **Inaboresha** usomeka wa msimbo ikilinganishwa na mbinu za kawaida za callback
> - **Inaruhusu** kushughulikia makosa kwa njia nzuri wakati wa matatizo ya mtandao
Hapa kuna video fupi kuhusu `async`:
[![Async na Await kwa kudhibiti ahadi](https://img.youtube.com/vi/YwmlRkrxvkk/0.jpg)](https://youtube.com/watch?v=YwmlRkrxvkk "Async na Await kwa kudhibiti ahadi")
[![Async and Await kwa kusimamia ahadi](https://img.youtube.com/vi/YwmlRkrxvkk/0.jpg)](https://youtube.com/watch?v=YwmlRkrxvkk "Async and Await kwa kusimamia ahadi")
> 🎥 Bonyeza picha hapo juu kwa video kuhusu async/await.
Unda kazi ya kuchukua na kuonyesha data ya matumizi ya kaboni:
### 🔄 **Kipimo cha Mafunzo**
**Kuelewa Programu isiyopitisha wakati moja**: Kabla ya kuingia katika kazi ya API, hakikisha unaelewa:
- ✅ Kwa nini tunatumia `async/await` badala ya kuziba kiongezi chote
- ✅ Jinsi vipengele vya `try/catch` vinavyoshughulikia makosa ya mtandao kwa upole
- ✅ Tofauti kati ya operesheni zenye mpangilio na zisizokuwa na mpangilio
- ✅ Kwa nini simu za API zinaweza kushindwa na jinsi ya kushughulikia makosa hayo
**Muunganisho wa Kila Siku:** Fikiria mifano hii ya kila siku ya async:
- **Kuagiza chakula**: Hutaki kusubiri jikoni - unapata risiti na kuendelea na mambo mengine
- **Kutuma barua pepe**: App yako haizime wakati wa kutuma - unaweza kuandika barua pepe zaidi
- **Kupakia kurasa za wavuti**: Picha zinapakia polepole huku unaendelea kusoma maandishi
**Mtiririko wa Uthibitishaji wa API**:
```mermaid
sequenceDiagram
participant Ext as Extension
participant API as CO2 Signal API
participant DB as Database
Ext->>API: Ombi lenye token ya uthibitisho
API->>API: Thibitisha token
API->>DB: Uliza data ya kaboni
DB->>API: Rudisha data
API->>Ext: Jibu la JSON
Ext->>Ext: Sasisha UI
```
Tengeneza kazi ya kuchukua na kuonyesha data ya matumizi ya kaboni:
```javascript
// Modern fetch API approach (no external dependencies needed)
// Mbinu ya kisasa ya fetch API (haitaji utegemezi wa nje)
async function displayCarbonUsage(apiKey, region) {
try {
// Fetch carbon intensity data from CO2 Signal API
// Pata data ya ukali wa kaboni kutoka API ya CO2 Signal
const response = await fetch('https://api.co2signal.com/v1/latest', {
method: 'GET',
headers: {
'auth-token': apiKey,
'Content-Type': 'application/json'
},
// Add query parameters for the specific region
// Ongeza vigezo vya uchunguzi kwa mkoa maalum
...new URLSearchParams({ countryCode: region }) && {
url: `https://api.co2signal.com/v1/latest?countryCode=${region}`
}
});
// Check if the API request was successful
// Angalia kama ombi la API liligonga
if (!response.ok) {
throw new Error(`API request failed: ${response.status}`);
}
@ -250,10 +431,10 @@ async function displayCarbonUsage(apiKey, region) {
const data = await response.json();
const carbonData = data.data;
// Calculate rounded carbon intensity value
// Hesabu thamani ya ukali wa kaboni iliyozungushwa
const carbonIntensity = Math.round(carbonData.carbonIntensity);
// Update the user interface with fetched data
// Sasaidishaji kiolesura cha mtumiaji na data iliyopatikana
loading.style.display = 'none';
form.style.display = 'none';
myregion.textContent = region.toUpperCase();
@ -261,12 +442,12 @@ async function displayCarbonUsage(apiKey, region) {
fossilfuel.textContent = `${carbonData.fossilFuelPercentage.toFixed(2)}% (percentage of fossil fuels used to generate electricity)`;
results.style.display = 'block';
// TODO: calculateColor(carbonIntensity) - implement in next lesson
// TODO: calculateColor(carbonIntensity) - tekeleza katika somo lijalo
} catch (error) {
console.error('Error fetching carbon data:', error);
// Show user-friendly error message
// Onyesha ujumbe wa kosa unaokubalika kwa mtumiaji
loading.style.display = 'none';
results.style.display = 'none';
errors.textContent = 'Sorry, we couldn\'t fetch data for that region. Please check your API key and region code.';
@ -274,58 +455,209 @@ async function displayCarbonUsage(apiKey, region) {
}
```
**Kufafanua kinachotokea hapa:**
**Vunja kile kinachotokea hapa:**
- **Inatumia** API ya kisasa ya `fetch()` badala ya maktaba za nje kama Axios kwa msimbo safi, usio na utegemezi
- **Inatekeleza** ukaguzi sahihi wa makosa kwa `response.ok` ili kugundua kushindwa kwa API mapema
- **Inashughulikia** operesheni za asynchronous kwa `async/await` kwa mtiririko wa msimbo unaosomeka zaidi
- **Inathibitisha** na CO2 Signal API kwa kutumia kichwa cha `auth-token`
- **Inachambua** data ya majibu ya JSON na kuchukua taarifa ya nguvu ya kaboni
- **Inasasisha** vipengele vingi vya UI na data ya mazingira iliyopangwa
- **Inatoa** ujumbe wa makosa unaofaa kwa watumiaji wakati simu za API zinashindwa
**Dhana muhimu za kisasa za JavaScript zilizodhihirishwa:**
- **Template literals** na sintaksia ya `${}` kwa muundo safi wa maandishi
- **Kushughulikia makosa** na vizuizi vya try/catch kwa programu thabiti
- **Mfumo wa async/await** kwa kushughulikia maombi ya mtandao kwa neema
- **Object destructuring** kuchukua data maalum kutoka kwa majibu ya API
- **Method chaining** kwa manipulations nyingi za DOM
✅ Kazi hii inaonyesha dhana kadhaa muhimu za maendeleo ya wavuti - kuwasiliana na seva za nje, kushughulikia uthibitisho, kuchakata data, kusasisha kiolesura, na kushughulikia makosa kwa neema. Hizi ni ujuzi wa msingi ambao watengenezaji wa kitaalamu hutumia mara kwa mara.
🎉 **Ulichofanikiwa:** Umeunda kiendelezi cha kivinjari kinachofanya:
- **Kinaunganisha** na mtandao na kuchukua data halisi ya mazingira
- **Kinahifadhi** mipangilio ya mtumiaji kati ya vikao
- **Kinashughulikia** makosa kwa neema badala ya kuanguka
- **Kinatoa** uzoefu laini, wa kitaalamu wa mtumiaji
Jaribu kazi yako kwa kuendesha `npm run build` na kuonyesha upya kiendelezi chako kwenye kivinjari. Sasa una kifuatiliaji cha alama ya kaboni kinachofanya kazi. Somo linalofuata litaongeza utendaji wa ikoni ya nguvu ili kukamilisha kiendelezi.
- **Imetekeleza** ukaguzi sahihi wa makosa kwa kutumia `response.ok` ili kugundua makosa ya API mapema
- **Inashughulikia** operesheni asynchronous kwa kutumia `async/await` kwa mtiririko wa msimbo unaosomeka zaidi
- **Inathibitisha** kwa kutumia kichwa cha habari `auth-token` cha CO2 Signal API
- **Inachambua** data ya majibu ya JSON na kutoa taarifa za uzito wa kaboni
- **Inasasisha** vipengele vingi vya UI kwa data ya mazingira iliyopangwa
- **Inatoa** ujumbe wa makosa rafiki kwa mtumiaji mwanzoni makosa ya API
**Dhana muhimu za JavaScript za kisasa zilizoonyeshwa:**
- **Mitiso ya templeti** kwa syntax ya `${}` kwa uandikishaji safi wa string
- **Kushughulikia makosa** kwa vipengele vya try/catch kwa programu imara
- **Muundo wa async/await** kwa kushughulikia maombi ya mtandao kwa upole
- **Uvunjaji wa vitu** kuchukua data maalum kutoka majibu ya API
- **Minyororo ya mbinu** kwa michakato mingi ya DOM
✅ Kazi hii inaonyesha dhana muhimu za ukuzaji wavuti - kuwasiliana na seva za nje, kusimamia uthibitishaji, kuchakata data, kusasisha interface, na kushughulikia makosa kwa ustadi. Hizi ni ujuzi wa msingi ambao watengenezaji wa kitaalamu hutumia mara kwa mara.
```mermaid
flowchart TD
A[Anza Wito la API] --> B[Pata Ombi]
B --> C{Mtandao Umefanikiwa?}
C -->|Hapana| D[Kosa la Mtandao]
C -->|Ndiyo| E{Majibu Sawa?}
E -->|Hapana| F[Kosa la API]
E -->|Ndiyo| G[Tafsiri JSON]
G --> H{Data Sahihi?}
H -->|Hapana| I[Kosa la Data]
H -->|Ndiyo| J[Sasisha UI]
D --> K[Onyesha Ujumbe wa Kosa]
F --> K
I --> K
J --> L[Ficha Kupakia]
K --> L
style A fill:#e1f5fe
style J fill:#e8f5e8
style K fill:#ffebee
style L fill:#f3e5f5
```
### 🔄 **Kipimo cha Mafunzo**
**Kuelewa Mfumo Kamili**: Thibitisha utaalamu wako wa mtiririko mzima:
- ✅ Jinsi marejeleo ya DOM yanavyomruhusu JavaScript kudhibiti interface
- ✅ Kwa nini hifadhi ya ndani huunda kuishi kati ya vikao vya kivinjari
- ✅ Jinsi async/await inavyofanya simu za API bila kuzima kiongezi
- ✅ Nini hutokea wakati simu za API zinashindwa na jinsi makosa yanavyoshughulikiwa
- ✅ Kwa nini uzoefu wa mtumiaji unajumuisha hali za upakiaji na ujumbe wa makosa
🎉 **Umefanikisha:** Umeunda kiongezi cha kivinjari kinachofanya:
- **Kuunganisha** na mtandao na kuchukua data halisi ya mazingira
- **Kuhifadhi** mipangilio ya mtumiaji kati ya vikao
- **Kushughulikia** makosa kwa ustadi badala ya kuvunjika
- **Kutoa** uzoefu laini, wa kitaalamu kwa mtumiaji
Jaribu kazi yako kwa kuendesha `npm run build` na kusasisha kiongezi chako katika kivinjari. Sasa una kifuatilia kina cha athari za kaboni kinachofanya kazi. Somo lijalo litaongeza utendakazi wa ikoni ya mabadiliko kumalizia kiongezi.
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Agent kukamilisha changamoto ifuatayo:
**Description:** Boreshsha upanuzi wa kivinjari kwa kuongeza maboresho ya kushughulikia makosa na vipengele vya uzoefu wa mtumiaji. Changamoto hii itakusaidia kufanya mazoezi ya kufanya kazi na APIs, hifadhi ya ndani, na uendeshaji wa DOM kwa kutumia mifumo ya kisasa ya JavaScript.
**Maelezo:** Boresha kiendelezi cha kivinjari kwa kuongeza maboresho ya kushughulikia makosa na vipengele vya uzoefu wa mtumiaji. Changamoto hii itakusaidia kufanya mazoezi ya kufanya kazi na API, hifadhi ya ndani, na manipulations za DOM kwa kutumia mifumo ya kisasa ya JavaScript.
**Prompt:** Tengeneza toleo lililoboreshwa la kazi displayCarbonUsage ambalo linajumuisha: 1) Mbinu ya kujaribu tena kwa miito ya API iliyoshindwa kwa matumizi ya ondoa hujuma wa kufanya marudio, 2) Uhakiki wa pembejeo wa msimbo wa kanda kabla ya kufanya mwito wa API, 3) Uhuishaji wa upakiaji na viashiria vya maendeleo, 4) Kuhifadhi majibu ya API katika localStorage kwa nyakati za kumalizika (hifadhi kwa dakika 30), na 5) Kipengele cha kuonyesha data za kihistoria kutoka kwa miito ya awali ya API. Pia ongeza maelezo sahihi ya aina za TypeScript-style JSDoc kuelezea vigezo vyote vya kazi na aina za marejeo.
**Kichocheo:** Unda toleo lililoboreshwa la kazi ya displayCarbonUsage inayojumuisha: 1) Utaratibu wa kurudia kwa simu za API zilizoshindwa na kurudi nyuma kwa kasi, 2) Uthibitishaji wa maingizo kwa msimbo wa eneo kabla ya kufanya simu ya API, 3) Uhuishaji wa kupakia na viashiria vya maendeleo, 4) Kuhifadhi majibu ya API katika LocalStorage na timestamps za kumalizika muda (hifadhi kwa dakika 30), na 5) Kipengele cha kuonyesha data ya kihistoria kutoka kwa simu za API za awali. Pia ongeza maoni sahihi ya JSDoc ya mtindo wa TypeScript ili kuandika vigezo vyote vya kazi na aina za kurudi.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Panua uelewa wako wa API kwa kuchunguza wingi wa API za kivinjari zinazopatikana kwa maendeleo ya wavuti. Chagua moja ya API hizi za kivinjari na jenga onyesho dogo:
Panua uelewa wako wa APIs kwa kuchunguza wingi wa APIs zinazopatikana kwenye kivinjari kwa maendeleo ya wavuti. Chagua moja ya APIs hizi za kivinjari na tengeneza onyesho dogo:
- [Geolocation API](https://developer.mozilla.org/docs/Web/API/Geolocation_API) - Pata eneo la sasa la mtumiaji
- [Geolocation API](https://developer.mozilla.org/docs/Web/API/Geolocation_API) - Pata eneo la mtumiaji kwa sasa
- [Notification API](https://developer.mozilla.org/docs/Web/API/Notifications_API) - Tuma arifa za desktop
- [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API) - Unda kiolesura cha
Umejifunza kuhusu LocalStorage na API katika somo hili, vyote ni muhimu sana kwa msanifu wa wavuti wa kitaalamu. Je, unaweza kufikiria jinsi vitu hivi viwili vinavyofanya kazi pamoja? Fikiria jinsi unavyoweza kubuni tovuti ambayo ingeweka vitu vitakavyotumiwa na API.
- [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API) - Tengeneza interfaces za kuvuta na kuachia zinazoingiliana
- [Web Storage API](https://developer.mozilla.org/docs/Web/API/Web_Storage_API) - Mbinu za hifadhi ya ndani za hali ya juu
- [Fetch API](https://developer.mozilla.org/docs/Web/API/Fetch_API) - Mbadala wa kisasa kwa XMLHttpRequest
**Maswali ya utafiti ya kuzingatia:**
- Ni matatizo gani ya dunia halisi API hii huyakidhi?
- API inashughulikia vipi makosa na visa vya pembezoni?
- Kuna masuala gani ya usalama yanayojitokeza wakati wa kutumia API hii?
- API hii inaungwa mkono kwa upana gani katika vivinjari tofauti?
Baada ya utafiti wako, tambua sifa gani hufanya API iwe rafiki kwa waendelezaji na yenye kutegemeka.
## Jaribio Baada ya Somo
[Jaribio baada ya somo](https://ff-quizzes.netlify.app/web/quiz/26)
## Mapitio & Kujifunza Binafsi
Umejifunza kuhusu LocalStorage na APIs katika somo hili, zote zikiwa zenye manufaa sana kwa mtaalamu wa wavuti. Je, unaweza kufikiria jinsi vitu hivi viwili vinavyofanya kazi pamoja? Fikiria jinsi ungevutia usanifu wa tovuti itakayohifadhi vitu vinavyotumika na API.
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua tabo la DevTools Application na chunguza localStorage kwenye tovuti yoyote
- [ ] Tengeneza fomu rahisi ya HTML na jaribu uthibitishaji wa fomu kwenye kivinjari
- [ ] Jaribu kuhifadhi na kupata data kwa kutumia localStorage kwenye console ya kivinjari
- [ ] Chunguza data ya fomu inayotumwa kwa kutumia tabo la Mtandao (Network)
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Kamilisha jaribio baada ya somo na kuelewa dhana za kushughulikia fomu
- [ ] Tengeneza fomu ya upanuzi wa kivinjari inayohifadhi mapendeleo ya mtumiaji
- [ ] Tekeleza uthibitishaji wa fomu upande wa mteja na ujumbe wa makosa wenye msaada
- [ ] Fanya mazoezi ya kutumia chrome.storage API kwa ajili ya kuhifadhi data za upanuzi
- [ ] Tengeneza interface ya mtumiaji inayojibu mipangilio iliyohifadhiwa ya mtumiaji
### 📅 **Ujenzi wa Upanuzi Wako kwa Wiki Moja**
- [ ] Kamilisha upanuzi wa kivinjari wenye kazi kamili za fomu
- [ ] Zaidi ujuzi wa aina mbalimbali za hifadhi: za ndani (local), za usawazishaji (sync), na za kikao (session)
- [ ] Tekeleza vipengele vya juu vya fomu kama kujaza moja kwa moja na uthibitishaji
- [ ] Ongeza kazi za kuingiza/kuondoa data za mtumiaji
- [ ] Jaribu upanuzi wako kwa kina katika vivinjari tofauti
- [ ] Fanyia maboresho uzoefu wa mtumiaji na kushughulikia makosa kwenye upanuzi wako
### 🌟 **Utaalam Wako wa API za Wavuti kwa Mwezi Mmoja**
- [ ] Tengeneza programu ngumu kwa kutumia APIs za hifadhi za kivinjari mbalimbali
- [ ] Jifunze mifumo ya maendeleo inayotegemea offline kwanza
- [ ] Changia katika miradi ya chanzo wazi inayohusiana na uhifadhi wa data
- [ ] Kuwa mtaalamu katika maendeleo yanayozingatia faragha na uzingativu wa GDPR
- [ ] Tengeneza maktaba zinazoweza kutumika tena za kushughulikia fomu na usimamizi wa data
- [ ] Sambaza maarifa kuhusu APIs za wavuti na maendeleo ya upanuzi
## 🎯 Ratiba Yako ya Utaalam wa Maendeleo ya Upanuzi
```mermaid
timeline
title Maendeleo ya Kujifunza Muunganisho wa API & Uhifadhi
section Misingi ya DOM (dakika 15)
Marejeleo ya Vipengele: ujuzi wa querySelector
: Usanidi wa msikilizaji wa matukio
: Misingi ya usimamizi wa hali
section Uhifadhi wa Ndani (dakika 20)
Uhifadhi wa Data: Uhifadhi wa funguo-thamani
: Usimamizi wa kikao
: Usimamizi wa mapendeleo ya mtumiaji
: Zana za ukaguzi wa uhifadhi
section Kushughulikia Fomu (dakika 25)
Ingizo la Mtumiaji: Uthibitishaji wa fomu
: Kuzuia matukio
: Utoaji data
: Mabadiliko ya hali ya UI
section Muunganisho wa API (dakika 35)
Mawasiliano ya Nje: Maombi ya HTTP
: Mifumo ya uthibitishaji
: Uchambuzi wa data ya JSON
: Ushughulikiaji wa majibu
section Ufanyaji wa Async (dakika 40)
JavaScript ya Kisasa: Ushughulikiaji wa ahadi
: Mifumo ya async/await
: Usimamizi wa makosa
: Operesheni zisizozuia
section Ushughulikiaji wa Makosa (dakika 30)
Maombi Imara: Mipangilio ya jaribu/kamata
: Ujumbe rafiki kwa mtumiaji
: Upunguzaji wa hofu polepole
: Mbinu za kutatua kasoro
section Mifumo ya Juu (wiki 1)
Maendeleo ya Kitaalamu: Mikakati ya kuhifadhi cache
: Kuzuia viwango vya maombi
: Mifumo ya kujaribu tena
: Uboreshaji wa utendaji
section Ujuzi wa Uzalishaji (mwezi 1)
Vipengele vya Kampuni: Mbinu bora za usalama
: Toleo la API
: Ufuatiliaji & uandikaji
: Miundo changamano inayoweza kupanuka
```
### 🛠️ Muhtasari wa Zana Zako za Maendeleo ya Full-Stack
Baada ya kumaliza somo hili, sasa una:
- **Utaalam wa DOM**: Kulenga na uendeshaji wa vipengele kwa usahihi
- **Ujuzi wa Hifadhi**: Usimamizi wa data endelevu kwa localStorage
- **Uunganishaji wa API**: Kupata data kwa wakati halisi na uthibitishaji
- **Programu Asynchronous**: Operesheni zisizozuia kwa JavaScript ya kisasa
- **Kushughulikia Makosa**: Programu thabiti zinazoshughulikia makosa kwa uangalifu
- **Uzoefu wa Mtumiaji**: Hali za upakiaji, uthibitisho, na mwingiliano laini
- **Mifumo ya Kisasa**: fetch API, async/await, na vipengele vya ES6+
**Ujuzi wa Kitaalamu Uliopata**: Umetekeleza mifumo inayotumika katika:
- **Programu za Wavuti**: Programu za ukurasa mmoja zenye vyanzo vya data vya nje
- **Maendeleo ya Simu**: Programu zinazoendeshwa na API zenye uwezo wa kutumika offline
- **Programu za Desktop**: Programu za Electron zenye hifadhi endelevu
- **Mifumo ya Kiasasi**: Uthibitishaji, kuhifadhi kwa cache, na kushughulikia makosa
- **Mifumo ya Kisasa**: Mifumo ya usimamizi wa data ya React/Vue/Angular
**Kiwango Kifuatayo**: Uko tayari kuchunguza mada za hali ya juu kama mikakati ya caching, muunganisho wa wakati halisi wa WebSocket, au usimamizi tata wa hali!
## Kazi
## Kazi ya Nyumbani
[Chukua API](assignment.md)
[Kubali API](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tangazo la Kutojihusisha**:
Nyaraka hii imefasiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au vipungufu. Nakala ya asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya mtaalamu wa kibinadamu inashauriwa. Hatujawajibika kwa kutoelewana au tafsiri potofu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,163 +1,332 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "eb358f3f4c2c082f9f3a4f98efa1d337",
"translation_date": "2025-10-24T19:44:25+00:00",
"original_hash": "b275fed2c6fc90d2b9b6661a3225faa2",
"translation_date": "2026-01-07T01:45:23+00:00",
"source_file": "5-browser-extension/3-background-tasks-and-performance/README.md",
"language_code": "sw"
}
-->
# Mradi wa Kiendelezi cha Kivinjari Sehemu ya 3: Jifunze Kuhusu Kazi za Nyuma na Utendaji
Umewahi kujiuliza ni nini hufanya baadhi ya viendelezi vya kivinjari kuhisi haraka na vyenye mwitikio huku vingine vikionekana kuwa polepole? Siri iko katika kile kinachotokea nyuma ya pazia. Wakati watumiaji wanabonyeza kwenye kiolesura cha kiendelezi chako, kuna ulimwengu mzima wa michakato ya nyuma inayosimamia upatikanaji wa data, masasisho ya ikoni, na rasilimali za mfumo kwa utulivu.
# Mradi wa Kiongezi cha Kivinjari Sehemu ya 3: Jifunze Kuhusu Majukumu ya Nyuma na Utendaji
```mermaid
journey
title Safari Yako ya Kuboresha Utendaji
section Msingi
Jifunze zana za kivinjari: 3: Student
Elewa upimaji: 4: Student
Tambua vikwazo: 4: Student
section Vipengele vya Ongezeko
Jenga mfumo wa rangi: 4: Student
Unda kazi za nyuma: 5: Student
Sasisha alama kwa nguvu: 5: Student
section Uboreshaji
Simamia utendaji: 5: Student
Rekebisha matatizo: 4: Student
Pamba uzoefu: 5: Student
```
Umewahi kujiuliza ni nini kinachofanya baadhi ya viongezi vya kivinjari kuonekana vya kasi na vya majibu wakati vingine vinaonekana vya polepole? Siri iko katika kile kinachotokea nyuma ya pazia. Wakati watumiaji wanabofya katika kiolesura cha kiongezi chako, kuna ulimwengu mzima wa michakato ya nyuma ambayo hushughulikia kwa utulivu upokeaji wa data, sasisho za ikoni, na rasilimali za mfumo.
Hii ni somo letu la mwisho katika mfululizo wa viendelezi vya kivinjari, na tunakwenda kufanya kifuatiliaji chako cha alama ya kaboni kifanye kazi kwa urahisi. Utaongeza masasisho ya ikoni ya nguvu na kujifunza jinsi ya kugundua masuala ya utendaji kabla hayajawa matatizo. Ni kama kurekebisha gari la mbio - marekebisho madogo yanaweza kufanya tofauti kubwa katika jinsi kila kitu kinavyofanya kazi.
Hii ni somo letu la mwisho katika mfululizo wa viongezi vya kivinjari, na tutaifanya kipima alama cha kaboni kiende kwa ufanisi. Utaongeza sasisho za ikoni zinazobadilika na kujifunza jinsi ya kutambua matatizo ya utendaji kabla hayajawa shida. Ni kama kusawazisha gari la mbio - marekebisho madogo yanaweza kufanya tofauti kubwa katika jinsi kila kitu kinavyoendeshwa.
Tunapomaliza, utakuwa na kiendelezi kilichosafishwa na kuelewa kanuni za utendaji zinazotofautisha programu za wavuti nzuri na zile bora. Hebu tuzame katika ulimwengu wa uboreshaji wa kivinjari.
Mara tutakapomaliza, utakuwa na kiongezi kilichosafishwa na utaelewa kanuni za utendaji zinazotenganisha programu za wavuti nzuri na bora. Tuchimbue ulimwengu wa uboreshaji wa kivinjari.
## Maswali ya Kabla ya Somo
## Mtihani wa Kabla ya Somo
[Maswali ya kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/27)
[Mtihani wa kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/27)
### Utangulizi
Katika masomo yetu ya awali, ulijenga fomu, ukaunganisha na API, na ukashughulikia upatikanaji wa data usio wa moja kwa moja. Kiendelezi chako kinachukua sura vizuri.
Sasa tunahitaji kuongeza ukamilifu - kama kufanya ikoni ya kiendelezi hicho ibadilishe rangi kulingana na data ya kaboni. Hii inanikumbusha jinsi NASA ilivyolazimika kuboresha kila mfumo kwenye chombo cha Apollo. Hawakuweza kumudu mizunguko au kumbukumbu iliyopotea kwa sababu maisha yalitegemea utendaji. Ingawa kiendelezi chetu cha kivinjari si muhimu kiasi hicho, kanuni zile zile zinatumika - msimbo mzuri huunda uzoefu bora wa mtumiaji.
Katika masomo yetu ya awali, ulijenga fomu, ukaunganisha na API, na kushughulikia upokeaji wa data usio sawa wa wakati. Kiongezi chako kiko katika hatua nzuri ya kuundwa.
Sasa tunahitaji kuongeza matokeo ya mwisho - kama kufanya ikoni ya kiongezi kubadilisha rangi kulingana na data ya kaboni. Hii inanifanya nikumbuke jinsi NASA ilivyolazimika kuboresha kila mfumo kwenye chombo cha angani cha Apollo. Hawakuweza kupoteza mizunguko au kumbukumbu kwa sababu maisha yaliweza kutegemea utendaji. Ingawa kiongezi chetu cha kivinjari siyo muhimu sana hivyo, kanuni sawa zinatumika - msimbo mzuri hutoa uzoefu bora kwa mtumiaji.
```mermaid
mindmap
root((Utendaji na Kazi za Mandhari))
Browser Performance
Rendering Pipeline
Asset Optimization
DOM Manipulation
JavaScript Execution
Profiling Tools
Developer Tools
Performance Tab
Timeline Analysis
Bottleneck Detection
Extension Architecture
Background Scripts
Content Scripts
Message Passing
Icon Management
Optimization Strategies
Code Splitting
Lazy Loading
Caching
Resource Compression
Visual Feedback
Dynamic Icons
Color Coding
Real-time Updates
User Experience
```
## Misingi ya Utendaji wa Wavuti
Wakati msimbo wako unafanya kazi kwa ufanisi, watu wanaweza *kuhisi* tofauti. Unajua wakati ambapo ukurasa unapakia mara moja au uhuishaji unafanyika kwa urahisi? Huo ni utendaji mzuri kazini.
Utendaji si tu kuhusu kasi - ni kuhusu kuunda uzoefu wa wavuti unaohisi wa asili badala ya kuwa wa kusumbua na wa kufadhaisha. Katika siku za mwanzo za kompyuta, Grace Hopper maarufu alihifadhi nanosekondi (kipande cha waya chenye urefu wa futi moja) kwenye dawati lake kuonyesha jinsi mwanga unavyosafiri kwa sekunde bilioni moja. Ilikuwa njia yake ya kuelezea kwa nini kila mikrosekondi ni muhimu katika kompyuta. Hebu tuchunguze zana za upelelezi zinazokusaidia kugundua kinachochelewesha mambo.
> "Utendaji wa wavuti ni kuhusu mambo mawili: jinsi ukurasa unavyopakia haraka, na jinsi msimbo wake unavyofanya kazi haraka." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
Mada ya jinsi ya kufanya tovuti zako ziwe haraka sana kwenye aina zote za vifaa, kwa aina zote za watumiaji, katika hali zote, bila shaka ni pana. Hapa kuna mambo ya kuzingatia unapoijenga mradi wa kawaida wa wavuti au kiendelezi cha kivinjari.
Hatua ya kwanza ya kuboresha tovuti yako ni kuelewa kinachotokea kwa kweli nyuma ya pazia. Kwa bahati nzuri, kivinjari chako kina zana za upelelezi zenye nguvu zilizojengwa ndani.
Ili kufungua Zana za Watengenezaji katika Edge, bonyeza zile nukta tatu juu kulia, kisha nenda kwenye Zana Zaidi > Zana za Watengenezaji. Au tumia njia ya mkato ya kibodi: `Ctrl` + `Shift` + `I` kwenye Windows au `Option` + `Command` + `I` kwenye Mac. Ukishafika hapo, bonyeza kichupo cha Utendaji - hapa ndipo utakapofanya uchunguzi wako.
**Hii ndiyo zana yako ya upelelezi wa utendaji:**
- **Fungua** Zana za Watengenezaji (utazitumia mara kwa mara kama mtengenezaji!)
- **Nenda** kwenye kichupo cha Utendaji - fikiria kama kifuatiliaji cha usawa wa programu yako ya wavuti
- **Bonyeza** kitufe cha Rekodi na tazama ukurasa wako ukifanya kazi
- **Chunguza** matokeo ili kugundua kinachochelewesha mambo
Hebu jaribu hili. Fungua tovuti (Microsoft.com inafanya kazi vizuri kwa hili) na bonyeza kitufe cha 'Rekodi'. Sasa fresha ukurasa na tazama profaili ikikamata kila kitu kinachotokea. Unapomaliza kurekodi, utaona muhtasari wa kina wa jinsi kivinjari kinavyofanya 'scripts', 'renders', na 'paints' tovuti. Inanikumbusha jinsi udhibiti wa misheni unavyofuatilia kila mfumo wakati wa uzinduzi wa roketi - unapata data ya wakati halisi juu ya kinachotokea na lini.
✅ [Nyaraka za Microsoft](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) zina maelezo mengi zaidi ikiwa unataka kuchimba zaidi
> Kidokezo cha kitaalamu: Futa akiba ya kivinjari chako kabla ya kupima ili kuona jinsi tovuti yako inavyofanya kazi kwa wageni wa mara ya kwanza - kawaida ni tofauti sana na ziara za kurudia!
Chagua vipengele vya muda wa profaili ili kukuza matukio yanayotokea wakati ukurasa wako unapakia.
Pata muhtasari wa utendaji wa ukurasa wako kwa kuchagua sehemu ya muda wa profaili na kuangalia jopo la muhtasari:
![Muhtasari wa profaili ya Edge](../../../../translated_images/snapshot.97750180ebcad73794a3594b36925eb5c8dbaac9e03fec7f9b974188c9ac63c7.sw.png)
Angalia jopo la Kumbukumbu ya Matukio ili kuona kama tukio lolote lilichukua zaidi ya ms 15:
Wakati msimbo wako unafanya kazi kwa ufanisi, watu wanaweza hata *kuhisi* tofauti. Unajua wakati huo ambapo ukurasa unapakia mara moja au uhuishaji unaflow vizuri? Hiyo ni utendaji mzuri ukiwa kazini.
Utendaji siyo tu kuhusu kasi - ni kuhusu kutengeneza uzoefu wa wavuti unaohisi kuwa wa asili badala ya usumbufu na shida. Zamani katika siku za mwanzo za kompyuta, Grace Hopper alihifadhi kipande cha waya chenye urefu wa sentimita moja mezani mwake kuonyesha jinsi mwanga unavyosafiri katika nanosekunde moja (sehemu ya sekunde bilioni moja). Hii ilikuwa njia yake ya kuelezea kwa nini kila mikrosekunde ni muhimu katika kompyuta. Tuchunguze zana za uchunguzi zinazokusaidia kugundua kinachosababisha kucheleweshwa.
> "Utendaji wa tovuti unahusu mambo mawili: jinsi ukurasa unavyopakuliwa kwa haraka, na jinsi msimbo unavyokimbia haraka." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
Mada ya jinsi ya kufanya tovuti zako ziwe za kasi sana katika vifaa vyote aina mbalimbali, kwa watumiaji wote, katika hali zote za mazingira, haishangazi kuwa ni pana sana. Hapa kuna mambo ya kuzingatia unapojenga mradi wa wavuti wa kawaida au kiongezi cha kivinjari.
Hatua ya kwanza katika kuboresha tovuti yako ni kuelewa kinachotokea kweli chini ya pazia. Bahati nzuri, kivinjari chako kina zana za uchunguzi zilizo na nguvu zaidi ndani yake.
```mermaid
flowchart LR
A[HTML] --> B[Parsia]
B --> C[Mti wa DOM]
D[CSS] --> E[Parsia]
E --> F[CSSOM]
G[JavaScript] --> H[Tekeleza]
C --> I[Mti wa Uwasilishaji]
F --> I
H --> I
I --> J[Mpangilio]
J --> K[Paka]
K --> L[Muunganiko]
L --> M[Onyesha]
subgraph "Njia Muhimu ya Uwasilishaji"
N["1. Parsia HTML"]
O["2. Parsia CSS"]
P["3. Tekeleza JS"]
Q["4. Tengeneza Mti wa Uwasilishaji"]
R["5. Pangilia Vitu"]
S["6. Paka Piksela"]
T["7. Muunganiko wa Tabaka"]
end
style M fill:#e8f5e8
style I fill:#fff3e0
style H fill:#ffebee
```
Ili kufungua Zana za Wavumbuzi katika Edge, bonyeza vidoti vitatu hapo juu kulia, kisha nenda kwenye More Tools > Developer Tools. Au tumia njia ya keyboard: `Ctrl` + `Shift` + `I` kwenye Windows au `Option` + `Command` + `I` kwenye Mac. Ukifika hapo, bonyeza kichupo cha Performance - hapa ndipo utafanya uchunguzi wako.
**Hapa kuna jumla ya zana zako za kufuatilia utendaji:**
- **Fungua** Zana za Wavumbuzi (utazitumia mara kwa mara kama msanidi programu!)
- **Nenda** kwenye kichupo cha Performance - fikiria kama kichunguzi cha mazoezi cha programu yako ya wavuti
- **Bonyeza** kitufe cha Record na ukae uangalie ukurasa ukiendesha
- **Chunguza** matokeo kugundua kinachosababisha ucheleweshaji
Tujaribu hili. Fungua tovuti (Microsoft.com inafanya kazi vizuri) na bonyeza kitufe cha 'Record'. Sasa refreshing ukurasa na angalia profaaili ikichukua kila kinachoendelea. Ukimaliza kurekodi, utaona maelezo ya kina ya jinsi kivinjari kinavyofanya 'scripts', 'renders', na 'paints' tovuti. Inanikumbusha jinsi kituo cha udhibiti cha misheni kinavyofuata kila mfumo wakati wa uzinduzi wa roketi - unapata data halisi kwa wakati halisi kuhusu kinachotokea na lini.
![Edge profiler](../../../../translated_images/profiler.5a4a62479c5df01c.sw.png)
✅ [Hati ya Microsoft](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) ina maelezo mengi zaidi ikiwa unataka kifahamike zaidi
> Ushauri wa Pro: Safisha cache ya kivinjari chako kabla ya kujaribu kuona jinsi tovuti yako inavyofanya kazi kwa wageni wa mara ya kwanza - mara nyingi ni tofauti na ziara za kurudia!
Chagua vipengele vya ratiba ya profaili kupanua matukio yanayotokea wakati ukurasa wako unapakia.
Pata picha ya utendaji wa ukurasa wako kwa kuchagua sehemu ya ratiba ya profaili na kuangalia dirisha la muhtasari:
![Edge profiler snapshot](../../../../translated_images/snapshot.97750180ebcad737.sw.png)
Angalia dirisha la Log la Tukio kuona kama tukio lolote limechukua zaidi ya ms 15:
![Edge event log](../../../../translated_images/log.804026979f3707e0.sw.png)
✅ Jifunze profaaili yako! Fungua zana za msanidi kwenye tovuti hii na ona kama kuna vikwazo yoyote. Nini ni mali ambayo inapakia polepole zaidi? Haraka zaidi?
```mermaid
flowchart TD
A[Fungua DevTools] --> B[Elekea Kichupo cha Utendaji]
B --> C[Bofya Kitufe cha Kurekodi]
C --> D[Fanya Vitendo]
D --> E[Acha Kurekodi]
E --> F{Chambua Matokeo}
F --> G[Angalia Mstari wa Muda]
F --> H[Angalia Mtandao]
F --> I[Tazama Skripti]
F --> J[Tambua Matukio ya Uchoraji]
G --> K{Kazi Ndefu?}
H --> L{Mali Kubwa?}
I --> M{Kuzuia Uchoraji?}
J --> N{Uchoraji Mghali?}
K -->|Ndiyo| O[Boresha JavaScript]
L -->|Ndiyo| P[Finyaza Mali]
M -->|Ndiyo| Q[Ongeza Async/Defer]
N -->|Ndiyo| R[Rahisisha Mitindo]
O --> S[Jaribu Tena]
P --> S
Q --> S
R --> S
style A fill:#e1f5fe
style F fill:#fff3e0
style S fill:#e8f5e8
```
## Nini cha Kuutafuta Unapotengeneza Profaili
![Kumbukumbu ya matukio ya Edge](../../../../translated_images/log.804026979f3707e00eebcfa028b2b5a88cec6292f858767bb6703afba65a7d9c.sw.png)
Kukimbia profaaili ni mwanzo tu - ujuzi wa kweli ni kujua kile chati za rangi kinakokufahamisha kweli. Usijali, utajifunza kuzi soma. Wasanidi programu wenye uzoefu wamejifunza kugundua ishara za onyo kabla hazijawa matatizo makubwa.
✅ Jifunze profaili yako! Fungua zana za watengenezaji kwenye tovuti hii na uone kama kuna vizuizi. Ni rasilimali gani inayopakia polepole zaidi? Haraka zaidi?
Tuzungumze kuhusu walaghai wa kawaida - waumbaji wa matatizo ya utendaji wanaojaribu kuingia kwenye miradi ya wavuti. Kama Marie Curie alivyolazimika kufuatilia kwa makini viwango vya mionzi maabara yake, tunahitaji kuangalia mifumo fulani inayoashiria matatizo yanayokuja. Kukamata haya mapema kutakuokoa wewe (na watumiaji wako) msongo mkubwa.
## Nini cha Kuangalia Unapofanya Profaili
**Ukubwa wa mali**: Tovuti zimekuwa 'nzito' zaidi kwa miaka, na uzito huo mwingi unatokana na picha. Ni kama tunajaza mzigo mwingi zaidi kwenye mifuko yetu ya kidijitali.
Kuendesha profaili ni mwanzo tu - ujuzi halisi ni kujua kile grafu za rangi zinakuambia. Usijali, utazoea kuzisoma. Watengenezaji wenye uzoefu wamejifunza kugundua ishara za onyo kabla hazijawa matatizo makubwa.
✅ Angalia [Internet Archive](https://httparchive.org/reports/page-weight) kuona jinsi ukubwa wa kurasa umeongezeka kwa muda - ni wazi sana.
Hebu tuzungumze kuhusu wahalifu wa kawaida - matatizo ya utendaji yanayopenda kujificha kwenye miradi ya wavuti. Kama jinsi Marie Curie alivyolazimika kufuatilia viwango vya mionzi kwa uangalifu katika maabara yake, tunahitaji kuangalia mifumo fulani inayonyesha matatizo yanayokuja. Kuyagundua mapema kutakuokoa (na watumiaji wako) kutoka kwa kufadhaika.
**Hapa ni jinsi ya kuendelea kuboresha mali zako:**
- **Punguza ukubwa** wa picha hizo! Miundo ya kisasa kama WebP inaweza kupunguza faili kwa kiasi kikubwa
- **Toa** picha nzuri kwa kifaa kila wakati - hakuna haja ya kutuma picha kubwa za desktop kwa simu
- **Punguza** CSS na JavaScript yako - kila baiti ni muhimu
- **Tumia** upakiaji wa polepole ili picha zipakuliwe tu watumiaji wanapozizama kwa msururu
**Ukubwa wa rasilimali**: Tovuti zimekuwa "nzito" zaidi kwa miaka, na uzito mwingi wa ziada unatokana na picha. Ni kama tumekuwa tukijaza zaidi na zaidi kwenye masanduku yetu ya kidijitali.
**Kupitia DOM**: Kivinjari kinapaswa kujenga Modeli ya Hati kulingana na msimbo unaoandika, hivyo ni kwa maslahi ya utendaji mzuri kuweka majina ya elemeni kuwa machache, kutumia na kupamba kile ukurasa unachohitaji tu. Hadi hapa, CSS nyingi zisizotumika zinazohusiana na ukurasa zinaweza kuboreshwa; mitindo inayohitaji kutumiwa ukurasa mmoja tu haipaswi kuingizwa kwenye karatasi kuu ya mitindo.
✅ Angalia [Arki ya Mtandao](https://httparchive.org/reports/page-weight) ili kuona jinsi ukubwa wa kurasa umekua kwa muda - ni wazi sana.
**Mikakati muhimu ya kuboresha DOM:**
- **Punguza** idadi ya vipengele vya HTML na viwango vya uingizaji
- **Ondoa** sheria za CSS zisizotumika na umekanishaji wa karatasi za mitindo kwa ufanisi
- **Panga** CSS kupakia tu kinachohitajika kwa kila ukurasa
- **Panga** HTML kwa maana bora kwa uchambuzi wa kivinjari
**Hivi ndivyo unavyoweza kuweka rasilimali zako zikiwa bora:**
- **Banisha** picha hizo! Miundo ya kisasa kama WebP inaweza kupunguza ukubwa wa faili kwa kiasi kikubwa
- **Toa** saizi sahihi ya picha kwa kila kifaa - hakuna haja ya kutuma picha kubwa za desktop kwa simu
- **Punguza** CSS na JavaScript yako - kila byte ni muhimu
- **Tumia** upakiaji wa polepole ili picha zipakie tu wakati watumiaji wanapozisogeza
**JavaScript**: Kila msanidi JavaScript anapaswa kuangalia kwa skripti zinazozuia upangaji kabla DOM inaweza kusafirishwa na kupakwa rangi kwenye kivinjari. Fikiria kutumia `defer` na skripti zako za umbali (kama inavyofanyika katika moduli ya Terrarium).
**Uchambuzi wa DOM**: Kivinjari kinapaswa kujenga Mfano wa Kitu cha Nyaraka kulingana na msimbo unaoandika, kwa hivyo ni kwa maslahi ya utendaji mzuri wa ukurasa kuweka lebo zako kwa kiwango cha chini, ukitumia na kuunda tu kile kinachohitajika na ukurasa. Kwa hatua hii, CSS ya ziada inayohusiana na ukurasa inaweza kuboreshwa; mitindo inayohitajika kutumika tu kwenye ukurasa mmoja haitahitaji kujumuishwa kwenye karatasi kuu ya mitindo, kwa mfano.
**Mbinu za kisasa za kuboresha JavaScript:**
- **Tumia** sifa ya `defer` kupakia skripti baada ya uchambuzi wa DOM
- **Tekeleza** kugawanya msimbo kupakia only JavaScript inayohitajika
- **Tumia** upakiaji polepole kwa kazi zisizo muhimu mara moja
- **Punguza** matumizi ya maktaba nzito na mifumo inapowezekana
**Mikakati muhimu ya uboreshaji wa DOM:**
- **Punguza** idadi ya vipengele vya HTML na viwango vya kuingiza
- **Ondoa** sheria za CSS zisizotumika na unganisha karatasi za mitindo kwa ufanisi
- **Panga** CSS kupakia tu kinachohitajika kwa kila ukurasa
- **Unda** HTML kwa njia ya kimantiki kwa uchambuzi bora wa kivinjari
✅ Jaribu baadhi ya tovuti kwenye [Site Speed Test website](https://www.webpagetest.org/) kujifunza zaidi kuhusu ukaguzi wa kawaida unaofanywa kubaini utendaji wa tovuti.
**JavaScript**: Kila mtengenezaji wa JavaScript anapaswa kuangalia 'scripts' zinazozuia uchoraji ambazo lazima zipakie kabla ya DOM nyingine kuweza kuchambuliwa na kuchorwa kwenye kivinjari. Fikiria kutumia `defer` na scripts zako za ndani (kama inavyofanyika kwenye moduli ya Terrarium).
### 🔄 **Ukaguzi wa Mafunzo**
**Uelewa wa Utendaji**: Kabla ya kujenga vipengele vya kiongezi, hakikisha unaweza:
- ✅ Eleza njia muhimu ya uchoraji kutoka HTML hadi piksela
- ✅ Tambua vikwazo vya utendaji vinavyotokea mara kwa mara katika programu za wavuti
- ✅ Tumia zana za msanidi kivinjari kufuatilia utendaji wa ukurasa
- ✅ Elewa jinsi ukubwa wa mali na ugumu wa DOM unavyoathiri kasi
**Mbinu za kisasa za uboreshaji wa JavaScript:**
- **Tumia** sifa ya `defer` kupakia scripts baada ya uchambuzi wa DOM
- **Tekeleza** kugawanya msimbo ili kupakia JavaScript inayohitajika tu
- **Tumia** upakiaji wa polepole kwa utendaji usio wa muhimu
- **Punguza** matumizi ya maktaba na mifumo mizito inapowezekana
**Mtihani wa Haraka wa Kujijua**: Nini kinatokea wakati una JavaScript inayozuia upangaji?
*Jibu: Kivinjari kinapaswa kupakua na kutekeleza script kabla ya kuendelea kusoma HTML na kuchora ukurasa*
✅ Jaribu tovuti kadhaa kwenye [Tovuti ya Mtihani wa Kasi ya Tovuti](https://www.webpagetest.org/) ili kujifunza zaidi kuhusu ukaguzi wa kawaida unaofanywa ili kubaini utendaji wa tovuti.
**Athari Halisi za Utendaji**:
- **Kuchelewa kwa 100ms**: Watumiaji hutoa hisia ya kuchelewa
- **Kuchelewa kwa sekunde 1**: Watumiaji huanza kupoteza umakini
- **Zaidi ya sekunde 3**: 40% ya watumiaji wanasitiza kutumia ukurasa
- **Mitandao ya simu**: Utendaji ni muhimu zaidi
Sasa kwa kuwa una wazo la jinsi kivinjari kinavyotoa rasilimali unazotuma kwake, hebu tuangalie mambo ya mwisho unayohitaji kufanya ili kukamilisha kiendelezi chako:
Sasa huku ukijua jinsi kivinjari kinavyopaka mali unazotuma, tazama vitu vya mwisho unavyohitaji kufanya kuimaliza kiongezi chako:
### Unda kazi ya kuhesabu rangi
Sasa tutaunda kazi inayogeuza data ya nambari kuwa rangi zenye maana. Fikiria kama mfumo wa taa za barabarani - kijani kwa nishati safi, nyekundu kwa kiwango cha juu cha kaboni.
Kazi hii itachukua data ya CO2 kutoka API yetu na kuamua ni rangi gani inayoonyesha vyema athari za mazingira. Ni sawa na jinsi wanasayansi wanavyotumia mfumo wa rangi katika ramani za joto kuonyesha mifumo tata ya data - kutoka kwa joto la bahari hadi uundaji wa nyota. Hebu tuongeze hii kwenye `/src/index.js`, mara tu baada ya zile `const` tulizoanzisha awali:
Sasa tutaunda kazi inaygeuza data za nambari kuwa rangi zenye maana. Fikiri kama mfumo wa taa za barabarani - kijani kwa nishati safi, nyekundu kwa mwanga mkubwa wa kaboni.
Kazi hii itachukua data za CO2 kutoka API yetu na kubaini ni rangi gani inayoashiria zaidi athari za mazingira. Ni kama walimu wa sayansi wanavyotumia rangi kwenye ramani za joto kuonesha mifumo tata ya data - kutoka joto la bahari hadi uundaji wa nyota. Tutaongeza hii kwa `/src/index.js`, mara tu baada ya zile `const` tunazoziongeza mapema:
```mermaid
flowchart LR
A[Thamani ya CO2] --> B[Tafuta Kiwango Karibu Zaidi]
B --> C[Pata Kielekezi cha Kiwango]
C --> D[Ramani kwa Rangi]
D --> E[Tuma kwa Mandharinyuma]
subgraph "Kiwango cha Rangi"
F["0-150: Kijani (Safisha)"]
G["150-600: Njano (Kiwango cha Kati)"]
H["600-750: Machungwa (Kiwango cha Juu)"]
I["750+: Kahawia (Kiwango Sana Juu)"]
end
subgraph "Ujumbe Kupitia"
J[Script ya Maudhui]
K[chrome.runtime.sendMessage]
L[Script ya Mandharinyuma]
M[Update ya Ikoni]
end
style A fill:#e1f5fe
style D fill:#e8f5e8
style E fill:#fff3e0
```
```javascript
function calculateColor(value) {
// Define CO2 intensity scale (grams per kWh)
// Tambua kiwango cha mkazo wa CO2 (gramu kwa kWh)
const co2Scale = [0, 150, 600, 750, 800];
// Corresponding colors from green (clean) to dark brown (high carbon)
// Rangi zinazolingana kutoka kijani (safi) hadi kahawia kuu (oksijeni ya juu)
const colors = ['#2AA364', '#F5EB4D', '#9E4229', '#381D02', '#381D02'];
// Find the closest scale value to our input
// Tafuta thamani ya kiwango inayokaribia zaidi na ingizo letu
const closestNum = co2Scale.sort((a, b) => {
return Math.abs(a - value) - Math.abs(b - value);
})[0];
console.log(`${value} is closest to ${closestNum}`);
// Find the index for color mapping
// Tafuta nambari ya ramani ya rangi
const num = (element) => element > closestNum;
const scaleIndex = co2Scale.findIndex(num);
const closestColor = colors[scaleIndex];
console.log(scaleIndex, closestColor);
// Send color update message to background script
// Tuma ujumbe wa kusasisha rangi kwa script ya nyuma
chrome.runtime.sendMessage({ action: 'updateIcon', value: { color: closestColor } });
}
```
**Hebu tuchambue kazi hii ya busara:**
- **Inaweka** safu mbili - moja kwa viwango vya CO2, nyingine kwa rangi (kijani = safi, kahawia = chafu!)
- **Inapata** mechi ya karibu zaidi na thamani yetu halisi ya CO2 kwa kutumia upangaji wa safu
**Hebu tuchambue kazi hii maridadi:**
- **Inaanzisha** safu mbili - moja kwa viwango vya CO2, nyingine kwa rangi (kijani = safi, kahawia = chafu!)
- **Inatafuta** thamani iliyo karibu zaidi na CO2 halisi kwa kutumia upangaji wa safu
- **Inachukua** rangi inayolingana kwa kutumia njia ya findIndex()
- **Inatuma** ujumbe kwa script ya nyuma ya Chrome na rangi yetu iliyochaguliwa
- **Inatumia** maandishi ya kiolezo (hizo backticks) kwa muundo safi wa maandishi
- **Inahifadhi** kila kitu kikiwa kimepangwa kwa tamko la const
API ya `chrome.runtime` [API](https://developer.chrome.com/extensions/runtime) ni kama mfumo wa neva wa kiendelezi chako - inashughulikia mawasiliano yote ya nyuma ya pazia na kazi:
> "Tumia API ya chrome.runtime kupata ukurasa wa nyuma, kurudisha maelezo kuhusu manifest, na kusikiliza na kujibu matukio katika maisha ya programu au kiendelezi. Unaweza pia kutumia API hii kubadilisha njia ya URL za jamaa kuwa URL zilizo na sifa kamili."
**Kwa nini API ya Chrome Runtime ni muhimu:**
- **Inaruhusu** sehemu tofauti za kiendelezi chako kuzungumza
- **Inashughulikia** kazi za nyuma bila kufungia kiolesura cha mtumiaji
- **Inasimamia** matukio ya maisha ya kiendelezi chako
- **Inafanya** kupitisha ujumbe kati ya scripts kuwa rahisi sana
✅ Ikiwa unakijenga kiendelezi hiki cha kivinjari kwa Edge, inaweza kushangaza kwamba unatumia API ya chrome. Matoleo mapya ya kivinjari cha Edge yanaendesha injini ya kivinjari ya Chromium, kwa hivyo unaweza kutumia zana hizi.
> **Kidokezo cha Kitaalamu**: Ikiwa unataka kufanya profaili ya kiendelezi cha kivinjari, fungua zana za watengenezaji kutoka ndani ya kiendelezi chenyewe, kwani ni kivinjari chake tofauti. Hii inakupa ufikiaji wa vipimo vya utendaji maalum vya kiendelezi.
- **Inatuma** ujumbe kwa script ya nyuma ya Chrome yenye rangi tuliiyochagua
- **Inatumia** literals za template (hizo nyota) kwa usafi zaidi wa muundo wa maneno
- **Inahifadhi** kila kitu kwa utaratibu na maelezo ya const
`chrome.runtime` [API](https://developer.chrome.com/extensions/runtime) ni kama mfumo wa neva wa kiongezi chako - hushughulikia mawasiliano na majukumu ya nyuma ya pazia:
> "Tumia chrome.runtime API kupata ukurasa wa nyuma, rudisha maelezo kuhusu hati, na sikiliza na jibu matukio katika mzunguko wa maisha wa app au kiongezi. Pia unaweza kutumia API hii kubadilisha njia za relative za URLs kuwa URLs kamili."
**Kwa nini Chrome Runtime API ni ya kufaa sana:**
- **Inaruhusu** sehemu tofauti za kiongezi chako kuwasiliana
- **Inashughulikia** kazi za nyuma bila kuzuia kiolesura cha mtumiaji
- **Inasimamia** matukio ya mzunguko wa maisha ya kiongezi chako
- **Inafanya** upitishaji ujumbe kati ya script kuwa rahisi sana
✅ Ikiwa unatengeneza kiongezi hiki cha kivinjari kwa Edge, inaweza kukushangaza kwamba unatumia API ya chrome. Mabadiliko ya kivinjari cha Edge yanatumia injini ya kivinjari cha Chromium, hivyo unaweza kutumia zana hizi.
```mermaid
architecture-beta
group browser(logos:chrome)[Kivinjari]
service popup(logos:html5)[UI ya Popup] in browser
service content(logos:javascript)[Skripti ya Maudhui] in browser
service background(database)[Skripti ya Nyuma] in browser
service api(logos:api)[API ya Nje] in browser
popup:R -- L:content
content:R -- L:background
background:T -- B:api
content:T -- B:api
junction junctionCenter in browser
popup:R -- L:junctionCenter
junctionCenter:R -- L:background
```
> **Ushauri wa Pro**: Ikiwa ungependa kufuatilia kiongezi cha kivinjari, anza zana za msanidi kutoka ndani ya kiongezi chenyewe, kwani ni mfano tofauti wa kivinjari. Hii inakuwezesha kupata vipimo maalum vya utendaji wa kiongezi.
### Weka rangi ya ikoni ya msingi
Kabla ya kuanza kupata data halisi, hebu tupe kiendelezi chetu mwanzo. Hakuna mtu anayependa kutazama ikoni tupu au inayovunjika. Tutaanza na rangi ya kijani ili watumiaji wajue kiendelezi kinafanya kazi mara tu wanapokisakinisha.
Kabla ya kuanza kupokea data halisi, tupe kiongezi mwanzo mzuri. Hakuna anayependa kuangalia ikoni tupu au kuonekana imevunjika. Tutaanza na rangi ya kijani ili watumiaji wajue kiongezi kinafanya kazi mara wanapo kichukua.
Katika kazi yako ya `init()`, hebu weka ikoni ya kijani ya msingi:
Katika kazi yako ya `init()`, tuweke ikoni ya kijani kama ili ya msingi:
```javascript
chrome.runtime.sendMessage({
@ -168,105 +337,261 @@ chrome.runtime.sendMessage({
});
```
**Hii uanzishaji unakamilisha:**
- **Inaweka** rangi ya kijani ya kawaida kama hali ya msingi
- **Inatoa** maoni ya haraka ya kuona wakati kiendelezi kinapopakia
- **Inaanzisha** muundo wa mawasiliano na script ya nyuma
- **Inahakikisha** watumiaji wanaona kiendelezi kinachofanya kazi kabla ya data kupakia
### Piga kazi, tekeleza wito
**Huu mwanzo unayafanya ni:**
- **Weka** rangi ya kijani isiyoegemea upande kama hali ya msingi
- **Toa** mrejesho wa kuona mara moja wakati kiongezi kinapakia
- **Anzisha** mtindo wa mawasiliano na script ya nyuma
- **Hakikisha** watumiaji wanaona kiongezi kinachofanya kazi kabla data haijapakia
### Piga simu kwa kazi, tekeleza simu
Sasa hebu tuunganishe kila kitu pamoja ili kwamba data mpya ya CO2 inapokuja, ikoni yako ibadilike kiotomatiki na rangi sahihi. Ni kama kuunganisha mzunguko wa mwisho katika kifaa cha elektroniki - ghafla vipengele vyote vya mtu binafsi vinafanya kazi kama mfumo mmoja.
Sasa tunganishe kila kitu pamoja ili kutokea data mpya ya CO2, ikoni yako ibadilishwe kiotomatiki na rangi sahihi. Ni kama kuunganisha mzunguko wa mwisho katika kifaa cha umeme - ghafla sehemu zote zinafanya kazi kama mfumo mmoja.
Ongeza mstari huu mara tu baada ya kupata data ya CO2 kutoka API:
Ongeza mstari huu mara baada ya kupata data ya CO2 kutoka API:
```javascript
// After retrieving CO2 data from the API
// let CO2 = data.data[0].intensity.actual;
// Baada ya kupata data ya CO2 kutoka API
// acha CO2 = data.data[0].intensity.actual;
calculateColor(CO2);
```
**Muunganiko huu unakamilisha:**
- **Unaunganisha** mtiririko wa data ya API na mfumo wa kiashiria cha kuona
- **Unasababisha** masasisho ya ikoni kiotomatiki wakati data mpya inafika
- **Unahakikisha** maoni ya kuona ya wakati halisi kulingana na kiwango cha sasa cha kaboni
- **Unadumisha** mgawanyo wa wasiwasi kati ya upatikanaji wa data na mantiki ya kuonyesha
**Uunganisho huu unafanikisha:**
- **Unganisha** mtiririko wa data ya API na mfumo wa kielekezi cha kuona
- **Unda** sasisho la ikoni kiotomatiki wakati data mpya inapotokea
- **Hakikisha** mrejesho wa kuona wa wakati halisi kulingana na mwanga wa kaboni wa sasa
- **Dumisha** utofauti wa majukumu kati ya upokeaji wa data na mantiki ya onyesho
Na hatimaye, katika `/dist/background.js`, ongeza msikilizaji wa simu hizi za hatua za nyuma:
Na mwisho, katika `/dist/background.js`, ongeza msikilizaji kwa simu hizi za vitendo vya nyuma:
```javascript
// Listen for messages from the content script
// Sikiliza ujumbe kutoka kwa script ya maudhui
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
if (msg.action === 'updateIcon') {
chrome.action.setIcon({ imageData: drawIcon(msg.value) });
}
});
// Draw dynamic icon using Canvas API
// Borrowed from energy lollipop extension - nice feature!
// Chora ikoni ya nguvu kwa kutumia API ya Canvas
// Imekopwa kutoka kwenye extension ya energy lollipop - kipengele kizuri!
function drawIcon(value) {
// Create an offscreen canvas for better performance
// Tengeneza canvas isiyoonyeshwa kwa utendaji bora
const canvas = new OffscreenCanvas(200, 200);
const context = canvas.getContext('2d');
// Draw a colored circle representing carbon intensity
// Chora duara lenye rangi linaloonyesha nguvu ya kaboni
context.beginPath();
context.fillStyle = value.color;
context.arc(100, 100, 50, 0, 2 * Math.PI);
context.fill();
// Return the image data for the browser icon
// Rudisha data ya picha kwa ikoni ya kivinjari
return context.getImageData(50, 50, 100, 100);
}
```
**Hii script ya nyuma inafanya:**
- **Inasikiliza** ujumbe kutoka kwa script yako kuu (kama mpokeaji wa simu)
- **Inashughulikia** maombi hayo ya 'updateIcon' kubadilisha ikoni ya zana yako
- **Inaunda** ikoni mpya papo hapo kwa kutumia API ya Canvas
- **Inachora** duara rahisi la rangi linaloonyesha kiwango cha sasa cha kaboni
- **Inasasisha** zana ya kivinjari chako na ikoni mpya
- **Inatumia** OffscreenCanvas kwa utendaji laini (hakuna kuzuia UI)
✅ Utajifunza zaidi kuhusu API ya Canvas katika [Masomo ya Mchezo wa Anga](../../6-space-game/2-drawing-to-canvas/README.md).
**Wakati wa kujaribu kiendelezi chako:**
- **Jenga** kila kitu kwa `npm run build`
- **Pakia upya** kiendelezi chako kwenye kivinjari (usisahau hatua hii)
- **Fungua** kiendelezi chako na tazama ikoni hiyo ikibadilisha rangi
- **Angalia** jinsi inavyoitikia data halisi ya kaboni kutoka kote ulimwenguni
**Hii ni kile script ya nyuma inachofanya:**
- **Inasikiliza** ujumbe kutoka script yako kuu (kama mkaribishaji anapokea simu)
- **Inashughulikia** maombi ya 'updateIcon' kubadilisha ikoni ya upau wa zana
- **Inaunda** ikoni mpya moja kwa moja kwa kutumia Canvas API
- **Inachora** mduara rahisi wenye rangi unaoonyesha mwanga wa kaboni wa sasa
- **Inasasisha** upau wa zana wa kivinjari chako na ikoni mpya
- **Inatumia** OffscreenCanvas kwa utendaji mzuri (hakuna kuzuia UI)
✅ Utajifunza zaidi kuhusu Canvas API katika masomo ya [Space Game](../../6-space-game/2-drawing-to-canvas/README.md).
```mermaid
sequenceDiagram
participant CS as Skripti ya Maudhui
participant BG as Skripti ya Kifahari
participant Canvas as OffscreenCanvas
participant Browser as Ikoni ya Kivinjari
CS->>BG: sendMessage({action: 'updateIcon', color})
BG->>Canvas: new OffscreenCanvas(200, 200)
Canvas->>Canvas: getContext('2d')
Canvas->>Canvas: beginPath() + fillStyle + arc()
Canvas->>Canvas: fill() + getImageData()
Canvas->>BG: Rudisha data ya picha
BG->>Browser: chrome.action.setIcon(imageData)
Browser->>Browser: Sasisha ikoni ya zana
```
### 🔄 **Ukaguzi wa Mafunzo**
**Uelewa Kamili wa Kiongezi**: Thibitisha ustadi wako wa mfumo mzima:
- ✅ Ujumbe unavyopita kati ya script tofauti za kiongezi kazi yake ni gani?
- ✅ Kwa nini tunatumia OffscreenCanvas badala ya Canvas ya kawaida kwa utendaji?
- ✅ Ni jukumu gani la Chrome Runtime API katika usanifu wa upanuzi?
- ✅ Je, algoriti ya hesabu ya rangi hupangaje data kwa mrejesho wa kuona?
Sasa utajua kwa haraka ikiwa ni wakati mzuri wa kufua nguo au ikiwa unapaswa kusubiri nishati safi zaidi. Umejenga kitu chenye manufaa halisi na umejifunza kuhusu utendaji wa kivinjari njiani.
**Mambo ya Kuzingatia Utendaji**: Upanuzi wako sasa unaonyesha:
- **Ujumbe bora**: Mawasiliano safi kati ya muktadha wa maandishi
- **Uchoraji ulioboreshwa**: OffscreenCanvas huzuia kuziba kwa UI
- **Mabadiliko ya wakati halisi**: Mabadiliko ya icon yanayotegemea data za moja kwa moja
- **Usimamizi wa kumbukumbu**: Usafishaji mzuri na usimamizi wa rasilimali
## Changamoto ya Wakala wa GitHub Copilot 🚀
**Wakati wa kujaribu upanuzi wako:**
- **Jenga** yote kwa `npm run build`
- **Pakia upya** upanuzi wako kwenye kivinjari (usisahau hatua hii)
- **Fungua** upanuzi wako na angalia icon ikibadilisha rangi
- **Angalia** jinsi unavyotegemea data halisi za kaboni kutoka duniani kote
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Sasa utajua kwa haraka kama ni wakati mzuri wa kufanya mzigo huo wa nguo au kama unapaswa kusubiri nishati safi. Umekuwa umejenga kitu kinachotumika kweli na kujifunza kuhusu utendaji wa kivinjari kwa njia hii.
**Maelezo:** Boresha uwezo wa ufuatiliaji wa utendaji wa kiendelezi cha kivinjari kwa kuongeza kipengele kinachofuatilia na kuonyesha nyakati za upakiaji kwa vipengele tofauti vya kiendelezi.
## Changamoto ya GitHub Copilot Agent 🚀
**Kichocheo:** Unda mfumo wa ufuatiliaji wa utendaji kwa kiendelezi cha kivinjari kinachopima na kurekodi muda unaochukua kupata data ya CO2 kutoka API, kuhesabu rangi, na kusasisha ikoni. Ongeza kazi inayoitwa `performanceTracker` inayotumia API ya
Hapa kuna misheni ya kuvutia ya upelelezi: chagua tovuti chache za chanzo huria ambazo zimekuwepo kwa miaka mingi (fikiri Wikipedia, GitHub, au Stack Overflow) na chunguza historia yao ya commit. Je, unaweza kugundua walipofanya maboresho ya utendaji? Ni matatizo gani yaliendelea kujitokeza?
Tumia hali ya Agent kukamilisha changamoto ifuatayo:
**Mbinu yako ya uchunguzi:**
- **Tafuta** ujumbe wa commit kwa maneno kama "boresha," "utendaji," au "haraka"
- **Angalia** mifumo - je, wanazidi kurekebisha aina zile zile za matatizo?
- **Tambua** sababu za kawaida zinazochelewesha tovuti
- **Shiriki** unachogundua - waendelezaji wengine hujifunza kutoka kwa mifano halisi
**Maelezo:** Boresha uwezo wa ufuatiliaji wa utendaji wa upanuzi wa kivinjari kwa kuongeza kipengele kinachofuatilia na kuonyesha nyakati za upakiaji kwa vipengele tofauti vya upanuzi.
## Jaribio Baada ya Somo
**Agizo:** Tengeneza mfumo wa ufuatiliaji wa utendaji kwa upanuzi wa kivinjari unaopima na kurekodi muda unaochukua kupata data za CO2 kutoka API, kuhesabu rangi, na kusasisha icon. Ongeza kazi inayoitwa `performanceTracker` inayotumia Performance API kupima michakato hii na kuonyesha matokeo kwenye konsoli ya kivinjari ikiwa na alama za muda na vipimo vya muda wa utekelezaji.
[Jaribio baada ya somo](https://ff-quizzes.netlify.app/web/quiz/28)
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## Mapitio na Kujisomea
## 🚀 Changamoto
Fikiria kujisajili kwa [jarida la utendaji](https://perf.email/)
Hii ni misheni ya mshtuki ya kuvutia: chagua tovuti chache chanzo wazi ambazo zimekuwepo kwa miaka mingi (fikiria Wikipedia, GitHub, au Stack Overflow) na chunguza historia ya mabadiliko yao. Je, unaweza kugundua wapi walifanya maboresho ya utendaji? Ni matatizo gani yaliendelea kujitokeza?
Chunguza baadhi ya njia ambazo vivinjari hupima utendaji wa wavuti kwa kuangalia kupitia tabo za utendaji katika zana zao za wavuti. Je, unapata tofauti kubwa?
**Mbinu yako ya uchunguzi:**
- **Tafuta** ujumbe wa mabadiliko kwa maneno kama "boresha," "utendaji," au "haraka zaidi"
- **Tazama** mifumo - je, wanaendelea kurekebisha aina sawa za matatizo?
- **Tambua** wahusika wa kawaida wanaosababisha tovuti kupungua kasi
- **Shiriki** kile unachogundua - waendelezaji wengine wajifunze kutoka kwa mifano halisi
## Mtihani wa Baada ya Darasa
[Mtihani wa baada ya darasa](https://ff-quizzes.netlify.app/web/quiz/28)
## Tathmini & Kujisomea
Fikiria kujiandikisha kwa [jarida la utendaji](https://perf.email/)
Chunguza baadhi ya njia ambazo vivinjari hupima utendaji wa mtandao kwa kupitia tabo za utendaji katika zana zao za mtandaoni. Je, unapata tofauti kubwa yoyote?
### ⚡ **Kitu Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua Meneja wa Kazi wa kivinjari (Shift+Esc katika Chrome) kuona matumizi ya rasilimali ya upanuzi
- [ ] Tumia tabo ya Utendaji ya DevTools kurekodi na kuchambua utendaji wa ukurasa wa wavuti
- [ ] Angalia ukurasa wa Upanuzi wa kivinjari kuona ni upanuzi gani unaathiri wakati wa kuanza
- [ ] Jaribu kuzima upanuzi kwa muda kuona tofauti za utendaji
### 🎯 **Kitu Unachoweza Kufanikisha Katika Saa Hii**
- [ ] Kamilisha mtihani wa baada ya somo na kuelewa dhana za utendaji
- [ ] Tekeleza script ya nyuma kwa upanuzi wako wa kivinjari
- [ ] Jifunze kutumia browser.alarms kwa kazi za nyuma zilizo bora
- [ ] Fanya mazoezi ya kupitisha ujumbe kati ya maandishi ya maudhui na maandishi ya nyuma
- [ ] Pima na boresha matumizi ya rasilimali ya upanuzi wako
### 📅 **Safari Yako ya Utendaji ya Wiki Moja**
- [ ] Kamilisha upanuzi wa kivinjari wa utendaji wa hali ya juu uliyo na kazi za nyuma
- [ ] Jifunze wafanyakazi wa huduma na usanifu wa kisasa wa upanuzi
- [ ] Tekeleza mbinu bora za usawazishaji na uhifadhi wa data
- [ ] Jifunze mbinu za hali ya juu za ufumbuzi hitilafu kwa utendaji wa upanuzi
- [ ] Boreshaji upanuzi wako kwa kazi na ufanisi wa rasilimali
- [ ] Tengeneza vipimo vya kina kwa hali za utendaji wa upanuzi
### 🌟 **Utaalamu Wako wa Boresha wa Mwezi Mmoja**
- [ ] Jenga upanuzi wa kivinjari wa kiwango cha biashara na utendaji bora
- [ ] Jifunze kuhusu Web Workers, Service Workers, na utendaji wa wavuti wa kisasa
- [ ] Changia miradi ya chanzo wazi inayolenga uboreshaji wa utendaji
- [ ] Zawadi kwa undani wa kivinjari na mbinu za juu za ufumbuzi hitilafu
- [ ] Tengeneza zana za ufuatiliaji wa utendaji na miongozo ya mbinu bora
- [ ] Kuwa mtaalamu wa utendaji anayesaidia kuboresha programu za wavuti
## 🎯 Muda Wako wa Utaalamu wa Upanuzi wa Kivinjari
```mermaid
timeline
title Maendeleo Kamili ya Maendeleo ya Ongeza
section Misingi ya Utendaji (dakika 20)
Utoaji wa Vifaa vya Kivinjari: Ustadi wa DevTools
: Uchambuzi wa mfululizo wa matukio
: Utambuzi wa vikwazo
: Njia muhimu ya uwasilishaji
section Kazi za Usuli (dakika 25)
Miundo ya Ongeza: Ujumbe wa ujumbe
: Skripti za usuli
: Matumizi ya API ya muda wa utekelezaji
: Mawasiliano ya muktadha wa msalaba
section Maoni ya Kuona (dakika 30)
UI Inayoendelea: Algorithmi za hesabu za rangi
: Uingizaji wa API ya Canvas
: Uzalishaji wa icons
: Sasisho za wakati halisi
section Uboreshaji wa Utendaji (dakika 35)
Msimbo Bora: Mifumo ya async
: Usimamizi wa kumbukumbu
: Usafishaji wa rasilimali
: Ufuatiliaji wa utendaji
section Tayari kwa Uzalishaji (dakika 45)
Kupendeza & Kupima: Ulinganifu wa vivinjari vingi
: Usimamizi wa makosa
: Uzoefu wa mtumiaji
: Uhakiki wa utendaji
section Vipengele vya Juu (wiki 1)
Ekosistimu ya Ongeza: Duka la Chrome Web
: Maoni ya watumiaji
: Uingizaji wa uchambuzi
: Usimamizi wa sasisho
section Maendeleo ya Kitaalamu (wiki 2)
Ongeza za Biashara: Ushirikiano wa timu
: Mapitio ya msimbo
: Mifereji ya CI/CD
: Ukaguzi wa usalama
section Ustadi wa Mtaalamu (mwezi 1)
Utaalamu wa Jukwaa: API za juu za Chrome
: Uboreshaji wa utendaji
: Mifumo ya usanifu
: Michango ya chanzo wazi
```
### 🛠️ Zana Kamili za Maendeleo ya Upanuzi Wako
Baada ya kumaliza trilojia hii, sasa umebobea:
- **Usanifu wa Kivinjari**: Uelewa wa kina wa jinsi upanuzi unavyoingiliana na mifumo ya kivinjari
- **Uchambuzi wa Utendaji**: Uwezo wa kutambua na kurekebisha vizuizi kwa kutumia zana za msanidi
- **Uandishi wa async**: Mitindo ya kisasa ya JavaScript kwa operesheni zisizozuia
- **Uingiliano wa API**: Upataji wa data za nje kwa uthibitishaji na usimamizi wa makosa
- **Ubunifu wa Picha**: Sasisho za UI zenye mabadiliko na uundaji wa michoro inayotegemea Canvas
- **Upitishaji Ujumbe**: Mawasiliano kati ya maandishi katika usanifu wa upanuzi
- **Uzoefu wa Mtumiaji**: Hali za upakiaji, usimamizi wa makosa, na mwingiliano wa asili
- **Ujuzi wa Uzalishaji**: Vipimo, ufumbuzi hitilafu, na uboreshaji kwa matumizi halisi
**Matumizi Halisi**: Ujuzi wako wa maendeleo ya upanuzi hutumika moja kwa moja kwa:
- **Programu za Wavuti Zinazokua**: Usanifu na mifumo ya utendaji sawa
- **Programu za Desktop za Electron**: Programu za mitandao ya mtandao kwa majukwaa mbalimbali
- **Programu za Simu mchanganyiko**: Maendeleo ya Cordova/PhoneGap kwa API za wavuti
- **Programu za Wavuti za Biashara**: Dashibodi ngumu na zana za uzalishaji
- **Upanuzi wa Chrome DevTools**: Zana za hali ya juu za msanidi na ufumbuzi hitilafu
- **Uingiliano wa API za Wavuti**: Programu yoyote inayozungumza na huduma za nje
**Madhara ya Kitaalamu**: Sasa unaweza:
- **Jenga** upanuzi wa kivinjari tayari kwa uzalishaji kutoka wazo hadi utekelezaji
- **Boresha** utendaji wa programu za wavuti kwa kutumia zana za uchanganuzi za viwandani
- **Panga** mifumo inayoweza kupanuka kwa mgawanyo mzuri wa majukumu
- **Fumbua** operesheni za async ngumu na mawasiliano ya muktadha mseto
- **Changia** miradi ya upanuzi wa chanzo wazi na viwango vya kivinjari
**Fursa Zilizopo Next Level**:
- **Mtaalamu wa Chrome Web Store**: Chapisha upanuzi kwa mamilioni ya watumiaji
- **Mhandisi wa Utendaji wa Wavuti**: Kubobea katika uboreshaji na uzoefu wa mtumiaji
- **Mtaalamu wa Jukwaa la Kivinjari**: Changia katika maendeleo ya injini za kivinjari
- **Muumba wa Mfumo wa Upanuzi**: Tengeneza zana zinazosaidia waendelezaji wengine
- **Mahusiano ya Wasanidi**: Sambaza maarifa kupitia ufundishaji na uundaji wa maudhui
🌟 **Nafasi Imetangazwa**: Umejenga upanuzi wa kivinjari kamili, unaofanya kazi unaoonyesha mbinu za kitaalamu za maendeleo na viwango vya kisasa vya wavuti!
## Kazi
[Chambua tovuti kwa utendaji](assignment.md)
[Tathmini tovuti kwa utendaji](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Mazoea**:
Hati hii imetafsiriwa kwa kutumia huduma ya utafiti wa lugha kwa AI [Co-op Translator](https://github.com/Azure/co-op-translator). Wakati tunajitahidi kwa usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokamilika. Hati ya asili kwa lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatubebwi dhamana kwa maana potofu au tafsiri mbaya inayotokea kutokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -23,7 +23,7 @@ Kiendelezi hiki kinaweza kuitwa na mtumiaji wakati wowote baada ya kuingiza API
### Shukrani
![kiendelezi cha kivinjari cha kijani](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![kiendelezi cha kivinjari cha kijani](../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Shukrani

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kwa kutumia API ya C02 Signal ya tmrow kufuatilia matumizi ya umeme, tengeneza kiongezo cha kivinjari ili uweze kuwa na kikumbusho moja kwa moja kwenye kivinjari chako kuhusu uzito wa matumizi ya umeme katika eneo lako. Kutumia kiongezo hiki kwa njia ya ad hoc kutakusaidia kufanya maamuzi kuhusu shughuli zako kulingana na taarifa hizi.
![picha ya kiongezo](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya kiongezo](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya 'alama tatu' kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya Viongezo. Kutoka hapo, chagua 'Load Unpacked' ili kupakia kiongezo kipya. Fungua folda ya 'dist' unapoulizwa, na kiongezo kitapakiwa. Ili kutumia, utahitaji API key ya API ya CO2 Signal ([pata moja hapa kupitia barua pepe](https://www.co2signal.com/) - weka barua pepe yako kwenye kisanduku kwenye ukurasa huu) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) unaolingana na [Ramani ya Umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, mimi hutumia 'US-NEISO').
![kusakinisha](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![kusakinisha](../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya API key na eneo kuingizwa kwenye kiolesura cha kiongezo, nukta ya rangi kwenye upau wa viongezo vya kivinjari inapaswa kubadilika ili kuonyesha matumizi ya nishati ya eneo lako na kukupa mwongozo kuhusu shughuli zinazotumia nishati nyingi ambazo zinafaa kufanya. Wazo nyuma ya mfumo huu wa 'nukta' lilitolewa kwangu na [kiongezo cha Energy Lollipop](https://energylollipop.com/) kwa uzalishaji wa California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kwa kutumia API ya C02 Signal kutoka tmrow kufuatilia matumizi ya umeme, tengeneza ugani wa kivinjari ili uweze kupata ukumbusho moja kwa moja kwenye kivinjari chako kuhusu matumizi ya umeme katika eneo lako. Kutumia ugani huu wa dharura kutakusaidia kufanya maamuzi kuhusu shughuli zako kwa kuzingatia taarifa hizi.
![picha ya ugani](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya ugani](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya 'alama tatu' kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya Ugani. Kutoka hapo, chagua 'Pakia ugani usiobanwa' ili kupakia ugani mpya. Fungua folda ya 'dist' unapoulizwa, na ugani utapakiwa. Ili kuitumia, utahitaji ufunguo wa API kwa API ya CO2 Signal ([pata moja hapa kwa barua pepe](https://www.co2signal.com/) - ingiza barua pepe yako kwenye kisanduku kwenye ukurasa huu) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) unaolingana na [Ramani ya Umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, mimi hutumia 'US-NEISO').
![usakinishaji](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![usakinishaji](../../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya kuingiza ufunguo wa API na eneo kwenye kiolesura cha ugani, nukta ya rangi kwenye upau wa ugani wa kivinjari inapaswa kubadilika ili kuonyesha matumizi ya nishati ya eneo lako na kukupa kiashiria kuhusu shughuli zinazotumia nishati ambazo zinafaa kufanywa. Wazo nyuma ya mfumo huu wa 'nukta' lilinipa msukumo kutoka kwa [ugani wa Energy Lollipop](https://energylollipop.com/) kwa uzalishaji wa hewa chafu huko California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kutumia API ya CO2 Signal ya tmrow kufuatilia matumizi ya umeme, tunajenga kiongezo cha kivinjari ili kukukumbusha jinsi matumizi ya umeme katika eneo lako yalivyo mazito kupitia kivinjari chako. Kutumia kiongezo hiki kwa muda mfupi kutakusaidia kufanya maamuzi kuhusu shughuli zako kulingana na taarifa hii.
![Picha ya skrini ya kiongezo](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![Picha ya skrini ya kiongezo](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya 'nukta tatu' kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya viongezo. Kutoka hapo, chagua 'Load unpacked' ili kupakia kiongezo kipya. Fungua folda ya 'dist' kwenye prompt, na kiongezo kitapakiwa. Ili kutumia, utahitaji API key ya CO2 Signal ([ipate kupitia barua pepe hapa](https://www.co2snal.com/) - weka barua pepe yako kwenye kisanduku cha ukurasa huo) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) kutoka [ramani ya umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, ninatumia 'US-NEISO').
![kusakinisha](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![kusakinisha](../../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya API key na msimbo wa eneo kuingizwa kwenye kiolesura cha kiongezo, nukta ya rangi kwenye bar ya viongezo vya kivinjari inapaswa kubadilika ili kuonyesha matumizi ya nishati ya eneo lako na kukupa kiashiria cha shughuli nzito za nishati zinazofaa kwa utendaji wako. Wazo la mfumo huu wa 'nukta' lilinipatia na [kiongezo cha Energy Lollipop](https://energylollipop.com/) kwa uzalishaji wa California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Tutatumia API ya Signal CO2 kutoka tmrow kufuatilia matumizi ya umeme ili kuunda ugani wa kivinjari, hivyo kuwa na ukumbusho moja kwa moja kwenye kivinjari chako kuhusu jinsi matumizi ya umeme yalivyo mazito katika eneo lako. Kutumia ugani huu maalum kutasaidia kutathmini shughuli zako kulingana na taarifa hizi.
![picha ya ugani](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya ugani](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya "alama tatu" kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya Ugani. Ikiwa haijawashwa tayari, washa Hali ya Msanidi Programu (chini kushoto). Chagua "Pakia isiyoshinikizwa" ili kupakia ugani mpya. Fungua folda ya "dist" kwenye dirisha la maelekezo, na ugani utawekwa. Ili kuitumia, utahitaji ufunguo wa API kwa API ya CO2 Signal (unaweza [kuupata hapa kupitia barua pepe](https://www.co2signal.com/) - weka barua pepe yako kwenye kisanduku kwenye ukurasa huu) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) unaolingana na [ramani ya umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, "US-NEISO").
![usakinishaji](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![usakinishaji](../../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Mara tu ufunguo wa API na eneo vimeingizwa kwenye kiolesura cha ugani, nukta ya rangi kwenye upau wa ugani wa kivinjari inapaswa kubadilika ili kuonyesha matumizi ya nishati ya eneo hilo na kutoa mwongozo kuhusu shughuli za matumizi makubwa ya nishati zinazofaa kufanywa. Wazo la mfumo huu wa "nukta" lilitolewa na [ugani wa Energy Lollipop](https://energylollipop.com/) kwa uzalishaji wa California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Tunajenga kiongezo cha kivinjari kinachotumia API ya CO2 Signal ya tmrow ili kufuatilia matumizi ya nishati katika eneo lako. Kiongezo hiki kitaonyesha ukumbusho kwenye kivinjari chako kuhusu kiwango cha matumizi ya nishati katika eneo lako. Kwa kutumia kiongezo hiki kwa njia ya ad hoc, unaweza kufanya maamuzi kuhusu shughuli zako kulingana na taarifa hii.
![picha ya kiongezo](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya kiongezo](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tafuta paneli ya "Viongezo" kutoka kwenye menyu ya "alama tatu" kwenye kona ya juu kulia ya kivinjari. Kutoka hapo, chagua "Load Unpacked" na upakie kiongezo kipya. Fungua folda ya "dist" unapoulizwa, na kiongezo kitawekwa. Ili kutumia, unahitaji API key ya CO2 Signal ([pata moja hapa kupitia barua pepe](https://www.co2signal.com/) - ingiza barua pepe yako kwenye kisanduku cha ukurasa huo) na [code ya eneo lako](http://api.electricitymap.org/v3/zones) inayolingana na [Electricity Map](https://www.electricitymap.org/map) (kwa mfano, Boston hutumia 'US-NEISO').
![kusakinisha](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![kusakinisha](../../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya kuingiza API key na eneo kwenye kiolesura cha kiongezo, nukta yenye rangi itakayoonekana kwenye upau wa viongezo vya kivinjari chako itabadilika ili kuonyesha kiwango cha matumizi ya nishati katika eneo lako. Hii itakusaidia kuamua ni shughuli gani zinazohitaji nishati zinafaa kufanywa. Wazo la mfumo huu wa "nukta" lilitokana na [Energy Lollipop extension](https://energylollipop.com/) kwa ajili ya uzalishaji wa California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kwa kutumia API ya Ishara ya CO2 ya tmrow kufuatilia matumizi ya umeme, tengeneza kiendelezi cha kivinjari ili uweze kupokea arifa kwenye kivinjari chako kuhusu uzito wa matumizi ya umeme katika eneo lako. Kutumia kiendelezi hiki hasa kutakusaidia kufanya maamuzi kuhusu shughuli zako kulingana na taarifa hizi.
![picha ya kiendelezi cha kivinjari](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya kiendelezi cha kivinjari](../../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza Hapa
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya 'alama tatu' kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya Viendelezi. Kutoka hapo, chagua 'Load Unpacked' ili kupakia kiendelezi kipya. Fungua folda ya 'dist' unapoulizwa, na kiendelezi kitapakiwa. Ili kutumia, utahitaji ufunguo wa API kwa API ya Ishara ya CO2 ([pata moja hapa kupitia barua pepe](https://www.co2signal.com/) - weka barua pepe yako kwenye kisanduku kwenye ukurasa huu) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) unaolingana na [Ramani ya Umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, mimi hutumia 'US-NEISO').
![kupakua](../../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![kupakua](../../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya ufunguo wa API na eneo kuingizwa kwenye kiolesura cha kiendelezi, nukta ya rangi kwenye upau wa kiendelezi cha kivinjari itabadilika ili kuonyesha matumizi ya nishati ya eneo lako na kukupa mapendekezo kuhusu shughuli nzito zinazofaa kufanya. Wazo la mfumo huu wa 'nukta' lilinipa msukumo kutoka kwa [kiendelezi cha kivinjari cha Energy Lollipop](https://energylollipop.com/) kwa uzalishaji wa California.

@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
Kwa kutumia API ya C02 Signal ya tmrow kufuatilia matumizi ya umeme, tengeneza kiongezo cha kivinjari ili uweze kuwa na kikumbusho moja kwa moja kwenye kivinjari chako kuhusu uzito wa matumizi ya umeme katika eneo lako. Kutumia kiongezo hiki kwa njia ya ad hoc kutakusaidia kufanya maamuzi kuhusu shughuli zako kulingana na taarifa hizi.
![picha ya kiongezo](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3875e1bc9405edd45a3d2e02963e48900adb91926a62a5807.sw.png)
![picha ya kiongezo](../../../../translated_images/extension-screenshot.0e7f5bfa110e92e3.sw.png)
## Kuanza
@ -31,7 +31,7 @@ npm run build
Ili kusakinisha kwenye Edge, tumia menyu ya 'alama tatu' kwenye kona ya juu kulia ya kivinjari ili kupata paneli ya Viongezo. Kutoka hapo, chagua 'Pakia Bila Kufungasha' ili kupakia kiongezo kipya. Fungua folda ya 'dist' unapoulizwa na kiongezo kitapakiwa. Ili kutumia, utahitaji ufunguo wa API kwa API ya CO2 Signal ([pata moja hapa kupitia barua pepe](https://www.co2signal.com/) - weka barua pepe yako kwenye kisanduku kwenye ukurasa huu) na [msimbo wa eneo lako](http://api.electricitymap.org/v3/zones) unaolingana na [Ramani ya Umeme](https://www.electricitymap.org/map) (kwa mfano, huko Boston, natumia 'US-NEISO').
![kusakinisha](../../../../translated_images/install-on-edge.78634f02842c48283726c531998679a6f03a45556b2ee99d8ff231fe41446324.sw.png)
![kusakinisha](../../../../translated_images/install-on-edge.78634f02842c4828.sw.png)
Baada ya kuingiza ufunguo wa API na eneo kwenye kiolesura cha kiongezo, nukta ya rangi kwenye upau wa viongezo vya kivinjari inapaswa kubadilika ili kuonyesha matumizi ya nishati ya eneo lako na kukupa mwongozo kuhusu shughuli zinazotumia nishati nyingi ambazo zinafaa kwako kufanya. Wazo nyuma ya mfumo huu wa 'nukta' lilitolewa kwangu na [kiongezo cha Energy Lollipop](https://energylollipop.com/) kwa utoaji wa hewa chafu wa California.

@ -1,59 +1,142 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "862f7f2ef320f6f8950fae379e6ece45",
"translation_date": "2025-10-24T19:43:20+00:00",
"original_hash": "a6332a7bb4d0be3bfd24199c83993777",
"translation_date": "2026-01-07T01:39:09+00:00",
"source_file": "6-space-game/1-introduction/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 1: Utangulizi
![Mchezo wa anga unaonyesha uchezaji](../../../../6-space-game/images/pewpew.gif)
Kama vile udhibiti wa NASA unavyoratibu mifumo mingi wakati wa uzinduzi wa anga, tutajenga mchezo wa anga unaoonyesha jinsi sehemu tofauti za programu zinaweza kufanya kazi pamoja bila matatizo. Wakati tunaunda kitu ambacho unaweza kucheza, utajifunza dhana muhimu za programu zinazotumika katika mradi wowote wa programu.
Tutachunguza njia mbili za msingi za kupanga msimbo: urithi na muundo. Hizi si dhana za kitaaluma tu ni mifumo ile ile inayotumika kuendesha kila kitu kutoka michezo ya video hadi mifumo ya benki. Pia tutatekeleza mfumo wa mawasiliano unaoitwa pub/sub ambao hufanya kazi kama mitandao ya mawasiliano inayotumika kwenye vyombo vya anga, ikiruhusu vipengele tofauti kushiriki taarifa bila kuunda utegemezi.
Mwisho wa mfululizo huu, utaelewa jinsi ya kujenga programu zinazoweza kupanuka na kubadilika iwe unaunda michezo, programu za wavuti, au mfumo wowote wa programu.
## Maswali ya Awali ya Somo
```mermaid
journey
title Safari Yako ya Maendeleo ya Michezo
section Msingi
Jifunze usanifu wa mchezo: 3: Student
Elewa urithi: 4: Student
Chunguza muundo: 4: Student
section Mawasiliano
Jenga mfumo wa pub/sub: 4: Student
Tengeneza mtiririko wa matukio: 5: Student
Unganisha vipengele: 5: Student
section Maombi
Unda vitu vya mchezo: 5: Student
Tekeleza mifano: 5: Student
Panga muundo wa mchezo: 5: Student
```
![Uhuishaji wa mchezo wa anga unaoonyesha mchezo](../../../../6-space-game/images/pewpew.gif)
Kama vile kituo cha udhibiti cha NASA kinavyoratibu mifumo mingi wakati wa uzinduzi wa anga, tutajenga mchezo wa anga unaoonyesha jinsi sehemu tofauti za programu zinaweza kushirikiana bila mshono. Wakati wa kuunda kitu ambacho unaweza kucheza kweli, utajifunza dhana muhimu za programu zinazotumika kwa mradi wowote wa programu.
Tutachunguza mbinu mbili za msingi za kupanga msimbo: urithi na muundo. Hizi si dhana za kitaaluma tu ni mifumo ile ile inayotumiwa kuendesha kila kitu kuanzia michezo ya video hadi mifumo ya benki. Pia tutaweka mfumo wa mawasiliano uitwao pub/sub unaofanya kazi kama mitandao ya mawasiliano inayotumiwa katika meli za anga, na kuruhusu sehemu tofauti kushiriki taarifa bila kuunda utegemezi.
Mwisho wa mfululizo huu, utaelewa jinsi ya kujenga programu zinazoweza kupanuka na kuendelea kubadilika iwe unatengeneza michezo, programu za wavuti, au mfumo mwingine wowote wa programu.
```mermaid
mindmap
root((Mimarisho ya Mchezo))
Object Organization
Urithi
Muundo
Miti ya Madarasa
Mchanganyiko wa Tabia
Communication Patterns
Mfumo wa Pub/Sub
Watumiaji wa Tukio
Kupitisha Ujumbe
Kuunganishwa kwa Wazi
Game Objects
Mali (x, y)
Tabia (kusogea, kugongana)
Usimamizi wa Mzunguko wa Maisha
Usimamizi wa Hali
Design Patterns
Kazi za Kiwanda
Mfano wa Mchunguzi
Mfumo wa Vipengele
Mimarisho Iliyosababishwa na Tukio
Scalability
Muundo wa Moduli
Msimbo Unaoweza Kudumishwa
Mikakati ya Upimaji
Uboreshaji wa Utendaji
```
## Mtihani wa Kabla ya Nasisho
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/29)
[Mtihani kabla ya nasisho](https://ff-quizzes.netlify.app/web/quiz/29)
## Urithi na Muundo katika Uundaji wa Michezo
## Urithi na Muundo katika Maendeleo ya Mchezo
Kadri miradi inavyokua kwa ugumu, mpangilio wa msimbo unakuwa muhimu. Kinachoanza kama hati rahisi kinaweza kuwa kigumu kudumisha bila muundo sahihi kama vile misheni za Apollo zilivyohitaji uratibu makini kati ya maelfu ya vipengele.
Maziwa ya miradi yanapoongezeka, upangaji wa msimbo unakuwa muhimu. Kile kinachoanza kama script rahisi kinaweza kuwa kigumu kudumisha bila muundo mzuri kama vile misheni za Apollo zilivyo hitaji uratibu makini kati ya maelfu ya vipengele.
Tutachunguza njia mbili za msingi za kupanga msimbo: urithi na muundo. Kila moja ina faida zake, na kuelewa zote mbili hukusaidia kuchagua njia sahihi kwa hali tofauti. Tutadhihirisha dhana hizi kupitia mchezo wetu wa anga, ambapo mashujaa, maadui, nguvu za ziada, na vitu vingine lazima vishirikiane kwa ufanisi.
Tutachunguza mbinu mbili za msingi za kupanga msimbo: urithi na muundo. Kila moja ina faida zake, na kuelewa zote kunakusaidia kuchagua njia sahihi kwa hali tofauti. Tutathibitisha dhana hizi kupitia mchezo wetu wa anga, ambapo mashujaa, adui, vitu vya nguvu, na vitu vingine lazima vishirikiane kwa ufanisi.
✅ Mojawapo ya vitabu maarufu zaidi vya programu vilivyowahi kuandikwa linahusu [mifumo ya muundo](https://en.wikipedia.org/wiki/Design_Patterns).
✅ Moja ya vitabu maarufu zaidi vya programu vilivyoandikwa ni kuhusu [mifumo ya kubuni](https://en.wikipedia.org/wiki/Design_Patterns).
Katika mchezo wowote, una `vitu vya mchezo` vipengele vya maingiliano vinavyojaza ulimwengu wa mchezo wako. Mashujaa, maadui, nguvu za ziada, na athari za kuona vyote ni vitu vya mchezo. Kila kimoja kipo katika viwianishi maalum vya skrini kwa kutumia thamani za `x` na `y`, sawa na kuweka alama kwenye ndege ya viwianishi.
Katika mchezo wowote, una `vitu vya mchezo` vipengele vinavyoshirikiana vinavyokaa katika dunia ya mchezo wako. Mashujaa, adui, vitu vya nguvu, na athari za kuona vyote ni vitu vya mchezo. Kila kipo katika kuratibu maalum za skrini kwa kutumia thamani za `x` na `y`, kama vile kuonyesha pointi kwenye mhimili wa kuratibu.
Licha ya tofauti zao za kuona, vitu hivi mara nyingi hushiriki tabia za msingi:
Licha ya tofauti zao za kuona, vitu hivi mara nyingi hushiriki tabia kuu:
- **Vipo mahali fulani** Kila kitu kina viwianishi vya x na y ili mchezo ujue wapi kukichora
- **Vingi vinaweza kusogea** Mashujaa hukimbia, maadui hufuatilia, risasi huruka kwenye skrini
- **Vinakuwa na muda wa maisha** Baadhi hubaki milele, vingine (kama milipuko) huonekana kwa muda mfupi na kutoweka
- **Hureact kwa vitu** Wakati vitu vinagongana, nguvu za ziada hukusanywa, baa za afya husasishwa
- **Vipo mahali fulani** Kila kitu kina kuratibu x na y ili mchezo ujue pa kuchora
- **Nyingi zinaweza kusogea** Mashujaa hukimbia, adui hufuata, risasi huruka juu ya skrini
- **Zina maisha** Baadhi hudumu daima, wengine (kama milipuko) huonekana kwa muda mfupi na kuondoka
- **Hureagiza kwa vitu** Wakati vitu vinapogongana, vitu vya nguvu huchukuliwa, ajili za afya hubadilika
✅ Fikiria mchezo kama Pac-Man. Je, unaweza kutambua aina nne za vitu vilivyoorodheshwa hapo juu katika mchezo huu?
✅ Fikiria mchezo kama Pac-Man. Je, unaweza kutambua aina nne za vitu zilizotajwa hapo juu katika mchezo huu?
### Kueleza Tabia Kupitia Msimbo
```mermaid
classDiagram
class GameObject {
+x: nambari
+y: nambari
+aina: kamba
+ipo_kwa_maeneo()
}
class MovableObject {
+hamiaKwa(x, y)
+inaweza_kusogea()
}
class TemporaryObject {
+muda_wa_maisha: nambari
+ina_muda_wa_maisha()
}
class InteractiveObject {
+wakatiWaMgongano()
+hurekebishwa_kwa_mambo()
}
GameObject <|-- MovableObject
GameObject <|-- TemporaryObject
GameObject <|-- InteractiveObject
MovableObject <|-- Hero
MovableObject <|-- Enemy
MovableObject <|-- Bullet
TemporaryObject <|-- PowerUp
TemporaryObject <|-- Explosion
InteractiveObject <|-- Collectible
InteractiveObject <|-- Obstacle
```
### Kuonyesha Tabia Kupitia Msimbo
Sasa kwa kuwa unaelewa tabia za kawaida ambazo vitu vya mchezo hushiriki, hebu tuchunguze jinsi ya kutekeleza tabia hizi katika JavaScript. Unaweza kueleza tabia za kitu kupitia mbinu zilizounganishwa na madarasa au vitu binafsi, na kuna njia kadhaa za kuchagua.
Sasa unapoelewa tabia za kawaida za vitu vya mchezo, hebu tuchunguze jinsi ya kutekeleza tabia hizi kwa JavaScript. Unaweza kuonyesha tabia za kitu kupitia mbinu zilizoambatanishwa na darasa au vitu binafsi, na kuna mbinu kadhaa za kuchagua.
**Njia ya Kulingana na Darasa**
**Mbinu ya Kutegemea Madarasa**
Madarasa na urithi hutoa njia iliyopangwa ya kupanga vitu vya mchezo. Kama mfumo wa uainishaji wa kitalaamu ulioanzishwa na Carl Linnaeus, unaanza na darasa la msingi linalo na mali za kawaida, kisha kuunda madarasa maalum yanayorithi misingi hii huku yakiongeza uwezo maalum.
Madarasa na urithi hutoa njia iliyopangwa za kupanga vitu vya mchezo. Kama mfumo wa upangaji wa k分类 uliozinduliwa na Carl Linnaeus, unaanza na darasa la msingi lenye sifa za pamoja, kisha huunda madarasa maalum yanayorithi msingi huu huku yakiongeza uwezo maalum.
✅ Urithi ni dhana muhimu kuelewa. Jifunze zaidi kwenye [makala ya MDN kuhusu urithi](https://developer.mozilla.org/docs/Web/JavaScript/Inheritance_and_the_prototype_chain).
Hivi ndivyo unavyoweza kutekeleza vitu vya mchezo kwa kutumia madarasa na urithi:
Hivi ndivyo unavyoweza kutekeleza vitu vya mchezo ukitumia madarasa na urithi:
```javascript
// Step 1: Create the base GameObject class
// Hatua 1: Unda darasa la msingi la GameObject
class GameObject {
constructor(x, y, type) {
this.x = x;
@ -63,19 +146,19 @@ class GameObject {
}
```
**Hebu tuvunje hatua kwa hatua:**
**Tuchambue hatua kwa hatua:**
- Tunaunda kiolezo cha msingi ambacho kila kitu cha mchezo kinaweza kutumia
- Constructor huhifadhi wapi kitu kipo (`x`, `y`) na ni aina gani ya kitu
- Hii inakuwa msingi ambao vitu vyote vya mchezo vitajengwa juu yake
- Kijengo huhifadhi mahali kitu kiko (`x`, `y`) na ni aina gani ya kitu
- Hii inakuwa msingi ambao vitu vyote vya mchezo vitajenga juu yake
```javascript
// Step 2: Add movement capability through inheritance
// Hatua ya 2: Ongeza uwezo wa kuhamahama kupitia urithi
class Movable extends GameObject {
constructor(x, y, type) {
super(x, y, type); // Call parent constructor
super(x, y, type); // Piga simu kwa konstrukta wa mzazi
}
// Add the ability to move to a new position
// Ongeza uwezo wa kuhamia kwenye nafasi mpya
moveTo(x, y) {
this.x = x;
this.y = y;
@ -83,47 +166,47 @@ class Movable extends GameObject {
}
```
**Katika hapo juu, tumefanya:**
- **Kuongeza** darasa la GameObject ili kuongeza utendaji wa kusogea
- **Kuita** constructor ya mzazi kwa kutumia `super()` ili kuanzisha mali zilizorithiwa
- **Kuongeza** mbinu ya `moveTo()` inayosasisha nafasi ya kitu
**Juu tume:**
- **Kupanua** darasa la GameObject ili kuongeza uwezo wa kusogea
- **Kupiga simu** kwa kijengo cha mzazi kwa kutumia `super()` kuanzisha sifa zilizorithiwa
- **Kuongeza** njia `moveTo()` inayobadilisha nafasi ya kitu
```javascript
// Step 3: Create specific game object types
// Hatua ya 3: Unda aina maalum za vitu vya mchezo
class Hero extends Movable {
constructor(x, y) {
super(x, y, 'Hero'); // Set type automatically
super(x, y, 'Hero'); // Weka aina moja kwa moja
}
}
class Tree extends GameObject {
constructor(x, y) {
super(x, y, 'Tree'); // Trees don't need movement
super(x, y, 'Tree'); // Miti haihitaji kusogea
}
}
// Step 4: Use your game objects
// Hatua ya 4: Tumia vitu vya mchezo wako
const hero = new Hero(0, 0);
hero.moveTo(5, 5); // Hero can move!
hero.moveTo(5, 5); // Shujaa anaweza kusogea!
const tree = new Tree(10, 15);
// tree.moveTo() would cause an error - trees can't move
// tree.moveTo() itasababisha kosa - miti haiwezi kusogea
```
**Kuelewa dhana hizi:**
- **Kuunda** aina maalum za vitu vinavyorithi tabia zinazofaa
- **Kudhirisha** jinsi urithi unavyoruhusu ujumuishaji wa vipengele kwa kuchagua
- **Kuonyesha** kwamba mashujaa wanaweza kusogea huku miti ikibaki imara
- **Kueleza** jinsi hierarkia ya darasa inavyopunguza vitendo visivyofaa
- **Hutengeneza** aina maalum za vitu vinavyorithi tabia zinazofaa
- **Inaonyesha** jinsi urithi unavyoruhusu kuchagua sifa maalum
- **Inaonyesha** kuwa mashujaa wanaweza kusogea wakati miti iko pasipo kusogea
- **Inaonyesha** jinsi mwelekeo wa madarasa unavyozuia vitendo visivyosahaulika
✅ Chukua dakika chache kufikiria shujaa wa Pac-Man (Inky, Pinky au Blinky, kwa mfano) na jinsi ambavyo ingeandikwa katika JavaScript.
✅ Chukua dakika chache kufikiria tena mashujaa wa Pac-Man (kama Inky, Pinky au Blinky) na jinsi wangekuwa wanaandikwa kwa JavaScript.
**Njia ya Muundo**
**Mbinu ya Muundo**
Muundo unafuata falsafa ya muundo wa modular, sawa na jinsi wahandisi wanavyounda vyombo vya anga na vipengele vinavyoweza kubadilishwa. Badala ya kurithi kutoka darasa la mzazi, unachanganya tabia maalum ili kuunda vitu vyenye utendaji unaohitajika. Njia hii inatoa kubadilika bila vikwazo vya hierarkia ngumu.
Muundo unafuata falsafa ya muundo wa moduli, sawa na jinsi wahandisi wanavyobuni meli za anga zikiwa na vipengele vinavyoweza kubadilishwa. Badala ya kurithi kutoka kwa darasa mzazi, unaunganisha tabia maalum kuunda vitu vyenye kazi kamili wanazohitaji. Mbinu hii hutoa ufanisi bila mipaka kali ya mwelekeo wa madarasa.
```javascript
// Step 1: Create base behavior objects
// Hatua 1: Tengeneza vitu vya tabia msingi
const gameObject = {
x: 0,
y: 0,
@ -138,16 +221,16 @@ const movable = {
};
```
**Hii ndiyo msimbo unavyofanya:**
- **Inafafanua** msingi wa `gameObject` na mali za nafasi na aina
- **Inaunda** kitu cha tabia ya `movable` chenye utendaji wa kusogea
- **Inatenganisha** masuala kwa kuweka data ya nafasi na mantiki ya kusogea huru
**Msimbo huu unafanya yafuatayo:**
- **Unafafanua** `gameObject` ya msingi yenye sifa za nafasi na aina
- **Unaunda** kitu tofauti cha tabia cha `movable` chenye uwezo wa kusogea
- **Unatenganisha** masuala kwa kuweka data ya nafasi na kanuni za harakati huru
```javascript
// Step 2: Compose objects by combining behaviors
// Hatua ya 2: Tengeneza vitu kwa kuunganisha tabia
const movableObject = { ...gameObject, ...movable };
// Step 3: Create factory functions for different object types
// Hatua ya 3: Unda kazi za kiwanda kwa aina tofauti za vitu
function createHero(x, y) {
return {
...movableObject,
@ -167,68 +250,127 @@ function createStatic(x, y, type) {
}
```
**Katika hapo juu, tumefanya:**
- **Kuunganisha** mali za msingi za kitu na tabia ya kusogea kwa kutumia spread syntax
- **Kuunda** kazi za kiwanda zinazorejesha vitu vilivyobinafsishwa
- **Kuwezesha** uundaji wa vitu vya kubadilika bila hierarkia ngumu za darasa
- **Kuruhusu** vitu kuwa na tabia zinazohitajika tu
**Juu tume:**
- **Kuja na** sifa za kitu cha msingi pamoja na tabia ya kusogea kwa kutumia spread syntax
- **Kuumba** kazi za kiwanda zinazorejesha vitu zilizobinafsishwa
- **Kuwezesha** uundaji wa vitu ulio huru bila mwelekeo wa madarasa mbinu kali
- **Kuruhusu** vitu kuwa na tabia ambazo vinahitaji tu
```javascript
// Step 4: Create and use your composed objects
// Hatua ya 4: Unda na tumia vitu vyako vilivyoundwa
const hero = createHero(10, 10);
hero.moveTo(5, 5); // Works perfectly!
hero.moveTo(5, 5); // Inaendana kikamilifu!
const tree = createStatic(0, 0, 'Tree');
// tree.moveTo() is undefined - no movement behavior was composed
// tree.moveTo() haijafafanuliwa - hakuna mwenendo uliounganishwa
```
**Vidokezo vya kukumbuka:**
- **Kuunda** vitu kwa kuchanganya tabia badala ya kuvirithi
- **Kutoa** kubadilika zaidi kuliko hierarkia ngumu za urithi
- **Kuruhusu** vitu kuwa na vipengele vinavyohitajika tu
- **Kutumia** spread syntax ya kisasa ya JavaScript kwa mchanganyiko safi wa vitu
**Mambo muhimu ya kukumbuka:**
- **Inaunda** vitu kwa kuchanganya tabia badala ya kuzirithi
- **Hutoa** ufanisi zaidi kuliko mwelekeo mgumu wa urithi
- **Inaruhusu** vitu kuwa na sifa haswa wanazohitaji
- **Inatumia** spread syntax ya JavaScript ya kisasa kwa mchanganyiko safi wa vitu
```
**Which Pattern Should You Choose?**
> 💡 **Pro Tip**: Both patterns have their place in modern JavaScript development. Classes work well for clearly defined hierarchies, while composition shines when you need maximum flexibility.
>
**Here's when to use each approach:**
- **Choose** inheritance when you have clear "is-a" relationships (a Hero *is-a* Movable object)
- **Select** composition when you need "has-a" relationships (a Hero *has* movement abilities)
- **Consider** your team's preferences and project requirements
- **Remember** that you can mix both approaches in the same application
## Communication Patterns: The Pub/Sub System
As applications grow complex, managing communication between components becomes challenging. The publish-subscribe pattern (pub/sub) solves this problem using principles similar to radio broadcasting one transmitter can reach multiple receivers without knowing who's listening.
Consider what happens when a hero takes damage: the health bar updates, sound effects play, visual feedback appears. Rather than coupling the hero object directly to these systems, pub/sub allows the hero to broadcast a "damage taken" message. Any system that needs to respond can subscribe to this message type and react accordingly.
**Which Pattern Should You Choose?**
**Pub/Sub** stands for 'publish-subscribe'
```mermaid
quadrantChart
title Code Organization Patterns
x-axis Simple --> Complex
y-axis Rigid --> Flexible
quadrant-1 Advanced Composition
quadrant-2 Hybrid Approaches
quadrant-3 Basic Inheritance
quadrant-4 Modern Composition
Class Inheritance: [0.3, 0.2]
Interface Implementation: [0.6, 0.4]
Mixin Patterns: [0.7, 0.7]
Pure Composition: [0.8, 0.9]
Factory Functions: [0.5, 0.8]
Prototype Chain: [0.4, 0.3]
```
### Understanding the Pub/Sub Architecture
> 💡 **Ushauri wa Mtaalamu**: Mifumo yote miwili ina nafasi yake katika maendeleo ya kisasa ya JavaScript. Madarasa yanafaa kwa mwelekeo uliotangazwa wazi, wakati muundo huangaza zaidi unapotakiwa ufanisi wa hali ya juu.
>
**Hivi ndivyo unavyotumia mbinu hizi:**
- **Chagua** urithi unapokuwa na uhusiano wa "ni" wazi (Shujaa *ni* kitu cha Kusogea)
- **Chagua** muundo unapohitaji uhusiano wa "ana" (Shujaa *ana* uwezo wa kusogea)
- **Fikiria** mapendeleo ya timu yako na mahitaji ya mradi
- **Kumbuka** unaweza kuchanganya mbinu zote mbili katika programu moja
### 🔄 **Kagua Elimu**
**Ufahamu wa Upangaji wa Vitu**: Kabla ya kuingia kwenye mifumo ya mawasiliano, hakikisha unaweza:
- ✅ Eleza tofauti kati ya urithi na muundo
- ✅ Tambua wakati wa kutumia madarasa dhidi ya kazi za kiwanda
- ✅ Elewa jinsi neno kuu `super()` linavyofanya kazi katika urithi
- ✅ Tambua faida za kila mbinu kwa maendeleo ya mchezo
**Jaribio la Haraka:** Je, ungeundaje Adui Anayeruka anayeweza kusogea na kuruka?
- **Mbinu ya urithi**: `class FlyingEnemy extends Movable`
- **Mbinu ya muundo**: `{ ...movable, ...flyable, ...gameObject }`
**Mfungamano wa Dunia Halisi:** Mifumo hii inaonekana kila mahali:
- **Vitu vya React**: Props (muundo) dhidi ya urithi wa darasa
- **Injini za Mchezo**: Mfumo wa vipengele-anavyo-husiana hutumia muundo
- **Programu za Simu**: Mifumo ya UI mara nyingi hutumia mwelekeo wa urithi
## Mifumo ya Mawasiliano: Mfumo wa Pub/Sub
Programu zinapozidi kuwa ngumu, kusimamia mawasiliano kati ya vipengele kunakuwa changamoto. Mfumo wa kuchapisha-kujisajili (pub/sub) unatatua tatizo hili kwa kutumia kanuni zinazofanana na za matangazo ya redio mtangazaji mmoja anaweza kufikia wapokeaji wengi bila kujua ni nani wasikilizaji.
Fikiria kinachotokea shujaa anapopata jeraha: njia ya afya hubadilika, sauti huchezwa, mrejesho wa kuona unaonekana. Badala ya kuunganisha kitu cha shujaa moja kwa moja na mifumo hii, pub/sub huruhusu shujaa kutangaza ujumbe wa "jeraha limetokea." Mfumo wowote unaohitaji kujibu unaweza kujisajili kwa aina hii ya ujumbe na ku-react ipasavyo.
**Pub/Sub** inasimama kwa 'chapisha-jisajili'
```mermaid
flowchart TD
A[Shujaa Apata Madhara] --> B[Chapisha: HERO_DAMAGED]
B --> C[Mfumo wa Matukio]
C --> D[Mshiriki wa Kipindi cha Afya]
C --> E[Mshiriki wa Mfumo wa Sauti]
C --> F[Mshiriki wa Athari za Kuonyesha]
C --> G[Mshiriki wa Mfumo wa Mafanikio]
D --> H[Sasisha Onyesho la Afya]
E --> I[Piga Sauti ya Madhara]
F --> J[Onyesha Mwangaza Mwekundu]
G --> K[Kagua Mafanikio ya Kuishi]
style A fill:#ffebee
style B fill:#e1f5fe
style C fill:#e8f5e8
style H fill:#fff3e0
style I fill:#fff3e0
style J fill:#fff3e0
style K fill:#fff3e0
```
### Kuelewa Miundo ya Pub/Sub
The pub/sub pattern keeps different parts of your application loosely coupled, meaning they can work together without being directly dependent on each other. This separation makes your code more maintainable, testable, and flexible to changes.
Mfumo wa pub/sub huhifadhi sehemu tofauti za programu yako zikiwa huru kabisa, maana zinaweza kushirikiana bila kuwa na utegemezi mzito. Kutenganisha huku kunafanya msimbo wako kuwa rahisi kudumisha, kupima, na kubadilika.
**The key players in pub/sub:**
- **Messages** Simple text labels like `'PLAYER_SCORED'` that describe what happened (plus any extra info)
- **Publishers** The objects that shout out "Something happened!" to anyone who's listening
- **Subscribers** The objects that say "I care about that event" and react when it happens
- **Event System** The middleman that makes sure messages get to the right listeners
**Wachezaji muhimu katika pub/sub:**
- **Ujumbe** Lebo rahisi za maandishi kama `'PLAYER_SCORED'` zinazoelezea kilichotokea (pamoja na taarifa za ziada)
- **Wachapishaji** Vitu vinavyotoa "Kitu kitatokea!" kwa yeyote anayesikiliza
- **Wajiandikishaji** Vitu vinavyosema "Ninajali tukio hilo" na kufanya kazi linapotokea
- **Mfumo wa Tukio** Mlezi anaye hakikisha ujumbe unafika kwa wasikilizaji sahihi
### Building an Event System
### Kujenga Mfumo wa Tukio
Let's create a simple but powerful event system that demonstrates these concepts:
Tujenge mfumo rahisi lakini wenye nguvu wa tukio unaoonyesha dhana hizi:
```javascript
// Step 1: Create the EventEmitter class
// Hatua 1: Unda darasa la EventEmitter
class EventEmitter {
constructor() {
this.listeners = {}; // Store all event listeners
this.listeners = {}; // Hifadhi wasikilizaji wote wa matukio
}
// Register a listener for a specific message type
// Sajili msikilizaji kwa aina maalum ya ujumbe
on(message, listener) {
if (!this.listeners[message]) {
this.listeners[message] = [];
@ -236,7 +378,7 @@ class EventEmitter {
this.listeners[message].push(listener);
}
// Send a message to all registered listeners
// Tuma ujumbe kwa wasikilizaji wote waliojisajili
emit(message, payload = null) {
if (this.listeners[message]) {
this.listeners[message].forEach(listener => {
@ -247,37 +389,37 @@ class EventEmitter {
}
```
**Kuvunja kinachotokea hapa:**
- **Kuunda** mfumo wa usimamizi wa matukio wa kati kwa kutumia darasa rahisi
- **Kuhifadhi** wasikilizaji katika kitu kilichopangwa kwa aina ya ujumbe
- **Kusajili** wasikilizaji wapya kwa kutumia mbinu ya `on()`
- **Kutangaza** ujumbe kwa wasikilizaji wote wanaovutiwa kwa kutumia `emit()`
- **Kusaidia** payloads za data za hiari kwa kupitisha taarifa husika
**Kuangalia kinachotokea hapa:**
- **Huunda** mfumo wa utawala wa tukio wa katikati kwa kutumia darasa rahisi
- **Huhifadhi** wasikilizaji katika kitu kilicho pangwa kwa aina ya ujumbe
- **Huandika** wasikilizaji wapya kwa kutumia njia `on()`
- **Hutangaza** ujumbe kwa wasikilizaji wote wenye nia kwa kutumia `emit()`
- **Husaidia** mzigo wa data usio lazima kwa kupitisha taarifa muhimu
### Kuweka Yote Pamoja: Mfano wa Vitendo
### Kuunganisha: Mfano Halisi
Sawa, hebu tuone hii ikifanya kazi! Tutajenga mfumo rahisi wa kusogea unaoonyesha jinsi pub/sub ilivyo safi na rahisi:
Sawa, tuchunguze hii katika vitendo! Tutengeneza mfumo rahisi wa harakati unaoonyesha jinsi pub/sub ni safi na rahisi:
```javascript
// Step 1: Define your message types
// Hatua ya 1: Eleza aina za ujumbe wako
const Messages = {
HERO_MOVE_LEFT: 'HERO_MOVE_LEFT',
HERO_MOVE_RIGHT: 'HERO_MOVE_RIGHT',
ENEMY_SPOTTED: 'ENEMY_SPOTTED'
};
// Step 2: Create your event system and game objects
// Hatua ya 2: Unda mfumo wako wa matukio na vitu vya mchezo
const eventEmitter = new EventEmitter();
const hero = createHero(0, 0);
```
**Hii ndiyo msimbo unavyofanya:**
- **Inafafanua** kitu cha constants ili kuzuia makosa ya herufi katika majina ya ujumbe
- **Inaunda** mfano wa emitter ya matukio ili kushughulikia mawasiliano yote
- **Inaanzisha** kitu cha shujaa katika nafasi ya kuanzia
**Msimbo huu unafanya yafuatayo:**
- **Umefafanua** kitu cha constants kuzuia makosa ya tahajia katika majina ya ujumbe
- **Umeunda** mfano wa mtangazaji wa tukio kushughulikia mawasiliano yote
- **Umeanzisha** kitu cha shujaa katika nafasi ya mwanzo
```javascript
// Step 3: Set up event listeners (subscribers)
// Hatua ya 3: Weka wasikilizaji wa matukio (wanajisajili)
eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
hero.moveTo(hero.x - 5, hero.y);
console.log(`Hero moved to position: ${hero.x}, ${hero.y}`);
@ -289,14 +431,14 @@ eventEmitter.on(Messages.HERO_MOVE_RIGHT, () => {
});
```
**Katika hapo juu, tumefanya:**
- **Kusajili** wasikilizaji wa matukio wanaojibu ujumbe wa kusogea
- **Kusasisha** nafasi ya shujaa kulingana na mwelekeo wa kusogea
- **Kuongeza** logging ya console kufuatilia mabadiliko ya nafasi ya shujaa
- **Kutenganisha** mantiki ya kusogea kutoka kwa usimamizi wa pembejeo
**Juu tume:**
- **Kusajili** wasikilizaji wa tukio wanaojibu ujumbe wa harakati
- **Kusasisha** nafasi ya shujaa kulingana na mwelekeo wa harakati
- **Kuongeza** uandishi wa kumbukumbu wa hali ya shujaa
- **Kutenganisha** mantiki ya harakati na usimamizi wa pembejeo
```javascript
// Step 4: Connect keyboard input to events (publishers)
// Hatua ya 4: Unganisha ingizo la kibodi na matukio (wachapishaji)
window.addEventListener('keydown', (event) => {
switch(event.key) {
case 'ArrowLeft':
@ -310,60 +452,211 @@ window.addEventListener('keydown', (event) => {
```
**Kuelewa dhana hizi:**
- **Kuunganisha** pembejeo ya kibodi na matukio ya mchezo bila kuunganisha kwa karibu
- **Kuwezesha** mfumo wa pembejeo kuwasiliana na vitu vya mchezo kwa njia isiyo ya moja kwa moja
- **Kuruhusu** mifumo mingi kujibu matukio sawa ya kibodi
- **Kufanya** iwe rahisi kubadilisha funguo au kuongeza njia mpya za pembejeo
> 💡 **Kidokezo cha Kitaalamu**: Uzuri wa muundo huu ni kubadilika! Unaweza kuongeza athari za sauti, mtikisiko wa skrini, au athari za chembe kwa urahisi kwa kuongeza wasikilizaji zaidi wa matukio hakuna haja ya kurekebisha msimbo wa kibodi au kusogea uliopo.
- **Kuunganisha** pembejeo ya kibodi na matukio ya mchezo bila utegemezi mkali
- **Kuwezesha** mfumo wa pembejeo kuwasiliana na vitu vya mchezo kwa njia zisizo za moja kwa moja
- **Kuruhusu** mifumo mingi kujibu matukio yale yale ya kibodi
- **Kufanya** rahisi kubadilisha vifungo au kuongeza njia mpya za pembejeo
```mermaid
sequenceDiagram
participant User
participant Keyboard
participant EventEmitter
participant Hero
participant SoundSystem
participant Camera
User->>Keyboard: Bonyeza MshaleKushoto
Keyboard->>EventEmitter: emit('HERO_MOVE_LEFT')
EventEmitter->>Hero: Hamisha kushoto pixel 5
EventEmitter->>SoundSystem: Cheza sauti ya hatua
EventEmitter->>Camera: Fuata shujaa
Hero->>Hero: Sasisha nafasi
SoundSystem->>SoundSystem: Cheza sauti
Camera->>Camera: Rekebisha eneo la kuona
```
> 💡 **Ushauri wa Mtaalamu**: Uzuri wa mfumo huu ni kubadilika! Unaweza kuongeza sauti, kutikisa skrini, au athari za chembe kwa tu kuongeza wasikilizaji zaidi wa tukio hauitaji kubadilisha msimbo uliopo wa kibodi au harakati.
>
**Hii ndiyo sababu utaipenda njia hii:**
- Kuongeza vipengele vipya kunakuwa rahisi sana sikiliza tu matukio unayojali
- Mambo mengi yanaweza kuguswa na tukio moja bila kuingiliana
- Kupima kunakuwa rahisi sana kwa sababu kila kipande hufanya kazi kwa uhuru
- Wakati kitu kinaharibika, unajua hasa wapi pa kuangalia
**Hii ndiyo sababu utapenda mbinu hii:**
- Kuongeza sifa mpya ni rahisi sana sikiliza tu matukio unayojali
- Mambo mengi yanaweza kuyatendea tukio moja bila kughumuana
- Kupima kunakuwa rahisi zaidi kwa sababu kila kipengele hufanya kazi pekee yake
- Tukio lolote linapovunjika, unajua hasa pa kuangalia
### Kwa Nini Pub/Sub Inapimika Vyema
### Kwa Nini Pub/Sub Huongeza Ufanisi
Mfumo wa pub/sub unadumisha urahisi kadri programu zinavyokua kwa ugumu. Iwe unashughulikia maadui wengi, masasisho ya UI yenye nguvu, au mifumo ya sauti, mfumo hushughulikia ongezeko la ukubwa bila mabadiliko ya usanifu. Vipengele vipya vinaunganishwa katika mfumo wa matukio uliopo bila kuathiri utendaji uliowekwa.
Mfumo wa pub/sub huendeleza ustahimilivu wakati programu zinapozidi kuwa ngumu. Iwe unaongoza adui mamia, masasisho ya UI ya kidigitali, au mifumo ya sauti, mfumo unakamilisha wingi bila mabadiliko ya usanifu. Sifa mpya zinaunganishwa kwenye mfumo wa tukio uliopo bila kuathiri utendaji uliowekwa.
> ⚠️ **Kosa la Kawaida**: Usianze na aina nyingi sana za ujumbe maalum mapema. Anza na makundi mapana na uyaboreshe kadri mahitaji ya mchezo wako yanavyokuwa wazi.
> ⚠️ **Kosa la Kawaida**: Usizalisha aina nyingi sana za ujumbe mapema mno. Anza na makundi makubwa kisha boresha kadri mahitaji ya mchezo yanavyoonekana.
>
**Mazoea bora ya kufuata:**
- **Kugawanya** ujumbe unaohusiana katika makundi ya kimantiki
- **Kutumia** majina ya kuelezea yanayoonyesha wazi kilichotokea
- **Kuweka** payloads za ujumbe rahisi na zenye lengo
- **Kudokumentisha** aina za ujumbe kwa ushirikiano wa timu
**Mazoezi bora ya kufuata:**
- **Unganisha** ujumbe zinazohusiana katika makundi yenye mantiki
- **Tumia** majina ya kueleweka yanayoelezea kilichotokea
- **Hifadhi** mzigo wa ujumbe kuwa rahisi na makini
- **Andika** aina za ujumbe kwa ajili ya ushirikiano wa timu
### 🔄 **Kagua Elimu**
**Ufahamu wa Miundo Inayotegemea Tukio**: Thibitisha ufahamu wako wa mfumo mzima:
- ✅ Mfumo wa pub/sub unazuiaje utegemezi mkali kati ya vipengele?
- ✅ Kwa nini ni rahisi kuongeza sifa mpya kwa miundo inayotegemea tukio?
- ✅ Je, EventEmitter ina jukumu gani katika mchakato wa mawasiliano?
- ✅ Vifaa vya ujumbe vinazuiaje makosa na kuboresha uthabiti?
**Changamoto ya Ubunifu**: Ungetatua vipi matukio haya ya mchezo kwa pub/sub?
1. **Adui anapokufa**: Sasisha alama, cheza sauti, toa kitu cha nguvu, ifute kutoka skrini
2. **Kiwilaya kumemalizika**: Ikome muziki, onyesha UI, hifadhi maendeleo, paku nyuma level ifuatayo
3. **Vitu vya nguvu vilipokelewa**: Boreshwa uwezo, sasisha UI, cheza athari, anza kengele
**Mfungamano wa Kitaalamu**: Mifumo hii inaonekana katika:
- **Mifumo ya mbele**: Matukio ya React/Vue
- **Huduma za nyuma**: Mawasiliano ya microservice
- **Injini za mchezo**: Mfumo wa tukio wa Unity
- **Maendeleo ya simu**: Mifumo ya notisi ya iOS/Android
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia mode ya Agent kukamilisha changamoto ifuatayo:
**Maelezo:** Unda mfumo rahisi wa vitu vya mchezo kwa kutumia urithi na mfumo wa pub/sub. Utatekeleza mchezo wa msingi ambapo vitu tofauti vinaweza kuwasiliana kupitia matukio bila kujua moja kwa moja kuhusu kila mmoja.
**Maelezo:** Unda mfumo rahisi wa vitu vya mchezo ukitumia urithi na mfumo wa pub/sub. Utatekeleza mchezo wa msingi ambapo vitu tofauti vinaweza kuwasiliana kupitia matukio bila kufahamiana moja kwa moja.
**Maelekezo:** Unda mfumo wa mchezo wa JavaScript wenye mahitaji yafuatayo: 1) Unda darasa la msingi la GameObject lenye viwianishi vya x, y na mali ya aina. 2) Unda darasa la Hero linalopanua GameObject na linaweza kusogea. 3) Unda darasa la Enemy linalopanua GameObject na linaweza kufuatilia shujaa. 4) Tekeleza darasa la EventEmitter kwa mfumo wa pub/sub. 5) Sanidi wasikilizaji wa matukio ili shujaa anaposogea, maadui wa karibu wapokee tukio la 'HERO_MOVED' na kusasisha nafasi zao kufuatilia shujaa. Jumuisha kauli za console.log kuonyesha mawasiliano kati ya vitu.
**Kauli:** Unda mfumo wa mchezo wa JavaScript wenye mahitaji yafuatayo: 1) Unda darasa la msingi GameObject lenye kuratibu x, y na sifa ya aina. 2) Unda darasa Hero linaloendeleza GameObject na linaweza kusogea. 3) Unda darasa Enemy linaloendeleza GameObject na linaweza kumfuata shujaa. 4) Tekeleza darasa la EventEmitter kwa mfumo wa pub/sub. 5) Weka wasikilizaji wa matukio ili shujaa anaposogea, adui wa karibu wapokee tukio la 'HERO_MOVED' na wasasisha nafasi zao kuelekea shujaa. Jumuisha taarifa za console.log kuonyesha mawasiliano kati ya vitu.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Fikiria jinsi muundo wa pub-sub unavyoweza kuboresha usanifu wa mchezo. Tambua vipengele vinavyopaswa kutoa matukio na jinsi mfumo unavyopaswa kujibu. Buni dhana ya mchezo na chorongea mifumo ya mawasiliano kati ya vipengele vyake.
Fikiria jinsi mfumo wa pub-sub unavyoweza kuboresha usanifu wa mchezo. Tambua ni vipengele gani vinapaswa kutangaza matukio na jinsi mfumo unavyopaswa kujibu. Buni dhana ya mchezo na panga mifumo ya mawasiliano kati ya vipengele vyake.
## Maswali ya Baada ya Somo
## Mtihani wa Baada ya Mhadhara
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/30)
[Mtihani wa baada ya mhadhara](https://ff-quizzes.netlify.app/web/quiz/30)
## Mapitio na Kujisomea
## Mapitio & Kujisomea
Jifunze zaidi kuhusu Pub/Sub kwa [kusoma kuhusu hilo](https://docs.microsoft.com/azure/architecture/patterns/publisher-subscriber/?WT.mc_id=academic-77807-sagibbon).
## Kazi
### ⚡ **Nini Unaweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua mchezo wowote wa HTML5 mtandaoni na chunguza msimbo wake ukiwa na DevTools
- [ ] Tengeneza kipengele rahisi cha HTML5 Canvas na chora umbo la msingi
- [ ] Jaribu kutumia `setInterval` kuunda mzunguko rahisi wa uhuishaji
- [ ] Chunguza nyaraka za Canvas API na jaribu mbinu ya kuchora
### 🎯 **Nini Unaweza Kufanikisha Katika Saa Hii**
- [ ] Kamili mtihani wa baada ya somo na kuelewa dhana za maendeleo ya michezo
- [ ] Pangilia muundo wa mradi wa mchezo wako na faili za HTML, CSS, na JavaScript
- [ ] Tengeneza mzunguko wa msingi wa mchezo unaosasisha na kuonyesha kwa kuendelea
- [ ] Chora sprite zako za kwanza za mchezo kwenye canvas
- [ ] Tekeleza upakiaji wa mali za msingi kwa picha na sauti
### 📅 **Uundaji Wako wa Mchezo wa Wiki Nzima**
- [ ] Kamili mchezo kamili wa anga na vipengele vyote vilivyopangwa
- [ ] Ongeza michoro ya kupendeza, athari za sauti, na uhuishaji laini
- [ ] Tekeleza hali za mchezo (skrini ya kuanza, mchezo, mchezo umekamilika)
- [ ] Tengeneza mfumo wa alama na ufuatiliaji wa maendeleo ya mchezaji
- [ ] Fanya mchezo wako uwe mzuri na wa kufikika kwa vifaa mbalimbali
- [ ] Shiriki mchezo wako mtandaoni na ukusanye maoni kutoka kwa wachezaji
### 🌟 **Maendeleo Yako ya Mchezo wa Mwezi**
- [ ] Tengeneza michezo mingi ikichunguza aina na mbinu mbalimbali
- [ ] Jifunze mfumo wa maendeleo ya mchezo kama Phaser au Three.js
- [ ] Changia katika miradi ya maendeleo michezo ya chanzo wazi
- [ ] Tambua mifumo ya hali ya juu ya programu za mchezo na uboreshaji
- [ ] Tengeneza jalada linaloonyesha ujuzi wako wa maendeleo ya mchezo
- [ ] Fundisha wengine wanaopenda maendeleo ya michezo na vyombo vya mwingiliano
## 🎯 Ratiba Yako ya Utaalamu wa Maendeleo ya Mchezo
```mermaid
timeline
title Muendelezo wa Kujifunza Miundo ya Mchezo
section Mifumo ya Vitu (dakika 20)
Mpangilio wa Msimbo: Urithi wa darasa
: Mifumo ya muundo
: Kazi za kiwanda
: Mchanganyiko wa tabia
section Mifumo ya Mawasiliano (dakika 25)
Muundo wa Tukio: Utekelezaji wa Pub/Sub
: Ubunifu wa ujumbe
: Watoa matukio
: Uunganishaji mwepesi
section Ubunifu wa Vitu vya Mchezo (dakika 30)
Mifumo ya Kitu: Usimamizi wa mali
: Muundo wa tabia
: Usimamizi wa hali
: Usimamizi wa mzunguko wa maisha
section Mifumo ya Miundo (dakika 35)
Ubunifu wa Mfumo: Mifumo ya vipengele
: Mfano wa mtazamaji
: Mfano wa amri
: Mashine za hali
section Dhana Zinazoendelea (dakika 45)
Muundo Unaoweza Kupanuka: Uboreshaji wa utendaji
: Usimamizi wa kumbukumbu
: Ubunifu wa moduli
: Mikakati ya upimaji
section Dhana za Injini ya Mchezo (wiki 1)
Maendeleo ya Kitaalamu: Grafu za mandhari
: Usimamizi wa mali
: Mipangilio ya uchoraji
: Muungano wa fizikia
section Ustadi wa Mfumo wa Kazi (wiki 2)
Maendeleo ya Moderni ya Mchezo: Mifumo ya mchezo ya React
: Uboreshaji wa Canvas
: Misingi ya WebGL
: Michezo ya PWA
section Mbinu za Viwanda (mwezi 1)
Ujuzi wa Kitaalamu: Ushirikiano wa timu
: Mapitio ya msimbo
: Mifumo ya muundo wa mchezo
: Uchanganuzi wa utendaji
```
### 🛠️ Muhtasari wa Kifaa Chako cha Usanifu wa Mchezo
Baada ya kumaliza somo hili, sasa una:
- **Utaalamu wa Mtindo wa Ubunifu**: Uelewa wa faida na hasara za urithi dhidi ya muundo
- **Usanifu Unaotegemea Matukio**: Utekelezaji wa pub/sub kwa mawasiliano yanayoweza kupanuka
- **Ubunifu Unaotegemea Vitu**: Mitishamba ya madaraja na mchanganyiko wa tabia
- **JavaScript ya Kisasa**: Kifaa cha kiwanda, sintaksia ya spread, na mifumo ya ES6+
- **Usanifu Unaoweza Kupanuka**: Ufungamano mpanao na kanuni za muundo wa moduli
- **Msingi wa Maendeleo ya Mchezo**: Mfumo wa vitu na mifumo ya vipengele
- **Mifumo ya Kitaalamu**: Mbinu za viwango vya tasnia za kupanga msimbo
**Matumizi Halisi**: Mifumo hii hutumika moja kwa moja kwa:
- **Mifumo ya Mbele**: Usanifu wa vipengele vya React/Vue na usimamizi wa hali
- **Huduma Za Nyuma**: Mawasiliano ya microservice na mifumo inayoendeshwa na matukio
- **Maendeleo ya Simu**: Usanifu wa app za iOS/Android na mifumo ya arifa
- **Mifumo ya Mchezo**: Unity, Unreal, na maendeleo ya michezo ya mtandao
- **Programu za Biashara**: Chanzo cha tukio na usanifu wa mifumo iliyoenea
- **Ubunifu wa API**: Huduma za RESTful na mawasiliano ya wakati halisi
**Ujuzi wa Kitaalamu Uliopatikana**: Sasa unaweza:
- **Kubuni** usanifu wa programu unaoweza kupanuka kwa kutumia mifumo iliyothibitishwa
- **Tekeleza** mifumo inayotegemea matukio inayoshughulikia mwingiliano tata
- **Chagua** mikakati inayofaa ya kupanga msimbo kwa hali tofauti
- **Rekebisha** na kudumisha mifumo isiyofungwa kwa ufanisi
- **Wasiliana** maamuzi ya kiufundi kwa kutumia istilahi za viwango vya tasnia
**Kiwango Kijacho**: Uko tayari kutekeleza mifumo hii katika mchezo halisi, kuchunguza mada za maendeleo ya mchezo yaliyo wazi, au kutumia dhana hizi za usanifu kwenye programu za wavuti!
🌟 **Mafanikio Yapotekwa**: Umejifunza mifumo ya msingi ya usanifu wa programu inayoiwezesha kutoka michezo rahisi hadi mifumo tata ya biashara!
## Kazi ya Nyumba
[Unda mfano wa mchezo](assignment.md)
[Tengeneza mfano wa mchezo](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kiarifu cha Msamaha**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za moja kwa moja zinaweza kuwa na makosa au kushindwa kutoa maana kamili. Hati asili kwa lugha yake ya mama inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatuwezi kuwajibika kwa kutoelewana au tafsiri mbaya zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,113 +1,232 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "84053695dca714e16ed064366503ebd5",
"translation_date": "2025-10-24T19:40:40+00:00",
"original_hash": "7994743c5b21fdcceb36307916ef249a",
"translation_date": "2026-01-07T01:34:13+00:00",
"source_file": "6-space-game/2-drawing-to-canvas/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 2: Chora Shujaa na Wanyama wa Ajabu kwenye Canvas
API ya Canvas ni mojawapo ya vipengele vyenye nguvu zaidi katika maendeleo ya wavuti kwa kuunda michoro ya nguvu na ya kuingiliana moja kwa moja kwenye kivinjari chako. Katika somo hili, tutabadilisha kipengele cha HTML `<canvas>` kilicho tupu kuwa ulimwengu wa mchezo uliojaa mashujaa na wanyama wa ajabu. Fikiria canvas kama ubao wako wa sanaa wa kidijitali ambapo msimbo unakuwa wa kuona.
Tunajenga juu ya kile ulichojifunza katika somo la awali, na sasa tutazama katika vipengele vya kuona. Utajifunza jinsi ya kupakia na kuonyesha sprites za mchezo, kuweka vipengele kwa usahihi, na kuunda msingi wa kuona kwa mchezo wako wa anga. Hii inaziba pengo kati ya kurasa za wavuti zisizobadilika na uzoefu wa nguvu na wa kuingiliana.
Mwisho wa somo hili, utakuwa na eneo kamili la mchezo na meli ya shujaa wako ikiwa imewekwa kwa usahihi na maumbo ya adui tayari kwa vita. Utaelewa jinsi michezo ya kisasa inavyotoa michoro kwenye vivinjari na kupata ujuzi wa kuunda uzoefu wako wa kuona wa kuingiliana. Hebu tuchunguze michoro ya canvas na kuleta mchezo wako wa anga uhai!
## Maswali ya Awali ya Somo
# Jenga Mchezo wa Anga Sehemu ya 2: Chora Shujaa na Mashetani kwenye Canvas
```mermaid
journey
title Safari Yako ya Mchuzi wa Canvas
section Msingi
Elewa API ya Canvas: 3: Student
Jifunze mfumo wa kuratibu: 4: Student
Chora maumbo ya msingi: 4: Student
section Kushughulikia Picha
Pakua mali za mchezo: 4: Student
Shughulikia upakuaji wa async: 5: Student
Weka sprites nafasi: 5: Student
section Uchoraji wa Mchezo
Tengeneza skrini ya mchezo: 5: Student
Jenga maumbo: 5: Student
Boresha utendaji: 4: Student
```
API ya Canvas ni mojawapo ya vipengele vyenye nguvu zaidi vya maendeleo ya wavuti kwa kuunda michoro yenye nguvu na ya mwingiliano moja kwa moja katika kivinjari chako. Katika somo hili, tutabadilisha kipengele tupu cha HTML `<canvas>` kuwa dunia ya mchezo yenye mashujaa na mashetani. Tafakari canvas kama ubao wako wa sanaa za kidijitali ambapo msimbo hugeuka kuwa picha.
Tunajenga juu ya kile ulichojifunza katika somo lililopita, na sasa tutaingia katika vipengele vya kuona. Utajifunza jinsi ya kupakia na kuonyesha sprites za mchezo, kuweka vitu mahali sahihi, na kuunda msingi wa kuona kwa mchezo wako wa anga. Hii inapunguza pengo kati ya kurasa za wavuti zisizosogezwa na uzoefu unaohusisha mwingiliano.
Mwishoni mwa somo hili, utakuwa na pazia kamili la mchezo na meli yako ya shujaa ikiwa imewekwa mahali sahihi na maumbo ya adui tayari kwa mapambano. Utafahamu jinsi michezo ya kisasa inavyophyonyesha michoro katika vivinjari na utapata ujuzi wa kuunda uzoefu wako wenye mwingiliano wa kuona. Tuchunguze michoro ya canvas na kuleta mchezo wako wa anga hai!
```mermaid
mindmap
root((Michoro ya Canvas))
Canvas Element
Kipengele cha HTML5
Muktadha wa 2D
Mfumo wa Msingi wa Kuratibu
Udhibiti wa Pikseli
Drawing Operations
Maumbo ya Msingi
Uchapishaji wa Maandishi
Uonyeshaji wa Picha
Kuchora Njia
Asset Management
Kupakia Picha
Operesheni za Msimamizi
Udhibiti wa Makosa
Utendaji
Game Rendering
Uwekaji wa Picha Ndogo
Mpangilio wa Muundo
Muundo wa Mzizi
Sasisho la Fremu
Visual Effects
Rangi & Mitindo
Mabadiliko
Miondoko
Upangaji Vigae
```
## Mtihani Kabla ya Mhadhara
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/31)
[Mtihani kabla ya mhadhara](https://ff-quizzes.netlify.app/web/quiz/31)
## Canvas
Kwa hivyo, kipengele hiki cha `<canvas>` ni nini hasa? Ni suluhisho la HTML5 la kuunda michoro ya nguvu na uhuishaji katika vivinjari vya wavuti. Tofauti na picha za kawaida au video ambazo ni za kudumu, canvas inakupa udhibiti wa kiwango cha pikseli juu ya kila kitu kinachoonekana kwenye skrini. Hii inafanya kuwa bora kwa michezo, taswira za data, na sanaa ya kuingiliana. Fikiria kama uso wa kuchora unaoweza kupangwa ambapo JavaScript inakuwa brashi yako ya rangi.
Sasa basi, ni nini hasa kipengele hiki cha `<canvas>`? Ni suluhisho la HTML5 la kuunda michoro yenye nguvu na michoro ya kusogeza kwenye vivinjari vya wavuti. Tofauti na picha au video za kawaida zisizosogezwa, canvas inakupa udhibiti wa pixel kwa kila kitu kinachoonekana kwenye skrini. Hii inafanya iwe bora kwa michezo, maonyesho ya data, na sanaa zinazohusisha mwingiliano. Tafakari kama uso wa kuchora unaoweza kuprogramwa ambapo JavaScript ni brashi yako ya rangi.
Kwa chaguo-msingi, kipengele cha canvas kinaonekana kama mstatili tupu, wa uwazi kwenye ukurasa wako. Lakini hapo ndipo uwezo wake unapoonekana! Nguvu yake halisi inaibuka unapoitumia JavaScript kuchora maumbo, kupakia picha, kuunda uhuishaji, na kufanya vitu viitike kwa mwingiliano wa mtumiaji. Ni sawa na jinsi waanzilishi wa michoro za kompyuta wa mapema huko Bell Labs katika miaka ya 1960 walivyolazimika kupanga kila pikseli kuunda uhuishaji wa kidijitali wa kwanza.
Kawaida, kipengele cha canvas kinaonekana kama mstatili tupu, ulio wazi kwenye ukurasa wako. Lakini hapo ndipo kilicho na uwezo! Nguvu yake halisi huibuka unapojaribu kutumia JavaScript kuchora maumbo, kupakia picha, kuunda michoro ya mzunguko, na kufanya vitu kujibu mwingiliano wa mtumiaji. Hii ni sawa na jinsi waanzilishi wa michoro ya kompyuta katika Bell Labs miaka ya 1960 walilazimika kuprogramu kila pixel kuunda michoro ya kwanza ya kidijitali.
✅ Soma [zaidi kuhusu API ya Canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API) kwenye MDN.
Hivi ndivyo inavyotangazwa kawaida, kama sehemu ya mwili wa ukurasa:
Hivi ndivyo kawaida hupangwa, kama sehemu ya mwili wa ukurasa:
```html
<canvas id="myCanvas" width="200" height="100"></canvas>
```
**Hivi ndivyo msimbo huu unavyofanya:**
- **Huweka** sifa ya `id` ili uweze kurejelea kipengele hiki maalum cha canvas katika JavaScript
- **Hufafanua** `width` kwa pikseli ili kudhibiti ukubwa wa usawa wa canvas
- **Huweka** `height` kwa pikseli ili kuamua vipimo vya wima vya canvas
## Kuchora Jiometri Rahisi
Sasa kwa kuwa unajua kipengele cha canvas ni nini, hebu tuchunguze jinsi ya kuchora juu yake! Canvas hutumia mfumo wa kuratibu ambao unaweza kuhisi kuwa wa kawaida kutoka darasa la hesabu, lakini kuna mabadiliko moja muhimu maalum kwa michoro za kompyuta.
Canvas hutumia kuratibu za Cartesian na mhimili wa x (usawa) na mhimili wa y (wima) kuweka kila kitu unachochora. Lakini hapa kuna tofauti kuu: tofauti na mfumo wa kuratibu kutoka darasa la hesabu, sehemu ya asili `(0,0)` huanza kwenye kona ya juu-kushoto, na thamani za x huongezeka unapohamia kulia na thamani za y huongezeka unaposhuka chini. Njia hii inatokana na maonyesho ya kompyuta ya mapema ambapo mihimili ya elektroni ilichunguza kutoka juu hadi chini, na kufanya juu-kushoto kuwa sehemu ya asili ya kawaida.
![grid ya canvas](../../../../translated_images/canvas_grid.5f209da785ded492a01ece440e3032afe51efa500cc2308e5ea4252487ceaf0b.sw.png)
- **Huanzisha** sifa ya `id` ili uweze kurejelea kipengele hiki maalum cha canvas ndani ya JavaScript
- **Huainisha** upana kwa pixel kudhibiti ukubwa wa canvas usawa
- **Huamua** urefu kwa pixel kuainisha vipimo vya wima vya canvas
## Kuchora Mawumbo Rahisi
Sasa kwani unajua ni nini kipengele cha canvas, tuchunguze jinsi ya kweli ya kuchora juu yake! Canvas hutumia mfumo wa kuratibu ambao unaweza kuwa umemfahamu kutoka darasani hesabu, lakini kuna tofauti moja muhimu inayohusiana na michoro ya kompyuta.
Canvas hutumia kuratibu za Cartesian zenye mhimili wa x (usawa) na mhimili wa y (wima) kuweka kila kitu unachochora. Lakini hapa ndipo tofauti kuu: tofauti na mfumo wa kuratibu wa hesabu, sehemu ya asili `(0,0)` huanza pembezoni mwa juu-kushoto, ambapo thamani za x huongezeka unapohama kulia na thamani za y huongezeka unaposhuka chini. Mbinu hii inatokana na maonyesho ya kompyuta za awali ambapo nyuzi za elektroni zilipiga kutoka juu hadi chini, hivyo juu-kushoto ilikuwa sehemu ya kuanzia.
```mermaid
quadrantChart
title Mfumo wa Kuratibu wa Kainisi
x-axis Kushoto --> Kulia
y-axis Juu --> Chini
quadrant-1 Robo ya 1
quadrant-2 Robo ya 2
quadrant-3 Robo ya 3
quadrant-4 Robo ya 4
Origin Point: [0.1, 0.1]
Hero Center: [0.5, 0.8]
Enemy Formation: [0.3, 0.2]
Power-up: [0.7, 0.6]
UI Elements: [0.9, 0.1]
```
![gridi ya canvas](../../../../translated_images/canvas_grid.5f209da785ded492.sw.png)
> Picha kutoka [MDN](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)
Ili kuchora kwenye kipengele cha canvas, utafuata mchakato wa hatua tatu ambao unaunda msingi wa michoro yote ya canvas. Mara unapofanya hivi mara chache, inakuwa rahisi:
1. **Pata rejeleo** la kipengele chako cha Canvas kutoka DOM (kama kipengele kingine chochote cha HTML)
2. **Pata muktadha wa utoaji wa 2D** hii inatoa mbinu zote za kuchora
3. **Anza kuchora!** Tumia mbinu za muktadha zilizojengwa ndani kuunda michoro yako
Ili kuchora kwenye kipengele cha canvas, utafuata mchakato wa hatua tatu unaounda msingi wa michoro yote ya canvas. Mara unavyofanya mara kadhaa, hutakuwa jambo gumu tena:
```mermaid
flowchart LR
A[Elementi ya Canvas ya HTML] --> B[Pata Marejeleo ya Canvas]
B --> C[Pata Muktadha wa 2D]
C --> D[Operesheni za Kuchora]
D --> E[Chora Maumbo]
D --> F[Chora Maandishi]
D --> G[Chora Picha]
D --> H[Tumia Mitindo]
E --> I[Tengeneza kwenye Skrini]
F --> I
G --> I
H --> I
style A fill:#e1f5fe
style C fill:#e8f5e8
style I fill:#fff3e0
```
1. **Pata rejea** ya kipengele chako cha Canvas kutoka DOM (kama vile kipengele kingine chochote cha HTML)
2. **Pata muktadha wa kuona wa 2D** huu hutupa njia zote za kuchora
3. **Anza kuchora!** Tumia njia zilizojengewa ndani za muktadha kuunda michoro yako
Hivi ndivyo inavyoonekana katika msimbo:
```javascript
// Step 1: Get the canvas element
// Hatua ya 1: Pata kipengele cha turubai
const canvas = document.getElementById("myCanvas");
// Step 2: Get the 2D rendering context
// Hatua ya 2: Pata muktadha wa uchoraji wa 2D
const ctx = canvas.getContext("2d");
// Step 3: Set fill color and draw a rectangle
// Hatua ya 3: Weka rangi ya kujaza na chora mstatili
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 200, 200); // x, y, width, height
ctx.fillRect(0, 0, 200, 200); // x, y, upana, urefu
```
**Hebu tuchambue hatua kwa hatua:**
- Tunachukua kipengele chetu cha canvas kwa kutumia ID yake na kuhifadhi katika kigezo
- Tunapata muktadha wa utoaji wa 2D hii ni zana yetu iliyojaa mbinu za kuchora
- Tunaiambia canvas tunataka kujaza vitu kwa rangi nyekundu kwa kutumia mali ya `fillStyle`
- Tunachora mstatili kuanzia kwenye kona ya juu-kushoto (0,0) ambao ni upana wa pikseli 200 na urefu
✅ API ya Canvas inazingatia zaidi maumbo ya 2D, lakini unaweza pia kuchora vipengele vya 3D kwenye tovuti; kwa hili, unaweza kutumia [API ya WebGL](https://developer.mozilla.org/docs/Web/API/WebGL_API).
**Tuchambue hatua kwa hatua:**
- Tunakamata kipengele chetu cha canvas kwa kutumia ID yake na kuihifadhi kwenye tofauti
- Tunapata muktadha wa kuonyesha wa 2D zana yetu kamili ya njia za kuchora
- Tunaambia canvas tunataka kujaza vitu kwa rangi nyekundu kwa kutumia mali `fillStyle`
- Tunachora mstatili kuanzia pembezoni mwa juu kushoto (0,0) wenye upana na urefu wa pixel 200
Unaweza kuchora vitu vya aina mbalimbali kwa kutumia API ya Canvas kama:
✅ API ya Canvas inazingatia zaidi maumbo ya 2D, lakini pia unaweza kuchora vitu vya 3D kwenye tovuti; kwa hili, unaweza kutumia [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API).
- **Maumbo ya jiometri**, tayari tumeonyesha jinsi ya kuchora mstatili, lakini kuna mengi zaidi unayoweza kuchora.
- **Maandishi**, unaweza kuchora maandishi kwa fonti yoyote na rangi unayotaka.
- **Picha**, unaweza kuchora picha kulingana na mali ya picha kama .jpg au .png kwa mfano.
Unaweza kuchora aina zote za vitu kwa API ya Canvas kama:
✅ Jaribu! Unajua jinsi ya kuchora mstatili, unaweza kuchora duara kwenye ukurasa? Angalia baadhi ya michoro ya kuvutia ya Canvas kwenye CodePen. Hapa kuna [mfano wa kuvutia sana](https://codepen.io/dissimulate/pen/KrAwx).
- **Maumbo ya kijiometri**, tayari tumeonyesha jinsi ya kuchora mstatili, lakini kuna zaidi unayoweza kuchora.
- **Maandishi**, unaweza kuchora maandishi kwa aina yoyote ya fonti na rangi unayoitaka.
- **Picha**, unaweza kuchora picha kulingana na picha za rasilimali kama .jpg au .png kwa mfano.
## Pakia na Chora Mali ya Picha
✅ Jaribu! Unajua jinsi ya kuchora mstatili, unaweza kuchora mduara kwenye ukurasa? Tazama michoro ya Canvas ya kuvutia kwenye CodePen. Hapa kuna [mfano mzuri sana](https://codepen.io/dissimulate/pen/KrAwx).
Kuchora maumbo ya msingi ni muhimu kwa kuanza, lakini michezo mingi inahitaji picha halisi! Sprites, mandhari, na textures ndizo zinazotoa mvuto wa kuona kwa michezo. Kupakia na kuonyesha picha kwenye canvas hufanya kazi tofauti na kuchora maumbo ya jiometri, lakini ni rahisi mara unapofahamu mchakato.
### 🔄 **Ukaguzi wa Kufundisha**
**Uelewa wa Misingi ya Canvas**: Kabla ya kuhamia kwa upakiaji picha, hakikisha unaweza:
- ✅ Eleza jinsi mfumo wa kuratibu wa canvas unavyotofautiana na kuratibu za hesabu
- ✅ Elewa mchakato wa hatua tatu wa shughuli za kuchora canvas
- ✅ Tambua kile muktadha wa uchoraji wa 2D hutoa
- ✅ Eleza jinsi `fillStyle` na `fillRect` vinavyofanya kazi pamoja
Tunahitaji kuunda kipengele cha `Image`, kupakia faili ya picha yetu (hii hufanyika kwa njia ya asinkroni, ikimaanisha "katika usuli"), na kisha kuichora kwenye canvas mara tu inapokuwa tayari. Njia hii inahakikisha picha zako zinaonyeshwa vizuri bila kuzuia programu yako wakati zinapakia.
**Jaribio la Kujitathmini Haraka**: Ungechora mduara wa bluu wapi kwenye (100, 50) akiwa na radius 25?
```javascript
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(100, 50, 25, 0, 2 * Math.PI);
ctx.fill();
```
### Kupakia Picha ya Msingi
**Njia za Kuchora Canvas Unazojua Sasa**:
- **fillRect()**: Huchora mistari iliyojazwa
- **fillStyle**: Huweka rangi na mifumo
- **beginPath()**: Huanzisha njia mpya za kuchora
- **arc()**: Huunda miduara na miondoko
## Pakia na Chora Picha
Kuchora maumbo ya msingi ni muhimu kwa kuanza, lakini michezo mingi inahitaji picha halisi! Sprites, mandhari, na muundo ndio huipa mchezo mvuto wa kuona. Kupakia na kuonyesha picha kwenye canvas hufanyika tofauti na kuchora maumbo ya kijiometri, lakini ni rahisi mara utakapoelewa mchakato.
Tunahitaji kuunda kipengele cha `Image`, kupakia faili la picha yetu (hili hufanyika kwa njia isiyo ya mara moja, ikimaanisha "katika usuli"), kisha kuichora kwenye canvas mara inapoandaliwa. Njia hii huhakikisha picha zako zinaonyeshwa ipasavyo bila kuzuia programu yako wakati zinapopakia.
```mermaid
sequenceDiagram
participant JS as JavaScript
participant Img as Kifaa cha Picha
participant Server as Seva ya Faili
participant Canvas as Muktadha wa Canvas
JS->>Img: new Image()
JS->>Img: Weka mali ya src
Img->>Server: Omba faili la picha
Server->>Img: Rudisha data ya picha
Img->>JS: Chochea tukio la onload
JS->>Canvas: drawImage(img, x, y)
Canvas->>Canvas: Choragharama kwa skrini
Note over JS,Canvas: Upakiaji wa async huzuia kuzuiwa kwa UI
```
### Upakiaji wa Picha wa Kimsingi
```javascript
const img = new Image();
img.src = 'path/to/my/image.png';
img.onload = () => {
// Image loaded and ready to be used
// Picha imepakiwa na iko tayari kutumika
console.log('Image loaded successfully!');
};
```
**Hivi ndivyo kinachotokea katika msimbo huu:**
- Tunaunda kipengele kipya cha Picha ili kushikilia sprite au texture yetu
- Tunaiambia faili gani ya picha ya kupakia kwa kuweka njia ya chanzo
- Tunaisikiliza tukio la kupakia ili tujue hasa wakati picha iko tayari kutumika
**Hivi ndivyo msimbo huu unavyofanya:**
- Tuna **unda** kitu kipya cha Image kushikilia sprite au muundo wetu
- Tuna **ambia** ni faili gani la picha kupakia kwa kuweka njia ya chanzo
- Tuna **sikiliza** tukio la kupakia ili tujue picha iko tayari lini
### Njia Bora ya Kupakia Picha
Hapa kuna njia thabiti zaidi ya kushughulikia upakiaji wa picha ambayo watengenezaji wa kitaalamu hutumia mara kwa mara. Tutafunga upakiaji wa picha katika kazi inayotegemea Promise njia hii, maarufu wakati Promise za JavaScript zilipokuwa kiwango cha ES6, hufanya msimbo wako kuwa wa mpangilio zaidi na hushughulikia makosa kwa urahisi:
Hapa kuna njia bora zaidi ya kushughulikia upakiaji wa picha ambayo watengenezaji wataalamu hutumia sana. Tutazungusha upakiaji wa picha katika kazi inayotegemea Promise njia hii, iliyopendekezwa wakati Usahidi wa JavaScript ulipokuwa kawaida katika ES6, huifanya msimbo wako kuonekana vizuri zaidi na kushughulikia makosa kwa heshima:
```javascript
function loadAsset(path) {
@ -123,38 +242,38 @@ function loadAsset(path) {
});
}
// Modern usage with async/await
// Matumizi ya kisasa na async/await
async function initializeGame() {
try {
const heroImg = await loadAsset('hero.png');
const monsterImg = await loadAsset('monster.png');
// Images are now ready to use
// Picha sasa ziko tayari kutumika
} catch (error) {
console.error('Failed to load game assets:', error);
}
}
```
**Kile tulichofanya hapa:**
- Tumefunga mantiki yote ya upakiaji wa picha katika Promise ili tuweze kuishughulikia vizuri
- Tumeongeza utunzaji wa makosa ambao hutufahamisha wakati kitu kinakwenda vibaya
- Tumetumia sintaksia ya kisasa ya async/await kwa sababu ni rahisi kusoma
- Tumetumia vizuizi vya try/catch kushughulikia kwa urahisi matatizo yoyote ya upakiaji
**Tumefanya nini hapa:**
- **Tumefunga** yale yote ya upakiaji wa picha kwenye Promise ili tuweze kuyashughulikia vizuri zaidi
- **Tumekuwa na** usimamizi wa makosa unaotuambia mara moja ikiwa kuna tatizo
- **Tumetumia** sintaksia ya async/await ya kisasa kwa sababu ni safi kusoma zaidi
- **Tumemjumuisha** sehemu za try/catch kushughulikia makosa kwa heshima
Mara picha zako zinapopakiwa, kuzichora kwenye canvas ni rahisi sana:
Mara picha zako zikipakiwa, kuzieleza kwenye canvas ni rahisi kabisa:
```javascript
async function renderGameScreen() {
try {
// Load game assets
// Pakua mali za mchezo
const heroImg = await loadAsset('hero.png');
const monsterImg = await loadAsset('monster.png');
// Get canvas and context
// Pata turubai na muktadha
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
// Draw images to specific positions
// Chorasyua picha kwenye nafasi maalum
ctx.drawImage(heroImg, canvas.width / 2, canvas.height / 2);
ctx.drawImage(monsterImg, 0, 0);
} catch (error) {
@ -163,32 +282,56 @@ async function renderGameScreen() {
}
```
**Hebu tuchambue hatua kwa hatua:**
- Tunapakia picha zetu za shujaa na monster kwa usuli kwa kutumia await
- Tunachukua kipengele chetu cha canvas na kupata muktadha wa utoaji wa 2D tunaohitaji
- Tunapanga picha ya shujaa katikati kwa kutumia hesabu ya haraka ya kuratibu
- Tunaiweka picha ya monster kwenye kona ya juu-kushoto kuanza maumbo ya adui
- Tunashika makosa yoyote yanayoweza kutokea wakati wa upakiaji au utoaji
## Sasa Ni Wakati wa Kuanza Kujenga Mchezo Wako
**Tupite hatua kwa hatua:**
- Tunapakia picha za shujaa na shabiki katika usuli kwa kutumia await
- Tunakamata kipengele cha canvas na kupata muktadha wa kuonyesha wa 2D tunayohitaji
- Tunaweka picha ya shujaa katikati katikati kwa kutumia hesabu rahisi ya kuratibu
- Tunaweka picha ya monster pembezoni juu kushoto kuanzisha maumbo ya adui
- Tunakamata makosa yoyote yanayoweza kutokea wakati wa upakiaji au kuonyesha
```mermaid
flowchart TD
A[Pakia Mali] --> B{Picha Zote Zimepakwa?}
B -->|Hapana| C[Onyesha Inapakia]
B -->|Ndio| D[Pata Muktadha wa Kawaida]
C --> B
D --> E[Futa Skrini]
E --> F[Chora Mandhari]
F --> G[Chora Muundo wa Adui]
G --> H[Chora Meli ya Shujaa]
H --> I[Tumia Athari za Kuona]
I --> J[Onyesha Fremu]
subgraph "Rendering Pipeline"
K[Usimamizi wa Mali]
L[Muundo wa Taarifa]
M[Operesheni za Kuchora]
N[Tokea la Fremu]
end
style A fill:#e1f5fe
style J fill:#e8f5e8
style I fill:#fff3e0
```
## Sasa Ni Wakati wa Kuanzisha Mchezo Wako
Sasa tutaweka kila kitu pamoja kuunda msingi wa kuona wa mchezo wako wa anga. Una uelewa mzuri wa misingi ya canvas na mbinu za upakiaji wa picha, kwa hivyo sehemu hii ya vitendo itakuongoza kupitia kujenga skrini kamili ya mchezo na sprites zilizowekwa kwa usahihi.
Sasa tutaunganisha kila kitu kuunda msingi wa kuona wa mchezo wako wa anga. Una uelewa thabiti wa misingi ya canvas na mbinu za upakiaji picha, hivyo sehemu hii ya vitendo itakuongoza kuunda skrini kamili ya mchezo ukiwa na sprites zilizopangwa vyema.
### Kile cha Kujenga
Utajenga ukurasa wa wavuti na kipengele cha Canvas. Inapaswa kutoa skrini nyeusi `1024*768`. Tumekupa picha mbili:
Utajenga ukurasa wa wavuti wenye kipengele cha Canvas. Inapaswa kuonyesha skrini nyeusi ya `1024*768`. Tumekupa picha mbili:
- Meli ya shujaa
![Meli ya shujaa](../../../../translated_images/player.dd24c1afa8c71e9b82b2958946d4bad13308681392d4b5ddcc61a0e818ef8088.sw.png)
![Meli ya shujaa](../../../../translated_images/player.dd24c1afa8c71e9b.sw.png)
- 5*5 monster
![Meli ya monster](../../../../translated_images/enemyShip.5df2a822c16650c2fb3c06652e8ec8120cdb9122a6de46b9a1a56d54db22657f.sw.png)
![Meli ya monster](../../../../translated_images/enemyShip.5df2a822c16650c2.sw.png)
### Hatua Zinazopendekezwa za Kuanza Maendeleo
### Hatua zilizopendekezwa kuanza maendeleo
Tafuta faili za kuanzia ambazo zimeundwa kwa ajili yako katika folda ndogo ya `your-work`. Muundo wa mradi wako unapaswa kuwa na:
Tafuta faili za kuanzia zilizoundwa kwako katika folda ndogo ya `your-work`. Muundo wa mradi wako unapaswa kuwa na:
```bash
your-work/
@ -200,46 +343,46 @@ your-work/
└── package.json
```
**Hivi ndivyo unavyofanya kazi:**
- **Sprites za mchezo** ziko katika folda ya `assets/` ili kila kitu kiwe kimepangwa
- **Faili yako kuu ya HTML** inaweka kipengele cha canvas na kuandaa kila kitu
- **Faili ya JavaScript** ambapo utaandika uchawi wako wote wa utoaji wa mchezo
- **Package.json** inayoseti seva ya maendeleo ili uweze kujaribu kwa ndani
**Hivi ndivyo unavyofanya kazi na:**
- **Sprites za mchezo** zimehifadhiwa katika folda ya `assets/` ili kila kitu kike na kufanywa kwa mpangilio
- **Faili yako kuu ya HTML** inaandaa kipengele cha canvas na kuandaa kila kitu
- **Faili ya JavaScript** ambapo utaandika kila uchawi wa kuonyesha mchezo wako
- **package.json** inayounda seva ya maendeleo ili ujue kujaribu ndani ya mwenyewe
Fungua folda hii katika Visual Studio Code ili kuanza maendeleo. Utahitaji mazingira ya maendeleo ya ndani na Visual Studio Code, NPM, na Node.js imewekwa. Ikiwa huna `npm` imewekwa kwenye kompyuta yako, [hivi ndivyo unavyoweza kuisakinisha](https://www.npmjs.com/get-npm).
Fungua folda hii katika Visual Studio Code kuanza maendeleo. Utahitaji mazingira ya maendeleo ya kimtandao ikiwa ni pamoja na Visual Studio Code, NPM, na Node.js vilivyojengwa. Ikiwa bado huna `npm` kompyutani mwako, [hapa ndilo jinsi ya kuisakinisha](https://www.npmjs.com/get-npm).
Anzisha seva yako ya maendeleo kwa kuvinjari folda ya `your-work`:
Anzisha seva yako ya maendeleo kwa kwenda kwenye folda ya `your-work`:
```bash
cd your-work
npm start
```
**Amri hii inafanya mambo mazuri sana:**
- **Inaanzisha** seva ya ndani kwenye `http://localhost:5000` ili uweze kujaribu mchezo wako
- **Inahudumia** faili zako zote vizuri ili kivinjari chako kiweze kuzibeba kwa usahihi
- **Inatazama** faili zako kwa mabadiliko ili uweze kuendeleza kwa urahisi
- **Inakupa** mazingira ya maendeleo ya kitaalamu ya kujaribu kila kitu
**Amri hii hufanya mambo haya mazuri:**
- **Huanzisha** seva ya ndani kwenye `http://localhost:5000` ili ujue kujaribu mchezo wako
- **Huhudumia** faili zako zote kwa usahihi ili kivinjari chako kiweze kuzisoma
- **Hutazama** mabadiliko kwenye faili zako ili uendelee kuendeleza bila shida
- **Hukupa** mazingira ya maendeleo ya kitaalam kwa ajili ya majaribio
> 💡 **Kumbuka**: Kivinjari chako kitaonyesha ukurasa tupu mwanzoni hilo linatarajiwa! Unapoongeza msimbo, safisha kivinjari chako ili kuona mabadiliko yako. Njia hii ya maendeleo ya kurudia ni sawa na jinsi NASA ilivyojenga kompyuta ya mwongozo wa Apollo kujaribu kila sehemu kabla ya kuijumuisha katika mfumo mkubwa.
> 💡 **Kumbuka**: Kivinjari chako kitaonyesha ukurasa tupu hapo awali ni kawaida! Unapoongeza msimbo, bofya tena refresh kuona mabadiliko. Njia hii ya maendeleo ya hatua kwa hatua ni sawa na jinsi NASA ilivyounda kompyuta ya uongozi ya Apollo ikijaribu kila kipengele kabla ya kuzijumuisha kwenye mfumo mkubwa.
### Ongeza Msimbo
### Ongeza msimbo
Ongeza msimbo unaohitajika kwenye `your-work/app.js` kukamilisha kazi zifuatazo:
Ongeza msimbo unaotakiwa kwenye `your-work/app.js` kumaliza kazi zifuatazo:
1. **Chora canvas na mandhari nyeusi**
> 💡 **Hivi ndivyo**: Tafuta TODO katika `/app.js` na ongeza mistari miwili tu. Weka `ctx.fillStyle` kuwa nyeusi, kisha tumia `ctx.fillRect()` kuanzia (0,0) na vipimo vya canvas yako. Rahisi!
1. **Chora canvas yenye mfumo wa nyuma mweusi**
> 💡 **Hivi ndivyo**: Tafuta TODO katika `/app.js` na ongeza mistari miwili tu. Weka `ctx.fillStyle` kuwa nyeusi, kisha tumia `ctx.fillRect()` kuanzia (0,0) kwa vipimo vya canvas yako. Rahisi!
2. **Pakia textures za mchezo**
> 💡 **Hivi ndivyo**: Tumia `await loadAsset()` kupakia picha zako za mchezaji na adui. Hifadhi katika vigezo ili uweze kuzitumia baadaye. Kumbuka hazitaonekana hadi uzichore!
2. **Pakia muundo wa mchezo**
> 💡 **Hivi ndivyo**: Tumia `await loadAsset()` kupakia picha zako za mchezaji na adui. Hifadhi kwenye tofauti ili uweze kuzitumia baadaye. Kumbuka hazitaonekana hadi uchore!
3. **Chora meli ya shujaa katikati-chini**
> 💡 **Hivi ndivyo**: Tumia `ctx.drawImage()` kuweka shujaa wako. Kwa kuratibu ya x, jaribu `canvas.width / 2 - 45` kuisogeza katikati, na kwa kuratibu ya y tumia `canvas.height - canvas.height / 4` kuisogeza eneo la chini.
3. **Chora meli ya shujaa katikati chini**
> 💡 **Hivi ndivyo**: Tumia `ctx.drawImage()` kuweka shujaa. Kwa kuratibu ya x, jaribu `canvas.width / 2 - 45` kumuweka katikati, na kwa y tumia `canvas.height - canvas.height / 4` kumuweka sehemu ya chini.
4. **Chora maumbo ya adui ya 5×5**
> 💡 **Hivi ndivyo**: Tafuta kazi ya `createEnemies` na weka kitanzi kilichopachikwa. Utahitaji kufanya hesabu kwa nafasi na kuweka, lakini usijali nitakuonyesha jinsi ya kufanya!
4. **Chora safu ya meli 5×5 ya maadui**
> 💡 **Hivi ndivyo**: Tafuta kazi ya `createEnemies` na andaa mizunguko ndani ya mizunguko. Utahitaji kufanya hesabu kidogo ya nafasi na maeneo, lakini usijali nitakuonyesha hasa jinsi!
Kwanza, weka constants kwa mpangilio sahihi wa maumbo ya adui:
Kwanza, anza kwa kuweka constants za mpangilio sahihi wa maadui:
```javascript
const ENEMY_TOTAL = 5;
@ -249,13 +392,39 @@ const START_X = (canvas.width - FORMATION_WIDTH) / 2;
const STOP_X = START_X + FORMATION_WIDTH;
```
**Hebu tuchambue constants hizi:**
- Tunapanga maadui 5 kwa kila safu na safu (gridi nzuri ya 5×5)
- Tunafafanua nafasi ya kuweka kati ya maadui ili wasionekane wamebanwa
- Tunahesabu upana wa mpangilio wetu wote
- Tunajua wapi pa kuanza na kuacha ili mpangilio uonekane katikati
Kisha, unda vitanzi vilivyopachikwa kuchora mpangilio wa maadui:
**Hivi ndivyo constants hizi zinavyofanya kazi:**
- Tunaweka maadui 5 kwa kila safu na safu (gridi nzuri ya 5×5)
- Tunaainisha nafasi ya kuweka kati ya maadui ili wasionekane wamechanganika
- Tunahesabu upana wa mpangilio mzima wa maadui
- Tunaamua wapi kuanzia na kuisha ili safu ionekane katikati
```mermaid
flowchart LR
A["Upana wa Kanvas: 1024px"] --> B["Upana wa Maumbo: 490px"]
B --> C["Anza X: 267px"]
C --> D["Mkutano wa Adui: 98px"]
subgraph "Muumbo wa Adui 5x5"
E["Safu 1: Y=0"]
F["Safu 2: Y=50"]
G["Safu 3: Y=100"]
H["Safu 4: Y=150"]
I["Safu 5: Y=200"]
end
subgraph "Mkutano wa Safu"
J["Safu 1: X=267"]
K["Safu 2: X=365"]
L["Safu 3: X=463"]
M["Safu 4: X=561"]
N["Safu 5: X=659"]
end
style A fill:#e1f5fe
style B fill:#e8f5e8
style C fill:#fff3e0
```
Kisha, tengeneza mizunguko iliyopangwa kuchora mpangilio wa maadui:
```javascript
for (let x = START_X; x < STOP_X; x += ENEMY_SPACING) {
@ -265,51 +434,191 @@ for (let x = START_X; x < STOP_X; x += ENEMY_SPACING) {
}
```
**Hivi ndivyo kitanzi kilichopachikwa kinavyofanya:**
- Kitanzi cha nje **kinasogea** kutoka kushoto kwenda kulia kwenye mpangilio wetu
- Kitanzi cha ndani **kinapita** kutoka juu kwenda chini kuunda safu nadhifu
- Tunachora kila sprite ya adui kwenye kuratibu sahihi za x,y tulizohesabu
- Kila kitu kinabaki **kimepangwa vizuri** ili kionekane kitaalamu na kimepangwa
**Hivi mizunguko hii hufanya:**
- Mzunguko wa nje unahama kutoka kushoto kwenda kulia kwenye mpangilio wetu
- Mzunguko wa ndani unatembea kutoka juu hadi chini kuunda safu nzuri
- Tunachora kila sprite ya adui kwenye kuratibu halisi za x,y tulizohesabu
- Kila kitu kinawekwa kwa nafasi sawa ili kuonekana kitaalamu na kwa mpangilio
### 🔄 **Ukaguzi wa Kufundisha**
**Ustadi wa Kuonyeshwa kwa Mchezo**: Thibitisha uelewa wako wa mfumo kamili wa kuonyesha:
- ✅ Je, upakiaji wa picha kwa async unazuia vikwazo vya UI wakati mchezo unapoanza vipi?
- ✅ Kwa nini tunahesabu maeneo ya mpangilio wa maadui kwa constants badala ya kuweka nambari moja kwa moja?
- ✅ Muktadha wa uchoraji wa 2D huchukua jukumu gani katika shughuli za kuchora?
- ✅ Mizunguko ndani ya mizunguko huunda mpangilio wa sprite vya namna gani?
**Mambo ya Kufikiria Kuhusu Utendaji**: Mchezo wako sasa unaonyesha:
- **Upakiaji wa mali kwa ufanisi**: Usimamizi wa picha kwa kutumia Promise
- **Uwezeshaji wa kuonyesha mzuri**: Shughuli za kuchora zilizo na muundo
- **Mahesabu ya kuweka mahali**: Upangaji wa sprite kwa kutumia hesabu
- **Usimamizi makosa**: Kushughulikia makosa kwa heshima
**Mafundisho ya Kuprogramu kwa Mtazamo wa Picha**: Umejifunza:
- **Mifumo ya kuratibu**: Kutafsiri hisabati hadi nafasi za skrini
- **Usimamizi wa sprite**: Kupakia na kuonyesha picha za mchezo
- **Algorithmi za muundo**: Mifumo ya kihisabati kwa upangaji wa mpangilio
- **Uendeshaji usio wategemezi (Async)**: JavaScript ya kisasa kwa uzoefu laini wa mtumiaji
## Matokeo
Matokeo ya mwisho yanapaswa kuonekana kama hivi:
Matokeo yaliyokamilika yanapaswa kuonekana kama ifuatavyo:
![Skrini nyeusi na shujaa na maadui 5*5](../../../../translated_images/partI-solution.36c53b48c9ffae2a5e15496b23b604ba5393433e4bf91608a7a0a020eb7a2691.sw.png)
![Black screen with a hero and 5*5 monsters](../../../../translated_images/partI-solution.36c53b48c9ffae2a.sw.png)
## Suluhisho
Tafadhali jaribu kutatua mwenyewe kwanza lakini ukikwama, angalia [suluhisho](../../../../6-space-game/2-drawing-to-canvas/solution/app.js)
Tafadhali jaribu kutatua mwenyewe kwanza lakini ukikumbwa na shida, angalia [suluhisho](../../../../6-space-game/2-drawing-to-canvas/solution/app.js)
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Agent kukamilisha changamoto ifuatayo:
**Maelezo:** Boresha canvas ya mchezo wako wa anga kwa kuongeza athari za kuona na vipengele vya kuingiliana kwa kutumia mbinu za API ya Canvas ulizojifunza.
**Maelezo:** Boresha kanga ya mchezo wako wa angani kwa kuongeza athari za kuona na vipengele vinavyohusiana kwa kutumia mbinu za Canvas API ulizojifunza.
**Kichocheo:** Unda faili mpya inayoitwa `enhanced-canvas.html` na canvas inayonyesha nyota zinazong'aa kwenye mandhari, upau wa afya unaopiga kwa meli ya shujaa, na meli za adui zinazotembea polepole chini. Jumuisha msimbo wa JavaScript unaochora nyota zinazong'aa kwa kutumia nafasi za nasibu na opacity, kutekeleza upau wa afya unaobadilisha rangi kulingana na kiwango cha afya (kijani > njano > nyekundu), na kuhuisha meli za adui kusonga chini ya skrini kwa kasi tofauti.
**Onyo:** Tengeneza faili mpya iitwayo `enhanced-canvas.html` yenye kanga inayoonyesha nyota zinazong'aa nyuma, kipengele cha afya kinachobadilika cha meli ya shujaa, na meli za maadui zinazotembea polepole chini. Jumuisha nambari ya JavaScript inayochora nyota zinazong'aa kwa nafasi nasibu na uwazi, kutekeleza kipengele cha afya kinachobadilika rangi kulingana na kiwango cha afya (kijani > njano > nyekundu), na kuunda meli za maadui kutembea chini ya skrini kwa kasi tofauti.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [hali ya agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Umejifunza kuhusu kuchora kwa API ya Canvas inayozingatia 2D; angalia [API ya WebGL](https://developer.mozilla.org/docs/Web/API/WebGL_API), na jaribu kuchora kitu cha 3D.
## Maswali ya Baada ya Somo
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/32)
## Mapitio na Kujisomea
Jifunze zaidi kuhusu API ya Canvas kwa [kusoma kuhusu](https://developer.mozilla.org/docs/Web/API/Canvas_API).
## Kazi
[Cheza na API ya Canvas](assignment.md)
Umejifunza kuhusu kuchora kwa kutumia Canvas API iliyoelekezwa kwa 2D; angalia [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API), kisha jaribu kuchora kitu cha 3D.
## Jaribio Baada ya Mwalimu
[Jaribio baada ya mwalimu](https://ff-quizzes.netlify.app/web/quiz/32)
## Mapitio na Kujifunza Binafsi
Jifunze zaidi kuhusu Canvas API kwa [kusoma kuhusu hilo](https://developer.mozilla.org/docs/Web/API/Canvas_API).
### ⚡ **Unachoweza Kufanya Kama Dakika 5 Zijazo**
- [ ] Fungua kikao cha kivinjari na tengeneza kipengele cha kanga kwa kutumia `document.createElement('canvas')`
- [ ] Jaribu kuchora mraba kwa kutumia `fillRect()` kwenye muktadha wa kanga
- [ ] Jaribu kutumia rangi tofauti kwa kutumia mali ya `fillStyle`
- [ ] Chora mduara rahisi kwa kutumia njia ya `arc()`
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Maliza jaribio baada ya somo na uelewe misingi ya kanga
- [ ] Tengeneza programu ya kuchora kanga yenye sura na rangi mbalimbali
- [ ] Tekeleza upakiaji wa picha na uchoraji wa sprite kwenye mchezo wako
- [ ] Jenga uhuishaji rahisi unaohamisha vitu kwenye kanga
- [ ] Fanya mazoezi ya mabadiliko kwenye kanga kama usawa, mzunguko, na tafsiri
### 📅 **Safari Yako ya Wiki Mmoja ya Kanga**
- [ ] Maliza mchezo wa anga kwa picha zilizopambwa na uhuishaji wa sprite
- [ ] Pitia mbinu za juu za kanga kama mwelekeo wa rangi, mifumo, na muungano
- [ ] Tengeneza maonyesho ya mwingiliano kwa kutumia kanga kwa ushawishi wa data
- [ ] Jifunze mbinu za uboreshaji wa kanga kwa utendaji rahisi
- [ ] Jenga programu ya kuchora au kupaka rangi yenye zana mbalimbali
- [ ] Chunguza mifumo ya uundaji ubunifu na sanaa za kuzalisha kwa kanga
### 🌟 **Ubobezi Wako wa Mwezi Mmoja wa Picha**
- [ ] Jenga programu tata za kuona kwa kutumia Canvas 2D na WebGL
- [ ] Jifunze dhana za programu za picha na msingi wa shader
- [ ] Changia kwenye maktaba za picha za chanzo wazi na zana za maonyesho
- [ ] Kuwa mtaalamu wa uboreshaji wa utendaji kwa programu za picha nzito
- [ ] Tengeneza maudhui ya elimu kuhusu programu za kanga na picha za kompyuta
- [ ] Kuwa mtaalamu wa programu za picha anayeweza kusaidia wengine kuunda uzoefu wa kuona
## 🎯 Ratiba Yako ya Ubobezi wa Picha za Kanga
```mermaid
timeline
title Mchakato wa Kujifunza API ya Canvas
section Msingi wa Canvas (dakika 15)
Operesheni za Msingi: Marejeleo ya kipengee
: Upatikanaji wa muktadha wa 2D
: Mfumo wa kuratibu
: Kuchora maumbo rahisi
section Mbinu za Kuchora (dakika 20)
Misingi ya Grafikisi: Mraba na mizunguko
: Rangi na mitindo
: Uchoraji wa maandishi
: Operesheni za njia
section Usimamizi wa Picha (dakika 25)
Usimamizi wa Mali: Uundaji wa kipengee cha picha
: Mifumo ya upakiaji wa asynkro
: Usimamizi wa makosa
: Uboreshaji wa utendaji
section Grafikisi za Michezo (dakika 30)
Uchoraji wa Sprite: Algoriti za kuweka nafasi
: Hisa za umbo
: Uundaji wa mandhari
: Uchoraji wa fremu
section Mbinu za Juu (dakika 40)
Athari za Kuona: Mabadiliko
: Miondoko
: Uwekezaji tabaka
: Usimamizi wa hali
section Utendaji (dakika 35)
Uboreshaji: Uchoraji wenye ufanisi
: Usimamizi wa kumbukumbu
: Udhibiti wa kiwango cha fremu
: Kuweka rasilimali akiba
section Ujuzi wa Kitaalamu (wiki 1)
Grafikisi za Uzalishaji: Muingiliano wa WebGL
: Maktaba za Canvas
: Injini za michezo
: Masuala ya kuvuka majukwaa
section Grafikisi za Juu (mwezi 1)
Programu Maalum: Uwasilishaji wa data
: Sanaa ya mwingiliano
: Athari za wakati halisi
: Grafikisi za 3D
```
### 🛠️ Muhtasari wa Seti Yako ya Zana za Picha za Kanga
Baada ya kumaliza somo hili, sasa una:
- **Ubobezi wa Canvas API**: Uelewa kamili wa programu za picha za 2D
- **Hisabati za Ratiba**: Msimamo sahihi na algorithmi za upangaji
- **Usimamizi wa Mali**: Kupakia picha kitaalamu na usimamizi wa makosa
- **Mchakato wa Uchoraji**: Njia iliyopangwa ya muundo wa picha
- **Picha za Mchezo**: Msimamo wa sprite na hesabu za muundo
- **Programu zisizo wategemezi**: Mifumo ya kisasa ya JavaScript kwa utendaji laini
- **Programu za Kuona**: Kutafsiri dhana za kihisabati hadi picha za skrini
**Matumia halisi**: Uwezo wako wa Canvas unatumika moja kwa moja kwa:
- **Onyesho la Data**: Chati, grafu, na dashibodi zinazoingiliana
- **Maendeleo ya Mchezo**: Michezo ya 2D, maonyesho, na uzoefu wa mwingiliano
- **Sanaa ya Kidijitali**: Usanifu wa ubunifu na miradi ya sanaa za kuzalisha
- **Ubunifu wa UI/UX**: Picha maalum na vipengele vinavyoshirikiana
- **Programu za Elimu**: Zana za kujifunza za kuona na maonyesho
- **Programu za Mtandao**: Picha dinamik na maonyesho ya wakati halisi
**Ujuzi wa Kitaalamu Uliopata**: Sasa unaweza:
- **Jenga** suluhisho za picha za kawaida bila maktaba za nje
- **Boresha** utendaji wa uchoraji kwa uzoefu laini wa mtumiaji
- **Pata Kasoro** matatizo tata ya kuona kwa kutumia zana za mtengenezaji wa kivinjari
- **Buni** mifumo ya picha inayoweza kupanuka kwa kutumia kanuni za kihisabati
- **Unganisha** picha za Canvas na mfumo wa programu wa mtandao wa kisasa
**Mbinu za Canvas API Uliyotawala**:
- **Usimamizi wa Vipengele**: getElementById, getContext
- **Uendeshaji wa Kuchora**: fillRect, drawImage, fillStyle
- **Upakiaji Mali**: Vitu vya Picha, mifumo ya Promise
- **Msimamo wa Hisabati**: Hesabu za ratiba, algorithmi za muundo
**Kiwango Kifuatayo**: Uko tayari kuongeza uhuishaji, mwingiliano wa mtumiaji, kugundua mgongano, au kuchunguza WebGL kwa picha za 3D!
🌟 **Tuzo Imepatikana**: Umejenga mfumo kamili wa uchoraji wa mchezo kwa kutumia mbinu za msingi za Canvas API!
## Kazi ya Nyumbani
[Tumia Canvas API](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tangazo la Kukataa**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri kwa AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuwa sahihi, tafadhali fahamu kwamba tafsiri za moja kwa moja zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake ya asili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na watu inashauriwa. Hatubebii uwajibikaji wowote kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,103 +1,186 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "022bbb5c869091b98f19e408e0c51d5d",
"translation_date": "2025-10-24T19:39:43+00:00",
"original_hash": "8c55a2bd4bc0ebe4c88198fd563a9e09",
"translation_date": "2026-01-07T01:41:36+00:00",
"source_file": "6-space-game/3-moving-elements-around/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 3: Kuongeza Mwendo
Fikiria kuhusu michezo unayoipenda kinachovutia si tu picha nzuri, bali ni jinsi kila kitu kinavyosogea na kujibu vitendo vyako. Kwa sasa, mchezo wako wa anga ni kama mchoro mzuri, lakini tunakaribia kuongeza mwendo ambao utauleta uhai.
Wahandisi wa NASA walipokuwa wakipanga kompyuta ya mwongozo kwa misheni za Apollo, walikumbana na changamoto kama hiyo: jinsi ya kufanya chombo cha anga kujibu maelekezo ya rubani huku kikidumisha marekebisho ya mwelekeo kiotomatiki? Kanuni tutakazojifunza leo zinaakisi dhana hizo kusimamia mwendo unaodhibitiwa na mchezaji sambamba na tabia za mfumo wa kiotomatiki.
Katika somo hili, utajifunza jinsi ya kufanya vyombo vya anga visogee kwenye skrini, kujibu amri za mchezaji, na kuunda mifumo ya mwendo laini. Tutavunja kila kitu katika dhana zinazoweza kudhibitiwa ambazo zinajengwa kwa urahisi.
Mwisho wa somo, wachezaji watakuwa wakiruka chombo chao cha shujaa kwenye skrini huku vyombo vya adui vikifanya doria juu. Muhimu zaidi, utaelewa kanuni za msingi zinazowezesha mifumo ya mwendo ya michezo.
## Maswali ya Awali ya Somo
# Tengeneza Mchezo wa Anga Sehemu ya 3: Kuongeza Mwelekeo
```mermaid
journey
title Safari Yako ya Mchezo wa Vionjo
section Msingi wa Mwendo
Elewa kanuni za mwendo: 3: Student
Jifunze masasisho ya kuratibu: 4: Student
Tekeleza mwendo wa msingi: 4: Student
section Udhibiti wa Mchezaji
Shughulikia matukio ya kibodi: 4: Student
Zuia tabia za kimsingi: 5: Student
Tengeneza udhibiti unaojibu: 5: Student
section Mifumo ya Mchezo
Jenga mzunguko wa mchezo: 5: Student
Dhibiti maisha ya kitu: 5: Student
Tekeleza muundo wa pub/sub: 5: Student
```
Fikiria kuhusu michezo yako unayopendelea kinachoyafanya kuvutia si tu graphics nzuri, ni jinsi kila kitu kinavyosonga na kujibu hatua zako. Hivi sasa, mchezo wako wa anga ni kama picha nzuri, lakini tutakuongeza harakati zinazoleta uhai.
Wakati wahandisi wa NASA walipopanga kompyuta ya mwelekeo kwa misheni za Apollo, walikumbana na changamoto sawa: unafanyaje chombo cha anga kujibu maingizo ya rubani wakati kinadumisha mabadiliko ya mwelekeo moja kwa moja? Kanuni tutakazojifunza leo zinaakisi dhana hizo kusimamia harakati zinazoendeshwa na mchezaji pamoja na tabia za mfumo wa moja kwa moja.
Katika somo hili, utajifunza jinsi ya kufanya meli za anga kusogea kwenye skrini, kujibu amri za mchezaji, na kuunda mifumo laini ya harakati. Tutavunjua kila kitu kuwa dhana ndogo ndogo zinazojenga moja baada ya nyingine kwa asili.
Mwisho wa somo, utakuwa na wachezaji wanaruka meli yao shujaa kwenye skrini huku meli za maadui zikihamiria juu yao. Zaidi ya yote, utakuwa umeelewa kanuni msingi zinazoiendesha mifumo ya harakati katika mchezo.
```mermaid
mindmap
root((Game Animation))
Movement Types
Player Controlled
Automatic Motion
Physics Based
Scripted Paths
Event Handling
Keyboard Input
Mouse Events
Touch Controls
Default Prevention
Game Loop
Update Logic
Render Frame
Clear Canvas
Frame Rate Control
Object Management
Position Updates
Collision Detection
Lifecycle Management
State Tracking
Communication
Pub/Sub Pattern
Event Emitters
Message Passing
Loose Coupling
```
## Mtihani wa Kabla ya Somo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/33)
[Mtihani wa kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/33)
## Kuelewa Mwendo wa Mchezo
## Kuelewa Harakati za Mchezo
Michezo huja hai wakati vitu vinapoanza kusogea, na kuna njia mbili za msingi ambazo hii hutokea:
Michezo huishi pindi mambo yanapoanza kusogea, na kuna njia mbili msingi za hili kutokea:
- **Mwendo unaodhibitiwa na mchezaji**: Unapobonyeza kitufe au kubofya panya, kitu husogea. Hii ni uhusiano wa moja kwa moja kati yako na ulimwengu wa mchezo.
- **Mwendo wa kiotomatiki**: Wakati mchezo wenyewe unapoamua kusogeza vitu kama vile vyombo vya adui vinavyohitaji kufanya doria kwenye skrini bila kujali unachofanya.
- **Harakati zinazoendeshwa na mchezaji**: Unapobonyeza kitufe au kubofya panya, kitu kinaposogea. Hii ni uhusiano wa moja kwa moja kati yako na dunia ya mchezo wako.
- **Harakati za moja kwa moja**: Mchezo wenyewe unapochagua kusogeza vitu kama vile zile meli za maadui ambazo zinapaswa kuzunguka skrini iwe unafanya chochote au la.
Kufanya vitu visogee kwenye skrini ya kompyuta ni rahisi kuliko unavyofikiria. Kumbuka zile kuratibu za x na y kutoka darasa la hesabu? Hicho ndicho tunachofanya hapa. Wakati Galileo alipokuwa akifuatilia miezi ya Jupiter mnamo 1610, kimsingi alikuwa akifanya jambo hilo hilo kuchora nafasi kwa muda ili kuelewa mifumo ya mwendo.
Kufanya vitu visogee kwenye skrini ya kompyuta ni rahisi kuliko unavyofikiria. Kumbuka alama za x na y kutoka darasa la hesabu? Hizo ndizo hasa tunazotumia hapa. Wakati Galileo alipo fuatilia mwezi za Jupiter mwaka 1610, alikuwa akifanya kitu sawa kabisa kupanga kila nafasi kwa wakati kuelewa mifumo ya mwelekeo.
Kusogeza vitu kwenye skrini ni kama kuunda uhuishaji wa flipbook unahitaji kufuata hatua hizi tatu rahisi:
Kusogeza vitu kwenye skrini ni kama kutengeneza michoro ya flipbook unahitaji kufuata hatua hizi tatu rahisi:
1. **Sasisha nafasi** Badilisha mahali ambapo kitu chako kinapaswa kuwa (labda kisogeze pikseli 5 kulia)
2. **Futa fremu ya zamani** Safisha skrini ili usione mabaki ya roho kila mahali
```mermaid
flowchart LR
A["Kifurushi N"] --> B["Sasisha Nafasi"]
B --> C["Futa Kanjia"]
C --> D["Chora Vitu"]
D --> E["Kifurushi N+1"]
E --> F{Endelea?}
F -->|Ndiyo| B
F -->|Hapana| G["Mchezo Umeisha"]
subgraph "Mzunguko wa Michoro"
H["1. Hesabu nafasi mpya"]
I["2. Futa kifurushi kilichopita"]
J["3. Weka kifurushi kipya"]
end
style B fill:#e1f5fe
style C fill:#ffebee
style D fill:#e8f5e8
```
1. **Sasisha nafasi** Badilisha mahali ambapo kitu chako kinapaswa kuwepo (labda kihamishe pixeli 5 upande wa kulia)
2. **Futa fremu ya zamani** Safisha skrini ili usione maandishi ya mzingo kila mahali
3. **Chora fremu mpya** Weka kitu chako mahali pake mpya
Fanya hivi haraka vya kutosha, na boom! Unapata mwendo laini unaohisi wa asili kwa wachezaji.
Fanya hivi haraka vya kutosha, na boom! Utapata harakati laini zinazohisi kuwa halisi kwa wachezaji.
Hivi ndivyo inavyoweza kuonekana kwenye msimbo:
```javascript
// Set the hero's location
// Weka eneo la shujaa
hero.x += 5;
// Clear the rectangle that hosts the hero
// Futa mrabba unaomkaribisha shujaa
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Redraw the game background and hero
// Chora upya mandhari ya mchezo na shujaa
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "black";
ctx.drawImage(heroImg, hero.x, hero.y);
```
**Hii ndiyo msimbo unavyofanya:**
- **Husogeza** kuratibu ya x ya shujaa kwa pikseli 5 ili kuisogeza kwa usawa
- **Hufuta** eneo lote la canvas ili kuondoa fremu ya awali
- **Hujaza** eneo la canvas na rangi ya nyuma nyeusi
- **Huchora tena** picha ya shujaa mahali pake mpya
**Hivi ndivyo msimbo huu unavyofanya:**
- **Husasisha** x-coordinate ya shujaa kwa pixeli 5 kuisogeza usawa
- **Hufuta** eneo lote la turubai kuondoa fremu ya awali
- **Huongeza** rangi ya nyuma ya turubai kuwa nyeusi
- **Huchora upya** picha ya shujaa mahali pake mpya
✅ Je, unaweza kufikiria sababu kwa nini kuchora tena shujaa wako mara nyingi kwa sekunde kunaweza kusababisha gharama za utendaji? Soma kuhusu [mbadala wa muundo huu](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas).
Unaweza kufikiria sababu kwanini kuchora picha ya shujaa mara nyingi kwa sekunde kunaweza kuleta gharama za utendaji? Soma kuhusu [mbadala za muundo huu](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas).
## Kushughulikia Matukio ya Kibodi
## Shughulikia matukio ya kibodi
Hapa ndipo tunapounganisha pembejeo za mchezaji na vitendo vya mchezo. Wakati mtu anapobonyeza spacebar kufyatua laser au kugusa kitufe cha mshale ili kuepuka asteroid, mchezo wako unahitaji kugundua na kujibu pembejeo hiyo.
Hapa ndipo tunavyounganisha maingizo ya mchezaji kwa hatua za mchezo. Mtu anapobonyeza spacebar kuwasha laser au kubonyeza mshale kuepuka asteroid, mchezo wako unahitaji kugundua na kujibu maingizo hayo.
Matukio ya kibodi hutokea katika kiwango cha dirisha, ikimaanisha dirisha lako lote la kivinjari linasikiliza mibofyo hiyo ya vitufe. Mibofyo ya panya, kwa upande mwingine, inaweza kuhusishwa na vipengele maalum (kama kubofya kitufe). Kwa mchezo wetu wa anga, tutazingatia udhibiti wa kibodi kwa sababu hiyo ndiyo inawapa wachezaji hisia ya arcade ya kawaida.
Matukio ya kibodi hutokea kwenye dirisha zima, ikimaanisha dirisha lako la kivinjari linasikiliza bonyeza kitufe chote. Kubofya panya, kwa upande mwingine, kunaweza kuhusishwa na vipengele maalum (kama kubonyeza kitufe). Kwa mchezo wetu wa anga, tutazingatia vidhibiti vya kibodi kwa kuwa hivyo ndicho kinachotoa hisia za arcade za mtaani.
Hii inanikumbusha jinsi waendeshaji wa telegraph katika miaka ya 1800 walivyohitaji kutafsiri pembejeo za msimbo wa morse kuwa ujumbe wenye maana tunafanya kitu kama hicho, kutafsiri mibofyo ya vitufe kuwa amri za mchezo.
Hii inanikumbusha jinsi waendeshaji wa telegramu katika karne ya 1800 walilazimika kutafsiri maingizo ya code ya morse kuwa ujumbe wenye maana tunafanya kitu kama hicho, kutafsiri bonyeza ya vitufe kuwa amri za mchezo.
Ili kushughulikia tukio unahitaji kutumia njia ya `addEventListener()` ya dirisha na kuipatia vigezo viwili vya pembejeo. Kigezo cha kwanza ni jina la tukio, kwa mfano `keyup`. Kigezo cha pili ni kazi ambayo inapaswa kuitwa kama matokeo ya tukio kutokea.
Ili kushughulikia tukio unahitaji kutumia njia ya window ya `addEventListener()` na kuipatia vigezo viwili. Kigezo cha kwanza ni jina la tukio, kwa mfano `keyup`. Kigezo cha pili ni kazi inapaswa kuanzishwa kufuatia tukio hilo.
Hapa kuna mfano:
Hii ni mfano:
```javascript
window.addEventListener('keyup', (evt) => {
// evt.key = string representation of the key
// evt.key = uwakilishi wa mfululizo wa kitufe
if (evt.key === 'ArrowUp') {
// do something
// fanya kitu
}
});
```
**Kufafanua kinachotokea hapa:**
- **Husikiliza** matukio ya kibodi kwenye dirisha lote
- **Hukamata** kitu cha tukio ambacho kina taarifa kuhusu kitufe kilichobonyezwa
- **Hukagua** kama kitufe kilichobonyezwa kinalingana na kitufe maalum (katika kesi hii, mshale wa juu)
- **Hutekeleza** msimbo wakati hali inapotimizwa
**Kuvunjwa kwa kinachotokea hapa:**
- **Inasikiliza** matukio ya kibodi kwenye dirisha lote
- **Inakamata** kitu cha tukio ambacho kina taarifa kuhusu kitufe kilichobonyezwa
- **Hukagua** kama kitufe kilichobonyezwa kinahusiana na kitufe maalum (hapa hatupu mshale wa juu)
- **Hutekeleza** msimbo pale masharti yanapokutana
Kwa matukio ya vitufe kuna mali mbili kwenye tukio unazoweza kutumia kuona kitufe kilichobonyezwa:
Kwa matukio ya kitufe kuna mali mbili kwenye tukio unaweza kutumia kuona ni kitufe gani kilibonyezwa:
- `key` - hii ni mwakilishi wa maandishi wa kitufe kilichobonyezwa, kwa mfano `'ArrowUp'`
- `keyCode` - hii ni mwakilishi wa namba, kwa mfano `37`, inahusiana na `ArrowLeft`
- `key` - hii ni mwakilishi wa herufi ya kitufe kilichobonyezwa, kwa mfano `'ArrowUp'`
- `keyCode` - hii ni mwakilishi wa nambari, kwa mfano `37`, inalingana na `ArrowLeft`
Udanganyifu wa matukio ya vitufe ni muhimu nje ya ukuzaji wa michezo. Je, unaweza kufikiria matumizi mengine ya mbinu hii?
Kuendesha matukio ya kitufe ni muhimu hata nje ya uundaji wa michezo. Unaweza kufikiria matumizi mengine ya mbinu hii?
### Vitufe Maalum: Tahadhari!
```mermaid
sequenceDiagram
participant User
participant Browser
participant EventSystem
participant GameLogic
participant Hero
User->>Browser: Bonyeza kitufe cha MshaleJuu
Browser->>EventSystem: tukio la keydown
EventSystem->>EventSystem: preventDefault()
EventSystem->>GameLogic: emit('KEY_EVENT_UP')
GameLogic->>Hero: hero.y -= 5
Hero->>Hero: Sasisha nafasi
Note over Browser,GameLogic: Mtiririko wa matukio unazuia mipangilio ya kivinjari
Note over GameLogic,Hero: Mfumo wa pub/sub unafanya mawasiliano kuwa safi
```
### Vitufe maalum: tahadhari!
Baadhi ya vitufe vina tabia za kujengwa ndani ya kivinjari ambazo zinaweza kuingilia mchezo wako. Vitufe vya mshale husogeza ukurasa na spacebar husogeza chini tabia ambazo hutaki wakati mtu anajaribu kuendesha chombo chake cha anga.
Baadhi ya vitufe vina tabia za kivinjari zilizo jengwa ndani ambazo zinaweza kuingilia mchezo wako. Vitufe vya mshale husogeza ukurasa na spacebar hufanya kuruka chini tabia ambazo hutaki mtu akijaribu kuongoza meli yao ya anga.
Tunaweza kuzuia tabia hizi za msingi na kuruhusu mchezo wetu kushughulikia pembejeo badala yake. Hii ni sawa na jinsi waandaaji wa kompyuta wa mapema walivyohitaji kuzuia usumbufu wa mfumo ili kuunda tabia maalum tunafanya tu katika kiwango cha kivinjari. Hivi ndivyo:
Tunaweza kuzuia tabia hizi za chaguo-msingi na kuruhusu mchezo wetu kushughulikia maingizo badala yake. Hii ni sawa na jinsi watengenezaji wa kompyuta wa zamani walivyonakili interrupt za mfumo kuunda tabia za kipekee sisi tunazifanya hii kwenye kiwango cha kivinjari. Hivi ndivyo:
```javascript
const onKeyDown = function (e) {
@ -106,53 +189,93 @@ const onKeyDown = function (e) {
case 37:
case 39:
case 38:
case 40: // Arrow keys
case 40: // Mfunguo za mshale
case 32:
e.preventDefault();
break; // Space
break; // Nafasi
default:
break; // do not block other keys
break; // usizuie funguo nyingine
}
};
window.addEventListener('keydown', onKeyDown);
```
**Kuelewa msimbo huu wa kuzuia:**
- **Hukagua** namba za vitufe maalum ambazo zinaweza kusababisha tabia zisizohitajika za kivinjari
- **Huzuia** kitendo cha msingi cha kivinjari kwa vitufe vya mshale na spacebar
- **Huruhusu** vitufe vingine kufanya kazi kawaida
- **Hutumia** `e.preventDefault()` kuzuia tabia ya kujengwa ndani ya kivinjari
**Kuelewa msimbo wa kuzuia huu:**
- **Hukagua** nambari za vitufe maalum ambazo zinaweza kusababisha tabia mbaya ya kivinjari
- **Huzuia** kitendo cha kivinjari cha chaguo-msingi kwa vitufe vya mshale na spacebar
- **Humuruhusu** vitufe vingine kufanya kazi kawaida
- **Inatumia** `e.preventDefault()` kuzuia tabia zilizojengewa kivinjari
### 🔄 **Ukaguzi wa Kifahamu**
**Kuelewa Shughulikia Matukio**: Kabla ya kuhamia kwenye harakati za moja kwa moja, hakikisha unaweza:
- ✅ Eleza tofauti kati ya matukio ya `keydown` na `keyup`
- ✅ Elewa kwanini tunazuia tabia za kivinjari za asili
- ✅ Eleza jinsi wasikilizaji wa matukio wanavyounganisha maingizo ya mtumiaji na mantiki ya mchezo
- ✅ Tambua ni vitufe gani vinaweza kuingilia vikumbilio vya mchezo
**Jaribio la Haraka:** Nini kingetokea kama usingezuia tabia za chaguo-msingi kwa vitufe vya mshale?
*Jibu: Kivinjari kingesogeza ukurasa, kikiingilia harakati za mchezo*
## Mwendo Unaosababishwa na Mchezo
**Msanifu wa Mfumo wa Matukio:** Sasa unaelewa:
- **Kusikiliza kiwango cha dirisha**: Kukamata matukio kwa kiwango cha kivinjari
- **Mali za kitu cha tukio**: Mfuatano wa `key` dhidi ya nambari za `keyCode`
- **Kuzuia chaguo-msingi**: Kusimamisha tabia zisizotaka za kivinjari
- **Mantiki ya masharti**: Kujibu mchanganyiko wa vitufe maalum
Sasa hebu tuzungumze kuhusu vitu vinavyosogea bila pembejeo ya mchezaji. Fikiria kuhusu vyombo vya adui vinavyosogea kwenye skrini, risasi zinazopaa kwa mistari ya moja kwa moja, au mawingu yanayozunguka nyuma. Mwendo huu wa kiotomatiki hufanya ulimwengu wa mchezo wako kuhisi hai hata wakati hakuna mtu anayegusa udhibiti.
## Harakati zinazosababishwa na mchezo
Tunatumia vipima muda vilivyojengwa ndani ya JavaScript kusasisha nafasi kwa vipindi vya kawaida. Dhana hii ni sawa na jinsi saa za pendulum zinavyofanya kazi utaratibu wa kawaida unaosababisha vitendo vya wakati thabiti. Hivi ndivyo inavyoweza kuwa rahisi:
Sasa tuzungumze kuhusu vitu vinavyosogea bila maingizo ya mchezaji. Fikiria meli za maadui zinazoelea kwenye skrini, risasi zinazopigwa kwa mstari wa moja kwa moja, au mawingu yanayotiririka nyuma. Harakati hizi za kujitegemea hufanya dunia ya mchezo wako ihisi kuwa hai hata mtu asipoghushi vidhibiti.
Tunatumia vipima muda vilivyojengewa ndani ya JavaScript kusasisha nafasi kwa vipindi vya kawaida. Dhana hii ni sawa na namna saa za pendulum zinavyofanya kazi kifaa cha kawaida kinachowasha vitendo vya wakati kwa wakati. Hivi ndivyo rahisi inaweza kuwa:
```javascript
const id = setInterval(() => {
// Move the enemy on the y axis
// Hamisha adui kwenye mhimili wa y
enemy.y += 10;
}, 100);
```
**Hii ndiyo msimbo wa mwendo unavyofanya:**
- **Huunda** kipima muda kinachoendesha kila milisekunde 100
- **Husogeza** kuratibu ya y ya adui kwa pikseli 10 kila wakati
- **Huhifadhi** kitambulisho cha muda ili tuweze kukisimamisha baadaye ikiwa inahitajika
- **Husogeza** adui chini kwenye skrini kiotomatiki
**Hivi ndivyo msimbo huu wa harakati unavyofanya:**
- **Huunda** kipima muda kinachoendelea kila milisekunde 100
- **Husasisha** y-coordinate ya adui kwa pixeli 10 kila mara
- **Huhifadhi** kitambulisho cha kipindi ili tuweze kukizuia baadaye ikiwa inahitajika
- **Hihamisha** adui chini kwenye skrini moja kwa moja
## Mzunguko wa Mchezo
## Mzunguko wa mchezo
Hii ndiyo dhana inayounganisha kila kitu mzunguko wa mchezo. Ikiwa mchezo wako ungekuwa filamu, mzunguko wa mchezo ungekuwa projektor ya filamu, ikionyesha fremu baada ya fremu haraka sana kiasi kwamba kila kitu kinaonekana kusogea kwa laini.
Hii ni dhana inayounganisha kila kitu pamoja mzunguko wa mchezo. Ikiwa mchezo wako ungetiwa filamu, mzunguko wa mchezo ungetiwa mradi wa sinema, unaoonyesha fremu kwa fremu kwa haraka sana kiasi kila kitu kinadhaniwa kusogea kwa usawa.
Kila mchezo una moja ya mizunguko hii inayoendesha nyuma ya pazia. Ni kazi inayosasisha vitu vyote vya mchezo, kuchora tena skrini, na kurudia mchakato huu kila mara. Hii inafuatilia shujaa wako, maadui wote, risasi yoyote inayoruka hali nzima ya mchezo.
Kila mchezo una mzunguko huu unavyofanya kazi nyuma ya pazia. Ni kazi inayosasisha vitu vyote vya mchezo, kuchora skrini upya, na kuirudia mchakato huu kwa mfululizo. Hii inasimamia shujaa wako, maadui wote, risasi yoyote inayoruka hali nzima ya mchezo.
Dhana hii inanikumbusha jinsi waandaaji wa filamu wa mapema kama Walt Disney walivyohitaji kuchora tena wahusika fremu kwa fremu ili kuunda dhana ya mwendo. Tunafanya jambo hilo hilo, tu kwa msimbo badala ya penseli.
Dhana hii inanikumbusha jinsi waharakati wa filamu wa zamani kama Walt Disney walilazimika kuchora tena wahusika fremu kwa fremu kuonyesha mwelekeo wa uhuishaji. Sisi tunafanya kitu kama hicho, lakini kwa msimbo badala ya kalamu.
Hivi ndivyo mzunguko wa mchezo unavyoweza kuonekana, ukielezwa kwa msimbo:
Hivi ndivyo mzunguko wa mchezo unavyoweza kuonekana typicallly, ukielezwa kwa msimbo:
```mermaid
flowchart TD
A["Anza Mzunguko wa Mchezo"] --> B["Futa Kifagio"]
B --> C["Jaza Mandhari"]
C --> D["Sasisha Vitu vya Mchezo"]
D --> E["Chora Shujaa"]
E --> F["Chora Wadau"]
F --> G["Chora Vipengele vya UI"]
G --> H["Subiri Fremu Ifuatayo"]
H --> I{Mchezo Unaendelea?}
I -->|Ndiyo| B
I -->|Hapana| J["Maliza Mchezo"]
subgraph "Udhibiti wa Kiwango cha Fremu"
K["60 FPS = 16.67ms"]
L["30 FPS = 33.33ms"]
M["10 FPS = 100ms"]
end
style B fill:#ffebee
style D fill:#e1f5fe
style E fill:#e8f5e8
style F fill:#e8f5e8
```
```javascript
const gameLoopId = setInterval(() => {
function gameLoop() {
@ -168,27 +291,27 @@ const gameLoopId = setInterval(() => {
```
**Kuelewa muundo wa mzunguko wa mchezo:**
- **Hufuta** eneo lote la canvas ili kuondoa fremu ya awali
- **Hujaza** mandharinyuma na rangi thabiti
- **Hufuta** turubai yote kuondoa fremu ya awali
- **Hujaaza** nyuma ya turubai kwa rangi imara
- **Huchora** vitu vyote vya mchezo katika nafasi zao za sasa
- **Hurudia** mchakato huu kila milisekunde 200 ili kuunda uhuishaji laini
- **Husimamia** kiwango cha fremu kwa kudhibiti muda wa vipindi
- **Huirudia** mchakato huu kila milisekunde 200 ili kuunda uhuishaji laini
- **Husimamia** kiwango cha fremu kwa kudhibiti muda wa mzunguko
## Kuendelea na Mchezo wa Anga
## Kuendeleza Mchezo wa Anga
Sasa tutaongeza mwendo kwenye eneo tuli ulilojenga hapo awali. Tunakaribia kuubadilisha kutoka picha ya skrini hadi uzoefu wa kuingiliana. Tutafanya kazi kupitia hatua kwa hatua ili kuhakikisha kila kipande kinajengwa juu ya kingine.
Sasa tutaongeza harakati kwa eneo tulilo jenga awali lisilosogea. Tutalibadilisha kuwa uzoefu wa kuingiliana. Tutafanya kazi hatua kwa hatua kuhakikisha kila kipande kinajengwa juu ya kile cha awali.
Chukua msimbo kutoka mahali tulipoishia katika somo la awali (au anza na msimbo katika folda ya [Sehemu ya II- mwanzo](../../../../6-space-game/3-moving-elements-around/your-work) ikiwa unahitaji mwanzo mpya).
Chukua msimbo kutoka alikotuacha katika somo la awali (au anza na msimbo katika folda ya [Part II- starter](../../../../6-space-game/3-moving-elements-around/your-work) ikiwa unahitaji mwanzo mpya).
**Hivi ndivyo tunavyounda leo:**
- **Udhibiti wa shujaa**: Vitufe vya mshale vitaendesha chombo chako cha anga kwenye skrini
- **Mwendo wa adui**: Vyombo hivyo vya kigeni vitaanza kusonga mbele
**Hivi ndivyo tunavyotengeneza leo:**
- **Vidhibiti vya shujaa**: Vitufe vya mshale vitaongoza meli yako ya angani kwenye skrini
- **Harakati za maadui**: Zile meli za kigeni zitaanza kusonga mbele
Tuanzishe utekelezaji wa vipengele hivi.
Tuanze kutekeleza vipengele hivi.
## Hatua Zinazopendekezwa
## Hatua zilizopendekezwa
Tafuta faili ambazo zimeundwa kwako katika folda ndogo ya `your-work`. Inapaswa kuwa na yafuatayo:
Tafuta faili zilizo tengenezwa kwako kwenye folda ndogo `your-work`. Zinapaswa kuwa na yafuatayo:
```bash
-| assets
@ -199,27 +322,27 @@ Tafuta faili ambazo zimeundwa kwako katika folda ndogo ya `your-work`. Inapaswa
-| package.json
```
Unaanza mradi wako katika folda ya `your-work` kwa kuandika:
Unaanza mradi wako katika folda `your-work` kwa kuandika:
```bash
cd your-work
npm start
```
**Hii amri inavyofanya:**
- **Inasogeza** kwenye saraka ya mradi wako
- **Inaanzisha** HTTP Server kwenye anwani `http://localhost:5000`
- **Inahudumia** faili zako za mchezo ili uweze kuzijaribu kwenye kivinjari
**Hivi ndivyo amri hii inavyofanya:**
- **Inapeleka** kwenye saraka ya mradi wako
- **Inaanzisha** Server ya HTTP kwenye anwani `http://localhost:5000`
- **Hutumikia** faili za mchezo wako ili uweze kujaribu kwenye kivinjari
Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua kivinjari na ingiza anwani hiyo, kwa sasa inapaswa kuonyesha shujaa na maadui wote; hakuna kinachosogea - bado!
Hapo juu itaanzisha Server ya HTTP kwenye anwani `http://localhost:5000`. Fungua kivinjari na ingiza anwani hiyo, sasa inapaswa kuonyesha shujaa na maadui wote; hakuna kinachosogea bado!
### Ongeza Msimbo
### Ongeza msimbo
1. **Ongeza vitu maalum** kwa `shujaa`, `adui`, na `kitu cha mchezo`, vinapaswa kuwa na mali za `x` na `y`. (Kumbuka sehemu ya [Urithi au muundo](../README.md)).
1. **Ongeza vitu vilivyotengwa** kwa ajili ya `hero` na `enemy` na `game object`, vinapaswa kuwa na mali za `x` na `y`. (Kumbuka sehemu ya [Urithi au muundo](../README.md)).
*KIDOKEZO* `kitu cha mchezo` kinapaswa kuwa na `x` na `y` na uwezo wa kujichora kwenye canvas.
*KIBWANA* `game object` inapaswa kuwa na `x` na `y` na uwezo wa kujichora kwenye turubai.
> **Kidokezo**: Anza kwa kuongeza darasa jipya la `GameObject` na ueleze mjenzi wake kama ilivyo hapa chini, kisha ujichore kwenye canvas:
> **Ushauri**: Anza kwa kuongeza darasa jipya la `GameObject` lenye muundaji umeainishwa kama ifuatavyo, kisha ulichore kwenye turubai:
```javascript
class GameObject {
@ -240,12 +363,48 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
```
**Kuelewa darasa hili la msingi:**
- **Hufafanua** mali za kawaida ambazo vitu vyote vya mchezo vinashiriki (nafasi, ukubwa, picha)
- **Hujumuisha** bendera ya `dead` kufuatilia kama kitu kinapaswa kuondolewa
- **Hutoa** njia ya `draw()` inayochora kitu kwenye canvas
- **Huanzisha** thamani za msingi kwa mali zote ambazo madarasa ya watoto yanaweza kubadilisha
- **Lina** mali za kawaida ambazo vitu vyote vya mchezo hushirikiana nazo (nafasi, ukubwa, picha)
- **Linajumuisha** bendera ya `dead` kufuatilia ikiwa kitu kinapaswa kuondolewa
- **Linatoa** njia ya `draw()` inayochora kitu kwenye turubai
- **Linayeka** thamani za msingi kwa mali zote ambazo madarasa ya watoto yanaweza kuzibadilisha
Sasa, panua `GameObject` kuunda `Hero` na `Enemy`:
```mermaid
classDiagram
class GameObject {
+x: nambari
+y: nambari
+dead: boolean
+type: string
+width: nambari
+height: nambari
+img: Image
+draw(ctx)
}
class Hero {
+speed: nambari
+type: "Shujaa"
+width: 98
+height: 75
}
class Enemy {
+type: "Adversary"
+width: 98
+height: 50
+setInterval()
}
GameObject <|-- Hero
GameObject <|-- Enemy
class EventEmitter {
+listeners: kitu
+on(message, listener)
+emit(message, payload)
}
```
Sasa, panua `GameObject` huu kuunda `Hero` na `Enemy`:
```javascript
class Hero extends GameObject {
@ -278,51 +437,51 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
}
```
**Dhana muhimu katika madarasa haya:**
- **Hurithi** kutoka `GameObject` kwa kutumia neno kuu `extends`
- **Huita** mjenzi wa mzazi kwa `super(x, y)`
- **Huanzisha** vipimo maalum na mali kwa kila aina ya kitu
- **Hutekeleza** mwendo wa kiotomatiki kwa maadui kwa kutumia `setInterval()`
**Dhana kuu katika madarasa haya:**
- **Linarithi** kutoka `GameObject` kwa kutumia neno `extends`
- **Lina** njia ya kuwaita muundaji wa mzazi `super(x, y)`
- **Lina** vipimo maalum na mali kwa kila aina ya kitu
- **Linatekeleza** harakati za moja kwa moja kwa maadui kwa kutumia `setInterval()`
2. **Ongeza wahandaji wa matukio ya vitufe** kushughulikia urambazaji wa vitufe (sogeza shujaa juu/chini kushoto/kulia)
2. **Ongeza wasimamizi wa matukio ya kitufe** kushughulikia uongozaji wa kitufe (hamisha shujaa juu/chini kushoto/kulia)
*KUMBUKA* ni mfumo wa cartesian, juu-kushoto ni `0,0`. Pia kumbuka kuongeza msimbo wa kuzuia *tabia ya msingi*
*KUMBUKA* ni mfumo wa kiasili, juu-kushoto ni `0,0`. Pia kumbuka kuongeza msimbo wa kusimamisha *tabia ya asili*
> **Kidokezo**: Unda kazi yako ya `onKeyDown` na uambatanishe kwenye dirisha:
> **Ushauri**: Tengeneza kazi yako ya `onKeyDown` na uiunganishe na dirisha:
```javascript
const onKeyDown = function (e) {
console.log(e.keyCode);
// Add the code from the lesson above to stop default behavior
// Ongeza msimbo kutoka somo hapo juu kusimamisha tabia ya kawaida
switch (e.keyCode) {
case 37:
case 39:
case 38:
case 40: // Arrow keys
case 40: // Mshale wa mwelekeo
case 32:
e.preventDefault();
break; // Space
break; // Nafasi
default:
break; // do not block other keys
break; // usizui kWingineko funguo
}
};
window.addEventListener("keydown", onKeyDown);
```
**Hii wahandaji wa matukio unavyofanya:**
- **Husikiliza** matukio ya kubonyeza vitufe kwenye dirisha lote
- **Hurekodi** namba ya kitufe ili kukusaidia kufuatilia vitufe vinavyobonyezwa
- **Huzuia** tabia ya msingi ya kivinjari kwa vitufe vya mshale na spacebar
- **Huruhusu** vitufe vingine kufanya kazi kawaida
**Hivi ndivyo msimamizi wa tukio hili unavyofanya:**
- **Husikiliza** matukio ya keydown kwenye dirisha lote
- **Hurekodi** msimbo wa kitufe kusaidia kutatua matatizo
- **Huzuia** tabia za chaguo-msingi za kivinjari kwa vitufe vya mshale na spacebar
- **Humruhusu** vitufe vingine kufanya kazi kawaida
Angalia console ya kivinjari chako kwa wakati huu, na uone mibofyo ya vitufe ikirekodiwa.
Angalia consola ya kivinjari sasa hivi, na tazama bonyeza vitufe vinavyorekodiwa.
3. **Tekeleza** [Mfumo wa Pub sub](../README.md), hii itafanya msimbo wako kuwa safi unapofuata sehemu zinazobaki.
3. **Tekeleza** muundo wa [Pub sub](../README.md), huu utafanya msimbo wako usafi unapoendelea na sehemu zinazobaki.
Mfumo wa Chapisha-Jisajili husaidia kupanga msimbo wako kwa kutenganisha ugunduzi wa tukio na usimamizi wa tukio. Hii inafanya msimbo wako kuwa wa moduli zaidi na rahisi kudumisha.
Muundo wa Publish-Subscribe husaidia kupanga msimbo wako kwa kutenganisha kugundua matukio na kushughulikia matukio. Hii hufanya msimbo wako kuwa wa modular na rahisi kudumisha.
Ili kufanya sehemu hii ya mwisho, unaweza:
Kufanya sehemu hii ya mwisho, unaweza:
1. **Ongeza msikilizaji wa tukio** kwenye dirisha:
@ -340,13 +499,34 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
});
```
**Hii mfumo wa tukio unavyofanya:**
- **Hugundua** pembejeo ya kibodi na kuibadilisha kuwa matukio maalum ya mchezo
- **Hutenganisha** ugunduzi wa pembejeo na mantiki ya mchezo
- **Hufanya** iwe rahisi kubadilisha udhibiti baadaye bila kuathiri msimbo wa mchezo
- **Huruhusu** mifumo mingi kujibu pembejeo moja
2. **Unda darasa la EventEmitter** kuchapisha na kujisajili kwa ujumbe:
**Hivi ndivyo mfumo huu wa tukio unavyofanya:**
- **Hugundua** maingizo ya kibodi na kuyageuza kuwa matukio maalum ya mchezo
- **Hutenganisha** kugundua maingizo na mantiki ya mchezo
- **Hufanya** iwe rahisi kubadilisha vidhibiti baadaye bila kuathiri msimbo wa mchezo
- **Humruhusu** mifumo mingi kujibu maingizo hayo hayo
```mermaid
flowchart TD
A["Ingizo la Kibodi"] --> B["Msikilizaji wa Tukio la Dirisha"]
B --> C["Mtawanyaji wa Tukio"]
C --> D["TUKIO_LA_KIFUNZO_UKURASA_JUU"]
C --> E["TUKIO_LA_KIFUNZO_UKURASA_CHINI"]
C --> F["TUKIO_LA_KIFUNZO_UKURASA_KUSHOTO"]
C --> G["TUKIO_LA_KIFUNZO_UKURASA_KULIA"]
D --> H["Mwendo wa Shujaa"]
D --> I["Mfumo wa Sauti"]
D --> J["Athari za Visual"]
E --> H
F --> H
G --> H
style A fill:#e1f5fe
style C fill:#e8f5e8
style H fill:#fff3e0
```
2. **Tengeneza darasa la EventEmitter** kwa kuchapisha na kujisajili kwa ujumbe:
```javascript
class EventEmitter {
@ -361,7 +541,7 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
this.listeners[message].push(listener);
}
3. **Ongeza constants** na weka EventEmitter:
3. **Ongeza constants** na usanidi wa EventEmitter:
```javascript
const Messages = {
@ -381,10 +561,10 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
```
**Kuelewa usanidi:**
- **Hufafanua** constants za ujumbe ili kuepuka makosa ya herufi na kufanya mabadiliko ya msimbo kuwa rahisi
- **Hutangaza** vigezo vya picha, muktadha wa canvas, na hali ya mchezo
- **Huunda** EventEmitter ya kimataifa kwa mfumo wa pub-sub
- **Huanzisha** safu ya kushikilia vitu vyote vya mchezo
- **Lina** constants za ujumbe ili kuepuka makosa na kurahisisha marekebisho
- **Lintaja** vigezo kwa picha, muktadha wa turubai, na hali ya mchezo
- **Hutengeneza** event emitter ya dunia kwa mfumo wa pub-sub
- **Inaanzisha** safu ili kushikilia vitu vyote vya mchezo
4. **Anzisha mchezo**
@ -406,9 +586,9 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
hero.x -= 5;
});
4. **Sanidi mzunguko wa mchezo**
4. **Panga mzunguko wa mchezo**
Rekebisha kazi ya `window.onload` ili kuanzisha mchezo na kusanidi mzunguko wa mchezo kwa muda mzuri. Pia utaongeza boriti ya laser:
Badilisha kazi ya `window.onload` kuanzisha mchezo na kupanga mzunguko wa mchezo kwa kipindi kizuri. Pia utaongeza miale ya laser:
```javascript
window.onload = async () => {
@ -428,16 +608,16 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
};
```
**Kuelewa usanidi wa mchezo:**
- **Husubiri** ukurasa kupakia kikamilifu kabla ya kuanza
- **Hupata** kipengele cha canvas na muktadha wake wa uchoraji wa 2D
- **Hupakia** mali zote za picha kwa njia isiyo ya moja kwa moja kwa kutumia `await`
- **Huanza** mzunguko wa mchezo unaoendesha kwa vipindi vya milisekunde 100 (10 FPS)
- **Hufuta** na kuchora tena skrini nzima kila fremu
**Kuelewa mipangilio ya mchezo:**
- **Inasubiri** ukurasa upakuliwe kikamilifu kabla ya kuanza
- **Inapata** kipengele cha canvas na muktadha wake wa upigaji wa 2D
- **Inapakia** mali zote za picha kwa kutumia `await` kimya kimya
- **Inaendesha** mzunguko wa mchezo kwenye vipindi vya 100ms (10 FPS)
- **Inafuta** na kuchora tena skrini nzima kila fremu
5. **Ongeza msimbo** kusogeza maadui kwa muda fulani
5. **Ongeza msimbo** kusogeza maadui kwa kipindi fulani
Rekebisha kazi ya `createEnemies()` ili kuunda maadui na kuwasukuma kwenye darasa jipya la gameObjects:
Badilisha kazi ya `createEnemies()` kuunda maadui na kuyaingiza katika darasa jipya la gameObjects:
```javascript
function createEnemies() {
@ -456,14 +636,14 @@ Hapo juu itaanzisha HTTP Server kwenye anwani `http://localhost:5000`. Fungua ki
}
```
**Hii uundaji wa maadui unavyofanya:**
- **Huhesabu** nafasi za kuweka maadui katikati ya skrini
- **Inaunda** gridi ya maadui kwa kutumia mikondo iliyopachikwa
- **Inapeana** picha ya adui kwa kila kitu cha adui
- **Inaongeza** kila adui kwenye safu ya vitu vya mchezo ya kimataifa
na ongeza kazi ya `createHero()` kufanya mchakato sawa kwa shujaa.
**Kile kinachofanywa na uundaji wa adui:**
- **Huhesabu** maeneo ya kuweka maadui katikati ya skrini
- **Hunda** rundo la maadui kwa kutumia mizunguko iliyotanda
- **Hugawa** picha ya adui kwa kila kitu cha adui
- **Huaongeza** kila adui katika safu ya vitu vya mchezo duniani
na ongeza kazi ya `createHero()` kufanya mchakato kama huo kwa shujaa.
```javascript
function createHero() {
hero = new Hero(
@ -475,12 +655,12 @@ na ongeza kazi ya `createHero()` kufanya mchakato sawa kwa shujaa.
}
```
**Kile uundaji wa shujaa unafanya:**
- **Inaweka** shujaa katikati ya chini ya skrini
- **Inapeana** picha ya shujaa kwa kitu cha shujaa
- **Inaongeza** shujaa kwenye safu ya vitu vya mchezo kwa ajili ya kuonyesha
**Kile kinachofanywa na uundaji wa shujaa:**
- **Huweka** shujaa katikati chini ya skrini
- **Hugawa** picha ya shujaa kwa kitu cha shujaa
- **Huongeza** shujaa katika safu ya vitu vya mchezo kwa ajili ya kuchora
na hatimaye, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
na mwisho, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
```javascript
function drawGameObjects(ctx) {
@ -488,14 +668,34 @@ na hatimaye, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
}
```
**Kuelewa kazi ya kuchora:**
- **Inapitia** vitu vyote vya mchezo kwenye safu
- **Inaita** njia ya `draw()` kwa kila kitu
- **Inapita** muktadha wa canvas ili vitu viweze kujionyesha
Maadui wako wanapaswa kuanza kusonga mbele kuelekea chombo cha anga cha shujaa wako!
}
}
**Kuelewa kazi ya kuchora:**
- **Inapitia** vitu vyote vya mchezo katika safu
- **Inaita** njia ya `draw()` kwa kila kitu
- **Hinukuu** muktadha wa canvas ili vitu viweze kujichora wenyewe
### 🔄 **Angalia Mafunzo**
**Uelewa Kamili wa Mfumo wa Mchezo**: Thibitisha ustadi wako wa usanifu mzima:
- ✅ Je, urithi unawezaje kufanya Hero na Enemy washirikiane kwa mali za GameObject?
- ✅ Kwa nini muundo wa pub/sub unafanya msimbo wako uwe rahisi kudumishwa?
- ✅ Mzunguko wa mchezo unashika nafasi gani katika kuunda michoro laini?
- ✅ Wasikilizaji wa matukio huunganisha vipi ingizo la mtumiaji na tabia ya kitu cha mchezo?
**Uingizaji wa Mfumo**: Mchezo wako sasa unaonyesha:
- **Ubunifu wa vitu**: Madarasa ya msingi na urithi maalum
- **Muundo wa tukio**: Muundo wa pub/sub kwa unganisho mwepesi
- **Mfumo wa michoro**: Mzunguko wa mchezo kwa masasisho yanayoendelea
- **Udhibiti wa ingizo**: Matukio ya kibodi na kuzuia tabia ya default
- **Usimamizi wa mali**: Kupakia picha na michoro ya sprite
**Mifumo ya Kitaalamu**: Umetekeleza:
- **Utoaji wa majukumu**: Ingizo, mantiki, na michoro vimetengwa
- **Polymorphism**: Vitu vyote vya mchezo vinashirikiana kiolesura sawa cha kuchora
- **Ujumbe wa mawasiliano**: Mawasiliano safi kati ya vipengele
- **Usimamizi wa rasilimali**: Haraka katika sprite na michoro
Maadui wako wanapaswa kuanza kusogea kwenye meli yako ya shujaa!
}
}
```
and add a `createHero()` function to do a similar process for the hero.
@ -511,7 +711,7 @@ Maadui wako wanapaswa kuanza kusonga mbele kuelekea chombo cha anga cha shujaa w
}
```
na hatimaye, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
na mwisho, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
```javascript
function drawGameObjects(ctx) {
@ -519,59 +719,181 @@ na hatimaye, ongeza kazi ya `drawGameObjects()` kuanza kuchora:
}
```
Maadui wako wanapaswa kuanza kusonga mbele kuelekea chombo cha anga cha shujaa wako!
Maadui wako wanapaswa kuanza kusogea kwenye meli yako ya shujaa!
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya Mwakilishi wa GitHub Copilot 🚀
Hapa kuna changamoto itakayoboresha ubora wa mchezo wako: kuongeza mipaka na udhibiti laini. Kwa sasa, shujaa wako anaweza kuruka nje ya skrini, na harakati zinaweza kuhisi kuwa na ukakasi.
Hapa kuna changamoto itakayoimarisha ubora wa mchezo wako: kuongeza mipaka na udhibiti laini. Kwa sasa, shujaa wako anaweza kuruka nje ya skrini, na mwendo unaweza kuonekana usio sawa.
**Dhamira Yako:** Fanya chombo chako cha anga kihisi kuwa halisi zaidi kwa kutekeleza mipaka ya skrini na harakati laini. Hii ni sawa na jinsi mifumo ya udhibiti wa ndege ya NASA inavyopunguza chombo cha anga kisizidi vigezo salama vya operesheni.
**Lengo lako:** Fanya meli yako ya shujaa ihisi halisi zaidi kwa kutekeleza mipaka ya skrini na mwendo laini. Hii ni sawa na jinsi mifumo ya kudhibiti ndege ya NASA inavyozuia nafasi ya meli kurukwa zaidi ya vigezo salama.
**Hapa kuna unachopaswa kujenga:** Unda mfumo unaohakikisha chombo cha anga cha shujaa wako kinabaki kwenye skrini, na fanya udhibiti uhisi laini. Wakati wachezaji wanashikilia kitufe cha mshale, chombo kinapaswa kuteleza kwa mfululizo badala ya kusonga hatua kwa hatua. Fikiria kuongeza maoni ya kuona wakati chombo kinapofikia mipaka ya skrini labda athari ndogo kuonyesha ukingo wa eneo la kucheza.
**Hapa unachojenga:** Unda mfumo unaoweka meli yako ya shujaa ndani ya skrini, na ufanye udhibiti uhisi laini. Wakati wachezaji wanashikilia kitufe cha mshale, meli iendelee kusogea kwa urahisi badala ya hatua za kidurubini. Fikiria kuongeza mwangaza wa kuona wakati meli inafika mipaka ya skrini labda mwelekeo mdogo unaonyesha ukingo wa eneo la mchezo.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto
Mpangilio wa msimbo unakuwa muhimu zaidi kadri miradi inavyokua. Unaweza kuwa umeona faili yako ikijaa na kazi, vigezo, na madarasa vyote vikiwa vimechanganyika. Hii inanikumbusha jinsi wahandisi walivyopanga msimbo wa misheni ya Apollo kwa kuunda mifumo wazi na inayoweza kudumishwa ambayo timu nyingi zingeweza kufanya kazi nayo kwa wakati mmoja.
Mpangilio wa msimbo unakuwa muhimu zaidi kadri miradi inavyokua. Unaweza kuwa umegundua faili lako lina msongamano wa kazi, mabadiliko, na madarasa yametanganywa pamoja. Hii inanifanya nikumbuke jinsi wahandisi walivyopanga msimbo wa misioni ya Apollo kuhifadhi mifumo wazi, inayoweza kudumishwa na timu nyingi kufanya kazi pamoja kwa wakati mmoja.
**Dhamira yako:**
Fikiria kama mbunifu wa programu. Je, ungepanga msimbo wako vipi ili miezi sita kutoka sasa, wewe (au mwenzako) uweze kuelewa kinachoendelea? Hata kama kila kitu kinabaki kwenye faili moja kwa sasa, unaweza kuunda mpangilio bora:
**Lengo lako:**
Fikiria kama mbunifu wa programu. Utaandaaje msimbo wako hata miezi sita baadaye, wewe (au mwenzako) mnajua kinachoendelea? Hata kama kila kitu kipo katika faili moja kwa sasa, unaweza kuunda mpangilio bora:
- **Kugroup kazi zinazohusiana** pamoja na vichwa vya maoni vilivyo wazi
- **Kutenganisha majukumu** - weka mantiki ya mchezo tofauti na uonyeshaji
- **Kutumia majina ya kawaida** kwa vigezo na kazi
- **Kuunda moduli** au namespaces ili kupanga vipengele tofauti vya mchezo wako
- **Kuongeza nyaraka** zinazoelezea madhumuni ya kila sehemu kuu
- **Kuunganisha kazi zinazohusiana** pamoja kwa vichwa vya maoni vya wazi
- **Kutengwa kwa majukumu** - kuweka mantiki ya mchezo mbali na michoro
- **Kutumia majina thabiti** kwa mabadiliko na kazi
- **Kutengeneza moduli** au namespaces kupanga sehemu tofauti za mchezo wako
- **Ongeza nyaraka** zinazofafanua kusudi la kila sehemu kuu
**Maswali ya kutafakari:**
- Ni sehemu gani za msimbo wako ni ngumu zaidi kuelewa unaporudi kuzitazama?
- Je, ungepanga msimbo wako vipi ili iwe rahisi kwa mtu mwingine kuchangia?
- Nini kingetokea ikiwa ungependa kuongeza vipengele vipya kama nguvu za ziada au aina tofauti za maadui?
- Ni sehemu gani za msimbo wako ni ngumu kueleweka unaporudiona?
- Ungefanyaje kupanga msimbo wako ili kuwezesha mtu mwingine kuchangia kwa urahisi?
- Je, itatokea nini ikiwa ungependa kuongeza vipengele kama power-ups au aina tofauti za maadui?
## Jaribio la Baada ya Somo
## Mtihani wa Baada ya Somo
[Jaribio la baada ya somo](https://ff-quizzes.netlify.app/web/quiz/34)
[Mtihani wa baada ya somo](https://ff-quizzes.netlify.app/web/quiz/34)
## Mapitio na Kujisomea
## Mapitio & Kujifunza Binafsi
Tumekuwa tukijenga kila kitu kutoka mwanzo, ambayo ni nzuri kwa kujifunza, lakini hapa kuna siri kidogo kuna mifumo ya ajabu ya JavaScript huko nje ambayo inaweza kushughulikia kazi nyingi za msingi kwa ajili yako. Mara tu unapohisi kuwa na ujasiri na misingi tuliyojadili, inafaa [kuchunguza kinachopatikana](https://github.com/collections/javascript-game-engines).
Tumekuwa tukijenga kila kitu kutoka mwanzo, jambo zuri kwa kujifunza, lakini hapa kuna siri kidogo kuna mifumo mizuri ya JavaScript inayoweza kusimamia mengi ya mizigo kikubwa. Mara ukijisikia huru na msingi tuliofunza, inafaa [kuangalia kinachopatikana](https://github.com/collections/javascript-game-engines).
Fikiria mifumo kama kuwa na kisanduku cha zana kilichojaa badala ya kutengeneza kila zana kwa mkono. Inaweza kutatua changamoto nyingi za mpangilio wa msimbo tulizozungumzia, pamoja na kutoa vipengele ambavyo vingechukua wiki kujenga mwenyewe.
Fikiria mifumo kama boksi la zana zenye vifaa vikamilifu badala ya kutengeneza kila chombo kwa mkono. Inaweza kutatua changamoto nyingi za kupanga msimbo tulizozungumzia, na pia kutoa vipengele vinavyochukua wiki kutengeneza mwenyewe.
**Mambo ya kuchunguza:**
- Jinsi injini za mchezo zinavyopanga msimbo utashangazwa na mifumo ya busara wanayotumia
- Mbinu za utendaji kwa kufanya michezo ya canvas iende laini kama siagi
- Vipengele vya kisasa vya JavaScript vinavyoweza kufanya msimbo wako kuwa safi zaidi na rahisi kudumisha
- Njia tofauti za kusimamia vitu vya mchezo na uhusiano wao
**Vitu vya kuangalia zaidi:**
- Jinsi injini za michezo zinavyopanga msimbo utashangazwa na mifumo hodari wanayotumia
- Mbinu za utendaji kwa kufanya michezo ya canvas isikate
- Sifa za kisasa za JavaScript zinazoweza kufanya msimbo wako safi na rahisi kudumishwa
- Njia tofauti za kusimamia vitu vya mchezo na uhusiano wake
## Kazi
## 🎯 Muda wa Utaalamu wa Michoro ya Mchezo Wako
[Toa maoni kwenye msimbo wako](assignment.md)
```mermaid
timeline
title Mchakato wa Kujifunza Mchezo wa Uhuishaji & Mwingiliano
section Misingi ya Mwendo (dakika 20)
Kanuni za Uhuishaji: Uhuishaji wa msingi wa fremu
: Sasisho la nafasi
: Mifumo ya kuratibu
: Mwendo mkamilifu
section Mifumo ya Matukio (dakika 25)
Ingizo la Mtumiaji: Udhibiti wa tukio la kibodi
: Kuzuia tabia ya msingi
: Sifa za kitu cha tukio
: Kusikiliza ngazi ya dirisha
section Mizee ya Mchezo (dakika 30)
Ubunifu wa Kitu: Mifumo ya urithi
: Uundaji wa darasa la msingi
: Tabia maalum
: Vifaa vya polymorphic
section Mifumo ya Mawasiliano (dakika 35)
Utekelezaji wa Pub/Sub: Watangazaji wa matukio
: Thamani za ujumbe
: Uunganishaji mgevu
: Uingiliano wa mfumo
section Ustadi wa Mzunguko wa Mchezo (dakika 40)
Mifumo ya Wakati Halisi: Udhibiti wa kiwango cha fremu
: Mzunguko wa sasisho/uonyeshaji
: Usimamizi wa hali
: Uboreshaji wa utendaji
section Mbinu za Juu (dakika 45)
Sifa za Kitaalamu: Ugunduzi wa mgongano
: Mulinganisho wa fizikia
: Mashine za hali
: Mifumo ya vipengele
section Dhana za Injini ya Mchezo (wiki 1)
Uelewa wa Mfumo: Mifumo ya vipengele vya kiumbe
: Miti ya mandhari
: Mipangilio ya mali
: Uchanganuzi wa utendaji
section Ujuzi wa Uzalishaji (mwezi 1)
Maendeleo ya Kitaalamu: Upangaji wa msimbo
: Ushirikiano wa timu
: Mikakati ya upimaji
: Uboreshaji wa usambazaji
```
### 🛠️ Muhtasari wa Zana za Maendeleo ya Mchezo Wako
Baada ya kumaliza somo hili, sasa umemaster:
- **Kanuni za michoro**: Mwendo wa fremu na mabadiliko laini
- **Programu inayoendeshwa na matukio**: Udhibiti wa kibodi na usimamizi sahihi wa matukio
- **Ubunifu wa vitu**: Mirongo ya urithi na kiolesura cha polymorphic
- **Mifumo ya mawasiliano**: Muundo wa pub/sub kwa msimbo unaohifadhiwa
- **Mzunguko wa mchezo**: Masasisho na michoro ya wakati halisi
- **Mifumo ya ingizo**: Ramani za udhibiti na kuzuia tabia za default
- **Usimamizi wa mali**: Kupakia sprite na mbinu za michoro ya ufanisi
### ⚡ **Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua console ya kivinjari na jaribu `addEventListener('keydown', console.log)` kuona matukio ya kibodi
- [ ] Tengeneza kipengele rahisi cha div na ukisogeze kwa kutumia vitufe vya mshale
- [ ] Jaribu `setInterval` kuunda mwendo wa kuendelea
- [ ] Jaribu kuzuia tabia ya default kwa `event.preventDefault()`
### 🎯 **Unachoweza Kufanikisha Saa Hii**
- [ ] Kamilisha mtihani wa baada ya somo na kuelewa programu inayoendeshwa na matukio
- [ ] Tengeneza meli ya shujaa anayesogea na udhibiti kamili wa kibodi
- [ ] Tekeleza mifumo laini ya mwendo wa maadui
- [ ] Ongeza mipaka kuzuia vitu vya mchezo kutoka kuondoka skrini
- [ ] Tengeneza ufuatiliaji wa mgongano wa msingi kati ya vitu vya mchezo
### 📅 **Safari Yako ya Michoro ya Wiki Nzima**
- [ ] Kamilisha mchezo kamili wa anga na mwendo ulioboreshwa na mwingiliano
- [ ] Ongeza mifumo ya mwendo iliyoboreshwa kama miondoko, kuongezeka kwa kasi, na fizikia
- [ ] Tekeleza mabadiliko laini na kazi za kupunguza kasi taratibu
- [ ] Tengeneza athari za chembe na mifumo ya mrejesho wa kuona
- [ ] Boresha utendaji wa mchezo kwa michezo laini ya 60fps
- [ ] Ongeza udhibiti wa kugusa simu na muundo unaojibu
### 🌟 **Maendeleo Yako ya Mwezi Mmoja**
- [ ] Jenga programu changamano za mwingiliano na mifumo ya michoro ya hali ya juu
- [ ] Jifunze maktaba za michoro kama GSAP au tengeneza injini yako ya michoro
- [ ] Changia maendeleo ya michezo ya chanzo wazi na miradi ya michoro
- [ ] Tambua utendaji wa picha kwa programu zinazochukua rasilimali nyingi
- [ ] Tengeneza maudhui ya elimu kuhusu maendeleo ya michezo na michoro
- [ ] Jenga wasifu unaoonyesha ustadi wa hali ya juu wa programu za mwingiliano
**Matumizi Halisi**: Ustadi wako wa michoro ya mchezo unahusiana moja kwa moja na:
- **Programu za wavuti zenye mwingiliano**: Dashibodi za kimuktadha na interfaz za wakati halisi
- **Uwasilishaji wa data**: Chati zilizo na michoro na picha zenye mwingiliano
- **Programu za elimu**: Mifano ya mwingiliano na zana za kujifunza
- **Maendeleo ya simu**: Michezo ya kugusa na udhibiti wa ishara
- **Programu za desktop**: Programu za Electron zenye michoro laini
- **Michoro ya wavuti**: Maktaba za CSS na JavaScript za michoro
**Ujuzi wa Kitaalamu Uliopatikana**: Sasa unaweza:
- **Kubuni** mifumo inayoendeshwa na matukio inayokua kwa ugumu
- **Kutekeleza** michoro laini kwa kutumia kanuni za kihisabati
- **Kutatua matatizo** ya mifumo changamano kwa kutumia zana za maendeleo ya kivinjari
- **Kuboresha** utendaji wa mchezo kwa vifaa na vivinjari mbalimbali
- **Kubuni** miundo ya msimbo rahisi kudumishwa kwa kutumia mifumo iliyo thibitishwa
**Mafunzo ya Maendeleo ya Mchezo Uliyopata**:
- **Usimamizi wa kiwango cha fremu**: Kuelewa FPS na udhibiti wa muda
- **Udhibiti wa ingizo**: Mifumo ya kivinjari na mtandao ya kibodi
- **Mzunguko wa maisha ya kitu**: Mtindo wa uundaji, masasisho, na uharibifu
- **Mfanano wa hali**: Kudumisha hali ya mchezo thabiti kwa fremu zote
- **Miundo ya matukio**: Mawasiliano yaliyotengwa kati ya mifumo ya mchezo
**Ngazi Ifuatayo**: Uko tayari kuongeza ufuatiliaji wa mgongano, mifumo ya pointi, athari za sauti, au kuchunguza mifumo ya michezo ya kisasa kama Phaser au Three.js!
🌟 **Ufanisi Umefunguliwa**: Umetengeneza mfumo kamili wa mchezo wenye usanifu wa kitaalamu wenye mifumo ya hali ya juu!
## Kazi ya Nyumbani
[Maoni kwenye msimbo wako](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Hatutoi Dhamana**:
Nyaraka hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kwamba tafsiri zilizotengenezwa kiotomatiki zinaweza kuwa na makosa au kutokukamilika. Nyaraka asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha kuaminika. Kwa taarifa muhimu, tafsiri ya kitaalamu inayotolewa na binadamu inapendekezwa. Hatubeba dhamana kwa kutoelewana au tafsiri potofu zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,36 +1,103 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4b1d441cfd31924084956000c0fee5a5",
"translation_date": "2025-10-24T19:42:30+00:00",
"original_hash": "039b4d8ce65f5edd82cf48d9c3e6728c",
"translation_date": "2026-01-07T01:32:32+00:00",
"source_file": "6-space-game/4-collision-detection/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 4: Kuongeza Laser na Kugundua Migongano
## Maswali ya Awali ya Somo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/35)
Fikiria wakati katika Star Wars ambapo torpedoes za proton za Luke zilipiga sehemu ya kutolea moshi ya Death Star. Kugundua migongano kwa usahihi kulibadilisha hatima ya galaksi! Katika michezo, kugundua migongano hufanya kazi kwa njia sawa - huamua wakati vitu vinapokutana na kinachotokea baadaye.
Katika somo hili, utaongeza silaha za laser kwenye mchezo wako wa anga na kutekeleza kugundua migongano. Kama vile wapangaji wa NASA wanavyohesabu njia za vyombo vya anga ili kuepuka uchafu, utajifunza kugundua wakati vitu vya mchezo vinapokutana. Tutavunja hili katika hatua zinazoweza kudhibitiwa ambazo zinajengwa juu ya kila moja.
Mwisho wa somo, utakuwa na mfumo wa mapigano unaofanya kazi ambapo laser zinaharibu maadui na migongano husababisha matukio ya mchezo. Kanuni hizi za kugundua migongano hutumika katika kila kitu kutoka kwa simulizi za fizikia hadi interfaces za wavuti zinazoshirikiana.
✅ Fanya utafiti kidogo kuhusu mchezo wa kwanza kabisa wa kompyuta uliowahi kuandikwa. Je, ulikuwa na uwezo gani?
# Jenga Mchezo wa Anga Sehemu ya 4: Kuongeza Laser na Kugundua Mgongano
```mermaid
journey
title Safari Yako ya Ugundaji wa Migongano
section Msingi wa Fizikia
Elewa mstatili: 3: Student
Jifunze hesabu za kukutana: 4: Student
Fahamu mifumo ya kuratibu: 4: Student
section Mecaniki za Mchezo
Tekeleza upigaji wa leza: 4: Student
Ongeza mzunguko wa maisha wa kitu: 5: Student
Tengeneza sheria za migongano: 5: Student
section Uingizaji wa Mfumo
Jenga ugundaji wa migongano: 5: Student
Boresha utendaji: 5: Student
Jaribu mifumo ya mwingiliano: 5: Student
```
## Mtihani Kabla ya Kozi
[Mtihani kabla ya kozi](https://ff-quizzes.netlify.app/web/quiz/35)
Fikiria wakati katika Star Wars wakati torpedo za protoni za Luke zilipogonga mlango wa kutolea moshi wa Death Star. Kugundua mgongano huo hasa kuliibadilisha hatima ya galaxia! Katika michezo, kugundua mgongano hufanya kazi kwa njia ile ile - huchunguza wakati vitu vinapoingiliana na kinachotokea baadaye.
Katika somo hili, utaongeza silaha za laser kwenye mchezo wako wa anga na kutekeleza kugundua mgongano. Kama vile wasimamizi wa misheni wa NASA wanavyopanga njia za meli za anga kuepuka vifuniko, utajifunza kugundua wakati vitu vya mchezo vinapoingiliana. Tutavunja hii kuwa hatua ndogo ndogo zinazojenga moja baada ya nyingine.
Mwisho wa somo, utakuwa na mfumo wa mapigano unaofanya kazi ambapo laser hubomoa maadui na migongano huanzisha matukio ya mchezo. Misingi hii ya mgongano inatumiwa katika kila kitu kutoka kwa simu za fizikia hadi kwenye interfaces za wavuti za mwingiliano.
```mermaid
mindmap
root((Collision Detection))
Physics Concepts
Mipaka ya Mstatili
Upimaji wa Kukutana
Mifumo ya Kuratibu
Mantiki ya Kutenganisha
Game Objects
Mabomu ya Laser
Meli za Adui
Mhusika wa Shujaa
Maeneo ya Migongano
Lifecycle Management
Uundaji wa Vitu
Sasisho za Mwendo
Uwekaji alama wa Uharibifu
Usafishaji wa Kumbukumbu
Event Systems
Ingizo la Kibodi
Matukio ya Migongano
Mabadiliko ya Hali ya Mchezo
Athari za Sauti/Mwonekano
Performance
Algorithimu Chenye Ufanisi
Uboreshaji wa Kasi ya Fremu
Usimamizi wa Kumbukumbu
Mgawanyiko wa Eneo
```
✅ Fanya utafiti kidogo kuhusu mchezo wa kompyuta wa kwanza kabisa ulioandikwa. Ulifanyaje kazi?
## Kugundua Migongano
## Kugundua mgongano
Kugundua migongano hufanya kazi kama sensa za ukaribu kwenye moduli ya mwezi ya Apollo - kila wakati huchunguza umbali na kutoa tahadhari wakati vitu vinapokaribiana sana. Katika michezo, mfumo huu huamua wakati vitu vinapokutana na kinachotakiwa kutokea baadaye.
Kugundua mgongano hufanya kazi kama sensa za umbali katika moduli ya mwezi ya Apollo - huchunguza mara kwa mara umbali na kutoa tahadhari wakati vitu vinakaribia sana. Katika michezo, mfumo huu huamua wakati vitu vinapoingiliana na kinachopaswa kufanyika baadae.
Njia tutakayotumia inachukulia kila kitu cha mchezo kama mstatili, sawa na jinsi mifumo ya udhibiti wa trafiki ya anga inavyotumia maumbo ya kijiometri rahisi kufuatilia ndege. Njia hii ya mstatili inaweza kuonekana rahisi, lakini ni bora kiuhesabu na inafanya kazi vizuri kwa hali nyingi za mchezo.
Njia tunayojitumia hutibu kila kielelezo cha mchezo kama mraba, sawa na jinsi mifumo ya udhibiti wa usafiri wa anga inavyotumia maumbo rahisi ya jiometri kufuatilia ndege. Njia hii ya mraba inaweza kuonekana kuwa ya msingi, lakini ni yenye ufanisi wa kihesabu na hufanya kazi vizuri kwa hali nyingi za mchezo.
### Uwakilishi wa Mstatili
### Uwakilishi wa mraba
Kila kitu cha mchezo kinahitaji mipaka ya kuratibu, sawa na jinsi rover ya Mars Pathfinder ilivyopanga eneo lake kwenye uso wa Mars. Hivi ndivyo tunavyofafanua mipaka hii ya kuratibu:
Kila kielelezo cha mchezo kinahitaji mipaka ya viwango vya kuratibu, kama vile rover wa Mars Pathfinder alivyopanga mahali pake kwenye uso wa Mars. Hapa tunavyoelezea mipaka hii ya kuratibu:
```mermaid
flowchart TD
A["🎯 Kitu cha Mchezo"] --> B["📍 Nafasi (x, y)"]
A --> C["📏 Vipimo (upana, urefu)"]
B --> D["Juu: y"]
B --> E["Kushoto: x"]
C --> F["Chini: y + urefu"]
C --> G["Kulia: x + upana"]
D --> H["🔲 Mipaka ya Mstatili"]
E --> H
F --> H
G --> H
H --> I["Uko Tayari kwa Kugundua Mgongano"]
style A fill:#e3f2fd
style H fill:#e8f5e8
style I fill:#fff3e0
```
```javascript
rectFromGameObject() {
return {
@ -42,16 +109,38 @@ rectFromGameObject() {
}
```
**Hebu tuvunje hili:**
- **Ukingo wa juu**: Hapo ndipo kitu chako kinaanza wima (nafasi yake ya y)
- **Ukingo wa kushoto**: Hapo ndipo kinaanza mlalo (nafasi yake ya x)
- **Ukingo wa chini**: Ongeza urefu kwenye nafasi ya y - sasa unajua kinaishia wapi!
- **Ukingo wa kulia**: Ongeza upana kwenye nafasi ya x - na umepata mipaka kamili
**Hebu tuvunje haya:**
- **Kipande cha juu**: Huko ndiko kielelezo kinaanzia kwa usawa (nafasi yake ya y)
- **Kipande cha kushoto**: Huko kielelezo kinaanzia kwa wima (nafasi yake ya x)
- **Kipande cha chini**: Ongeza urefu kwenye nafasi ya y - sasa unajua kinapoisha!
- **Kipande cha kulia**: Ongeza upana kwenye nafasi ya x - na umepata kikomo kamili
### Algorithimu ya Mstatili
### Algorithm ya kutelezea
Kugundua migongano ya mistatili hutumia mantiki sawa na jinsi Teleskopu ya Anga ya Hubble inavyodhibiti kama vitu vya angani vinakutana katika uwanja wake wa maoni. Algorithimu huchunguza kutengana:
Kugundua kutelezea kwa mraba hutumia mantiki kama Hubble Space Telescope inavyogundua kama vitu vya angani vinaingiliana katika uwanja wake wa kuona. Algorithm huchunguza kama kuna utofauti:
```mermaid
flowchart LR
A["Mraba 1"] --> B{"Majaribio ya Mlinganyo"}
C["Mraba 2"] --> B
B --> D["R2 kushoto > R1 kulia?"]
B --> E["R2 kulia < R1 kushoto?"]
B --> F["R2 juu > R1 chini?"]
B --> G["R2 chini < R1 juu?"]
D --> H{"Kuna Kweli yoyote?"}
E --> H
F --> H
G --> H
H -->|Ndiyo| I["❌ Hakuna Mlinganyo"]
H -->|Hapana| J["✅ Mlinganyo Umegunduliwa"]
style B fill:#e3f2fd
style I fill:#ffebee
style J fill:#e8f5e8
```
```javascript
function intersectRect(r1, r2) {
return !(r2.left > r1.right ||
@ -61,60 +150,105 @@ function intersectRect(r1, r2) {
}
```
**Jaribio la kutengana hufanya kazi kama mifumo ya rada:**
- Je, mstatili 2 uko kabisa upande wa kulia wa mstatili 1?
- Je, mstatili 2 uko kabisa upande wa kushoto wa mstatili 1?
- Je, mstatili 2 uko kabisa chini ya mstatili 1?
- Je, mstatili 2 uko kabisa juu ya mstatili 1?
**Jaribio la utofauti hufanya kazi kama mifumo ya rada:**
- Je, mraba wa 2 uko kabisa upande wa kulia wa mraba wa 1?
- Je, mraba wa 2 uko kabisa upande wa kushoto wa mraba wa 1?
- Je, mraba wa 2 uko kabisa chini ya mraba wa 1?
- Je, mraba wa 2 uko kabisa juu ya mraba wa 1?
Ikiwa hakuna mojawapo ya hali hizi ni kweli, mistatili lazima iwe inakutana. Njia hii inaakisi jinsi waendeshaji wa rada wanavyodhibiti kama ndege mbili ziko umbali salama.
Kama hakuna mojawapo ya masharti haya ni kweli, basi mraba ni lazima yaingiliane. Njia hii inaakisi jinsi waendeshaji wa rada wanavyogundua kama ndege mbili ziko umbali salama.
## Kusimamia Mzunguko wa Maisha ya Vitu
## Kusimamia maisha ya vitu
Wakati laser inapopiga adui, vitu vyote viwili vinahitaji kuondolewa kwenye mchezo. Hata hivyo, kufuta vitu katikati ya mzunguko kunaweza kusababisha ajali - somo lililojifunza kwa njia ngumu katika mifumo ya kompyuta ya mapema kama Kompyuta ya Mwongozo ya Apollo. Badala yake, tunatumia njia ya "kuweka alama kwa kufutwa" ambayo huondoa vitu kwa usalama kati ya fremu.
Wakati laser inapomgonga adui, vitu vyote viwili vinapaswa kuondolewa kwenye mchezo. Hata hivyo, kufuta vitu katikati ya mzunguko kunaweza kusababisha crash - somo lililojifunzwa kwa njia ngumu katika mifumo ya awali ya kompyuta kama Apollo Guidance Computer. Badala yake, tunatumia njia ya "kuweka alama ya kufutwa" ambayo huondoa vitu kwa usalama kati ya mizunguko.
Hivi ndivyo tunavyoweka alama kwa kitu ili kuondolewa:
```mermaid
stateDiagram-v2
[*] --> Active: Kitu Kimeundwa
Active --> Collided: Kugongana Kumetambuliwa
Collided --> MarkedDead: Weka dead = true
MarkedDead --> Filtered: Fremu Ifuatayo
Filtered --> [*]: Kitu Kimeondolewa
Active --> OutOfBounds: Anaondoka Skrini
OutOfBounds --> MarkedDead
note right of MarkedDead
Salama kuendelea
fremu ya sasa
end note
note right of Filtered
Vitu vimeondolewa
kati ya fremu
end note
```
Hapa tunavyoweka alama ya kitu cha kuondoa:
```javascript
// Mark object for removal
// Taja kitu kwa ajili ya kuondolewa
enemy.dead = true;
```
**Kwa nini njia hii inafanya kazi:**
- Tunaweka alama kwa kitu kama "kimekufa" lakini hatukifuti mara moja
- Hii inaruhusu fremu ya mchezo ya sasa kumalizika kwa usalama
- Hakuna ajali kutoka kwa kujaribu kutumia kitu ambacho tayari kimeondolewa!
**Kwa nini njia hii hufanya kazi:**
- Tunaweka alama ya kitu kama "kimekufa" lakini hatafuta mara moja
- Hii inaruhusu fremu ya sasa ya mchezo kukamilika kwa usalama
- Hakuna crash kutokana na jaribio la kutumia kitu ambacho kimetoweka!
Kisha chuja vitu vilivyowekwa alama kabla ya mzunguko wa uonyeshaji unaofuata:
Kisha chuja vitu vilivyo na alama kabla ya mzunguko wa uchoraji ufuatao:
```javascript
gameObjects = gameObjects.filter(go => !go.dead);
```
**Kile uchujaji huu unachofanya:**
- Huunda orodha mpya yenye vitu "hai" pekee
- Hutupa chochote kilichowekwa alama kama kimekufa
- Huweka mchezo wako ukiendelea vizuri
- Huzuia kujaa kwa kumbukumbu kutokana na vitu vilivyoharibiwa
**Kuchuja kunafanya:**
- Kuunda orodha safi na vitu "hai" tu
- Kuondoa chochote kilicho na alama ya kifo
- Kuweka mchezo ukicheza kwa wasiwasi mdogo
- Kuzuia mkusanyiko wa kumbukumbu wa vitu vilivyoangamiza
## Kutekeleza Mitambo ya Laser
## Kutekeleza mitambo ya laser
Vitu vya laser katika michezo hufanya kazi kwa kanuni sawa na torpedoes za photon katika Star Trek - ni vitu tofauti vinavyosafiri kwa mistari ya moja kwa moja hadi vinapopiga kitu. Kila bonyeza ya spacebar huunda kitu kipya cha laser kinachosogea kwenye skrini.
Projectiles za laser katika michezo hufanya kazi kwa kanuni ile ile kama torpedo za photon katika Star Trek - ni vitu vinavyosafiri kwa mstari hadi viripukie kitu. Kila bonyeza la spacebar linaunda kitu cha laser kinachosogea kwenye skrini.
Ili kufanya kazi hii, tunahitaji kuratibu vipande kadhaa tofauti:
Ili kufanya kazi hii, tunahitaji kuratibu vipengele kadhaa tofauti:
**Vipengele muhimu vya kutekeleza:**
- **Unda** vitu vya laser vinavyozaliwa kutoka kwa nafasi ya shujaa
- **Shughulikia** pembejeo za kibodi ili kuchochea uundaji wa laser
- **Simamia** harakati za laser na mzunguko wa maisha
- **Tekeleza** uwakilishi wa kuona kwa vitu vya laser
- **Unda** vitu vya laser vinavyojitokeza kutoka kwenye nafasi ya shujaa
- **Simamia** ingizo la kibodi kuzindua uundaji wa laser
- **Dhibiti** harakati za laser na maisha yake
- **Tekeleza** uwakilishi wa kuona kwa projectiles za laser
## Kutekeleza Udhibiti wa Kiwango cha Kufyatua
## Kutekeleza udhibiti wa kiwango cha moto wa risasi
Viwango vya kufyatua visivyo na kikomo vingezidi injini ya mchezo na kufanya mchezo kuwa rahisi sana. Mifumo halisi ya silaha inakabiliwa na vikwazo sawa - hata phasers za USS Enterprise zilihitaji muda wa kujazwa tena kati ya risasi.
Kiwango kisichokoma cha kupiga risasi kingeharibu injini ya mchezo na kufanya mchezo kuwa rahisi sana. Mifumo halisi ya silaha hukabiliana na vikwazo sawa - hata phasers za USS Enterprise zilihitaji muda wa kujaza tena kabla ya kupiga tena.
Tutatekeleza mfumo wa kupoa ambao unazuia kufyatua haraka-haraka huku ukidumisha udhibiti wa haraka:
Tutatekeleza mfumo wa baridi unaozuia kurushwa kwa haraka sana huku ukihakikisha udhibiti unakuwa wa haraka:
```mermaid
sequenceDiagram
participant Player
participant Weapon
participant Cooldown
participant Game
Player->>Weapon: Bonyeza Spacebar
Weapon->>Cooldown: Angalia kama ipo baridi
alt Weapon iko Tayari
Cooldown->>Weapon: baridi = kweli
Weapon->>Game: Tengeneza Laser
Weapon->>Cooldown: Anza baridi mpya
Cooldown->>Cooldown: baridi = sio kweli
Note over Cooldown: Subiri 500ms
Cooldown->>Cooldown: baridi = kweli
else Weapon iko Baridi
Cooldown->>Weapon: baridi = sio kweli
Weapon->>Player: Hakuna hatua
end
```
```javascript
class Cooldown {
constructor(time) {
@ -132,44 +266,60 @@ class Weapon {
fire() {
if (!this.cooldown || this.cooldown.cool) {
// Create laser projectile
// Tengeneza mionzi wa laser
this.cooldown = new Cooldown(500);
} else {
// Weapon is still cooling down
// Silaha bado inapoa
}
}
}
```
**Jinsi kupoa kunavyofanya kazi:**
- Wakati inaundwa, silaha huanza "moto" (haiwezi kufyatua bado)
- Baada ya muda wa kusubiri, inakuwa "baridi" (tayari kufyatua)
- Kabla ya kufyatua, tunakagua: "Je, silaha ni baridi?"
- Hii inazuia kubonyeza mara kwa mara huku ikidumisha udhibiti wa haraka
**Jinsi mfumo wa baridi unavyofanya kazi:**
- Inapoanzishwa, silaha huwa "moto" (haiwezi kupiga bado)
- Baada ya kipindi cha muda wa kung'oa moto, huwa "baridi" (iko tayari kupiga)
- Kabla ya kupiga, tunakagua: "Je, silaha iko baridi?"
- Hii huzuia bonyeza kwa haraka huku ikidumisha udhibiti wa haraka
✅ Rejelea somo la 1 katika mfululizo wa mchezo wa anga ili ukumbuke kuhusu baridi za kupiga risasi.
## Kujenga mfumo wa kugundua mgongano
✅ Rejelea somo la 1 katika mfululizo wa mchezo wa anga ili kujikumbusha kuhusu vipindi vya kupoa.
Utaongeza msimbo wako wa mchezo wa anga uliopo kuunda mfumo wa kugundua mgongano. Kama mfumo wa kuepuka mgongano wa Automated wa kituo cha Anga la Kimataifa, mchezo wako utafuatilia nafasi za vitu kwa kuendelea na kujibu migongano.
## Kujenga Mfumo wa Kugundua Migongano
Kutoka msimbo wa somo lako la awali, utaongeza kugundua mgongano na sheria maalum zinazosimamia mwingiliano wa vitu.
Utaongeza msimbo uliopo wa mchezo wako wa anga ili kuunda mfumo wa kugundua migongano. Kama mfumo wa kuepuka migongano wa Kituo cha Kimataifa cha Anga, mchezo wako utafuatilia kila wakati nafasi za vitu na kujibu mikutano.
> 💡 **Ushauri Mtaalamu**: Picha ya laser tayari iko kwenye folda yako ya mali na imerejelewa kwenye msimbo wako, tayari kwa utekelezaji.
Kuanzia na msimbo wa somo lako la awali, utaongeza kugundua migongano na sheria maalum zinazodhibiti mwingiliano wa vitu.
### Sheria za mgongano za kutekeleza
> 💡 **Ushauri wa Kitaalam**: Sprite ya laser tayari imejumuishwa kwenye folda yako ya mali na inarejelewa kwenye msimbo wako, tayari kutekelezwa.
**Mifumo ya mchezo ya kuongeza:**
1. **Laser inapogonga adui**: Kielelezo cha adui hubomolewa linapogongwa na projectile ya laser
2. **Laser inapogonga kikomo cha skrini**: Laser huondolewa linapofika upande wa juu wa skrini
3. **Mgongano wa adui na shujaa**: Vitu vyote viwili hubomolewa wanapoingiliana
4. **Adui anapofika chini**: Halali ya mchezo kuisha wakati maadui wanapofika chini ya skrini
### Sheria za Migongano za Kutekeleza
### 🔄 **Ukaguzi wa Kifundisho**
**Msingi wa Kugundua Mgongano**: Kabla ya kutekeleza, hakikisha unaelewa:
- ✅ Jinsi mipaka ya mraba inavyofafanua maeneo ya mgongano
- ✅ Kwa nini jaribio la utofauti ni bora zaidi kuliko hesabu ya kutelezea
- ✅ Umuhimu wa kusimamia maisha ya kitu katika mizunguko ya mchezo
- ✅ Jinsi mifumo inayosababishwa na matukio inavyoratibu majibu ya mgongano
**Mitambo ya mchezo ya kuongeza:**
1. **Laser inapiga adui**: Kitu cha adui kinaharibiwa kinapopigwa na laser
2. **Laser inapopiga mipaka ya skrini**: Laser huondolewa inapofikia ukingo wa juu wa skrini
3. **Migongano ya adui na shujaa**: Vitu vyote viwili vinaharibiwa vinapokutana
4. **Adui anafikia chini**: Hali ya mchezo kuisha wakati maadui wanapofikia chini ya skrini
**Jaribio la Kwajili Yako**: Nini kingetokea kama ungefuta vitu mara moja badala ya kuweka alama?
*Jibu: Kufuta katikati ya mzunguko kunaweza kusababisha crash au kuruka vitu katika mzunguko*
## Kuweka Mazingira ya Maendeleo
**Ufahamu wa Fizikia**: Sasa unaelewa:
- **Mifumo ya Kuaratibu**: Jinsi nafasi na vipimo vinavyounda mipaka
- **Mantiki ya Kutelezea**: Kanuni za kihesabu nyuma ya kugundua mgongano
- **Uboreshaji wa Utendaji**: Kwa nini algorithms zenye ufanisi ni muhimu katika mifumo ya wakati halisi
- **Usimamizi wa Kumbukumbu**: Mifumo salama ya maisha ya vitu kwa uthabiti
Habari njema - tayari tumeweka msingi mwingi kwa ajili yako! Mali zote za mchezo wako na muundo wa msingi zinasubiri kwenye folda ya `your-work`, tayari kwako kuongeza vipengele vya kugundua migongano.
## Kuweka mazingira ya maendeleo
### Muundo wa Mradi
Habari njema - tayari tumeweka msingi mkubwa kwa ajili yako! Mali zako zote za mchezo na muundo wa msingi upo katika folda ndogo ya `your-work`, tayari kwa wewe kuongeza vipengele vya mgongano yenye nguvu.
### Muundo wa mradi
```bash
-| assets
@ -183,33 +333,58 @@ Habari njema - tayari tumeweka msingi mwingi kwa ajili yako! Mali zote za mchezo
**Kuelewa muundo wa faili:**
- **Inajumuisha** picha zote za sprite zinazohitajika kwa vitu vya mchezo
- **Inajumuisha** hati kuu ya HTML na faili ya programu ya JavaScript
- **Inatoa** usanidi wa kifurushi kwa seva ya maendeleo ya ndani
- **Inajumuisha** hati kuu ya HTML na faili la programu ya JavaScript
- **Inatoa** usanidi wa kifurushi kwa server ya maendeleo ya ndani
### Kuanza Seva ya Maendeleo
### Kuanza server ya maendeleo
Elekea kwenye folda ya mradi wako na anzisha seva ya ndani:
Elekea kwenye folda ya mradi wako na anzisha server ya ndani:
```bash
cd your-work
npm start
```
**Mfululizo huu wa amri:**
- **Hubadilisha** folda hadi folda ya mradi wako wa kazi
- **Huanzisha** seva ya HTTP ya ndani kwenye `http://localhost:5000`
- **Hutoa** faili za mchezo wako kwa majaribio na maendeleo
- **Huwezesha** maendeleo ya moja kwa moja na upakiaji wa kiotomatiki
**Mfuatano wa amri huu:**
- **Hubadilisha** saraka kwenda folda ya mradi unaofanya kazi
- **Huanzisha** server ya HTTP ya ndani kwenye `http://localhost:5000`
- **Hutumikia** faili za mchezo wako kwa ajili ya majaribio na maendeleo
- **Huwezesha** maendeleo ya moja kwa moja na upyaaji wa kiotomatiki
Fungua kivinjari chako na elekea `http://localhost:5000` ili kuona hali ya sasa ya mchezo wako na shujaa na maadui wakionyeshwa kwenye skrini.
Fungua kivinjari chako na elekea `http://localhost:5000` kuona hali ya sasa ya mchezo wako ikiwa shujaa na maadui wanaonyeshwa kwenye skrini.
### Utekelezaji Hatua kwa Hatua
### Utekelezaji hatua kwa hatua
Kama njia ya kimfumo NASA ilivyotumia kuandika programu ya chombo cha anga cha Voyager, tutatekeleza kugundua migongano kwa utaratibu, tukijenga kila kipengele hatua kwa hatua.
Kama ilivyokuwa mbinu ya mfumo wa NASA wa kuprogramu meli za Voyager, tutatekeleza kugundua mgongano kwa utaratibu, tukijenga kila kipengele hatua kwa hatua.
#### 1. Ongeza Mipaka ya Migongano ya Mstatili
```mermaid
flowchart TD
A["1. Mipaka ya Mraba"] --> B["2. Ugundaji wa Kukutana"]
B --> C["3. Mfumo wa Laser"]
C --> D["4. Usindikaji wa Matukio"]
D --> E["5. Sheria za Mbinguni"]
E --> F["6. Mfumo wa Kupumzika"]
G["Mipaka ya Kiini"] --> A
H["Algoriti ya Fizikia"] --> B
I["Uundaji wa Risasi"] --> C
J["Ingizo la Kibodi"] --> D
K["Mantiki ya Mchezo"] --> E
L["Kuzuia Kiwango"] --> F
F --> M["🎮 Mchezo Kamili"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
style M fill:#e1f5fe
```
#### 1. Ongeza mipaka ya mgongano ya mraba
Kwanza, hebu tufundishe vitu vya mchezo wetu jinsi ya kuelezea mipaka yao. Ongeza njia hii kwenye darasa lako la `GameObject`:
Kwanza, tuelekee kufundisha vitu vya mchezo jinsi ya kuelezea mipaka yao. Ongeza njia hii kwenye darasa lako la `GameObject`:
```javascript
rectFromGameObject() {
@ -222,15 +397,15 @@ rectFromGameObject() {
}
```
**Njia hii inakamilisha:**
- **Huunda** kitu cha mstatili chenye mipaka sahihi ya kuratibu
- **Huhesabu** ukingo wa chini na wa kulia kwa kutumia nafasi pamoja na vipimo
- **Hurejesha** kitu tayari kwa algorithimu za kugundua migongano
- **Hutoa** interface ya kawaida kwa vitu vyote vya mchezo
**Njia hii hufanikisha:**
- **Inaunda** kielelezo cha mraba chenye mipaka sahihi ya kuratibu
- **Hesabu** vipande vya chini na kulia kwa kutumia nafasi na vipimo
- **Inarudisha** kielelezo tayari kwa algorithms za kugundua mgongano
- **Inatoa** interface iliyo sanifu kwa vitu vyote vya mchezo
#### 2. Tekeleza Kugundua Migongano
#### 2. Tekeleza kugundua kutelezea
Sasa hebu tuunde mpelelezi wa migongano - kazi inayoweza kusema wakati mistatili miwili inakutana:
Sasa tuitengeneze mgunduzi wetu wa mgongano - kazi inayoweza kusema wakati mraba mbili zinapoingiliana:
```javascript
function intersectRect(r1, r2) {
@ -243,19 +418,19 @@ function intersectRect(r1, r2) {
}
```
**Algorithimu hii inafanya kazi kwa:**
- **Inajaribu** hali nne za kutengana kati ya mistatili
- **Inarejesha** `false` ikiwa hali yoyote ya kutengana ni kweli
- **Inaonyesha** migongano wakati hakuna kutengana
- **Inatumia** mantiki ya kukanusha kwa majaribio ya migongano yenye ufanisi
**Algorithm hii hufanya kazi kwa:**
- **Kujaribu** masharti manne ya utofauti kati ya mraba
- **Kurudisha** `false` kama mojawapo ya masharti ya utofauti ni kweli
- **Kuelezea** mgongano wakati hakuna utofauti
- **Kutumia** mantiki ya kukanusha kwa jaribio la kutelezea kwa ufanisi
#### 3. Tekeleza Mfumo wa Kufyatua Laser
#### 3. Tekeleza mfumo wa kurushia laser
Hapa ndipo mambo yanapokuwa ya kusisimua! Hebu tuweke mfumo wa kufyatua laser.
Hapa ndipo mambo yanapopendeza! Tuweke mfumo wa kurusha laser.
##### Aina za Ujumbe
##### Hati za ujumbe
Kwanza, hebu tueleze aina za ujumbe ili sehemu tofauti za mchezo wetu ziweze kuwasiliana:
Kwanza, tuelekeze aina za ujumbe ili sehemu tofauti za mchezo wetu ziweze kuwasiliana:
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
@ -263,14 +438,14 @@ COLLISION_ENEMY_LASER: "COLLISION_ENEMY_LASER",
COLLISION_ENEMY_HERO: "COLLISION_ENEMY_HERO",
```
**Aina hizi za ujumbe zinatoa:**
- **Husanifisha** majina ya matukio katika programu
- **Huwezesha** mawasiliano thabiti kati ya mifumo ya mchezo
- **Huzuia** makosa ya herufi katika usajili wa vishikaji vya matukio
**Vitambulisho hivi hutoa:**
- **Sanifisha** majina ya matukio katika programu
- **Kuwezesha** mawasiliano thabiti kati ya mifumo ya mchezo
- **Kuzuia** makosa ya kuandika kwa usajili wa wachunguzi wa matukio
##### Ushughulikiaji wa Pembejeo za Kibodi
##### Kushughulikia ingizo la kibodi
Ongeza utambuzi wa kitufe cha nafasi kwenye msikilizaji wa matukio ya kibodi:
Ongeza utambuzi wa funguo za space kwenye msikilizaji wa matukio ya kibodi:
```javascript
} else if(evt.keyCode === 32) {
@ -278,14 +453,14 @@ Ongeza utambuzi wa kitufe cha nafasi kwenye msikilizaji wa matukio ya kibodi:
}
```
**Msikilizaji huu wa pembejeo:**
- **Hutambua** bonyeza za kitufe cha nafasi kwa kutumia keyCode 32
- **Hutoa** ujumbe wa tukio uliosanifishwa
- **Huwezesha** mantiki ya kufyatua iliyotenganishwa
**Msindikaji huu wa ingizo:**
- **Hutambua** mapigo ya kitufe cha space kwa kutumia keyCode 32
- **Hutuma** ujumbe wa tukio linalosanifiwa
- **Huwezesha** mantiki ya kurusha laser isiyoshikamana moja kwa moja
##### Usajili wa Msikilizaji wa Matukio
##### Kusanidi msikilizaji wa tukio
Sajili tabia ya kufyatua katika kazi yako ya `initGame()`:
Jiandikishe tabia ya kurusha katika kazi yako ya `initGame()`:
```javascript
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
@ -295,12 +470,12 @@ eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
});
```
**Msikilizaji wa matukio huu:**
- **Huitikia** matukio ya kitufe cha nafasi
- **Hukagua** hali ya kupoa ya kufyatua
- **Huchochea** uundaji wa laser inapowezekana
**Msikilizi huu wa tukio:**
- **Hujibu** matukio ya kitufe cha space
- **Hukagua** hali ya baridi kabla ya kurusha
- **Huanzisha** uundaji wa laser wakati inaruhusiwa
Ongeza usimamizi wa migongano kwa mwingiliano wa laser na adui:
Ongeza usindikaji wa mgongano kati ya laser na adui:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@ -309,14 +484,14 @@ eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
});
```
**Msimamizi wa migongano huu:**
- **Hupokea** data ya tukio la migongano na vitu vyote viwili
**Msindikaji huu wa mgongano:**
- **Hupokea** data ya tukio la mgongano na vitu vyote viwili
- **Huweka alama** vitu vyote viwili kwa kuondolewa
- **Hakikisha** usafi sahihi baada ya migongano
- **Huhakikisha** usafishaji sahihi baada ya mgongano
#### 4. Unda Darasa la Laser
#### 4. Unda darasa la Laser
Tekeleza laser inayosafiri juu na kusimamia mzunguko wake wa maisha:
Tekeleza projectile ya laser inayosogea juu na kusimamia maisha yake:
```javascript
class Laser extends GameObject {
@ -340,22 +515,22 @@ class Laser extends GameObject {
```
**Utekelezaji wa darasa hili:**
- **Hupanua** GameObject ili kurithi utendaji wa msingi
- **Huweka** vipimo vinavyofaa kwa sprite ya laser
- **Huunda** harakati za moja kwa moja za juu kwa kutumia `setInterval()`
- **Hushughulikia** kujiharibu inapofikia juu ya skrini
- **Husimamia** muda wake wa uhuishaji na usafi
- **Unapanua** GameObject kurithisha utendaji wa msingi
- **Unaweka** vipimo vinavyofaa kwa picha ya laser
- **Unda** harakati za moja kwa moja kwa kutumia `setInterval()`
- **Huongeza** uharibifu wa mwenyewe inapofika juu ya skrini
- **Hudhibiti** muda wake wa mzunguko na usafishaji
#### 5. Tekeleza Mfumo wa Kugundua Migongano
#### 5. Tekeleza mfumo wa kugundua mgongano
Unda kazi kamili ya kugundua migongano:
Unda kazi kamili ya kugundua mgongano:
```javascript
function updateGameObjects() {
const enemies = gameObjects.filter(go => go.type === 'Enemy');
const lasers = gameObjects.filter(go => go.type === "Laser");
// Test laser-enemy collisions
// Jaribu mgongano kati ya laser na adui
lasers.forEach((laser) => {
enemies.forEach((enemy) => {
if (intersectRect(laser.rectFromGameObject(), enemy.rectFromGameObject())) {
@ -367,22 +542,22 @@ function updateGameObjects() {
});
});
// Remove destroyed objects
// Ondoa vitu vilivyoharibiwa
gameObjects = gameObjects.filter(go => !go.dead);
}
```
**Mfumo huu wa migongano:**
- **Huchuja** vitu vya mchezo kwa aina kwa majaribio yenye ufanisi
- **Hujaribu** kila laser dhidi ya kila adui kwa mikutano
- **Hutoa** matukio ya migongano wakati mikutano inatokea
- **Husafisha** vitu vilivyoharibiwa baada ya usindikaji wa migongano
**Mfumo huu wa mgongano:**
- **Huchuja** vitu vya mchezo kwa aina kwa ufanisi
- **Hujaribu** kila laser dhidi ya kila adui kwa kutelezea
- **Huanzisha** matukio ya mgongano wakati kutelezea kunatambuliwa
- **Huhakikisha** usafishaji wa vitu vilivyoharibika baada ya usindikaji wa mgongano
> ⚠️ **Muhimu**: Ongeza `updateGameObjects()` kwenye mzunguko wako mkuu wa mchezo katika `window.onload` ili kuwezesha kugundua migongano.
> ⚠️ **Muhimu**: Ongeza `updateGameObjects()` kwenye mzunguko kuu wa mchezo katika `window.onload` ili kuwezesha kugundua mgongano.
#### 6. Ongeza Mfumo wa Kupoa kwa Darasa la Shujaa
#### 6. Ongeza mfumo wa baridi kwa darasa la Hero
Boresha darasa la Shujaa na mitambo ya kufyatua na udhibiti wa kiwango:
Boreshwa darasa la Hero na mitambo ya kurusha na udhibiti wa kiwango cha risasi:
```javascript
class Hero extends GameObject {
@ -414,44 +589,180 @@ class Hero extends GameObject {
}
```
**Kuelewa darasa la Shujaa lililoboreshwa:**
- **Huanzisha** kipima muda cha kupoa kwa sifuri (tayari kufyatua)
- **Huunda** vitu vya laser vilivyowekwa juu ya meli ya shujaa
- **Huweka** kipindi cha kupoa ili kuzuia kufyatua haraka-haraka
- **Hupunguza** kipima muda cha kupoa kwa kutumia masasisho ya msingi wa muda
- **Hutoa** ukaguzi wa hali ya kufyatua kupitia njia ya `canFire()`
**Kuelewa darasa lililoboreshwa la Hero:**
- **Huanzisha** kengele ya baridi kwa sifuri (iko tayari kurusha)
- **Hutengeneza** vitu vya laser vinavyoanzishwa juu ya chombo cha shujaa
- **Huweka** muda wa baridi kuzuia kurusha haraka
- **Hupunguza** kengele ya baridi kwa sasisho za kiotomatiki
- **Hutoa** ukaguzi wa hali ya kurusha kupitia njia `canFire()`
### 🔄 **Ukaguzi wa Kifundisho**
**Uelewa Kamili wa Mfumo**: Thibitisha ustadi wako wa mfumo wa mgongano:
- ✅ Je, mipaka ya mraba inaruhusu kugundua mgongano kwa ufanisi vipi?
- ✅ Kwa nini usimamizi wa maisha ya vitu ni muhimu kwa uthabiti wa mchezo?
- ✅ Mfumo wa baridi unazuia matatizo ya utendaji vipi?
- ✅ Nini nafasi ya usanifu unaotegemea matukio katika usindikaji wa mgongano?
**Muunganiko wa Mfumo**: Kugundua mgongano kwako kunaonyesha:
- **Usahihi wa Kihesabu**: Algorithm za kutelezea mraba
- **Uboreshaji wa Utendaji**: Mfano wa jaribio la mgongano lenye ufanisi
- **Usimamizi wa Kumbukumbu**: Kuunda na kuharibu vitu kwa usalama
- **Uratibu wa Matukio**: Mawasiliano ya mifumo isiyounganishwa
- **Usindikaji wa Wakati Halisi**: Sasisho za mzunguko wa fremu
**Mifano ya Kitaalamu**: Umetekeleza:
- **Utengamano wa Masuala**: Fizikia, uchora, na ingizo zimegawanyika
- **Ubunifu unaoelekezwa na Kilele cha Vitu**: Urithi na polymorphism
- **Usimamizi wa Hali**: Maisha ya vitu na ufuatiliaji wa hali ya mchezo
- **Uboreshaji wa Utendaji**: Algorithm zenye ufanisi kwa matumizi ya wakati halisi
### Kupima utekelezaji wako
Mchezo wako wa anga sasa una mfumo kamili wa kugundua mgongano na mitambo ya mapigano. 🚀 Pima uwezo huu mpya:
- **Tumia** mihimili ya mshale kuhakiki udhibiti wa mzunguko
- **Piga laser** kwa kubonyeza spacebar - angalia jinsi baridi inavyozuia bonyeza mara kwa mara
- **Angalia migongano** wakati laser zinapogonga maadui, ikisababisha kuondolewa
- **Thibitisha usafishaji** wakati vitu vilivyoangamizwa vinaondoka kwenye mchezo
Umetekeleza kwa mafanikio mfumo wa kugundua mgongano ukitumia kanuni za kihesabu zinazoongoza uratibu wa meli za anga na roboti.
### ⚡ **Kile Unachoweza Kufanya Katika Dakika 5 Zijazo**
- [ ] Fungua DevTools za kivinjari na weka breakpoints katika kazi yako ya kugundua mgongano
- [ ] Jaribu kubadilisha kasi ya laser au harakati za adui kuona athari za mgongano
- [ ] Jaribu thamani tofauti za baridi ili kupima viwango vya risasi
- [ ] Ongeza taarifa za `console.log` kufuatilia matukio ya mgongano kwa wakati halisi
### 🎯 **Unaweza Kufanikisha Saa Hii**
- [ ] Kamilisha jaribio baada ya somo na kuelewa algorithms za utambuzi mgongano
- [ ] Ongeza athari za kuona kama mlipuko wakati mgongano unapotokea
- [ ] Tekeleza aina tofauti za risasi zenye sifa tofauti
- [ ] Unda power-ups zinazoongeza uwezo wa mchezaji kwa muda mfupi
- [ ] Ongeza athari za sauti kufanya migongano iwe ya kuridhisha zaidi
### 📅 **Mipango Yako ya Programu ya Fizikia kwa Wiki Nzima**
- [ ] Kamilisha mchezo kamili wa anga yenye mifumo ya mgongano iliyosafishwa
- [ ] Tekeleza maumbo ya mgongano yaliyo mbali zaidi ya mstatili (mizunguko, polygons)
- [ ] Ongeza mifumo ya chembe kwa athari za mlipuko halisi
- [ ] Unda tabia ngumu za maadui zenye kuepuka migongano
- [ ] Boresha utambuzi wa mgongano kwa utendaji bora na vitu vingi
- [ ] Ongeza maonyesho ya fizikia kama msukumo na mwendo halisi
### 🌟 **Ustadi Wako wa Fizikia wa Mchezo kwa Mwezi Mzima**
- [ ] Jenga michezo yenye engines za fizikia zilizoendelea na maonyesho halisi
- [ ] Jifunze utambuzi wa mgongano wa 3D na algorithms za mgawanyo wa nafasi
- [ ] Changia katika maktaba za fizikia za chanzo huria na engines za michezo
- [ ] Zaidi ujifunze uboreshaji wa utendaji kwa programu zenye picha nyingi
- [ ] Unda maudhui ya kielimu kuhusu fizikia ya mchezo na utambuzi wa migongano
- [ ] Jenga portfolio inayoonyesha ustadi wa programu za fizikia zilizoendelea
## 🎯 Ratiba Yako ya Ustadi wa Utambuzi wa Migongano
```mermaid
timeline
title Mchakato wa Kujifunza Ugunduzi wa Migongano & Fizikia za Mchezo
section Misingi (dakika 10)
Rectangle Math: Mifumo ya kuratibu
: Maendeleo ya mpaka
: Ufuatiliaji wa nafasi
: Usimamizi wa vipimo
section Ubunifu wa Algorithm (dakika 20)
Intersection Logic: Upimaji wa utofauti
: Ugunduzi wa kufunikana
: Uboreshaji wa utendaji
: Usimamizi wa matukio maalum
section Utekelezaji wa Mchezo (dakika 30)
Object Systems: Usimamizi wa mzunguko wa maisha
: Uratibu wa matukio
: Ufuatiliaji wa hali
: Usafishaji wa kumbukumbu
section Vipengele vya Kuingiliana (dakika 40)
Combat Mechanics: Mifumo ya mradi wa risasi
: Muda wa kupumzika kwa silaha
: Hesabu ya majeraha
: Mrejesho wa kuona
section Fizikia Zaidi (dakika 50)
Real-time Systems: Uboreshaji wa kiwango cha fremu
: Mgawanyo wa nafasi
: Mwitikio wa mgongano
: Mulinganisho wa fizikia
section Mbinu za Kitaalamu (wiki 1)
Game Engine Concepts: Mifumo ya vipengele
: Mifumo ya fizikia
: Uchanganuzi wa utendaji
: Uboreshaji wa majukwaa mbalimbali
section Matumizi ya Sekta (mwezi 1)
Production Skills: Uboreshaji wa kiwango kikubwa
: Ushirikiano wa timu
: Uendelezaji wa injini
: Utekelezaji wa jukwaa
```
### 🛠️ Muhtasari wa Zana zako za Fizikia za Mchezo
Baada ya kukamilisha somo hili, sasa umefikia:
- **Hisabati ya Migongano**: Algorithms za kukutana kwa mstatili na mifumo ya kuratibu
- **Uboreshaji wa Utendaji**: Utambuzi wa mgongano wenye ufanisi kwa matumizi ya wakati halisi
- **Usimamizi wa Mzunguko wa Maisha ya Vitu**: Mbinu salama za uundaji, uboreshaji, na uharibifu
- **Mikakati ya Tukio**: Mifumo isiyounganishwa kutoka kwa majibu ya mgongano
- **Muunganiko wa Mzunguko wa Mchezo**: Uboreshaji wa fizikia kwa fremu na kuratibu uchoraji
- **Mifumo ya Ingizo**: Udhibiti unaojibu kwa viwango vya kuzuia na mrejesho
- **Usimamizi wa Kumbukumbu**: Mifumo ya uokoaji vitu kwa ufanisi na mbinu za kusafisha
**Matumizi Halisi:** Ustadi wako wa utambuzi mgongano unatumika moja kwa moja kwa:
- **Maonyesho ya Kiingilio**: Uigaji wa kisayansi na zana za kielimu
- **Ubunifu wa Kiolesura cha Mtumiaji**: Mienendo ya kuburuta na kugusa
- **Uwasilishaji Data**: Chati zinazoshirikiana na vipengele vinavyoweza kubonyezwa
- **Maendeleo ya Simu**: Utambuzi wa ishara za kugusa na kushughulikia migongano
- **Uprogramu wa Roboti**: Upangaji njia na kuepuka vitu vizuilivu
- **Picha za Kompyuta**: Ufuatiliaji wa miale na algorithms za nafasi
**Ustadi Ulicho Pata Kitaalamu:** Sasa unaweza:
- **Kubuni** algorithms zenye ufanisi kwa utambuzi wa mgongano wa wakati halisi
- **Tekeleza** mifumo ya fizikia inayokua kwa ugumu wa vitu
- **Kagua** mifumo tata ya mwingiliano kwa kutumia kanuni za hisabati
- **Boresha** utendaji kwa vifaa tofauti na uwezo wa vivinjari
- **Sanifu** mifumo ya mchezo inayoweza kudumishwa kwa kutumia mitindo ya muundo iliyo thibitishwa
### Kupima Utekelezaji Wako
**Mafanikio ya Maendeleo ya Mchezo Uliyopata**:
- **Maigizo ya Fizikia**: Utambuzi wa migongano na majibu kwa wakati halisi
- **Uhandisi wa Utendaji**: Algorithms zilizo boreshwa kwa matumizi ya mwingiliano
- **Mifumo ya Tukio**: Mawasiliano yasiyounganishwa kati ya vipengele vya mchezo
- **Usimamizi wa Vitu**: Mifumo yenye ufanisi kwa mzunguko wa maisha wa maudhui yenye mabadiliko
- **Kushughulikia Ingizo**: Udhibiti unaojibu na mrejesho unaofaa
Mchezo wako wa anga sasa una mfumo kamili wa kugundua migongano na mitambo ya mapigano. 🚀 Jaribu uwezo mpya:
- **Elekea** kwa kutumia funguo za mshale ili kuthibitisha udhibiti wa harakati
- **Fyatua laser** kwa spacebar - angalia jinsi kupoa kunavyozuia kubonyeza mara kwa mara
- **Angalia migongano** wakati laser zinapopiga maadui, zikichochea kuondolewa
- **Thibitisha usafi** wakati vitu vilivyoharibiwa vinatoweka kutoka kwenye mchezo
**Kiwango Kifuatayo**: Uko tayari kuchunguza engines za fizikia zilizoendelea kama Matter.js, tekaleleza utambuzi wa mgongano wa 3D, au ujenge mifumo ngumu ya chembe!
Umefanikiwa kutekeleza mfumo wa kugundua migongano kwa kutumia kanuni zile zile za hisabati zinazotumika katika urambazaji wa vyombo vya anga na roboti.
🌟 **Mafanikio Yamefikiwa**: Umeunda mfumo kamili wa mwingiliano wa msingi wa fizikia wenye utambuzi wa mgongano wa kiwango cha kitaalamu!
## Changamoto ya Wakala wa GitHub Copilot 🚀
## GitHub Copilot Agent Changamoto 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia mode ya Mwakilishi kukamilisha changamoto ifuatayo:
**Maelezo:** Boresha mfumo wa kugundua migongano kwa kutekeleza nguvu za ziada zinazozaliwa kwa nasibu na kutoa uwezo wa muda mfupi zinapokusanywa na meli ya shujaa.
**Maelezo:** Boreshsha mfumo wa utambuzi mgongano kwa kutekeleza power-ups zinazozalishwa kwa nasibu na kutoa uwezo wa muda wakati zikusanywa na meli ya shujaa.
**Kichocheo:** Unda darasa la PowerUp linalopanua GameObject na utekeleze kugundua migongano kati ya shujaa na nguvu za ziada. Ongeza angalau aina mbili za nguvu za ziada: moja inayoongeza kiwango cha kufyatua (kupunguza kupoa) na nyingine inayounda ngao ya muda mfupi. Jumuisha mantiki ya kuzalisha nguvu za ziada kwa vipindi vya nasibu na nafasi.
**Maombi:** Unda darasa la PowerUp ambalo linaongeza GameObject na tekeleza utambuzi mgongano kati ya shujaa na power-ups. Ongeza angalau aina mbili za power-ups: moja inayoongeza kiwango cha moto (kupunguza muda wa kuweka tena) na nyingine inayounda ngao ya muda. Jumuisha mantiki ya kuzalisha power-ups kwa vipindi na maeneo vya nasibu.
---
## 🚀 Changamoto
Ongeza mlipuko! Angalia mali za mchezo katika [repo ya Space Art](../../../../6-space-game/solution/spaceArt/readme.txt) na jaribu kuongeza mlipuko wakati laser inapopiga mgeni.
Ongeza mlipuko! Angalia mali za mchezo katika [the Space Art repo](../../../../6-space-game/solution/spaceArt/readme.txt) na jaribu kuongeza mlipuko wakati laser inapogonga mgeni
## Maswali ya Baada ya Somo
## Jaribio Baada ya Forecho
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/36)
[Jaribio baada ya forecho](https://ff-quizzes.netlify.app/web/quiz/36)
## Mapitio na Kujisomea
## Mapitio & Kujisoma
Jaribu vipindi katika mchezo wako hadi sasa. Nini kinatokea unapovibadilisha? Soma zaidi kuhusu [matukio ya muda ya JavaScript](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
Jaribu mzunguko katika mchezo wako hadi sasa. Nini hutokea unapobadilisha? Soma zaidi kuhusu [matukio ya muda ya JavaScript](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
## Kazi
@ -459,5 +770,7 @@ Jaribu vipindi katika mchezo wako hadi sasa. Nini kinatokea unapovibadilisha? So
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya kiasili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kiarifa cha Dhima**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au upotoshaji. Hati asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inashauriwa. Hatutawalipii kwa taarifa potofu au tafsiri zisizo sahihi zitakazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,24 +1,88 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d642759cf1542f554871f74956a59af9",
"translation_date": "2025-10-24T19:44:06+00:00",
"original_hash": "2ed9145a16cf576faa2a973dff84d099",
"translation_date": "2026-01-07T01:37:55+00:00",
"source_file": "6-space-game/5-keeping-score/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 5: Alama na Maisha
## Maswali ya Awali ya Somo
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/37)
Tayari kufanya mchezo wako wa anga uhisi kama mchezo halisi? Hebu tuongeze alama za pointi na kudhibiti maisha - mbinu za msingi ambazo zilibadilisha michezo ya awali ya arcade kama Space Invaders kutoka maonyesho rahisi hadi burudani ya kuvutia. Hapa ndipo mchezo wako unakuwa wa kuchezeka kweli.
# Tengeneza Mchezo wa Anga Sehemu ya 5: Alama na Maisha
```mermaid
journey
title Safari Yako ya Ubunifu wa Mchezo
section Maoni ya Mchezaji
Elewa saikolojia ya alama: 3: Student
Jifunza mawasiliano ya kuona: 4: Student
Unda mifumo ya zawadi: 4: Student
section Utekelezaji wa Kifundi
Uchoraji maandishi kwenye Canvas: 4: Student
Usimamizi wa hali: 5: Student
Sasisho zinazoendeshwa na matukio: 5: Student
section Uboreshaji wa Mchezo
Ubunifu wa uzoefu wa mtumiaji: 5: Student
Sawa changamoto na zawadi: 5: Student
Tengeneza mchezo unaovutia: 5: Student
```
## Mtihani wa Kabla ya Darasa
[Mtihani wa kabla ya darasa](https://ff-quizzes.netlify.app/web/quiz/37)
Ume tayari kufanya mchezo wako wa anga uonekane kama mchezo halisi? Tuweke alama za pointi na kusimamia maisha - mifumo kuu iliyobadilisha michezo ya awali ya arcade kama Space Invaders kutoka maonyesho rahisi kuwa burudani inayovutia. Hapa ndipo mchezo wako unakuwa wa kuchezwa kweli.
```mermaid
mindmap
root((Mifumo ya Maoni ya Michezo))
Visual Communication
Text Rendering
Icon Display
Color Psychology
Layout Design
Scoring Mechanics
Point Values
Reward Timing
Progress Tracking
Achievement Systems
Life Management
Risk vs Reward
Player Agency
Difficulty Balance
Recovery Mechanics
User Experience
Immediate Feedback
Clear Information
Emotional Response
Engagement Loops
Implementation
Canvas API
State Management
Event Systems
Performance
```
## Kuchora Maandishi Kwenye Skrini - Sauti ya Mchezo Wako
Ili kuonyesha alama zako, tunahitaji kujifunza jinsi ya kuandika maandishi kwenye canvas. Njia ya `fillText()` ndiyo zana yako kuu kwa hili - ni mbinu ile ile iliyotumika katika michezo ya arcade ya zamani kuonyesha alama na taarifa za hali.
Ili kuonyesha alama yako, tunahitaji kujifunza jinsi ya kuonyesha maandishi kwenye kanvas. Njia ya `fillText()` ni zana yako kuu kwa hili - ni mbinu ile ile inayotumika katika michezo ya arcade ya zamani kuonyesha alama na taarifa za hali.
```mermaid
flowchart LR
A["📝 Yaliyomo ya Maandishi"] --> B["🎨 Mtindo"]
B --> C["📍 Uwekaji Nafasi"]
C --> D["🖼️ Uchoraji wa Kanvas"]
E["Familia ya Fonti"] --> B
F["Ukubwa wa Fonti"] --> B
G["Rangi"] --> B
H["Mlinganyo"] --> B
I["Koordineti ya X"] --> C
J["Koordineti ya Y"] --> C
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
```
Una udhibiti kamili juu ya muonekano wa maandishi:
```javascript
@ -28,24 +92,74 @@ ctx.textAlign = "right";
ctx.fillText("show this on the screen", 0, 0);
```
✅ Chunguza zaidi kuhusu [kuongeza maandishi kwenye canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text) - unaweza kushangazwa na jinsi unavyoweza kuwa mbunifu na fonti na mitindo!
## Maisha - Zaidi ya Nambari Tu
Katika muundo wa mchezo, "maisha" yanawakilisha nafasi ya mchezaji kufanya makosa. Dhana hii ilianza na mashine za pinball, ambapo ungepata mipira kadhaa ya kucheza nayo. Katika michezo ya video ya awali kama Asteroids, maisha yalipa wachezaji ruhusa ya kuchukua hatari na kujifunza kutokana na makosa.
Uwakilishi wa kuona ni muhimu sana - kuonyesha ikoni za meli badala ya tu "Maisha: 3" huunda utambuzi wa haraka wa kuona, sawa na jinsi kabati za arcade za awali zilivyotumia picha kuwasiliana bila kujali vizuizi vya lugha.
## Kujenga Mfumo wa Tuzo wa Mchezo Wako
Sasa tutaweka mifumo ya maoni ya msingi inayowafanya wachezaji waendelee kucheza:
- **Mfumo wa alama**: Kila meli ya adui iliyoharibiwa inatoa alama 100 (nambari za mviringo ni rahisi kwa wachezaji kuhesabu kiakili). Alama zinaonyeshwa kwenye kona ya chini kushoto.
- **Kipima maisha**: Shujaa wako anaanza na maisha matatu - kiwango kilichowekwa na michezo ya arcade ya awali ili kusawazisha changamoto na uchezaji. Kila mgongano na adui unagharimu maisha moja. Tutaonyesha maisha yaliyobaki kwenye kona ya chini kulia kwa kutumia ikoni za meli ![picha ya maisha](../../../../translated_images/life.6fb9f50d53ee0413cd91aa411f7c296e10a1a6de5c4a4197c718b49bf7d63ebf.sw.png).
✅ Jitumbukize zaidi kwenye [kuongeza maandishi kwenye kanvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text) - unaweza kushangaa jinsi unavyoweza kuwa mbunifu kwa kutumia fonti na mtindo!
## Maisha - Zaidi ya Nambari tu
Katika muundo wa michezo, "maisha" yanawakilisha nafasi ya mchezaji ya kufanya makosa. Dhana hii inarudi kwenye mashine za pinball, ambapo unapaswa kupata mipira mingi ya kucheza nayo. Katika michezo ya video ya mapema kama Asteroids, maisha yaliruhusu wachezaji kuchukua hatari na kujifunza kutoka kwa makosa.
```mermaid
flowchart TD
A["🎮 Hatua ya Mchezaji"] --> B{"Tathmini ya Hatari"}
B --> C["Hatari Kubwa, Zawadi Kubwa"]
B --> D["Mkakati Salama"]
C --> E{"Matokeo"}
D --> F["Maendeleo Thabiti"]
E -->|Mafanikio| G["🏆 Alama Kubwa"]
E -->|Kushindwa| H["💔 Poteza Maisha"]
H --> I{"Maisha Yabaki?"}
I -->|Ndio| J["🔄 Jaribu Tena"]
I -->|Hapana| K["💀 Mchezo Umeisha"]
J --> B
G --> B
F --> B
style C fill:#ffebee
style D fill:#e8f5e8
style G fill:#e3f2fd
style H fill:#fff3e0
```
Uwakilishi wa kuona una umuhimu mkubwa - kuonyesha ikoni za meli badala ya "Maisha: 3" hutengeneza utambuzi wa haraka wa kuona, sawa na jinsi makabati ya arcade za zamani zilivyotumia alama kuwasiliana kati ya lugha mbalimbali.
## Kujenga Mfumo wa Tuzo za Mchezo Wako
Sasa tutaweka mifumo ya mawazo ya msingi inayowafanya wachezaji waendelee kushiriki:
```mermaid
sequenceDiagram
participant Player
participant GameEngine
participant ScoreSystem
participant LifeSystem
participant Display
Player->>GameEngine: Anapiga Adui
GameEngine->>ScoreSystem: Toa Pointi
ScoreSystem->>ScoreSystem: +100 pointi
ScoreSystem->>Display: Sasisha Pointi
Player->>GameEngine: Anagongana na Adui
GameEngine->>LifeSystem: Poteza Maisha
LifeSystem->>LifeSystem: -1 maisha
LifeSystem->>Display: Sasisha Maisha
alt Maisha > 0
LifeSystem->>Player: Endelea Kucheza
else Maisha = 0
LifeSystem->>GameEngine: Mchezo Umeisha
end
```
- **Mfumo wa alama**: Kila meli ya adui iliyoharibiwa huleta pointi 100 (nambari za mduara ni rahisi kwa wachezaji kuhesabu kichwani). Alama zinaonyeshwa upande wa chini kushoto.
- **Kihesabu maisha**: Shujaa wako anaanza na maisha matatu - kiwango kilichowekwa na michezo ya awali ya arcade kulingana na changamoto na urahisi wa kucheza. Kila mgongano na adui hukupotezea maisha moja. Tutaonyesha maisha yaliyobaki upande wa chini kulia kwa kutumia ikoni za meli ![life image](../../../../translated_images/life.6fb9f50d53ee0413.sw.png).
## Hebu Tuanze Kujenga!
## Twende Kwenye Ujenzi!
Kwanza, andaa mazingira yako ya kazi. Nenda kwenye faili katika folda yako ndogo ya `your-work`. Unapaswa kuona faili hizi:
Kwanza, andaa eneo lako la kazi. Nenda kwenye faili ziko katika folda ndogo ya `your-work`. Unapaswa kuona faili hizi:
```bash
-| assets
@ -64,17 +178,42 @@ cd your-work
npm start
```
Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii kwenye kivinjari chako ili kuona mchezo wako. Jaribu vidhibiti kwa funguo za mshale na jaribu kupiga adui ili kuthibitisha kila kitu kinafanya kazi.
### Muda wa Kuandika Nambari!
Hii inaendesha seva ya ndani kwa anwani `http://localhost:5000`. Fungua anwani hii kwenye kivinjari chako ili kuona mchezo wako. Jaribu kuendesha na mishale ya panya na jaribu kupiga risasi adui kuhakikisha kila kitu kinafanya kazi.
```mermaid
flowchart TD
A["1. Kupakia Mali"] --> B["2. Vigezo vya Mchezo"]
B --> C["3. Kugundua Mgongano"]
C --> D["4. Kuboresha Shujaa"]
D --> E["5. Kazi za Kuonyesha"]
E --> F["6. Wasimamizi wa Matukio"]
G["Picha ya Alama ya Maisha"] --> A
H["Ufuatiliaji wa Alama & Maisha"] --> B
I["Sehemu za Shujaa-Adui"] --> C
J["Njia za Alama & Maisha"] --> D
K["Uchoraji wa Maandishi & Alama"] --> E
L["Mantiki ya Tuzo & Adhabu"] --> F
F --> M["🎮 Mchezo Umekamilika"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
style M fill:#e1f5fe
```
### Wakati wa Kuandika Msimbo!
1. **Chukua mali za kuona unazohitaji**. Nakili mali ya `life.png` kutoka folda ya `solution/assets/` hadi folda yako ya `your-work`. Kisha ongeza lifeImg kwenye kazi yako ya window.onload:
1. **Pata mali za kuona unazohitaji**. Nakili mali ya `life.png` kutoka folda ya `solution/assets/` kwenda kwenye folda yako ya `your-work`. Kisha ongeza lifeImg kwenye function yako ya window.onload:
```javascript
lifeImg = await loadTexture("assets/life.png");
```
1. Usisahau kuongeza `lifeImg` kwenye orodha yako ya mali:
1. Usisahau kuongeza `lifeImg` kwenye orodha ya mali zako:
```javascript
let heroImg,
@ -84,9 +223,9 @@ Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii k
eventEmitter = new EventEmitter();
```
2. **Sanidi vigezo vya mchezo wako**. Ongeza nambari kufuatilia alama zako za jumla (kuanzia 0) na maisha yaliyobaki (kuanzia 3). Tutaonyesha hizi kwenye skrini ili wachezaji daima wajue wanasimama wapi.
2. **Andaa vigezo vya mchezo wako**. Ongeza msimbo wa kufuatilia jumla ya alama zako (kuanza kwa 0) na maisha yaliyobaki (kuanza kwa 3). Tutaonyesha haya skrini ili wachezaji waweze kuona hali zao kila wakati.
3. **Tekeleza utambuzi wa mgongano**. Panua kazi yako ya `updateGameObjects()` ili kugundua wakati adui wanagongana na shujaa wako:
3. **Tekeleza ugunduzi wa migongano**. Eneo la kuongeza kwenye function yako ya `updateGameObjects()` ili kugundua wakati maadui wamagongana na shujaa wako:
```javascript
enemies.forEach(enemy => {
@ -97,15 +236,15 @@ Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii k
})
```
4. **Ongeza ufuatiliaji wa maisha na pointi kwa Shujaa wako**.
1. **Anzisha kaunta**. Chini ya `this.cooldown = 0` katika darasa lako la `Hero`, sanidi maisha na pointi:
4. **Ongeza kufuatilia maisha na pointi kwa Shujaa wako**.
1. **Anzisha kihesabu**. Chini ya `this.cooldown = 0` katika darasa lako la `Hero`, andaa maisha na pointi:
```javascript
this.life = 3;
this.points = 0;
```
1. **Onyesha maadili haya kwa mchezaji**. Unda kazi za kuchora maadili haya kwenye skrini:
1. **Onyesha thamani hizi kwa mchezaji**. Unda functions za kuchora thamani hizi kwenye skrini:
```javascript
function drawLife() {
@ -132,18 +271,34 @@ Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii k
```
1. **Unganisha kila kitu kwenye mzunguko wa mchezo wako**. Ongeza kazi hizi kwenye kazi yako ya window.onload mara tu baada ya `updateGameObjects()`:
1. **Unganisha kila kitu kwenye mzunguko wako wa mchezo**. Ongeza functions hizi kwenye window.onload yako mara baada ya `updateGameObjects()`:
```javascript
drawPoints();
drawLife();
```
1. **Tekeleza matokeo na tuzo za mchezo**. Sasa tutaongeza mifumo ya maoni inayofanya vitendo vya mchezaji kuwa na maana:
### 🔄 **Uhakiki wa Kifundisho**
**Uelewa wa Muundo wa Mchezo**: Kabla ya kutekeleza matokeo, hakikisha unaelewa:
- ✅ Jinsi maoni ya kuona yanavyowasilisha hali ya mchezo kwa wachezaji
- ✅ Kwanini kuweka vitu vya UI mahali pake huwa bora kwa urahisi wa matumizi
- ✅ Saikolojia nyuma ya thamani za pointi na usimamizi wa maisha
- ✅ Jinsi kuonyesha maandishi kwenye kanvas kunavyotofautiana na maandishi ya HTML
**Jaribio la Haraka la Kujijitathmini**: Kwa nini michezo ya arcade kawaida hutumia nambari za mduara kwa pointi?
*Jibu: Nambari za mduara ni rahisi kwa wachezaji kuhesabu kichwani na hutoa zawadi za kisaikolojia zinazoridhisha*
**Misingi ya Uzoefu wa Mtumiaji**: Sasa unatumia:
- **Madaraja ya Kuona**: Taarifa muhimu zipo mahali pa wazi
- **Maoni ya Haraka**: Mabadiliko ya wakati halisi kwa vitendo vya mchezaji
- **Mzigo wa Kifikra**: Uwasilishaji rahisi na wazi wa taarifa
- **Muundo wa Hisia**: Ikoni na rangi zinazoanzisha uhusiano wa mchezaji
1. **Migongano inagharimu maisha**. Kila wakati shujaa wako anagongana na adui, unapaswa kupoteza maisha.
1. **Tekeleza matokeo na zawadi za mchezo**. Sasa tutaongeza mifumo ya maoni inayofanya vitendo vya mchezaji kuwa na maana:
1. **Migongano huharibu maisha**. Kila wakati shujaa wako anagongana na adui, unapaswa kupoteza maisha moja.
Ongeza njia hii kwenye darasa lako la `Hero`:
Ongeza njia hii kwa darasa lako la `Hero`:
```javascript
decrementLife() {
@ -154,17 +309,17 @@ Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii k
}
```
2. **Kupiga adui kunapata pointi**. Kila hit sahihi inatoa alama 100, ikitoa maoni ya haraka ya chanya kwa upigaji sahihi.
Panua darasa lako la Hero na njia hii ya kuongeza:
2. **Kupiga risasi adui huleta pointi**. Kila risasi inayoelekezwa kwa usahihi huleta pointi 100, ikitoa maoni mazuri mara moja kwa kupiga risasi kwa usahihi.
Panua darasa lako la Hero kwa njia hii ya kuongeza alama:
```javascript
incrementPoints() {
this.points += 100;
}
```
Sasa unganisha kazi hizi kwenye matukio ya mgongano:
Sasa ungana functions hizi na matukio ya migongano:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@ -179,41 +334,177 @@ Hii inaendesha seva ya ndani kwenye `http://localhost:5000`. Fungua anwani hii k
});
```
✅ Unavutiwa na michezo mingine iliyojengwa kwa JavaScript na Canvas? Fanya uchunguzi - unaweza kushangazwa na kile kinachowezekana!
Baada ya kutekeleza vipengele hivi, jaribu mchezo wako ili kuona mfumo kamili wa maoni ukifanya kazi. Unapaswa kuona ikoni za maisha kwenye kona ya chini kulia, alama zako kwenye kona ya chini kushoto, na uone jinsi migongano inavyopunguza maisha huku risasi sahihi zikiongeza alama zako.
Mchezo wako sasa una mbinu muhimu ambazo zilifanya michezo ya arcade ya awali kuwa ya kuvutia - malengo wazi, maoni ya haraka, na matokeo yenye maana kwa vitendo vya mchezaji.
✅ Unavyojiuliza kuhusu michezo mingine iliyojengwa kwa JavaScript na Canvas? Chunguza - unaweza kushangaa uwezo uliopo!
Baada ya kutekeleza hizi, jaribu mchezo wako kuona mfumo mzima wa maoni ukiwasha. Unapaswa kuona ikoni za maisha chini kulia, alama zako chini kushoto, na uangalie migongano inapopunguza maisha huku risasi zinazofaulu zikiongeza alama zako.
Mchezo wako sasa una mifumo ya msingi iliyofanya michezo ya awali ya arcade kuwa ya kivutio - malengo wazi, maoni ya haraka, na matokeo yenye maana kwa vitendo vya mchezaji.
### 🔄 **Uhakiki wa Kifundisho**
**Mfumo Kamili wa Muundo wa Mchezo**: Hakikisha umeelewa mifumo ya maoni kwa wachezaji:
- ✅ Jinsi mifumo ya alama inavyosababisha motisha na ushiriki wa mchezaji?
- ✅ Kwanini utangamano wa kuona ni muhimu katika muundo wa kiolesura cha mtumiaji?
- ✅ Jinsi mfumo wa maisha unavyolingania changamoto na kumweka mchezaji?
- ✅ Nini nafasi ya maoni ya haraka katika kuunda uzoefu wa kucheza unaridhisha?
**Uunganishaji wa Mfumo**: Mfumo wako wa maoni unaonyesha:
- **Muundo wa Uzoefu wa Mtumiaji**: Mawasiliano wazi na mpangilio wa taarifa
- **Mhimili wa Matukio**: Mabadiliko yanayotegemea matukio kwa vitendo vya mchezaji
- **Usimamizi wa Hali**: Kufuatilia na kuonyesha data ya mchezo kwa ufanisi
- **Uwezo wa Kanvas**: Kuonyesha maandishi na kuweka sprites
- **Saikolojia ya Mchezo**: Uelewa wa motisha na ushiriki wa mchezaji
**Mifumo ya Kitaalamu Uliyotekeleza**:
- **Muundo wa MVC**: Tofautisha mantiki ya mchezo, data, na uwasilishaji
- **Mfumo wa Mwangalizi**: Mabadiliko yanayotegemea matukio kwa hali ya mchezo
- **Muundo wa Sehemu**: Function zinazotumika tena kwa uwasilishaji na mantiki
- **Uboreshaji wa Utendaji**: Uonyesho mzuri ndani ya mizunguko ya mchezo
### ⚡ **Unaweza Kutoa Je Katika Dakika 5 Zijazo**
- [ ] Jaribu ukubwa na rangi tofauti za fonti kwa onyesho la alama
- [ ] Jaribu kubadilisha thamani za pointi na uone jinsi zinavyoathiri hisia za mchezo
- [ ] Ongeza taarifa za console.log kufuatilia wakati pointi na maisha yanabadilika
- [ ] Jaribu matukio kama kukosa maisha au kufikia alama za juu
### 🎯 **Unaweza Kufanikisha Saa Hii**
- [ ] Kamilisha mtihani wa baada ya somo na kuelewa saikolojia ya muundo wa mchezo
- [ ] Ongeza sauti kwa alama na kupoteza maisha
- [ ] Tekeleza mfumo wa alama nyingi kwa kutumia localStorage
- [ ] Unda thamani tofauti za pointi kwa aina tofauti za maadui
- [ ] Ongeza athari za kuona kama kutetemeka kwa skrini unapopoteza maisha
### 📅 **Safari Yako ya Muundo wa Mchezo kwa Wiki**
- [ ] Kamilisha mchezo kamili wa anga pamoja na mifumo ya maoni iliyoimarishwa
- [ ] Tekeleza mifumo ya alama ya juu kama multipliers za mfululizo
- [ ] Ongeza mafanikio na vitu vinavyoweza kufunguliwa
- [ ] Tengeneza usawa na maendeleo ya ugumu
- [ ] Unda miundo ya kiolesura cha mtumiaji kwa menyu na skrini za mwisho wa mchezo
- [ ] Soma michezo mingine kuelewa mifumo ya ushiriki
### 🌟 **Ustadi Wako wa Maendeleo ya Mchezo kwa Mwezi**
- [ ] Tengeneza michezo kamili yenye mifumo tata ya maendeleo
- [ ] Jifunze uchambuzi wa mchezo na tabia za wachezaji
- [ ] Changia kwenye miradi ya maendeleo ya michezo ya chanzo-wazi
- [ ] Mwelekeo wa darasa la juu la muundo wa mchezo na njia za kupata mapato
- [ ] Tengeneza maudhui ya elimu kuhusu muundo wa mchezo na uzoefu wa mtumiaji
- [ ] Jenga repoti ya kuonyesha ustadi wa muundo na maendeleo ya mchezo
## 🎯 Ratiba Yako ya Ustadi wa Muundo wa Mchezo
```mermaid
timeline
title Mchezo Ubunifu & Mchezaji Maoni Mafunzo Maendeleo
section Msingi (10 dakika)
Mawasiliano ya Kuona: Uwasilishaji wa maandishi
: Ubunifu wa ikoni
: Kanuni za upangaji
: Saikolojia ya rangi
section Saikolojia ya Mchezaji (20 dakika)
Mifumo ya Motisha: Thamani za pointi
: Hatari dhidi ya malipo
: Maoni ya maendeleo
: Ubunifu wa mafanikio
section Utekelezaji wa Kiufundi (30 dakika)
Utaalamu wa Canvas: Msimamo wa maandishi
: Uwasilishaji wa sprite
: Usimamizi wa hali
: Uboreshaji wa utendaji
section Mizani ya Mchezo (40 dakika)
Ubunifu wa Ugumu: Usimamizi wa maisha
: Miondoko ya alama
: Uhifadhi wa mchezaji
: Ufikiaji
section Uzoefu wa Mtumiaji (50 dakika)
Ubunifu wa Kiolesura: Hierarkia ya taarifa
: Maoni ya mwitikio
: Ubunifu wa hisia
: Upimaji wa utumiaji
section Mifumo ya Juu (1 wiki)
Mchezaji Mehmechanics: Mifumo ya maendeleo
: Uingiliaji wa uchambuzi
: Ubunifu wa uuzaji
: Sifa za jamii
section Ujuzi wa Sekta (1 mwezi)
Maendeleo ya Kitaalamu: Ushirikiano wa timu
: Nyaraka za ubunifu
: Utafiti wa mchezaji
: Uboreshaji wa jukwaa
```
### 🛠️ Muhtasari wa Seti ya Zana za Muundo wa Mchezo Wako
Baada ya kumaliza somo hili, umeweza:
- **Saikolojia ya Mchezaji**: Uelewa wa motisha, hatari/zawadi, na nyuzi za ushiriki
- **Mawasiliano ya Kuona**: Muundo mzuri wa UI kutumia maandishi, ikoni, na mpangilio
- **Mifumo ya Maoni**: Mwitikio wa wakati halisi kwa vitendo vya mchezaji na matukio ya mchezo
- **Usimamizi wa Hali**: Kufuatilia na kuonyesha data ya mchezo yenye mabadiliko kwa ufanisi
- **Kuonyesha Maandishi kwenye Kanvas**: Onyesho la maandishi la kitaalamu lenye mtindo na mpangilio
- **Uunganishaji wa Matukio**: Kuunganisha vitendo vya mtumiaji na matokeo yenye maana ya mchezo
- **Usawa wa Mchezo**: Kubuni mizunguko ya ugumu na mifumo ya maendeleo ya mchezaji
**Matumizi Halisi**: Ujuzi wako wa muundo wa mchezo unatumika moja kwa moja kwa:
- **Muundo wa Kiolesura cha Mtumiaji**: Kuunda kiolesura kinachovutia na rahisi kutumia
- **Maendeleo ya Bidhaa**: Uelewa wa motisha za mtumiaji na nyuzi za maoni
- **Teknolojia ya Elimu**: Gamification na mifumo ya kuwashirikisha wanafunzi
- **Uwasilishaji wa Data**: Kufanya taarifa ngumu kuwa rahisi na kuvutia
- **Maendeleo ya Programu za Simu**: Mifumo ya kushikilia wateja na muundo wa uzoefu wa mtumiaji
- **Teknolojia ya Masoko**: Uelewa wa tabia za watumiaji na uboreshaji wa mabadiliko
**Ustadi wa Kitaalamu Uliyopata**: Sasa unaweza:
- **Kubuni** uzoefu wa mtumiaji unaowahamasisha na kuwasilisha watumiaji
- **Tekeleza** mifumo ya maoni inayoelekeza tabia za mtumiaji kwa ufanisi
- **Kulinganisha** changamoto na urahisi katika mifumo ya mwingiliano
- **Kuunda** mawasiliano ya kuona yanayofanya kazi kwa makundi tofauti ya watumiaji
- **Kuchambua** tabia za mtumiaji na kurekebisha maboresho ya muundo
**Mafunzo ya Maendeleo ya Mchezo Uliyoyajua**:
- **Motisha ya Mchezaji**: Uelewa wa kinachowasukuma na kuwashikilia wachezaji
- **Ubunifu wa Kuona**: Kuunda kiolesura wazi, kivutio, na chenye utendaji
- **Uunganishaji wa Mfumo**: Kuunganisha mifumo mingi ya mchezo kwa uzoefu wa pamoja
- **Uboreshaji wa Utendaji**: Uonyesho mzuri na usimamizi bora wa hali
- **Ufikikaji**: Kubuni kwa kiwango tofauti cha ujuzi na mahitaji ya mchezaji
**Kipengele Kifuatacho**: Uko tayari kuchunguza mifumo ya hali ya juu ya muundo wa mchezo, kutekeleza mifumo ya uchambuzi, au kusoma kuhusu ufanisi wa mchezo na mikakati ya kushikilia wachezaji!
🌟 **Mafanikio Yamepatikana**: Umejenga mfumo kamili wa maoni kwa wachezaji kwa kanuni za kitaalamu za muundo wa mchezo!
---
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya Mwakilishi wa GitHub Copilot 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia mode ya Mwakilishi kukamilisha changamoto ifuatayo:
**Maelezo:** Boresha mfumo wa alama wa mchezo wa anga kwa kutekeleza kipengele cha alama ya juu na uhifadhi wa kudumu pamoja na mbinu za alama za bonasi.
**Maelezo:** Boreshaji mfumo wa alama wa mchezo wa anga kwa kutekeleza mfumo wa alama bora unaohifadhi salio bora la mchezaji kwenye localStorage. Ongeza pointi za ziada kwa kuua maadui mfululizo (mfumo wa mchanganyiko) na tumia thamani tofauti za pointi kwa aina tofauti za maadui. Onyesha kidokezo cha kuona wakati mchezaji anapata alama bora na onyesha alama bora ya sasa kwenye skrini ya mchezo.
**Kichocheo:** Unda mfumo wa alama ya juu unaohifadhi alama bora ya mchezaji kwenye localStorage. Ongeza pointi za bonasi kwa mauaji ya adui mfululizo (mfumo wa combo) na tekeleza maadili tofauti ya pointi kwa aina tofauti za adui. Ongeza kiashiria cha kuona wakati mchezaji anafikia alama mpya ya juu na onyesha alama ya juu ya sasa kwenye skrini ya mchezo.
**Ripoti:** Tengeneza mfumo wa alama bora unaohifadhi alama bora za mchezaji kwenye localStorage. Ongeza pointi za ziada kwa kuua maadui mfululizo (mfumo wa mchanganyiko) na tumia thamani tofauti za pointi kwa aina tofauti za maadui. Onyesha kidokezo cha kuona wakati mchezaji anapata alama bora mpya na onyesha alama bora ya sasa kwenye skrini ya mchezo.
## 🚀 Changamoto
Sasa una mchezo unaofanya kazi na alama na maisha. Fikiria ni vipengele gani vya ziada vinaweza kuboresha uzoefu wa mchezaji.
Sasa una mchezo unaofanya kazi pamoja na alama na maisha. Fikiria ni vipengele gani vya ziada vinaweza kuboresha uzoefu wa mchezaji.
## Maswali ya Baada ya Somo
## Mtihani wa Baada ya Darasa
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/38)
[Mtihani wa baada ya darasa](https://ff-quizzes.netlify.app/web/quiz/38)
## Mapitio na Kujifunza Binafsi
## Mapitio & Kujifunza Peke Yako
Unataka kuchunguza zaidi? Tafiti mbinu tofauti za alama za mchezo na mifumo ya maisha. Kuna injini za michezo za kuvutia kama [PlayFab](https://playfab.com) zinazoshughulikia alama, orodha za viongozi, na maendeleo ya wachezaji. Je, kuunganisha kitu kama hicho kunaweza kuboresha mchezo wako kwa kiwango kingine?
Unataka kuchunguza zaidi? Tafuta mbinu tofauti za alama za mchezo na mifumo ya maisha. Kuna injini za michezo zinazovutia kama [PlayFab](https://playfab.com) zinazoshughulikia alama, orodha za viongozi, na maendeleo ya mchezaji. Je, kuunganisha kitu kama hicho kunawezaje kuboresha mchezo wako?
## Kazi
## Kazi ya Nyumba
[Jenga Mchezo wa Alama](assignment.md)
[Tengeneza Mchezo wa Kuonyesha Alama](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Kisahihi**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokamilika. Hati halisi katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha kuaminika. Kwa habari muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatuwajibiki kwa kutoelewana au tafsiri potovu zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,59 +1,163 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "46bcdd9a0174031655a49bb062aa279c",
"translation_date": "2025-10-24T19:41:28+00:00",
"original_hash": "a4b78043f4d64bf3ee24e0689b8b391d",
"translation_date": "2026-01-07T01:36:03+00:00",
"source_file": "6-space-game/6-end-condition/README.md",
"language_code": "sw"
}
-->
# Jenga Mchezo wa Anga Sehemu ya 6: Mwisho na Kuanzisha Upya
Kila mchezo mzuri unahitaji masharti ya mwisho yaliyo wazi na mfumo laini wa kuanzisha upya. Umejenga mchezo wa anga wa kuvutia wenye harakati, mapigano, na alama - sasa ni wakati wa kuongeza vipande vya mwisho vinavyoufanya uhisi kamili.
Mchezo wako kwa sasa unaendelea bila kikomo, kama vile vyombo vya Voyager vilivyozinduliwa na NASA mwaka 1977 - bado vinasafiri angani miongo kadhaa baadaye. Ingawa hilo ni sawa kwa uchunguzi wa anga, michezo inahitaji mwisho ulioelezwa ili kuunda uzoefu wa kuridhisha.
Leo, tutaweka masharti sahihi ya kushinda/kushindwa na mfumo wa kuanzisha upya. Mwisho wa somo hili, utakuwa na mchezo uliosuguliwa ambao wachezaji wanaweza kukamilisha na kucheza tena, kama michezo ya arcade ya zamani iliyofafanua sekta hiyo.
## Maswali ya Awali ya Somo
# Jenga Mchezo wa Anga Sehemu ya 6: Mwisho na Anzisha Upya
```mermaid
journey
title Safari Yako ya Kukamilisha Mchezo
section Masharti ya Mwisho
Eleza hali za kushinda/kushindwa: 3: Student
Tekeleza ukaguzi wa masharti: 4: Student
Shughulikia mabadiliko ya hali: 4: Student
section Uzoefu wa Mchezaji
Tengeneza mifumo ya mrejesho: 4: Student
Tengeneza mbinu za kuanza upya: 5: Student
Samba usanifu wa mtumiaji: 5: Student
section Muunganisho wa Mfumo
Simamia mzunguko wa maisha wa mchezo: 5: Student
Shughulikia usafishaji wa kumbukumbu: 5: Student
Tengeneza uzoefu kamili: 5: Student
```
Kila mchezo mzuri unahitaji masharti wazi ya mwisho na utaratibu mzuri wa kuanzisha upya. Umejenga mchezo bora wa anga wenye harakati, mapigano, na makadirio - sasa ni wakati wa kuongeza vipande vya mwisho vinavyoufanya uhisi umekamilika.
Mchezo wako kwa sasa unaendelea bila kikomo, kama roboti za Voyager ambazo NASA ilizindua mwaka 1977 - bado zinasafiri kupitia anga mamilioni ya miaka baadaye. Wakati huo ni sawa kwa kuchunguza anga, michezo inahitaji hatua za mwisho zenye kufafanuliwa ili kuunda uzoefu unaoridhisha.
Leo, tutaweka masharti sahihi ya kushinda/kupoteza na mfumo wa kuanzisha upya. Mwisho wa somo hili, utakuwa na mchezo uliomalizika ambao wachezaji wanaweza kukamilisha na kucheza tena, kama michezo ya arcade ya zamani iliyoleta uhalisia wa aina hii.
```mermaid
mindmap
root((Ukamilishaji wa Mchezo))
End Conditions
Hali za Ushindi
Masharti ya Kushindwa
Ufuatiliaji wa Maendeleo
Uhakiki wa Hali
Player Feedback
Ujumbe wa Kuonekana
Saikolojia ya Rangi
Mawasiliano Wazi
Mwitikio wa Hisia
State Management
Udhibiti wa Mzunguko wa Mchezo
Usafishaji wa Kumbukumbu
Mzunguko wa Maisha ya Kitu
Ushughulikiaji wa Tukio
Restart Systems
Ushughulikiaji wa Ingizo
Weka Tena Hali
Mwanzo Mpya
Uzoefu wa Mtumiaji
Polish Elements
Onyesho la Ujumbe
Mabadiliko laini
Kuzuia Makosa
Upatikanaji
```
## Jaribio la Kabla ya Mhadhara
[Maswali ya awali ya somo](https://ff-quizzes.netlify.app/web/quiz/39)
[Jaribio la kabla ya mhadhara](https://ff-quizzes.netlify.app/web/quiz/39)
## Kuelewa Masharti ya Mwisho wa Mchezo
Mchezo wako unapaswa kumalizika lini? Swali hili la msingi limeunda muundo wa michezo tangu enzi za arcade za mapema. Pac-Man unamalizika unapokamatwa na roho au unapomaliza nukta zote, wakati Space Invaders unamalizika pale wageni wanapofika chini au unawaangamiza wote.
Kama muundaji wa mchezo, unafafanua masharti ya ushindi na kushindwa. Kwa mchezo wetu wa anga, hapa kuna mbinu zilizothibitishwa zinazounda uchezaji wa kuvutia:
- **`N` Meli za adui zimeangamizwa**: Ni kawaida sana ikiwa unagawanya mchezo katika viwango tofauti ambapo unahitaji kuangamiza `N` meli za adui ili kukamilisha kiwango.
- **Meli yako imeangamizwa**: Kuna michezo ambapo unapoteza mchezo ikiwa meli yako imeangamizwa. Mbinu nyingine ya kawaida ni kuwa na dhana ya maisha. Kila wakati meli yako inapoharibiwa inapunguza maisha. Mara maisha yote yanapopotea basi unapoteza mchezo.
- **Umekusanya alama `N`**: Sharti lingine la kawaida la mwisho ni kukusanya alama. Jinsi unavyopata alama ni juu yako lakini ni kawaida kupeana alama kwa shughuli mbalimbali kama kuangamiza meli ya adui au labda kukusanya vitu ambavyo vinaanguka wakati vinaharibiwa.
- **Kukamilisha kiwango**: Hii inaweza kuhusisha masharti kadhaa kama `X` meli za adui zimeangamizwa, `Y` alama zimekusanywa au labda kipengele maalum kimekusanywa.
## Kutekeleza Mfumo wa Kuanzisha Upya Mchezo
Michezo mizuri inahamasisha uchezaji tena kupitia mifumo laini ya kuanzisha upya. Wakati wachezaji wanakamilisha mchezo (au wanashindwa), mara nyingi wanataka kujaribu tena mara moja - iwe ni kushinda alama yao au kuboresha utendaji wao.
Tetris inadhihirisha hili kikamilifu: wakati vizuizi vyako vinapofika juu, unaweza kuanza mchezo mpya mara moja bila kupitia menyu ngumu. Tutajenga mfumo wa kuanzisha upya unaosafisha hali ya mchezo na kuwarudisha wachezaji kwenye hatua haraka.
Lini mchezo wako unapaswa kuisha? Swali hili la msingi limeunda muundo wa michezo tangu enzi za awali za arcade. Pac-Man huisha ukikamatwa na mizimu au kufuta pointi zote, wakati Space Invaders huisha wanapo wafikia chini au ukiachilia wote.
Kama muundaji wa mchezo, unafafanua masharti ya ushindi na kushindwa. Kwa mchezo wetu wa anga, hapa kuna njia zilizo wazi zinazounda mchezo unaovutia:
```mermaid
flowchart TD
A["🎮 Mchezo Umeanza"] --> B{"Angalia Masharti"}
B --> C["Idadi ya Adversaries"]
B --> D["Mia wa Shujaa"]
B --> E["Kiwango cha Alama"]
B --> F["Maendeleo ya Kiwango"]
C --> C1{"Adversaries = 0?"}
D --> D1{"Mia = 0?"}
E --> E1{"Alama ≥ Lengo?"}
F --> F1{"Malengo Yamekamilika?"}
C1 -->|Ndiyo| G["🏆 Ushindi"]
D1 -->|Ndiyo| H["💀 Kipigo"]
E1 -->|Ndiyo| G
F1 -->|Ndiyo| G
C1 -->|Hapana| B
D1 -->|Hapana| B
E1 -->|Hapana| B
F1 -->|Hapana| B
G --> I["🔄 Chaguo la Kuanzisha Upya"]
H --> I
style G fill:#e8f5e8
style H fill:#ffebee
style I fill:#e3f2fd
```
- **Meli `N` za Adui zimeangushwa**: Ni kawaida kabisa kama unagawanya mchezo katika ngazi tofauti unahitaji kuangusha meli `N` za Adui ili kumaliza ngazi
- **Meli yako imeangushwa**: Kuna michezo ambapo unashindwa ikiwa meli yako imeangushwa. Njia nyingine maarufu ni kuwa na maisha ya meli. Kila mara meli yako inapoangushwa hupoteza maisha moja. Ukipoteza maisha yote basi unashindwa.
- **Umepata pointi `N`**: Sharti lingine la mwisho ni kukusanya pointi. Jinsi unavyopata pointi ni jukumu lako lakini ni kawaida kugawa pointi kwa shughuli tofauti kama kuangusha meli ya adui au kukusanya vitu vinavyotolewa wakati adui anapoangushwa.
- **Kumaliza ngazi**: Hii inaweza kuhusisha masharti kadhaa kama meli `X` za adui kuangushwa, pointi `Y` kukusanywa au labda kitu maalum kimekusanywa.
## Kutekeleza Mfumo wa Kuanzisha Mchezo Upya
Michezo mizuri hutoa motisha ya kucheza tena kupitia njia za kuanzisha upya zitakazokuwa laini. Wachezaji wanapomaliza mchezo (au kukutana na kushindwa), mara nyingi wanataka kujaribu tena mara moja - iwe kuboresha alama zao au ubora wao.
```mermaid
stateDiagram-v2
[*] --> Playing: Mwanzo wa Mchezo
Playing --> Victory: Maadui wote wameangamizwa
Playing --> Defeat: Maisha = 0
Victory --> MessageDisplay: Onyesha ujumbe wa ushindi
Defeat --> MessageDisplay: Onyesha ujumbe wa kupoteza
MessageDisplay --> WaitingRestart: Bonyeza Ingiza cha kuendelea
WaitingRestart --> Resetting: Kitufe cha Ingiza kimethibitishwa
Resetting --> CleanupMemory: Futa vipindi
CleanupMemory --> ClearEvents: Ondoa wasikilizaji
ClearEvents --> InitializeGame: Mwanzo mpya
InitializeGame --> Playing: Mchezo mpya unaanza
note right of MessageDisplay
Maoni ya rangi:
Kijani = Ushindi
Nyekundu = Kupoteza
end note
note right of Resetting
Futa hali kabisa
huzuia kuvuja kwa kumbukumbu
end note
```
Tetris ni mfano mzuri kabisa: unapofikia juu ya blocks zako, unaweza kuanza mchezo mpya mara moja bila kupitia menyu ngumu. Tutajenga mfumo kama huo wa kuanzisha upya ambao unasafisha hali ya mchezo na kurudisha wachezaji katika hatua ya kucheza haraka.
**Tafakari**: Fikiria kuhusu michezo uliyocheza. Masharti gani yanamaliza mchezo, na unachochewa vipi kuanzisha upya? Nini hufanya uzoefu wa kuanzisha upya uhisi laini dhidi ya kufadhaisha?
**Fikiria**: Fikiria michezo uliyocheza. Huishia lini? Na unavyombidiwa kuanzisha upya? Nini kinachofanya uzoefu wa kuanzisha upya uwe laini badala ya kuwa msumbufu?
## Kile Utakachojenga
## Utakachojenga
Utatekeleza vipengele vya mwisho vinavyogeuza mradi wako kuwa uzoefu kamili wa mchezo. Vipengele hivi vinatofautisha michezo iliyosuguliwa kutoka kwa prototypes za msingi.
Utatekeleza vipengele vya mwisho vinavyobadilisha mradi wako kuwa uzoefu kamili wa mchezo. Vipengele hivi hutoa tofauti kati ya michezo iliyotiwa dozi na michoro ya awali.
**Hivi ndivyo tunavyoongeza leo:**
1. **Sharti la ushindi**: Angamiza maadui wote na upate sherehe sahihi (umestahili!)
2. **Sharti la kushindwa**: Poteza maisha na ukubali kushindwa na skrini ya kushindwa
3. **Mfumo wa kuanzisha upya**: Bonyeza Enter kurudi mara moja - kwa sababu mchezo mmoja haukutoshi
4. **Usimamizi wa hali**: Mwanzo safi kila wakati - hakuna maadui waliobaki au hitilafu za ajabu kutoka mchezo wa mwisho
1. **Sharti la ushindi**: Piga adui wote na upate sherehe nzuri (umestahili!)
2. **Sharti la kushindwa**: Poteza maisha yote na ubali na skrini ya kushindwa
3. **Mfumo wa kuanzisha upya**: Bonyeza Enter urejee moja kwa moja - maana mchezo mmoja hauwezi kutosha
4. **Usimamizi wa hali**: Anza safi kila mara - hakuna adui waliobaki au mabadiliko ya ajabu kutoka mchezo uliopita
## Kujiandaa
## Kuanzisha
Tayarishe mazingira yako ya maendeleo. Unapaswa kuwa na faili zote za mchezo wa anga kutoka masomo ya awali tayari.
Tandaza mazingira yako ya maendeleo. Unapaswa kuwa na faili zote za mchezo wako wa anga kutoka masomo yaliyopita tayari.
**Mradi wako unapaswa kuonekana kama hivi:**
**Mradi wako unapaswa kuonekana kama ifuatavyo:**
```bash
-| assets
@ -74,19 +178,44 @@ npm start
```
**Amri hii:**
- Inaendesha seva ya ndani kwenye `http://localhost:5000`
- Inazindua seva ya ndani kwenye `http://localhost:5000`
- Inahudumia faili zako vizuri
- Inasasisha kiotomatiki unapofanya mabadiliko
Fungua `http://localhost:5000` kwenye kivinjari chako na hakikisha mchezo wako unaendelea. Unapaswa kuwa na uwezo wa kusonga, kupiga risasi, na kuingiliana na maadui. Mara tu unapothibitisha, tunaweza kuendelea na utekelezaji.
> 💡 **Ushauri wa Kitaalamu**: Ili kuepuka maonyo katika Visual Studio Code, tangaza `gameLoopId` juu ya faili yako kama `let gameLoopId;` badala ya kutangaza ndani ya kazi ya `window.onload`. Hii inafuata mbinu bora za kisasa za kutangaza vigezo vya JavaScript.
- Inajirefresh kiotomatiki unaporudisha mabadiliko
Fungua `http://localhost:5000` katika kivinjari chako na hakikisha mchezo wako unaendelea. Unapaswa kuweza kusogeza, kutoa risasi, na kushirikiana na adui. Mara imekidhi, tunaweza kuendelea na utekelezaji.
> 💡 **Ushauri wa Pro**: Ili kuepuka onyo katika Visual Studio Code, tangaza `gameLoopId` juu ya faili yako kama `let gameLoopId;` badala ya kutangaza ndani ya kazi `window.onload`. Hii inaendana na mazoea bora ya tangazo la vigezo vya JavaScript vya kisasa.
```mermaid
flowchart TD
A["1. Ufuatiliaji wa Hali"] --> B["2. Wadau wa Matukio"]
B --> C["3. Vigezo vya Ujumbe"]
C --> D["4. Udhibiti wa Kuanza Upya"]
D --> E["5. Onyesho la Ujumbe"]
E --> F["6. Weka Upya Mfumo"]
G["isHeroDead()\nisEnemiesDead()"] --> A
H["Matukio ya Mgongano\nMatukio ya Mwisho wa Michezo"] --> B
I["MWISHO_MCHEZO_UKOSHWA\nMWISHO_MCHEZO_KUPOTEZA"] --> C
J["Kitufe cha Ingiza\nKichocheo cha Kuwasha Upya"] --> D
K["Ushindi/Kushindwa\nMaandishi yenye Rangi"] --> E
L["Usafishaji wa Hali\nUanzishaji Mpya"] --> F
F --> M["🎮 Michezo Kamili"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
style M fill:#e1f5fe
```
## Hatua za Utekelezaji
### Hatua ya 1: Unda Kazi za Kufuatilia Masharti ya Mwisho
### Hatua 1: Tengeneza Kazi za Kufuatilia Masharti ya Mwisho
Tunahitaji kazi za kufuatilia wakati mchezo unapaswa kumalizika. Kama sensa kwenye Kituo cha Kimataifa cha Anga zinazofuatilia mifumo muhimu kila wakati, kazi hizi zitakagua hali ya mchezo mara kwa mara.
Tunahitaji kazi za kufuatilia ni lini mchezo unapaswa kuisha. Kama sensa kwenye Kituo cha Anga cha Kimataifa kinachofuatilia mifumo muhimu kwa muda wote, kazi hizi zitaangalia hali ya mchezo kila wakati.
```javascript
function isHeroDead() {
@ -99,17 +228,50 @@ function isEnemiesDead() {
}
```
**Hivi ndivyo kinachotokea nyuma ya pazia:**
- **Inakagua** kama shujaa wetu hana maisha (pole!)
- **Inahesabu** ni maadui wangapi bado wako hai na wanapambana
- **Inarudisha** `true` wakati uwanja wa vita uko wazi kwa maadui
- **Inatumia** mantiki rahisi ya kweli/siyo ili kuweka mambo rahisi
- **Inachuja** kupitia vitu vyote vya mchezo kutafuta walionusurika
### Hatua ya 2: Sasisha Vishikilia Matukio kwa Masharti ya Mwisho
Sasa tutaunganisha ukaguzi wa masharti haya na mfumo wa matukio wa mchezo. Kila wakati mgongano unapotokea, mchezo utatathmini kama unachochea sharti la mwisho. Hii inaunda maoni ya haraka kwa matukio muhimu ya mchezo.
**Hivi ndivyo inavyofanya kazi ndani:**
- **Huatilia** kama shujaa wetu amepoteza maisha (aua!)
- **Huhesabu** ni adui wangapi bado wako hai na wenye nguvu
- **Hurudisha** `true` pale uwanja wa vita unapokuwa huru kwa maadui
- **Inatumia** mantiki rahisi ya kweli/supu kwa usahihi rahisi
- **Inachuja** vitu vyote vya mchezo kupata wanaoishi
### Hatua 2: Sasisha Mshughulikiaji wa Tukio kwa Masharti ya Mwisho
Sasa tutawaunganisha mkaguzi wa masharti kwenye mfumo wa tukio wa mchezo. Kila tukio la mgongano linapotokea, mchezo utapima kama sharti la mwisho limezingatiwa. Hii hutoa mrejesho wa papo hapo kwa matukio muhimu ya mchezo.
```mermaid
sequenceDiagram
participant Collision
participant GameLogic
participant Conditions
participant EventSystem
participant Display
Collision->>GameLogic: Laser inapiga adui
GameLogic->>GameLogic: Haribu vitu
GameLogic->>Conditions: Angalia isEnemiesDead()
alt Wapiganaji wote wameangushwa
Conditions->>EventSystem: Tuma GAME_END_WIN
EventSystem->>Display: Onyesha ujumbe wa ushindi
else Adui wapo
Conditions->>GameLogic: Endeleza mchezo
end
Collision->>GameLogic: Adui inapiga shujaa
GameLogic->>GameLogic: Punguza maisha
GameLogic->>Conditions: Angalia isHeroDead()
alt Maisha = 0
Conditions->>EventSystem: Tuma GAME_END_LOSS
EventSystem->>Display: Onyesha ujumbe wa kushindwa
else Maisha bado yapo
GameLogic->>Conditions: Angalia isEnemiesDead()
alt Wapiganaji wote wameangushwa
Conditions->>EventSystem: Tuma GAME_END_WIN
end
end
```
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
first.dead = true;
@ -126,7 +288,7 @@ eventEmitter.on(Messages.COLLISION_ENEMY_HERO, (_, { enemy }) => {
hero.decrementLife();
if (isHeroDead()) {
eventEmitter.emit(Messages.GAME_END_LOSS);
return; // loss before victory
return; // hasara kabla ya ushindi
}
if (isEnemiesDead()) {
eventEmitter.emit(Messages.GAME_END_WIN);
@ -142,31 +304,31 @@ eventEmitter.on(Messages.GAME_END_LOSS, () => {
});
```
**Kinachotokea hapa:**
- **Laser inagonga adui**: Wote wanatoweka, unapata alama, na tunakagua kama umeshinda
- **Adui anakugonga**: Unapoteza maisha, na tunakagua kama bado uko hai
- **Mpangilio mzuri**: Tunakagua kushindwa kwanza (hakuna anayependa kushinda na kushindwa kwa wakati mmoja!)
- **Majibu ya haraka**: Mara tu kitu muhimu kinapotokea, mchezo unajua kuhusu hilo
**Hapa kinatokea:**
- **Risasi inamgonga adui**: Wote wawili wanaondoka, unapata pointi, na tunakagua kama umeshinda
- **Adui anakukuta**: Unapoteza maisha, na tunakagua kama bado uko hai
- **Mpangilio mzuri**: Tunakagua kushindwa kwanza (hakuna anayetaka kushinda na kushindwa kwa wakati mmoja!)
- **Mwitikio wa papo hapo**: Mtu mzuri hutokea, mchezo unajua mara moja
### Hatua ya 3: Ongeza Aina Mpya za Ujumbe
### Hatua 3: Ongeza Meseji Mpya za Constants
Utahitaji kuongeza aina mpya za ujumbe kwenye kitu chako cha `Messages`. Aina hizi za ujumbe husaidia kudumisha uthabiti na kuzuia makosa ya herufi katika mfumo wako wa matukio.
Utahitajika kuongeza aina mpya za meseji kwenye kitu chako cha constants cha `Messages`. Constants hizi husaidia kudumisha uthabiti na kuzuia makosa ya tahajia katika mfumo wako wa tukio.
```javascript
GAME_END_LOSS: "GAME_END_LOSS",
GAME_END_WIN: "GAME_END_WIN",
```
**Katika hapo juu, tume:**
- **Ongeza** aina za ujumbe kwa matukio ya mwisho wa mchezo ili kudumisha uthabiti
- **Tumia** majina yanayoelezea wazi madhumuni ya tukio
- **Fuata** muundo wa majina uliopo kwa aina za ujumbe
**Katika hii tume:**
- **Ongeza** constants za matukio ya mwisho wa mchezo kudumisha uthabiti
- **Tumia** majina yanayoelezea sana kusudi la tukio
- **Fuata** muundo uliopo wa majina kwa aina za meseji
### Hatua ya 4: Tekeleza Udhibiti wa Kuanzisha Upya
### Hatua 4: Tekeleza Udhibiti wa Kuanzisha Upya
Sasa utaongeza udhibiti wa kibodi unaoruhusu wachezaji kuanzisha upya mchezo. Kitufe cha Enter ni chaguo la asili kwani kinahusishwa sana na kuthibitisha vitendo na kuanzisha michezo mipya.
Sasa utaongeza udhibiti wa kibodi unaowawezesha wachezaji kuanzisha mchezo upya. Kitufe cha Enter ni chaguo la asili kwa sababu mara nyingi huhusishwa na kuthibitisha vitendo na kuanzisha michezo mipya.
**Ongeza utambuzi wa kitufe cha Enter kwenye msikilizaji wako wa tukio la keydown uliopo:**
**Ongeza kugundua kitufe cha Enter kwenye mshughulikiaji wako wa tukio la keydown uliopo:**
```javascript
else if(evt.key === "Enter") {
@ -174,23 +336,23 @@ else if(evt.key === "Enter") {
}
```
**Ongeza aina mpya ya ujumbe:**
**Ongeza constant mpya ya meseji:**
```javascript
KEY_EVENT_ENTER: "KEY_EVENT_ENTER",
```
**Unachohitaji kujua:**
- **Inapanua** mfumo wako uliopo wa kushughulikia matukio ya kibodi
- **Inatumia** kitufe cha Enter kama kichocheo cha kuanzisha upya kwa uzoefu wa mtumiaji wa angavu
- **Inatoa** tukio maalum ambalo sehemu nyingine za mchezo wako zinaweza kusikiliza
- **Inadumisha** muundo sawa na udhibiti wako mwingine wa kibodi
**Jifunze haya:**
- **Unaongeza** mfumo wa kushughulikia keyboard uliopo
- **Inatumia** kitufe cha Enter kama kisababisha kuanzisha upya kwa urahisi wa mtumiaji
- **Inatuma** tukio maalum ambalo sehemu nyingine za mchezo zinaweza kulisikiliza
- **Hufuata** mtindo sawa na miongozo mingine ya keyboard
### Hatua ya 5: Unda Mfumo wa Kuonyesha Ujumbe
### Hatua 5: Tengeneza Mfumo wa Onyesha Meseji
Mchezo wako unahitaji kuwasiliana matokeo wazi kwa wachezaji. Tutaunda mfumo wa ujumbe unaoonyesha hali za ushindi na kushindwa kwa kutumia maandishi yenye rangi, sawa na interface za terminal za kompyuta za mapema ambapo kijani kilionyesha mafanikio na nyekundu ilionyesha makosa.
Mchezo wako unahitaji kuwasilisha matokeo kwa uwazi kwa wachezaji. Tutaunda mfumo wa meseji unaoonyesha hali ya ushindi na kushindwa kwa kutumia maandishi yenye rangi tofauti, kama vile mifumo ya terminal ya kompyuta ya zamani ambapo kijani kilionyesha mafanikio na nyekundu makosa.
**Unda kazi ya `displayMessage()`:**
**Tengeneza kazi ya `displayMessage()`:**
```javascript
function displayMessage(message, color = "red") {
@ -201,20 +363,20 @@ function displayMessage(message, color = "red") {
}
```
**Hatua kwa hatua, kinachotokea:**
- **Inaset** ukubwa wa fonti na familia kwa maandishi yanayosomeka wazi
- **Inatumia** parameter ya rangi na "nyekundu" kama chaguo-msingi kwa maonyo
- **Inasogeza** maandishi katikati ya usawa na wima kwenye canvas
- **Inatumia** parameter za kisasa za JavaScript kwa chaguo za rangi zinazobadilika
- **Inatumia** muktadha wa 2D wa canvas kwa uonyeshaji wa maandishi moja kwa moja
**Hatua kwa hatua, hivi ndivyo inavyofanya kazi:**
- **Aina** ukubwa wa fonti na familia kwa maandishi yanayosomeka
- **Inatumia** rangi waliyopewa na "nyekundu" kama chaguo-msingi cha onyo
- **Inaleta** maandishi katikati kwa usawa na wima kwenye canvas
- **Inatumia** vigezo vya JavaScript vya kisasa kwa rangi inayobadilika
- **Inatumia** muktadha wa 2D wa canvas moja kwa moja kuonyesha maandishi
**Unda kazi ya `endGame()`:**
**Tengeneza kazi ya `endGame()`:**
```javascript
function endGame(win) {
clearInterval(gameLoopId);
// Set a delay to ensure any pending renders complete
// Weka kuchelewesha ili kuhakikisha michoro yoyote inayosubiri imekamilika
setTimeout(() => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "black";
@ -233,19 +395,35 @@ function endGame(win) {
}
```
**Kazi hii inafanya:**
- **Inagandisha** kila kitu mahali pake - hakuna meli au laser zinazohama
- **Inachukua** pause ndogo (200ms) kuruhusu fremu ya mwisho kumaliza kuchora
- **Inafuta** skrini na kuipaka rangi nyeusi kwa athari ya kushangaza
- **Inaonyesha** ujumbe tofauti kwa washindi na walioshindwa
- **Inapaka rangi** habari - kijani kwa nzuri, nyekundu kwa... vizuri, si nzuri
- **Inawaambia** wachezaji jinsi ya kurudi kwenye mchezo
**Kazi hii hufanya:**
- **Inaweka kila kitu usiingie harakati - hakuna meli wala risasi zinazosogea**
- **Huchukua mapumziko mafupi (200ms) ili kuruhusu fremu ya mwisho kuchorwa**
- **Inafuta skrini na kuiweka weusi kwa athari ya kuonyesha**
- **Inaonyesha meseji tofauti kwa washindi na walioshindwa**
- **Inatumia rangi tofauti - kijani kwa mazuri, nyekundu kwa... si mazuri sana**
- **Inaeleza wachezaji jinsi ya kurudia mara moja**
### 🔄 **Ukaguzi wa Mafunzo**
**Usimamizi wa Hali ya Mchezo**: Kabla ya kutekeleza reset hakikisha unaelewa:
- ✅ Jinsi masharti ya mwisho yanavyounda malengo wazi ya mchezo
- ✅ Kwa nini mrejesho wa kuona ni muhimu kwa kuelewa kwa mchezaji
- ✅ Umuhimu wa kusafisha kwa usahihi ili kuzuia matumizi ya kumbukumbu kupita kiasi
- ✅ Jinsi usanifu unaoendeshwa na matukio unaruhusu mabadiliko safi ya hali
**Jaribio la Haraka**: Nini kingetokea kama usingesafisha wasikilizi wa matukio wakati wa reset?
*Jibu: Kutakuwa na matumizi ya kumbukumbu kupita kiasi na wasimamizi wa tukio wa mara kwa mara kusababisha tabia zisizotarajiwa*
**Kanuni za Ubunifu wa Mchezo**: Sasa unatekeleza:
- **Malengo Yaliyo Wazi**: Wachezaji wanajua hasa nini kina maana ya ushindi na kushindwa
- **Mrejesho wa Haraka**: Mabadiliko ya hali ya mchezo yanawasilishwa papo hapo
- **Udhibiti wa Mtumiaji**: Wachezaji wanaweza kuanzisha tena wanapokuwa tayari
- **Uhakikishi wa Mfumo**: Usafishaji sahihi unazuia mende na shida za utendaji
### Hatua ya 6: Tekeleza Mfumo wa Kuanzisha Upya Mchezo
### Hatua 6: Tekeleza Mfumo wa Kurejesha Mchezo
Mfumo wa kuanzisha upya unahitaji kusafisha kabisa hali ya mchezo wa sasa na kuanzisha kikao kipya cha mchezo. Hii inahakikisha wachezaji wanapata mwanzo safi bila data yoyote iliyobaki kutoka mchezo wa awali.
Mfumo wa kurejesha unahitaji kusafisha kabisa hali ya sasa ya mchezo na kuanzisha kipindi kipya cha mchezo. Hii inahakikisha wachezaji wanapata mwanzo safi bila data iliyobaki kutoka mchezo uliopita.
**Unda kazi ya `resetGame()`:**
**Tengeneza kazi ya `resetGame()`:**
```javascript
function resetGame() {
@ -266,15 +444,15 @@ function resetGame() {
}
```
**Hebu tuelewe kila sehemu:**
- **Inakagua** kama mzunguko wa mchezo unaendelea kabla ya kuanzisha upya
- **Inafuta** mzunguko wa mchezo uliopo ili kusimamisha shughuli zote za mchezo wa sasa
- **Inaondoa** wasikilizaji wote wa matukio ili kuzuia uvujaji wa kumbukumbu
**Tuelewe kila sehemu:**
- **Inakagua** kama mzunguko wa mchezo unaendelea kabla ya kurejesha
- **Inafuta** mzunguko wa mchezo uliopo kuzuia shughuli zote za sasa
- **Inatoa** wasikilizi wote wa matukio kuzuia matumizi ya kumbukumbu kupita kiasi
- **Inaanzisha upya** hali ya mchezo na vitu na vigezo vipya
- **Inaanzisha** mzunguko mpya wa mchezo na kazi zote muhimu za mchezo
- **Inadumisha** muda wa 100ms kwa utendaji wa mchezo thabiti
- **Inaanzisha** mzunguko mpya wa mchezo na kazi zote muhimu
- **Inahifadhi** muda wa 100ms kwa ustawi thabiti wa mchezo
**Ongeza msikilizaji wa tukio la kitufe cha Enter kwenye kazi yako ya `initGame()`:**
**Ongeza mshughulikiaji wa tukio la kitufe cha Enter kwenye kazi yako `initGame()`:**
```javascript
eventEmitter.on(Messages.KEY_EVENT_ENTER, () => {
@ -290,79 +468,217 @@ clear() {
}
```
**Mambo muhimu ya kukumbuka:**
- **Inaunganisha** bonyeza kitufe cha Enter na utendaji wa kuanzisha upya mchezo
- **Inasajili** msikilizaji wa tukio hili wakati wa kuanzisha mchezo
- **Inatoa** njia safi ya kuondoa wasikilizaji wote wa matukio wakati wa kuanzisha upya
- **Inazuia** uvujaji wa kumbukumbu kwa kusafisha wasikilizaji wa matukio kati ya michezo
- **Inaanzisha upya** kitu cha wasikilizaji kuwa hali tupu kwa uanzishaji safi
**Vidokezo muhimu kukumbuka:**
- **Inaunganisha** kitufe cha Enter na utendaji wa kuanzisha upya mchezo
- **Inasajili** mshughulikiaji huyu wakati wa kuanzisha mchezo
- **Inatoa** njia safi ya kuondoa wasikilizi wote wa matukio wakati wa reset
- **Inazuia** matumizi ya kumbukumbu kupita kiasi kwa kufuta wasimamizi wa matukio kati ya michezo
- **Inarudisha** vitu vya wasikilizi kuwa safi kwa kuanzisha tena bila matatizo
## Hongera! 🎉
👽 💥 🚀 Umefanikiwa kujenga mchezo kamili kutoka mwanzo. Kama waandaaji wa programu waliounda michezo ya video ya kwanza katika miaka ya 1970, umegeuza mistari ya msimbo kuwa uzoefu wa mwingiliano wenye mechanics sahihi za mchezo na maoni ya mtumiaji. 🚀 💥 👽
👽 💥 🚀 Umefanikiwa kujenga mchezo kamili kutoka mwanzo. Kama waandaaji wa michezo ya video ya awali miaka ya 1970, umegeuza mistari ya msimbo kuwa uzoefu shirikishi wenye mbinu sahihi za mchezo na mrejesho kwa mtumiaji. 🚀 💥 👽
**Umeyafanikisha:**
- **Kutekeleza** masharti kamili ya ushindi na kushindwa pamoja na mrejesho kwa mtumiaji
- **Kutoa** mfumo wa kuanzisha upya usio na mshono kwa mchezo wa kuendelea
- **Kubuni** mawasiliano wazi ya kuona kwa hali za mchezo
- **Kusimamia** mabadiliko mazito ya hali na usafishaji
- **Kukusanya** vipengele vyote katika mchezo unaochezwa na uthabiti
### 🔄 **Ukaguzi wa Mafunzo**
**Mfumo Kamili wa Maendeleo ya Mchezo**: Sherehekea ustadi wako wa mzunguko kamili wa maendeleo ya mchezo:
- ✅ Masharti ya mwisho huunda uzoefu unaoridhisha kwa mchezaji vipi?
- ✅ Kwa nini usimamizi sahihi wa hali ni muhimu kwa uthabiti wa mchezo?
- ✅ Mrejesho wa kuona huongeza uelewa wa mchezaji vipi?
- ✅ Mfumo wa kuanzisha upya una nafasi gani katika kushikilia wachezaji?
**Utaalamu wa Mfumo**: Mchezo wako kamili unaonyesha:
- **Mzunguko Kamili wa Maendeleo**: Kutoka kwenye michoro, ingizo, hadi usimamizi wa hali
- **Usanifu wa Kitaalamu**: Mifumo inayochochewa na matukio na usafishaji sahihi
- **Ubunifu wa Uzoefu wa Mtumiaji**: Mrejesho wazi na udhibiti wa maana
- **Uboreshaji wa Utendaji**: Uchoraji mzuri na usimamizi wa kumbukumbu kwa ufanisi
- **Ukomavu na Ukamilifu**: Maelezo yote yanayofanya mchezo uonekane umekamilika
**Ujuzi wa Viwanda**: Umetekeleza:
- **Mzunguko wa Mchezo**: Mifumo ya wakati halisi na utendaji unaoendelea
- **Programu Zinazoendeshwa na Tukio**: Mifumo iliyotenganishwa inayostawi vizuri
- **Usimamizi wa Hali**: Usimamizi wa data ngumu na maisha ya kategoria
- **Ubunifu wa Kiolesura cha Mtumiaji**: Mawasiliano wazi na udhibiti unaojibu
- **Upimaji na Utatuzi**: Maendeleo ya mara kwa mara na kutatua matatizo
### ⚡ **Unaweza Kufanya Katika Dakika 5 Zilizofuata**
- [ ] Cheza mchezo wako kamili na jaribu masharti yote ya ushindi na kushindwa
- [ ] Jaribu kubadilisha vigezo vya masharti ya mwisho tofauti
- [ ] Ongeza taarifa za console.log kufuatilia mabadiliko ya hali ya mchezo
- [ ] Shiriki mchezo wako na marafiki na ukusanye mrejesho
### 🎯 **Unaweza Kufanikisha Saa Hii**
- [ ] Maliza jaribio la baada ya somo na tafakari kuhusu safari yako ya maendeleo ya mchezo
- [ ] Ongeza athari za sauti kwa hali za ushindi na kushindwa
- [ ] Tekeleza masharti ya mwisho zaidi kama mipaka ya muda au malengo ya ziada
- [ ] Tengeneza ngazi tofauti za ugumu na idadi tofauti ya maadui
- [ ] Boresha muonekano wa mchezo kwa michoro bora na rangi
### 📅 **Mafanikio ya Maendeleo ya Mchezo Kwa Wiki Nzima**
- [ ] Maliza mchezo wa anga ulioboreshwa na ngazi nyingi na maendeleo
- [ ] Ongeza vipengele vya juu kama nguvu za ziada, aina tofauti za maadui, na silaha maalum
- [ ] Tengeneza mfumo wa alama za juu unaohifadhi data kwa kudumu
- [ ] Buni miunganisho ya mtumiaji kwa menyu, mipangilio, na chaguzi za mchezo
- [ ] Boresha utendaji kwa vifaa na vivinjari tofauti
- [ ] Toa mchezo wako mtandaoni na ushirikishe na jamii
### 🌟 **Kazi Yako ya Miezi Mmoja ya Maendeleo ya Mchezo**
- [ ] Tengeneza michezo kamili mingi ukichunguza aina na mbinu tofauti
- [ ] Jifunze fremu za maendeleo ya michezo za hali ya juu kama Phaser au Three.js
- [ ] Changia katika miradi ya maendeleo ya michezo ya chanzo wazi
- [ ] Soma misingi ya muundo wa mchezo na saikolojia ya mchezaji
- [ ] Unda mkusanyiko unaoonyesha ujuzi wako wa maendeleo ya michezo
- [ ] Ungana na jamii ya maendeleo ya michezo na endelea kujifunza
## 🎯 Ratiba Yako Kamili ya Utaalamu wa Maendeleo ya Mchezo
```mermaid
timeline
title Mchakato Kamili wa Kujifunza Maendeleo ya Mchezo
section Msingi (Masomo 1-2)
Game Architecture: Muundo wa mradi
: Usimamizi wa mali
: Misingi ya kioo cha kuchora
: Mifumo ya matukio
section Mifumo ya Mwingiliano (Masomo 3-4)
Player Control: Udhibiti wa ingizo
: Mbinu za mwendo
: Kugundua mgongano
: Mulinganisho wa fizikia
section Mbinu za Mchezo (Somo 5)
Feedback Systems: Mbinu za upigaji pointi
: Usimamizi wa maisha
: Mawasiliano ya kuona
: Motisha ya mchezaji
section Kukamilika kwa Mchezo (Somo 6)
Polish & Flow: Masharti ya mwisho
: Usimamizi wa hali
: Mifumo ya kuanzisha tena
: Uzoefu wa mtumiaji
section Vipengele vya Juu (Wiki 1)
Enhancement Skills: Uingizaji wa sauti
: Athari za kuona
: Maendeleo ya ngazi
: Uboreshaji wa utendaji
section Maendeleo ya Kitaalamu (Mwezi 1)
Industry Readiness: Uelewa wa mfumo
: Ushirikiano wa timu
: Maendeleo ya jalada
: Ushiriki wa jamii
section Kuendeleza Kazi (Miezi 3)
Specialization: Injini za mchezo za hali ya juu
: Uenezaji wa jukwaa
: Mikakati ya kupata mapato
: Mtandao wa viwanda
```
### 🛠️ Muhtasari wa Zana Zako Kamili za Maendeleo ya Mchezo
Baada ya kumaliza mfululizo huu mzima wa michezo ya anga, sasa umejifunza:
- **Mimaarufu ya Mchezo**: Mifumo inayotegemea matukio, mizunguko ya mchezo, na usimamizi wa hali
- **Programu ya Michoro**: API ya Canvas, uchoraji wa sprite, na athari za kuona
- **Mifumo ya Ingizo**: Matumizi ya kibodi, kugundua mgongano, na udhibiti unaojibu
- **Ubunifu wa Mchezo**: Maoni ya mchezaji, mifumo ya maendeleo, na mbinu za ushiriki
- **Uboreshaji wa Utendaji**: Uchoraji mzuri, usimamizi wa kumbukumbu, na udhibiti wa kiwango cha fremu
- **Uzoefu wa Mtumiaji**: Mawasiliano ya wazi, udhibiti wa moja kwa moja, na maelezo ya ukamilifu
- **Mifumo ya Kitaalamu**: Msimbo safi, mbinu za kutatua matatizo, na mpangilio wa mradi
**Matumizi Halisi**: Ujuzi wako wa maendeleo ya michezo unahusiana moja kwa moja na:
- **Maombi ya Mtandao ya Kuingiliana**: Vipengele vya mabadiliko na mifumo ya wakati halisi
- **Uonyeshaji wa Data**: Chati zenye michoro na michoro ya kuingiliana
- **Teknolojia ya Elimu**: Kuendeleza michezo na uzoefu wa kujifunza unaovutia
- **Maendeleo ya Simu**: Mwingiliano wa kugusa na uboreshaji wa utendaji
- **Programu za Kuiga**: Injini za fizikia na uigaji wa wakati halisi
- **Sekta za Ubunifu**: Sanaa inayokwenda na mwingiliano, burudani, na uzoefu wa kidijitali
**Ujuzi wa Kitaalamu Uliopatikana**: Sasa unaweza:
- **Kuunda** mifumo changamano ya mwingiliano kutoka mwanzo
- **Kutatua hitilafu** katika maombi ya wakati halisi kwa mbinu za kimfumo
- **Kuboresha** utendaji kwa uzoefu safi wa mtumiaji
- **Kubuni** maelezo ya mtumiaji yanayovutia na mifumo ya mwingiliano
- **Kushirikiana** kwa ufanisi kwenye miradi ya kiufundi kwa muundo sahihi wa msimbo
**Mafundisho ya Maendeleo ya Mchezo Uliyoyajua**:
- **Mifumo ya Wakati Halisi**: Mizunguko ya mchezo, udhibiti wa kiwango cha fremu, na utendaji
- **Mimaarufu Inayotegemea Matukio**: Mifumo isiyounganishwa na upitishaji ujumbe
- **Usimamizi wa Hali**: Kusimamia data changamano na maisha ya hali
- **Programu ya Kiolesura cha Mtumiaji**: Michoro ya Canvas na muundo unaojibu
- **Nadharia ya Ubunifu wa Mchezo**: Saikolojia ya mchezaji na mbinu za ushiriki
**Hatua Ifuatayo**: Uko tayari kuchunguza fremu za michezo za hali ya juu, michoro ya 3D, mifumo ya wachezaji wengi, au kuingia katika nafasi za kitaalamu za maendeleo ya mchezo!
🌟 **Mafanikio Yamefunguliwa**: Umehitimisha safari kamili ya maendeleo ya mchezo na kuunda uzoefu wa mwingiliano wa kitaalamu kutoka mwanzo!
**Umefanikiwa:**
- **Kutekeleza** masharti kamili ya kushinda na kushindwa na maoni ya mtumiaji
- **Kuunda** mfumo laini wa kuanzisha upya kwa uchezaji endelevu
- **Kubuni** mawasiliano ya wazi ya kuona kwa hali za mchezo
- **Kusimamia** mabadiliko magumu ya hali ya mchezo na usafishaji
- **Kukusanya** vipengele vyote kuwa mchezo unaoweza kuchezwa kikamilifu
**Karibu katika jamii ya maendeleo ya mchezo!** 🎮✨
## Changamoto ya Wakala wa GitHub Copilot 🚀
## Changamoto ya GitHub Copilot Agent 🚀
Tumia hali ya Wakala kukamilisha changamoto ifuatayo:
Tumia hali ya Agent kumaliza changamoto ifuatayo:
**Maelezo:** Boresha mchezo wa anga kwa kutekeleza mfumo wa maendeleo ya viwango na ugumu unaoongezeka na vipengele vya bonasi.
**Maelezo:** Boresha mchezo wa anga kwa kutekeleza mfumo wa maendeleo ya ngazi kwa ugumu unaoongezeka na vipengele vya bonasi.
**Kichocheo:** Unda mfumo wa mchezo wa viwango vingi ambapo kila kiwango kina meli zaidi za adui zenye kasi na afya iliyoongezeka. Ongeza kipengele cha kuzidisha alama kinachoongezeka na kila kiwango, na tekeleza nguvu za ziada (kama risasi za haraka au kinga) zinazojitokeza kwa bahati nasibu wakati maadui wanaharibiwa. Ongeza bonasi ya kukamilisha kiwango na onyesha kiwango cha sasa kwenye skrini pamoja na alama na maisha yaliyopo.
**Maelekezo:** Tengeneza mfumo wa mchezo wa anga yenye ngazi nyingi ambapo kila ngazi ina meli za maadui zaidi zenye kasi na afya iliyoongezeka. Ongeza kipengele cha kuzidisha alama kinachoongezeka kila ngazi, na utekeleze nguvu za ziada (kama moto wa haraka au kinga) zinazoonekana kwa nasibu wakati maadui wanapouawa. Jumuisha bonasi ya kukamilisha ngazi na onyesha ngazi ya sasa kwenye skrini pamoja na alama na maisha yaliyopo.
Jifunze zaidi kuhusu [hali ya wakala](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
Jifunze zaidi kuhusu [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) hapa.
## 🚀 Changamoto ya Kuboresha Hiari
**Ongeza Sauti kwenye Mchezo Wako**: Boresha uzoefu wa uchezaji kwa kutekeleza athari za sauti! Fikiria kuongeza sauti kwa:
**Ongeza Sauti kwa Mchezo Wako**: Boresha uzoefu wako wa kucheza kwa kutekeleza athari za sauti! Fikiria kuongeza sauti kwa:
- **Risasi za laser** wakati mchezaji anapiga
- **Uharibifu wa adui** wakati meli zinapigwa
- **Madhara kwa shujaa** wakati mchezaji anapigwa
- **Muziki wa ushindi** wakati mchezo unashinda
- **Sauti ya kushindwa** wakati mchezo unapotea
- **Mishale ya laser** wakati mchezaji anapopiga risasi
- **Uharibifu wa maadui** wakati meli zikipigwa
- **Madhara kwa shujaa** wakati mchezaji anakumbwa na pigo
- **Muziki wa ushindi** wakati mchezo unaposhindaniwa
- **Sauti ya kipigo** wakati mchezo unapopotea
**Mfano wa utekelezaji wa sauti:**
```javascript
// Create audio objects
// Tengeneza vitu vya sauti
const laserSound = new Audio('assets/laser.wav');
const explosionSound = new Audio('assets/explosion.wav');
// Play sounds during game events
// Cheza sauti wakati wa matukio ya mchezo
function playLaserSound() {
laserSound.currentTime = 0; // Reset to beginning
laserSound.currentTime = 0; // Rejesha mwanzo
laserSound.play();
}
```
**Unachohitaji kujua:**
- **Inaunda** vitu vya Sauti kwa athari tofauti za sauti
- **Inaseti upya** `currentTime` kuruhusu athari za sauti za haraka
- **Inashughulikia** sera za autoplay za kivinjari kwa kuchochea sauti kutoka kwa mwingiliano wa mtumiaji
- **Inasimamia** sauti na muda wa sauti kwa uzoefu bora wa mchezo
**Unachopaswa kujua:**
- **Inatengeneza** vitu vya Sauti kwa athari tofauti
- **Inarejesha** `currentTime` kuruhusu athari za sauti za moto wa haraka
- **Inashughulikia** sera za kuanza moja kwa moja kwa kivinjari kwa kuzua sauti kutokana na mwingiliano wa mtumiaji
- **Inasimamia** kiasi cha sauti na muda kwa uzoefu bora wa mchezo
> 💡 **Rasilimali ya Kujifunza**: Chunguza [sandbox ya sauti](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) ili kujifunza zaidi kuhusu kutekeleza sauti katika michezo ya JavaScript.
> 💡 **Rasilimali ya Kujifunza**: Chunguza [sandbox ya sauti](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) ili ujifunze zaidi kuhusu utekelezaji wa sauti katika michezo ya JavaScript.
## Maswali ya Baada ya Somo
## Mtihani Baada ya Mfululizo wa Mafunzo
[Maswali ya baada ya somo](https://ff-quizzes.netlify.app/web/quiz/40)
[Mtihani baada ya mfululizo wa mafunzo](https://ff-quizzes.netlify.app/web/quiz/40)
## Mapitio na Kujisomea
## Mapitio na Kujisomea Binafsi
Kazi yako ni kuunda sampuli mpya ya mchezo, kwa hivyo chunguza baadhi ya michezo ya kuvutia huko nje ili kuona ni aina gani ya mchezo unaweza kujenga.
Kazi yako ni kuunda mfano mpya wa mchezo, hivyo chunguza baadhi ya michezo ya kuvutia ili uone aina gani ya mchezo unaweza kuunda.
## Kazi
[Jenga Sampuli ya Mchezo](assignment.md)
[Jenga Mchezo Mfano](assignment.md)
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Hati ya Kutolea Maelezo**:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au dosari. Hati ya asili katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayotolewa na binadamu inashauriwa. Hatubebe dhamana yoyote kwa kutokuelewana au tafsiri potofu zitokanazo na matumizi ya tafsiri hii.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save