kita akan belajar objek oriented programming lewat bahasa pemrograman Python yang kalian tunggu-tunggu Bang lanjutan lanjutan Python dong bang dan syarat untuk mengikuti video ini kalian Tonton dulu video berikut itu bisa untuk fundamental dasar kalau kalian mau coba-coba Python di situ oke dan Sekarang kita akan belajar objek United programming lewat 2 atau lewat satu studi kasus yang mana di dalamnya ada dua buah objek jadi opj itu sendiri kalian harus tahu dulu bahwa kalau kita udah bicara op itu berarti kita menggambarkan sesuatu lewat sebuah objek player atau pemain dan satu lagi ada Enemy atau musuh asumsikan kita akan membuat sebuah game yang sederhana bukan game yang kayak macam ada grafiknya bukan ya ini ini lebih ke implementasi konsep op di dalam Python itu sendiri dengan dua objek yang kita Gambarkan sekarang yaitu player dan juga Enemy nantinya ke depan sebelum kita ngoding gua akan Jelaskan apa yang akan kita buat hari ini dan di sini pun akan gua mulai dari nol juga Oke jadi nanti kedepannya kita akan bikin player ini bisa interaksi ke Enemy alias player bisa melakukan penyerangan kepada musuhnya dan bahkan enemynya bisa nyerang balik ke sini di dalam op kita harus bisa menstrukturkan bahwa si player Ini tuh punya data apa aja Taruhlah player itu punya banyak atribut misalnya kayak macam nama gitu ya di sini ada nama terus ada juga dia tuh punya health atau name lah pakai bahasa Inggris ya Ada name ada health ada eee apalagi biasanya energi misalnya gitu Oke ini atribut untuk player dan untuk Enemy pun sama misalnya punya name punya health tapi nggak punya energi misalnya musuh tuh nggak punya energi ini Taruhlah musuhnya itu monster ya Enemy atau monster lah kayak gitu-gitu kedua hal ini akan kita jadikan sebuah kelas di Python ada kelas player dan kelas Enemy kedua kelas ini punya perilaku-perilaku yang masing-masing itu pasti berbeda untuk player itu punya aktivitas atau apa sih sebutnya tuh method ya method itu kayak macam Apa yang bisa dilakukan oleh playernya ya di sini misalnya player itu bisa attack pakai buka tutup artinya itu metode ya terus player itu bisa move Juga misalnya bisa jalan kayak gitu-gitu lah kurang lebih tapi paling dasar ya player itu bisa attack dulu aja oke untuk metodenya seperti ini dan untuk Enemy Enemy itu bisa attack juga tapi cukup berbeda anggapannya di sini monster ya monster aja jangan Enemy deh monster monster di sini agak cukup berbeda kalau kita bermain MMORPG game Monster akan menyerang ketika diserang ya enggak jadi ketika terjadi penyerangan yang dilakukan oleh si player itu sendiri kalau diserang dia akan nyerang balik gitu Baru dia nyerang balik ke sini dan health dari player akan berkurang kalau player yang menyerang nggak tag ke si monster maka health monster akan berkurang betul dan ketika health monster ini berkurang artinya monster ini sedang diserang dan ada Trigger ketika monster ini diserang maka monster akan melakukan attack kepada si player dan mengefek ke health-nya si player nah kurang lebih kayak gitu-gituan akan kita mainkan di codingan Python kali ini gimana konsep Apa yang akan kita buat cukup mengerti nggak nih studi kasusnya nih player bisa nyerang ke monster dan juga monster bisa nyerang balik ke player tapi monster hanya menyerang ke player ketika monster diserang dengan konsep Oop kita akan coba sekarang let's go untuk materi awal kita mulai dari yang playernya terlebih dahulu tapi nggak perlu ribet-ribet kita bikin yang paling kecilan dulu supaya ngerti konsep op-nya di Python seperti kayak gimana oke pertama kita di clear pakai yang namanya class huruf kecil semua Sorry kelas terus kita kasih nama dari objek itu apa nama objeknya adalah player seperti ini terus kasih titik dua dan di sini adalah atribut-atributnya apa di sini adalah metode-metodenya apa Biasanya seperti itu Oke untuk mengosongkan ini kita bisa Tes kita bisa kasih PS maksud gua kayak begini ya yang artinya itu si player ini enggak ada apa-apanya udah 0 doang dan kalau kita print playernya langsung player Ini adalah sebuah objek gitu kalau kita Run Nah di sini player adalah bagian dari Man yang ada di dalam SI Python itu sendiri dia adalah sebuah kelas dan untuk memanggil kelas ini kita bisa tinggal bikin instant baru di sini Taruhlah pakai huruf kecil player sama dengan player pakai buka tutup ini adalah sesuatu yang baru dari objek player Ini jadi apa-apa yang ada di dalam player sini adalah mencerminkan struktur dari kelas player itu sendiri sekarang kita belum bisa ngapa-ngapain karena belum ada apa-apanya di sini jadi kita bikin atributnya salah satunya misalnya dia itu punya nama yang nama awalnya itu misalnya Joni Terus lu bisa panggil nama itu lewat player ini jadi urutannya kayak begini Pak player ini sekarang udah masuk sebagai kelas player Jadinya kalau Memanggil nama Kita tinggal panggil player ini plus diikuti dengan nama atributnya apa ke sini Jadi kurang lebih kayak begini player dot nah pakai dot ya dot Apa nama atributnya name maka sebenarnya kalau kita cetak layar ini akan muncul Joni Kalau kita print kita bungkus ini jadi print ya print kayak begini gua hapus dulu supaya lebih menarik Kita pakai f di sininya biar terformat hasil printnya terus untuk mencetak variabel di dalam string ini kan pakai f ya Terus lu pakai kayak beginian masukin namenya lewat player.name [Musik] kita save kita Run Johnny berhasil dibuat sekarang gimana kalau misalkan nilai joninya nggak mau di sini tapi pengen di set di luar itu bisa juga sekarang taruh di sini player.name langsung kasih sama dengan misalnya kalau kita cetak lagi print F layer.name adalah nama baru perhatikan di sini berhasil dibuat the Official adalah nama baru karena kita Bypass atribut ini di sini nah ini kaitannya dengan yang namanya asses modifier jadi kita belajar dulu sedikit tentang asses modifier modifier ini yang kita di clear di sini adalah bertipe public Jadi kalau publik itu bisa diakses oleh luaran dari kelas ini contohnya luaran itu mana ini outer kelas ya ini inner class ini outer class outer kelas itu bisa mengakses name karena name ini adalah public sekarang Taruhlah di sini punya gaji player itu misalnya nih gaji taruh satu juta pakai underscore ya biar enak naruh nolnya gaji 1 juta dan kita ini gua hapus dulu bisa menentukan gajinya di sini padahal gajinya tuh udah fix 1 juta nggak boleh diubah-ubah tapi di sini ada seseorang misalnya gua tentuin dulu player.name itu udah jelas Joni kita ganti jadi Afrizal misalnya terus di sini juga karena gaji itu bersifat pabrik jadi kita bisa Set di sini gaji sama dengan 3 juta padahal semestinya dari sistem itu gaji harusnya udah 1 juta nggak boleh diubah-ubah tapi ketika kita ketik Player di sini kan akan muncul langsung dari intellisons bawaan pai jamnya Ini gua pakai pita ada gaji ada name yang mana Oh lah salah ini harusnya sellery pakai bahasa Inggris dong kan biar sesuai ya itu udah bahasa Inggris ini masa ini Indonesia salary eh sorry ini name ini nah ketika kita kasih titik salary dan lemnya muncul ke sini karena dia publik bisa diakses di luar kelasnya ini adalah yang di luar kelas kelas itu Terhenti Di Sini Betul tapi dia bisa terakses di sini karena dia public dan kalau pengen ini salary terlindungi dari orang-orang lain yang merubahnya di other class itu kita bisa kasih underscore underscore yang artinya underscore underscore itu adalah private asses modifier so ini bisa kita kategorikan sebagai private kalau gak salah sama juga kayak djs ya djs itu pakai pagar kalau di sini mah pake industri dan kalau gua baca-baca ya tentang Python itu sendiri agak sedikit bingung memang underscore underscore itu untuk private gue pribadi ya gua pribadi bingung sih kalau underscore doang itu untuk protected asses modifiernya dan Kalau nggak ya udah berarti nggak Nah si underscore kosongan doang ini kan protected berarti ini hanya bisa diakses oleh kelas turunan dari kelas utamanya atau kelasnya itu sendiri itu bisa mengakses sih underscore ini tapi kalau udah underscore mau turunannya pun itu nggak bisa mengakses Ya kurang lebih kayak gitu cuman gua bingungnya sih karena ini aja karena underscore underscore underscore aja gitu Gua takutnya kebalik gitu Pak apakah yang private yang underscore-nya 1 ataukah yang private__2 atau kayak gimana takut salah itunya aja tapi setelah gua mencoba dan gua buktikan di sini Yang gua bisa simpulkan sih underscore underscore ini adalah bersifat private karena Sekarang kita coba ya ini kalau udah gua kasih Android lu perhatikan di sini Bentar gua save dulu kali ya Bentar ini Lu lihat dah lu lihat lu lihat ketika gua ketik kayak gini makam salary muncul lubang katanya private nggak akan muncul ke sini lu perhatiin di sini udah berubah jadi variabel variabel barunya tuh namanya atribut barunya itu namanya underscorery di sini kita timpah kelas player dengan atribut baru yang namanya sellery jadi ini tuh dua hal yang berbeda kalau kita cetak Ya ini gua cetak nih print player.saleri sama print player._celeri Nggak ada tuh ke sini nggak masuk itu yang bikin gue bingung Jadi intinya itu udah sama dia tuh atribut baru ya atribut yang diset tapi juga sekaligus membuat dia menghilang dari peradaban gitu beneran ya kan bingung juga nih di underscore ini kagak ada nah cara supaya bisa mengekspos yang private itu kan kita bikin sebuah method untuk bisa mengekspos yang private tersebut method publik sebenarnya lebih pusingnya lagi ini Eh sorry ya ini ini sebelum jauh-jauh kita bikin konsep yang tadi udah gua gambarin di sini sebelum jauh-jauh ke sini gua mau sharing juga tentang kebisingan gua nih ya di Python itu sendiri sebenarnya di sini kita Ah gimana ya Ini gua bikin method Dev pakai Dave kalau kalian mau bikin sebuah metode get sellery misalnya get underscore sellery akan ada self nah ini kepungan berikutnya mungkin buat kalian yang belum pernah nih anggapan lah self itu kalau di JS atau kalau di bahasa lain disk kayak gitu-gitu kurang lebih mungkin ya tapi intinya self ini mencerminkan apa-apa yang ada di dalam kelas tersebut Jadi seluruh yang ada di sini itu itu bagian dari self juga parameter lah atau disebutnya di sini mah argumen Nah itulah argumen kita akan Return underscore underscore sorry Nah ini kan kalian bisa langsung underscorery karena self ini mencerminkan semua yang ada di sini maka supaya bisa masuk ke underscore lu mesti Panggil dulu self-nya di sini kasih titik baru underscore underscore sellery-nya muncul Kok bisa Bang karena_seleri itu adalah private private asses modifier hanya bisa diakses di dalam kelasnya sendiri get sellery adalah sebuah method yang ada di dalam kelas player kelasnya sendiri jadi dia muncul underscore underscore sellery tapi di sini di luar kelas kita nggak bisa player. gagal muncul apa-apa yang adanya adalah Dander method Dander method itu bawaan dari Python yang ada dobel underscore tuh biasanya disebut Thunder method kayak beginian ini bawaan dari Python tapi kan kita nggak main ini dulu ya kita mainin yang bikinan kita aja dulu bikinan kita sendiri aja kadang-kadang kita bingung ya kan nah Jadi intinya ini udah private yang bisa diakses di method yang bawaannya sih player itu sendiri atau bisa diakses di bawaannya di kelas bawaannya anjing susah banget gitu jadinya ini nggak akan bisa nih player. karena player ini di luar Scope dari player ini player objek betul dan untuk mengaksesnya kita lewat sih gate salary ini kalau gua Panggil dot getselerinya ada kok bisa Bang ya karena getseri ini sifatnya publik nggak pakai underscore nggak pakai apa-apa yang underscore kayak begini berlaku untuk atribut berlaku juga untuk method Jadi kalau lu taruh di sini methodnya underscore lalu Taruh lagi sini player dot menghilang Pak kagak ada jadi percuma kalau bikin getselerinya pakai private membuat apa gitu sama dengan memanggil langsung ke sini tapi kan nggak bisa kayak gitulah intinya ya Jadi ini Ini gua balikin lagi kayak gini Untuk apa tujuannya untuk meng-compare apa yang kita bikin di sini ini kan kita inject langsung ke dalam player sellery sebagai atribut baru dengan nilai 3 juta dan kita cetak ke layar dan kalau kita cetak udah pasti nilainya 3 juta dong nih 3 juta tapi 3 juta ini bukan menimpa sellery yang ini karena lu mungkin mikir di awal tadi sellery ini adalah Ini yang mana ini hanyalah aksesoris underscore underscore ini bukan aksesoris ini mah memang terbentuk sebagai atribut juga gitu Jadi udah mah ini jadi fungsi yang alah gimana ya Magic lah ibaratnya mah ini fungsinya merubah fungsinya plus juga merubah atributnya namanya gitu alah ya Jadi kalau gua print sini player.get sellery ya ini untuk membandingkan sellery kita yang saat ini yang ada di dalam kelas player itu terubah tidak dengan 3 juta ini yang tadinya satu juta kita lihat ya Nih gua taruh sini aja deh kita lihat kita Run Perhatikan satu juta itu tetap dapat dari player get salary ini get seller itu ini ya return self_faelary ini yang tadinya private di Expose menjadi sebuah method yang publik itu juga agak sedikit gimana gitu di otak gua ya dia teh private tapi dia di iniin nah sebenarnya kalau kalian punya pemikiran yang sampai ke gua lah ya udah aja kalau gitu mah publik Bang gitu Ngapain juga di private begini bedanya sekarang dia underscore ini cuman bisa di gate doang karena kita spesifik punya method untuk menggetnya nggak bisa ngeset seller ini gimanapun caranya lu mau pakai underscore underscore di sini ditimpah menjadi 3 juta pun Ya ini gua awasin dulu ketika kita lihat sendiri ini nggak akan bisa kalau kita Run niat satu juta Tetep get salary tetap satu juta nggak bisa dan malahan malahan player membentuk atribut baru kita coba panggil atributnya print player.celeri ah pusing kalau kita cetak outputnya ekspektasi gua adalah ini get salary akan mencetak 1 juta dan yang ini player salary ini membuat atribut baru bernama underscore underscore sellery 3 juta jadi kalau kita print satu juta dan 3 juta akan ke layar Wah Padahal sama underscore underscore Man tapi yang ini mah nggak bisa ya di kayak beginiin gitu ya maksud gua Ngerti nggak ya sebelum kita Jojo ke sana karena jujur pertama kali gua belajar Python gua bingung di sininya cuman sekarang udah tau lah intinya itu apa supaya membungkus ya ini salah satu bagian dari m kapsulation di aov pastinya supaya enggak nggak mengekspos atau supaya datanya itu nggak bisa di set dari luar hanya memang bisa diset tertentu dengan hal-hal tertentu di dalam kelasnya kayak gitu kurang lebih Oke sekarang kita baru bisa masuk nih ya ke dalam studi kasus yang gua maksud tadi tentang player dan juga tentang Enemy gua akan hapus ini sebagai intro permulaan tentang asses modifier dan juga beberapa hal yang gua pusingkan di awal ketika pertama kali gua belajar jadi ketika kalian mengikuti video ini nggak akan terlalu kaget dengan nanti apa yang akan kita coding gitu karena lebih Ini gua hapus lagi name juga gua hapus kita akan sesuaikan seperti apa yang ada di gambar ini juga gua hapus Kita tes dulu aja kosongin Cek lagi ke gambar player itu punya health dan juga punya energi dan juga punya nama kita mulai dari yang paling gampang yaitu nama atau kita langsung health energy aja kali biar lebih dalamnya kita bisa bikin ini menjadi Peter eksekusi langsung ketika pertama kali dibikin seperti ini dengan yang namanya Dander method di Python yang kayak macam begini ini pasnya gua awasin dev ini ya ini Dander dari Python supaya ketika pertama kali player ini terbentuk akan otomatis ini dijalankan misalnya terus gua print di sini print attacking gitu di sini gua print player created misalnya di sini gua cuman bikin player sama dengan player udah gini doang ekspektasinya adalah tidak memunculkan apa-apa dong karena belum dibikin ke attack kecuali kalau kita player dot attack maka wajar kalau muncul print attacking 1 Usage di sini artinya ini digunakan oleh satu oleh satu hal sesuatu di luar kelasnya yaitu sih ini gitu Tapi ketika kita begini pun kalau kita Run player created yang artinya Dander ini mengeksekusi dirinya sendiri ketika pertama kali terbentuk gitu ya makanya yang bisa di sini kita taruh aja print player artinya setiap kali ada yang menggunakan kelas ini artinya dia membentuk sesuatu hal yang baru jadi kita kasih created seperti ini dan di dalam sini kalian bisa paching Pak ya di dalam sini kalian bisa Pesing health-nya untuk si player ataupun energinya untuk si player contoh disini ada misalnya health maka kita masukkan di sini health artinya apa apa yang di dalam kurung sini itu adalah bagian dari ini kalau gua taruh di sini health-nya 100 ya player ini punya health 100 kalau gua Run saat ini nggak ya cuman player created doang karena 100 ini ngambang ngambang di mana ngambang di sini di sini kita nggak Tentukan apa-apa Taruhlah Di Sini gua bikin satu variabel atau satu atribut Sorry dengan cara seperti ini self dot health atau self dot X aja X dulu biar kalian nggak pusing self.x awalnya itu satu misalnya gini lalu kita cetak X ini ketika pertama kali player terbentuk player create di sini koma X = dalam kurung buka kayak gini self.x supaya bisa jalan variabel yang dipanggil dalam string kita tambahin f di sini kalau kita player created x1 x-nya 1 Oke ini belum kepake nih karena ini yang di dalam kurung sini akan masuk ke sini jadi 100 ini udah ada di dalam health dan tinggal kalian mainkan variabel kosongan X ini yang tadinya nilainya satu akan kita Timpa dengan health yang dikirim dari player jadi dua timpah dengan held sekarang tebak health-nya akan berapa atau x yang akan berapa Sorry X di sini X di sini akan menjadi 100 Kalau getaran X100 karena kita udah yakin bahwa self dot Artinya kita membuat sesuatu baru atribut baru di dalam kelas player kita akan buat atribut baru yang namanya health yang isi health-nya adalah health yang dikirim atau di passing dari argument sini ya Nah kalau di awal tadi gua bikin langsung kayak begini self health health lu akan bingung sendiri Maksudnya apa ini health ini health ini health jadi apaan gitu kan Makanya gua taruh di sini X dulu atau Y dulu Terserah lu jadi ini tuh bebas sebenarnya mau kayak begini pun bisa ya dan isi nilai ini adalah yang dikirim dari ini itu basicnya dulu nih sebelum jauh-jauh Oke jadi kita udah membentuk satu health yang baru di sini kita bisa ganti semuanya jadi health dan self nya pun disesuaikan jadi self health seperti itu kalau kita Run player created health 100 Oke dan bahkan kalau misalkan lu nggak mau passing ini di sini ini kan akan error sekarang error missing satu required artinya setiap kali kita mendefinite seperti ini pakai Dander ini ini jadi wajib hukumnya harus kita paching lewat ini supaya misalkan lu nggak mau nih passing di sini kita bisa taruh langsung nilainya di dalam argumen health ini taruh di sini sama dengan 100 artinya nilai default health kalau kita nggak set dari luarannya akan otomatis 100 kalau kita Run sekarang held 100 tapi ketika ada orang lain ngepahing 200 di sini nilai yang ini udah bukan jadi prioritas lagi tapi yang dari sini menjadi prioritas sehingga 100 ini akan diganti jadi 200 kalau getaran outputnya akan menjadi health 200 seperti itu jadi itu tergantung kalian aja mau yang mana dan gua pribadi enaknya kalau mainan beginian ini kan kita agak sedikit ambigu ya player sama dengan player 200 apa sih 200 Tuh nggak ada sesuatunya banget gitu kan kita bisa kasih argumennya langsung di sini health sama dengan 200 biar lebih terbaca aja sebenarnya gitu ya Jadi intinya kita punya player yang mana health-nya itu 200 nilainya kalau getaran masih aman Oke kalau kita nggak pakai ini pun nggak masalah nggak usah pakai spasi spasi ya langsung aja kayak begituan ya boleh Ran kayak begini dan misalkan kalau kalian pengen mengetahui apa-apa yang ada di dalam sini itu nanti gua akan kasih tahu contoh sekarang kita bikin dulu ya satu lagi ini health udah Terus energi energi kita bikin default-nya 100 juga terus kita tinggal masukin lagi hal yang sama dengan energi seperti ini player create Nah kan kita harus ribet lagi ya di sini tambahin lagi self self dot energi gitu capek ya untuk trouble shooting tujuan trouble shooting ini kita bisa Hapus di sini cukup layer created dan kita bisa bikin apa ya pemanggilannya di sini langsung untuk mengetahui objek apa aja sih yang ada di dalam SI kelas player ini dengan cara print player. ini Dander metode lagi DCT yang ini jadi kalau kita Run kita bisa tahu apa sih yang ada di dalam isian player ini kalau gua Run player created dan di dalamnya itu ada health 100 energy 100 perhatikan Ini adalah sebuah objek kalau di JS ini kan objek nih yang bisa kita kelola pastinya Oke sampai sini dulu pusing atau tidak Ini belum kelanjutannya nih belum ada yang namanya Super belum ada yang namanya kontraktor Ini udah ini tuh kontraktor ya ya gua lupa ini kontraktor kalau di bahasa-bahasa lain kayak macam JS ya kalau di gua JS ini kita sebut kontraktor lah kurang lebih gitu aman ya kita akan coba Lanjutkan ke kelas yang satunya lagi kalau ini kan health energy itu udah punya player udah ada gitu ya attack udah ada juga yang belum itu tadi tinggal monster jadi untuk monster Sorry playernya Kita tes dulu attack kita belum Attack kita fokus di player dulu ya kalian fokus di player player.te attack kayak gini harusnya dia akan muncul attacking Oke dan kita kasih sedikitlah bumbu-bumbu untuk memodifikasi atribut yang udah ada di sini jadi ketika nge-tag energinya akan berkurang sesuai Berapa besar attack-nya gitu so kalian bisa lihat perhatikan aja di sini ini kan kalau di dalam kurung itu berarti kita bisa Pahing sesuatu argumen gitu tergantung dari methodnya sendiri dan ini kan method kita sendiri ya Jadi kita mau bikin attack ini berdasarkan damage yang terkirim dari sininya pertama gua akan bikin energi Ini kan udah 100 gua akan kasih di sini argumen untuk damage Oke damage yang diberikan user atau player ketika pertama kalian attack secara default itu cuman satu gitu Taruhlah seperti ini jadi kalau nyebas-nyebas kayak gitu doang tuh cuman satu damage tapi dia juga bisa Tentukan damage-nya lewat sini langsung damage sama dengan misalnya 20 cuman kita harus validasi dong damage akan mengefek kepada energinya player Anggaplah Fanny kalau di mobile Legends mah funny ketika lu pakai skillnya lo akan energinya berkurang cuman triggernya berbeda energi Fanny akan terkuras habis ketika dia menyebat tidak terkena Hero alias cuman gesek-gesek ke angin doang nggak ngegesek ke Hero jadinya energinya boros Nah kalau di sini itu damage akan mengefek kepada energi energi akan berkurang sesuai dengan besaran damage-nya Jadi kurang lebih validasinya kayak gini self dot energi yang ini kita pakai self lagi karena di sini udah ada self artinya bisa masuk semuanya seperti yang tadi gua bilang self dot energi kurang dari sama dengan damage kayak begini aja udah cukup artinya nilai energi dari player akan berkurang sesuai dengan damage yang diberikan ini artinya kalau pakai apa nih kurang dari sama dengan itu sama dengan kayak begini Pak self dot energi sama dengan self dot energi kurang damage artinya damage artinya Sorry artinya energi terakhir yang dimiliki oleh si player ini akan dikurangin damage yang baru gitu jadi atribut energi akan selalu terupdate nilainya dengan sintaks yang seperti ini Nah kalau kalian ragu ini berkurang atau tidak setiap kita memberikan damage Ini gua hapus dulu ininya terus kita cetak playernya ya player print Sorry player pakai Dik aja ya untuk kebutuhan trouble shooting dict bukan dictory di ICT kalau kita Run sekarang energinya berkurang jadi 99 bener padahal kalian dilihat di sini ini energi 100 tapi ketika kita pakai playernya untuk menyerang maka energinya menjadi 99 dari mana 99 dari sini ini artinya 100 - 1 jadi 99 dan kalau kita lakukan dua kali penyerangan seperti ini artinya dua kali penyerangan ya ini penyerangan pertama ini penyerangan kedua kalau kita kan energinya menjadi 98 kalau di penyerangan kedua kita taruh damage-nya itu jadi lebih gede kita spend damage untuk menyerang si musuh dengan damage yang lebih besar yang mengefekkan energi kita akan cepat habis Taruhlah di sini gua taruh misalnya damage 50 Jadi kalau penyerangan kedua atau damage-nya 50 penyinaran pertama ya damage cuman jebret doang gitu nggak pakai jurus ceritanya jadi kalau kita sisa 49 Kenapa karena 100 - 1999 dikurangi 50 49 bener Kurang lebih kayak gitu Ini untuk yang attack si player tinggal kita buat si monsternya atau enemynya atau apanya tadi Enemy monster yang monster aja dah sekarang ini gua hapus dulu gua akan bikin ini gua awasin dulu boleh ya Ini gua pakai kurung seperti ini seret Nah biar jelas kita bikin kelas monster yang mana monster pun sama ya punya health jadi gua taruh sini ini self kayak tadi lagi untuk di awal dia itu punya self.hel sama dengan taruh di sini health sama aja kayak tadi yang nilai awalnya monster mungkin health-nya 500 dulu aja boleh jadi di sini tinggal kayak gini print monster sekarang kita Panggil monsternya di sini monster sama dengan monster ini player attack gua awasin dulu kita cetak dulu monsternya print monster seperti biasa dict biar kita tahu isinya apa terus kita Run monster created nah ini kalau lu bingung dengan kopplier kredit Bang ya kan gara-gara ini Oke monster created ini terus datanya adalah health sebanyak 500 Kalau gua masukkan monster health-nya di sini misalnya 1000 ya Inget argumen bisa dipasang di sini sekarang helpnya jadi 1000 betul nah kita taruh 100 aja di awal health-nya dan kita bisa masukkan di sini untuk health-nya di 500 biar ada referensi tambahan gitu biar nggak monoton lalu monster health ini harus berkurang ketika player melakukan penyerangan packing ini gua awasin player attack dot attack saat ini player itu nggak punya tujuan target penyerangannya dia cuman punya damage aja damage misalnya 80 tapi nyerangnya ke siapa Pak apakah monster kan bukan Oke kita buat player attack Ini mengetik monster so artinya di dalam method attack kita mesti passing lagi targetnya itu ini gua asin dulu kita masuk ke player kita modif di bagian method attack di sebelah kanan sini kita bikin targetnya targetnya siapa karena kita udah jelas targetnya adalah monster jadi kita bisa masukin di sini monster lalu kita bikin atribut baru self.target ya kan karena di sini bebas Lu bisa masukin apa aja self the target sama dengan monster kayak begini berarti kan di sini monster itu nggak punya default parameter yang mana di sini damage ada jadi sini merah nah ini kita bisa cuekin aja sebenarnya targetnya itu kita akan attack darahnya si monster jadi kita langsung bisa Bypass di sini monster dot health akan muncul ke sini artinya target kita adalah darahnya si monster so karena di sini kita punya argumen baru yaitu Monster kita masih passing juga ketika kita mengetik selain dari damage Kita juga harus punya target target monsternya mana ini dia monsternya kita tinggal masukin ke sini monster nggak punya argumen untuk bla bla bla Biarkan kita save dulu apakah error atau enggak kalau kita Run error non default argumen follow default argumen Nah untuk mengatasi ini salah satu caranya yang paling mudah adalah ini yang bisingkan juga nih pak kita pindahkan monster ini ke sini jangan di kanan karena di sini di argumen kedua itu dia punya initialisasi awal nilai jadi harapannya dari Python untuk metode attack itu yang argumen selanjutnya pun punya initialisasi makanya kalau kalian baca di sini non default parameter follow default parameter triknya adalah kita pindahkan aja ini karena dia nggak punya default parameter jadi taruh ke sini kita kasih koma dan semuanya lancar seharusnya kalau kita save aman dan untuk monster ini error kenapa karena damage yang diberikan itu harus kita pindahkan ke kanan atau monster itu kita taruh ke kiri gitu jadi Kita sesuaikan lagi urutannya player dot attack memberikan monster atau kepada monster ya player menyerang monster dengan damage 80 gitu kalau dibaca di sini juga sama penyerangan itu terhadap siapa targetnya dan damage-nya berapa Terus target itu kita set dari darahnya sih monster jadi kalau kita Run sekarang apakah error atau tidak tidak ya attacking aman sekarang kalau kita print monster dict-nya takut salah ngomong gua udah ICT jangan dikit-dikit itu agak sedikit sensitif gitu Pak dot underscore underscore supaya kita tahu isiannya Seperti apa kalau kita Run berapakah darahnya dia 500 masih 500 padahal udah dilakukan penyerangan Kenapa karena belum ada kalkulasi di sini untuk melakukan pengurangan secara langsung kita nggak perlu bikin ini jadi di dalam sebuah atribut kayak begini ini kita hapus langsung aja dari objek monster health monsternya akan kita kurangin kita kurang sebanyak damage yang diberikan udah cukup kayak begini aja kalau kita save kitaran dia akan berkurang sebanyak damage yang diberikan damage default-nya itu satu tapi berhubung Player di sini ngasih damage gede damage 80 jadi health yang tadinya 500 akan berkurang menjadi 500 dikurangi 80 health-nya sisa 420 betul sampai sini pusing atau tidak coba ditelaah dulu ya sintaknya seperti ini kurang lebih untuk monsternya kayak begini sekarang kita bisa buat ini lebih kelir lagi dengan cara memasukkan beberapa print-print tertentu yang bisa membantu kita untuk semuanya lebih jelas aja gitu apa yang kita lakukan di sini pertama untuk ketika player itu menge attack kita kasih tahu berapa sisa darah dari si monsternya itu sendiri Oke jadi kita masuk ke bagian print F ini kita pakai f ya di sininya F taking to monster lalu monster health kayak gini titik dua kasih kurawal monster.hel left kayak gini jadi dikasih tahu bahwa kita menyerang ke monster dan sisa darah dari si monster adalah sekian lagi gitu intinya kurang lebih kalau kita coba Run maka sekarang player create Master create terus attack gitu kurang lebih dan untuk yang d i CT ini Ini udah kita nggak perlu lagi karena kita di dalam attack itu punya log untuk mengetahui monster health-nya itu sisa berapa gitu ya Dan kita bisa perbaiki hal-hal yang lain juga untuk di bagian Def ini atau initialisasi di kelas kita hapus aja printnya supaya nggak pusing pas ke bagian konsol untuk player juga sama biar jadi lebih gampang aja bacanya dan nggak boros baris kalau kita Run pastikan bahwa apa yang udah kita ubah itu selalu aman-aman sejahtera attack to monster monster health 420 live ya jadi satu player Nah sekarang kalau misalkan playernya ada banyak Anggaplah ini gua taruh ini player 1 terus kita ubah semuanya player 1 attack ke monster dan sekarang player gua bikin player satu lagi ada di bawah sini player 2 = player kayak begini terus player 2 juga nggak attack ke monster tersebut player 2.atack ke monster ini sama ya ke monster ini kalau kalian bingung kita taruh aja Monster Dragon lah taruh aja dragonnya kita kasih Dragon kita kasih dragon kayak begini atau biar lebih clear monster sama dengan Dragon Monster sama dengan Dragon karena di sini kan ke pasingnya tuh sebagai monster jadi supaya nggak ambigu kita kasih monster yang isinya Dragon jadi di sini isinya itu Dragon sebenarnya ini gitu ya oke sekarang dibaca lebih enak lagi kita punya satu player kita punya satu player tambahan jadi ada dua total yang mana player kedua pun akan memiliki hal yang sama seperti player 1 Karena untuk keduanya ini punya basis yang sama dari kelas player lalu Dragon ini adalah bagian dari monster yang memiliki health 500 dan player 1 menyerang Monster Dragon dengan damage 80 dan untuk player 2 menyerang Dragon dengan damage 20 kalau kita start monster monster health 420 left monster health 400 left artinya health monster Ini udah selalu menjadi nilai yang terakhir ketika di sini diserang sama si player 1 ketika player 2 menyerang nggak reset lagi ke 500 health tapi tetep yang terakhir health-nya yaitu 420 dikurangin damage baru yang didapatkan dari player 2 yaitu 20 jadinya 400 so ini udah dynamis udah enak untuk bagian sih health monster Oke kalau misalkan ini diperdalam lagi diper enak lagi untuk cara baca Ya tiap orang beda-beda ya tapi kalau gua pribadi di sini Gua merasa untuk bagian ini udah cukup enak tapi untuk bagian ini gua rasa kayak ada yang Miss Coba kalian bisa tebak apa kalau kita pakai bacaan Manusia ya kayak player 1 attack Monster Dragon damage 80 Gua lebih prefer monster ini kita ganti jadi target jadi lebih cle berbagi bahwa player 1 attack kepada targetnya itu Dragon gitu dan damage-nya berapa kayak gitu Jadi kalau ini kita ganti jadi target dan ini pun kita ganti jadi target yang di atas kita ganti juga nih di bagian method attack yang ada di dalam kelas player kita ganti monster ini jadi target dan juga ini jadi target plus di sini pun sama target apakah akan berjalan Bang berjalan Jadi ini hanya sebagai penamaan yang mana sebenarnya yang penting itu adalah isinya isi dari target adalah Dragon isi dari Dragon adalah sebuah monster monster memiliki atribut health 500 jadi kalau kita Run ini akan menghasilkan hal yang sama Attack dan kita perlu meyakinkan diri bahwa si energi ini udah berkurang lewat ini ya self energi dikurangin 9 damage tapi kita belum tahu apakah energinya berkurang atau enggak jadi tadi kita cuman cobanya via player 1 dot underscore seperti ini di print kayak begini dan kita coba print yang kedua player 2 ini kita coba Run lagi player 1 itu energinya sisa 20 Karena menyerang sebanyak 80 player 2 itu Sisa 80 karena menyerang sebanyak 20 kita akan taruh ini supaya nggak pakai dish kita taruh di bagian sini monster health sisa segini dan your energy is self dot energi left jadi ini gua hapus kalau kita jalankan programnya kita Run monster health 420 left and your energy is 20 left monster health 400 left and your energy is 80 live begitu untuk player 1 dan player 2 sekarang kalau kita baca ini udah mulai lebih enak lagi program ini nggak cukup fair karena monster hanya diam aja nggak ada serangan balik dari si monster itu sendiri jadi kita akan buat monster ini bisa menyerang balik si penyerang karena player menyerang monster maka monster akan menyerang balik si playernya ketika playernya itu menyerang sih monster kayak Turtle kalau di mobile Legends gitu ya dia akan menyerang kalau dia diserang kurang lebih kayak gitu kita bikin satu fangsion metode di sini metode attack juga ya dari monster yang mana attack-nya si monster hanya akan ter-trigger ketika ada apa namanya ada attack dari luar di sini kita nggak punya atribut tambahan apapun cuman ada health doang so kita bisa mainin health ini sebenarnya untuk jadi parameter atau menjadi sebuah validasi khusus supaya attack ini bisa ter-trigger logikanya adalah ketika darahnya si monster berkurang Artinya ada yang menyerang siapapun itu betul healthnya berkurang berarti monster di Serang kecuali monsternya demam nggak ada yang nyerang dia sakit sendiri helpnya berkurang Ya tapi kan ini nggak ada demam ya Pak jadi monsternya kalau diserang doang tuh akan berkurang health-nya kita bisa validasi jika nah self dot health kurang dari nah kurang darinya ini kan bingung kalau health yang ini kurang dari ini maka dia akan melakukan penyerangan balik artinya kalau sekarang kita hardcode ya kita harus dulu ya kalau self.health-nya kurang dari yang ada di dalam monster sini Dragon kan punya maratus kalau Dragon health-nya itu kurang dari 500 maka kita print siap serang balik Dragon siap serang balik jika tidak maka Dragon sedang tidur gitu atau zzz ini boleh kalau kita Panggil Dragon dot Attack Dragon siap serang balik kenapa Karena health-nya sekarang sudah kurang dari 500 betul ini kan health-nya udah segini nih Berarti ada yang nyerang makanya Dragon siap serang balik Tapi itu kan di hardcore di sini nah Masalahnya kalau di sini kita ganti di sini pun harus ganti ya nggak kalau di sini misalnya headnya 700 terus Dragon ini dilakukan penyerangan oleh si player 1 dan player 2 dia masih tetap aja tidur nih pak Tuh ya jadinya ini nggak bisa kayak begini nggak boleh hardcore harus sesuai caranya kita bisa duplikat variabel ini atau atribut ini ke atribut yang baru untuk dijadikan patokan bahwa initialisasi health awal itu berapa kita akan bikin di sini dot health untuk skor ini sama dengan lu bisa taruh di sini self artinya ini adalah atribut baru yang nilainya akan mengambil nilai yang sama seperti pertama kali monster di initialisasi dengan health 500 artinya di sini akan selalu 500 tapi di sini akan selalu berubah alias dinamis kenapa Karena di player attack method yang diubah nilainya dari target yang mana targetnya adalah monster itu adalah atribut health jadi di sini akan dinamis tapi untuk yang health ini tidak ada interaksi dari mana-mana sehingga health ini akan menyimpan nilai yang sama terus-menerus yaitu initialisasi awal nilainya berapa entah itu yang di sini 500 atau kalau nggak di declar berarti ngambil yang ada di sini begitu karena apa Karena self dot health adalah health yang dikirim dari outer class atau dari default class yang ada di sini default argumen yang ada di sini maksud gua Oke cukup paham harusnya ya Jadi sekarang kita bisa kasih validasi ini jika self dot health kurang dari self.held ini artinya ini berkata kayak begini pak self.health itu kan berubah-ubah Taruhlah dia udah darahnya 420 kurang dari 500 yang mana health ini selalu 500 karena di passing dari sini 500 so 400 Apakah kurang dari 500 tentu saja maka Dragon siap penyerang balik atau ada penyerangan tapi jika tidak maka udah bobo aja dah nggak ada yang nyerang kok diam aja gitu loh dragon set set set gitu ya Dragon Serang balik kalau kita Run sekarang Dragon Serang balik tapi ketika tidak ada yang menyerang ini gua komentar jadi di sini nggak ada yang nyerang ya cuman Dragon doang ngetag nih Dragon Attack karena dragonnya nggak ada yang nyerang nggak boleh dilarang gitu kurang lebih jadinya kita bisa buat ini menjadi lebih natural lagi di bagian monster karena triggernya nanti kan ketika attack dilakukan oleh player tanpa harus kita Panggil Dragon Attack dragonnya udah attack Kalau ini kan kita attack sedangkan tadi di awal perjanjian kita adalah ketika kita bikin ini monster akan menyerang ketika player menyerang Oke tanpa diperintah jadi ini adalah sebuah perintah ini kita nggak boleh lakukan ini dan caranya cukup membingungkan tapi salah satu metode yang bisa kita gunakan adalah dengan kayak macam begini ini akan gua hapus gua akan jadikan ini menjadi sebuah metode yang meritten apa ya tipe data bullyan meritten true atau false so di sini akan gua kasih East underscore sebagai tanda bahwa ini adalah bullion ya metode bullion retailnya is attack yang isinya adalah sebuah Return kayak begini aja dah kayak begini jadi monster punya metode is a taked yang isinya adalah mengeluarkan nilai true atau false dan dia akan bernilai true ketika health kurang dari health ini jadi stekernya true so dimana kita pakai ini kita akan pakainya di sini ketika player mengeteksi monsternya jika melakukan attack player kita akan Panggil target.ise underscore 1 Usage satu Dynamic kalian bisa lihat di sini ada tulisannya satu Dynamic target dot is a taked dan is a take it ini akan memunculkan kalau kita print dulu ya Sorry kita belum belum attack pakai player satu aja untuk mengecek Dragon kita coba Run bernilai true karena health-nya udah berkurang dari health ini jadi di sini kita bisa bikin validasi jika target is a take a true maka health dari user self dot health dari player sorry ini akan dikurangin sebesar damage yang diberikan oleh si target.ised di sini monster belum punya Initial damage jadi kita bisa di clear damagenya secara langsung di sini self damage sama dengan misalnya untuk monster di mic nya itu selalu 10 seperti itu jadinya setiap kali player menyerang maka health user akan dikurangin sebesar target dot damage gitu Dan kalau kita running sekarang kita lihat monster health per 20 life your energy is 20 Life itu dapat dari sini nah supaya kita bisa lebih enak meng-capture dari kelas player yang ada di sini apa aja perubahannya kita buat satu method baru di bawah Sini Dev show_info di show info ini khusus untuk kebutuhan mencetak data fungsinya untuk mengeluarkan info-info playernya antara health-nya ataupun energinya so kita tinggal masukin di sini misalnya player energy titik dua self dot energi lalu kita print lagi player health titik dua self dot player self dot health Sorry begini untuk penyerangan itu kita tinggal taruh aja monster health live nya aja jadi ini udah nggak perlu lagi ini adalah data player terakhir antara energinya berapa ataupun health-nya berapa kayaknya health di atas deh ini lebih enak dan untuk monster health pun kita bisa bikin hal yang sama jadi ini kita nggak perlu bikin kayak beginian Kita hapus aja kita bikin cuman kayak macam player attacking to monster gini aja lalu untuk yang bagian Monster kita pergi ke sini kita bikin satu method yang baru show info self Return f sama aja kayak begini data-datanya dari si monster yang pertama kita butuh data health-nya monster health titik dua self dot health Jadi sekarang kita tinggal print keluar semuanya karena kalau kita running sekarang itu tidak akan ada yang tercetak kecuali player atau monster Oke kita akan cetak data dari si player itu sendiri player 1.show info dan juga monster yaitu si dragon.show info ketika penyerangan terjadi dilakukan oleh player 1 terhadap Dragon kita akan lihat data-datanya kita kan perhatikan di sini player attacking to monster player health-nya sisa 90 player energinya sisa 20 monster health-nya 420 masih ada yang kurang yaitu kita menyerang sebesar berapa damage dan juga kita diserang sebesar berapa damage gitu ya supaya lebih jelas untuk perhitungan nanti kita bisa ngitung-itung sendiri juga Apakah benar atau enggak gitu so kita bisa masukin beberapa nilai ke dalam bagian print ketika attack ini attack yang gua berikan itu berapa damage jadi kita bisa pakai f lagi di sini player attacking kayak gini to monster damage to monster gini jadi kalau kita Run setidaknya akan memunculkan hal kayak macam begini Pak player attacking 80 damage to monster untuk player health-nya sisa 90 karena dilakukan penyerangan oleh monster sebesar damagenya berapa kita belum tahu kita akan print untuk ngeprintnya itu ditaruh aja di sini print F monster Attack kalau kita save terus kita putaran lagi kalian bisa lihat sekarang lebih jelas lagi monster attack 10 damage to player attacking 80 damage to monster Kenapa Bang Monster attack 10 damage duluan daripada player attack karena printingnya itu setelah pengurangan darah dari user yang mana target is a Taken itu kan ada print di dalamnya yaitu ini sehingga kalau lu mau kebalikannya lu bisa bikin untuk print ini taruh di atas sini player attacking damage to monster dan target is a taken karena kita sudah memberikan Efek kepada monsternya lalu setiap kali target itu memang di attack maka dia akan menyerang balik ya kalau kita Run player attacking 80 damage to Monster sekarang udah di atas duluan nih terus monster attackback gitu ya ngasih 10 damage to player jadi player help itu kenapa masih 100 Bang karena gua lupa return returnnya di sini ke hapus mohon maaf ya kita save lagi sekarang nah player attacking 80 to monster player help season 90 karena monster ngetag sebanyak 10 damage player energi berkurang 20 karena dari packing yang diberikan itu 80 damage sisa monster health itu 420 karena attacknya dari player itu segini Bagaimana sekarang cukup clear kalian bisa lihat sintanya dulu untuk mempelajari apa yang sebenarnya terjadi di sini Oke misalkan kalau kita jalanin yang ini juga player 2 terus kita Munculkan player 2.show info sini kita Run Wow player attack yang 80 player attacking 20 damage to monster blablabla sisa Wah pusing lah ini mah Pokoknya pusing pusing pusing pusing nah karena kita bingung Siapa yang nyerang nggak punya nama jadi kita tambahkan nama di sini ya tambahkan name koma dan kita bikin satu atribut baru untuk player self.name sama dengan name ya begitu Oke kita udah punya name jadi ketika menyerang kita bisa kasih nama siapa yang menyerang ini player kita ganti jadi self taking sekian to monster Oke dan untuk monster pun sama kita akan kasih name juga Name koma kita bikin di sini self [Musik] self.name attack ini kita ganti juga jadi self dot name monster name darahnya sisa berapa gitu ya terus untuk yang ini juga bisa ini juga sama self.name dan perhatikan karena kita menambah argumen baru name di sini dan juga di Monster kita nambahin name di sini artinya di setiap ini kita harus tambahin namenya name sama dengan untuk layer 1 daya Afrizal untuk player 2 jangan deh mobile Legends aja balmond untuk player 2 name nya misalnya Laila untuk monster name-nya sama dengan misalnya name nya dragon dragon kayak begini Dragon lah bolehlah agak-agak beda aja gitu Oke kalau udah kita save terus kita coba Run lagi balmond attacking 80 damage to Monster Dragon Attack 10 damage to player balmond health 90 balmond energic 20 Dragon health 420 nah ini enaknya di begitu kan kenapa Karena kalau player 2 menyerang itu akan ambigu kalau nggak pakai name jadinya bingung Siapa yang nyerang gitu Kalau sekarang mah karena player 2 udah punya name Layla jadi kalau kita Run ini kita Run ya player 2.show info yang naganya enggak akan gua munculin dulu ke layar jadi getaran begini balmond attacking 80 Dragon Attack balik Layla attack 20 The Monster Dragon Attack balik lalu data yang lain-lain sekarang ada yang PR PR nya adalah sebenarnya kan kita udah tahu balmond ini nggak tag ke siapa harusnya tapi di sini masih terlalu hardcore hardcore-nya adalah ke monster Padahal kita udah tahu nama monsternya adalah Dragon jadi kita buat ini menjadi mengarah ke si monster yang memang memberikan damage terhadap si playernya itu sendiri so kita bisa manipulasi itu di bagian packing sini bagian monster ini kita bisa ganti langsung pakai target.name sekarang kita coba lagi running sekarang balmond attacking 80 to dragon nama dari monsternya yang ada di sini Dragon nama dari monster Layla juga mengetik monster yang sama Nah sekarang kalau Layla mengetik monster yang beda Taruhlah di sini gua punya monster baru misalnya di sini dia tuh sifatnya Scorpion eh sifatnya ituannya jenisnya Scorpion bagian dari monster name-nya misalnya Scoopy kayak begini helpnya default di 100 aja nggak papa nah sekarang player 2 tinggal kita arahin attacknya targetnya bukan Dragon tapi Scorpion kayak begini Kalau kita Run balmond attack to dragon Dragon Attack to player ini masih belum Laila attacky betul aman ya udah dinamis yang menjadi PR adalah tadi itu ini Gimana caranya Dragon tahu bahwa yang mengetiknya itu sih player player itu siapa namanya Nah sekarang kita buka ke bagian dragon yang mencetak Dragon Attack 10 damage to playernya di sini Bagaimana cara kita mengetahui player namenya sedangkan di sini tidak ada ciri-ciri kita bisa mendapatkan playernya simpelnya kita tinggal casing argumen ke sini kita kasih nama player underscore name lalu player ini kita ganti jadi player underscore yang menyerang si ini adalah si player name itu sendiri player name ini ditangkap dari luar kelas monster yang mana di atas di sini ya target is a taked kita taruh aja di sini player name sama dengan self.name sehingga kalau kita Run sekarang semuanya sudah dinamis balmond attack to dragon Dragon Attack to balmond Layla attack to scurpy Scoopy attack to Layla begitu kurang lebih itu salah satu sample cara supaya kalian bisa manipulasi data ketika bermain aov meter ini harus meritten nilai true atau false tapi di sini kita membutuhkan player name yang mana player name Ini fungsinya cuman untuk sebagai percetakan layar doang kayak nggak terlalu penting gitu kan Ya cuman untuk low gitu dan ini nggak semestinya harusnya ada tapi karena kita pengen tahu serangan balik yang dilakukan oleh si monster kepada siapa jadi di sini kita buatnya itu dari siapa datangnya is a taked itu datang dari player name yang mana player name-nya itu adalah si kelasnya itu sendiri jadi nanti bakal sesuai player 1 kalau menyerang si dragon maka Ya udah udah jelas Dragon itu tahu yang nyerangnya namanya siapa di player 1 yaitu si balmond player 2 pun sama dan begitu seterusnya