Oyun Programlama. Tasarım Örüntüleri

Benzer belgeler
C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

1 PROGRAMLAMAYA GİRİŞ

Yazılım Kodlama ve İ simlendirme Standartları v1.0

YZM 2116 Veri Yapıları

TARİHÇE. Versiyon Tarih Düzenleyen Açıklama Engin DURMAZ İlk versiyon

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Veri Yapıları ve Algoritmalar dönem

MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

Nesne Yönelimli Programlama

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

MOBİL UYGULAMA GELİŞTİRME

C++ ile Nesneye Dayalı Programlama

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

«BM364» Veritabanı Uygulamaları

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

BİL-141 Bilgisayar Programlama I (Java)

Erişim konusunda iki taraf vardır:

BİL132 Bilgisayar Programlama II

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

VERİ YAPILARI DERS NOTLARI BÖLÜM 5 QUEUE (KUYRUK) Yard. Doç. Dr. Deniz KILINÇ

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

işlemler bittikten sonra dosyaların kapatılması uygun olacaktır. Bunun için, fclose(fin);

The RestructuredText Book Documentation

Şablon Türler (Generics)

Burak Kıymaz JAVA FX

Nesne İşaretçileri. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. Sınıf Yapısı. Kalıtım Çok Şekillilik

Yrd. Doç. Dr. Caner ÖZCAN

Operatörlerin Aşırı Yüklenmesi

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Sunum İçeriği. Programlamaya Giriş

Bölüm 12. Nesne yönelimli programlama desteği

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

C++ Dersi: Nesne Tabanlı Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Yrd. Doç. Dr. Caner ÖZCAN

YZM 2116 Veri Yapıları

Karma C/C + + Kodlama

BMH-303 Nesneye Yönelik Programlama

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Object-Oriented Programming Lab 4. - Sıcaklık değeri, Kelvin biriminde saklansın. Varsayılan sıcaklık değeri K olsun.

BİL-142 Bilgisayar Programlama II

Android Kaynakları (Resources)

Yigin & Kuyruk {\} /\ Suhap SAHIN Onur GÖK

NESNEYE YÖNELİK PROGRAMLAMA

Object-Oriented Programming Laboratuvar 11

2 VISUAL STUDIO 2012 GELİŞTİRME ORTAMI

Akış Konrol Mekanizmaları

Cahit GÜNGÖR Hacettepe Üniversitesi Bilişim Enstitüsü. Sorumluluk Zinciri. Kod Üretme (Code Generation)

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

YZM 2108 Yazılım Mimarisi ve Tasarımı

Bölüm1. İlk Bilgiler ISBN

NESNEYE YÖNELİK PROGRAMLAMA

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

Ders - 7 while döngüsü

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Karşılaştırma İşlemleri ve Koşullu İfadeler

Stack Islemleri. Postfix ve Infix notasyonlari. Stack ozellikleri

TASARIM KALIPLARI-DEVAM. Singleton Adapter

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

/*int sayi1, sayi2,toplam=0;

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Görsel Programlama (Visual Programming)

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

İNTERNET TABANLI PROGRAMLAMA

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Dağıtık Sistemler CS5001

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Java da Program Denetimi ve Operatörler. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 2 1

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

Data Structures Lab Güz

BİLİNİRLİK ALANI ve ÖMÜR, KONTROL DEYİMLERİ

YZM311 YAZILIM YAPIMI BÖLÜM 4 TASARIM KALIPLARI. Yrd. Doç. Dr. Volkan TUNALI Mühendislik ve Doğa Bilimleri Fakültesi / Maltepe Üniversitesi

Giriş. geleneksel işletim sistemlerinde her prosesin. aynı adres uzayında birden fazla akış kontrolü gerekebilir

Jval tipi. Genel veri yapılarını kullanacağımız zaman Jval den faydalanırız.önemli olanlar aşağıda mevcuttur:

#ifndef FATURA_H #define FATURA_H

YZM 2116 Veri Yapıları

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Operatörlere İşlev Yükleme

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

Java dili, aşağıdakiler de dahil olmak üzere çok çeşitli denetleyici türlerine sahiptir.

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

Görsel Programlama-I (Visual Programming) 2.Hafta

Transkript:

Ders 5

Oyun Programlama Tasarım Örüntüleri

Gözlemci (Observer) Örüntüsü

Nedir? En sık kullanılan örüntülerden biri Model-View-Controller mimarisinin altyapısı Java ve.net gibi dillerde direk gömülü geliyor

Başarım Elde Edildi Başarım tabanlı bir oyun yaptığımızı düşünelim 100 Maymun Öldür -> İnsanlar Gezegeni Başarımı Bir Köprüden Düş -> İntihar Başarımı Bu başarımların hemen hemen kodun birçok yerinde kontrol edilmesi gerekir Başarımla ilgili kod, diğer kodların her yerine sızar Tek bir olay bir çok başarımı tetikleyebilir Bu kirlilik yaratır

Örnek void Physics::updateEntity(Entity& entity) bool wasonsurface = entity.isonsurface(); entity.accelerate(gravity); entity.update(); if (wasonsurface &&!entity.isonsurface()) notify(entity, EVENT_START_FALL); notify metodu birşeyin olduğunu haber verir Kime? Kim bilmek istiyorsa ona

Nasıl Çalışıyor? Gözlemci class Observer public: virtual ~Observer() virtual void onnotify(const Entity& entity, Event event) = 0; ; Observer sınıfını implement eden nesneler gözlemci haline gelirler. Artık onlar gerçekleşen tüm olaylardan haberdar edilirler

class Achievements : public Observer public: virtual void onnotify(const Entity& entity, Event event) switch (event) case EVENT_ENTITY_FELL: if (entity.ishero() && heroisonbridge_) unlock(achievement_fell_off_bridge); break; // Handle other events, update heroisonbridge_... private: void unlock(achievement achievement) // Unlock if not already unlocked... bool heroisonbridge_; ;

Nesne Gözlemlenen objeye "nesne" (subject) denir. class Subject private: Observer* observers_[max_observers]; int numobservers_; ; Nesne'nin görevi, kendisini gözlemleyenlerin bir listesini tutmaktır

Nesne (devam) Nesne'nin tuttuğu bu liste dışarıdan kontrol edilebilir class Subject public: void addobserver(observer* observer) // Add to array... void removeobserver(observer* observer) // Remove from array... // Other stuff... ;

Nesne (devam) Nesne'nin son görevi, bir olay olduğunda bunu gözlemcilerine iletmektir class Subject protected: void notify(const Entity& entity, Event event) for (int i = 0; i < numobservers_; i++) observers_[i]->onnotify(entity, event); // Other stuff... ;

Physics tarafı class Physics : public Subject public: void updateentity(entity& entity); ; void Physics::updateEntity(Entity& entity) bool wasonsurface = entity.isonsurface(); entity.accelerate(gravity); entity.update(); if (wasonsurface &&!entity.isonsurface()) notify(entity, EVENT_START_FALL);

Dikkat edilmesi gerekenler Gözlemci örüntüsü çok mu yavaş? Hayır! Genelllikle event ve messaging kavramlarıyla karıştırılıyor Bunlarda Queueing olabilir, Gözlemci'de yoktur

Dikkat edilmesi gerekenler Eşzamanlı çağrım Gözlemciler, nesneyi bloklayabilir! Stay off the UI Thread!

Dikkat edilmesi gerekenler Çok fazla dinamik tahsis Oyunun başında nesne-gözlemci linkleri kurulup sonrasında değiştirilmezse çok sorun olmaz Bağlı gözlemciler modeli:

Bağlı gözlemciler class Subject Subject() : head_(null) private: Observer* head_; ; class Observer friend class Subject; public: Observer() : next_(null) private: Observer* next_; ;

Bağlı gözlemciler void Subject::addObserver(Observer* observer) observer->next_ = head_; head_ = observer;

Bağlı gözlemcilerde gözlemci çıkarma void Subject::removeObserver(Observer* observer) if (head_ == observer) head_ = observer->next_; observer->next_ = NULL; return; Observer* current = head_; while (current!= NULL) if (current->next_ == observer) current->next_ = observer->next_; observer->next_ = NULL; return; current = current->next_;

Bağlı gözlemcilerde notify metodu void Subject::notify(const Entity& entity, Event event) Observer* observer = head_; while (observer!= NULL) observer->onnotify(entity, event); observer = observer->next_;

Dikkat edilmesi gerekenler Bu şekilde gözlemci yalnız bir nesneyi gözlemler Gerçekte bu doğru olmayabilir Bunun için wrapper node kullanılabilir

Diğer problemler Bir nesne veya gözlemciyi silerseniz ne olur? Karşılıklı haberleşerek silinmeleri gerekir

Singleton (tek kişilik) örüntüsü

Nedir? Bir sınıfın bir örneği vardır, ve bu örneğe heryerden ulaşılabilir.

Tek örnek Bir dosya sistemi (sınıfı) implementasyonu düşünün Bu implementasyon üzerinden dosya yaratıp, silebiliyorsunuz Aynı anda iki farklı örnek yaratıp, birine X dosyasını yarattırırken, diğerine X dosyasını sildirirseniz ne olur? Tek örnek bu tür problemleri çözmeye yarar

Heryerden ulaşılabilirlik Eğer tek bir örnek olacaksa, bu örneği kullanacak herkesin bu örneğe direk erişiminin olması gerekir Dosya sistemi örneği Loglama İçerik yükleme Kayıt etme vs.

Örnek kod class FileSystem public: static FileSystem& instance() // Lazy initialize. if (instance_ == NULL) instance_ = new FileSystem(); return *instance_; private: FileSystem() static FileSystem* instance_; ;

Modern yaklaşım class FileSystem public: static FileSystem& instance() static FileSystem *instance = new FileSystem(); return *instance; private: FileSystem() ; Bu kod modern c++ compilerlarında thread-safe çalışmaktadır

Avantajları Eğer kullanan yoksa örneği yaratmaz Çalışma sırasında yaratılması Böylece oyun içindeki bilgilere göre yaratılabilir Alternati olan static member'ların bu özelliği yoktur Altsınıf kullanıma imkan tanıması

Altsınıf kullanımı class FileSystem public: static FileSystem& instance(); virtual ~FileSystem() virtual char* readfile(char* path) = 0; virtual void writefile(char* path, char* contents) = 0; protected: FileSystem() ;

Altsınıf kullanımı - PS3 class PS3FileSystem : public FileSystem public: virtual char* readfile(char* path) // Use Sony file IO API... virtual void writefile(char* path, char* contents) // Use sony file IO API... ;

Altsınıf kullanımı - Wii class WiiFileSystem : public FileSystem public: virtual char* readfile(char* path) // Use Nintendo file IO API... virtual void writefile(char* path, char* contents) // Use Nintendo file IO API... ;

Altsınıf kullanımı - instance() FileSystem& FileSystem::instance() #if PLATFORM == PLAYSTATION3 static FileSystem *instance = new PS3FileSystem(); #elif PLATFORM == WII static FileSystem *instance = new WiiFileSystem(); #endif return *instance;

Sorunlar Globaller kötüdür Global çağrılar kodun anlaşılmasını ve izlenmesini zorlaştırır Gözlemci örüntüsü ile çatışabilir. İnsanlar heryerden erişilebilir bir örneği direk olarak kullanmak isteyebilirler. Mesela yere düşen bir taşın ses çıkarması. Singleton örüntüsü parallelizme çok uygun değildir.

Sorunlar Bir probleminiz varken iki problem çözer Ya sadece tek bir örneğe ihtiyacınız varsa? Ya sadece heryerden erişime ihtiyacınız varsa?

Sorunlar Lazy-initialization kontrolü sizden alır Oyun başladıktan sonra ses modülünün yüklenmesini istemezsiniz class FileSystem public: static FileSystem& instance() return instance_; private: FileSystem() static FileSystem instance_; ; Bu çözüm de polymorphism vs. gibi lazy initialization'ın getirdiği özellikleri yok eder

Gerçekten ihtiyacınız var mı? class Bullet public: int getx() const return x_; int gety() const return y_; void setx(int x) x_ = x; void sety(int y) y_ = y; private: int x_, y_; ;

class BulletManager public: Bullet* create(int x, int y) Bullet* bullet = new Bullet(); bullet->setx(x); bullet->sety(y); return bullet; bool isonscreen(bullet& bullet) return bullet.getx() >= 0 && bullet.getx() < SCREEN_WIDTH && bullet.gety() >= 0 && bullet.gety() < SCREEN_HEIGHT; void move(bullet& bullet) bullet.setx(bullet.getx() + 5); ;

Halbuki... class Bullet public: Bullet(int x, int y) : x_(x), y_(y) bool isonscreen() return x_ >= 0 && x_ < SCREEN_WIDTH && y_ >= 0 && y_ < SCREEN_HEIGHT; void move() x_ += 5; private: int x_, y_; ;

Yalnızca tek örnek yaratmak class FileSystem public: FileSystem() assert(!instantiated_); instantiated_ = true; ~FileSystem() instantiated_ = false; private: static bool instantiated_; ; bool FileSystem::instantiated_ = false;

Heryerden erişim Parametre olarak geçirin Ata sınıfa gömün Tek bir global sınıf üzerinden çalışın Servis Sağlayıcı örüntüsünü kullanın

Durum Örüntüsü

Hata nerede? void Heroine::handleInput(Input input) if (input == PRESS_B) yvelocity_ = JUMP_VELOCITY; setgraphics(image_jump);

Havada zıplamayı engelleyin void Heroine::handleInput(Input input) if (input == PRESS_B) if (!isjumping_) isjumping_ = true; // Jump...

Çökme ekleyelim void Heroine::handleInput(Input input) if (input == PRESS_B) // Jump if not jumping... else if (input == PRESS_DOWN) if (!isjumping_) setgraphics(image_duck); else if (input == RELEASE_DOWN) setgraphics(image_stand);

Hatayı farkettiniz mi?

void Heroine::handleInput(Input input) if (input == PRESS_B) if (!isjumping_ &&!isducking_) // Jump... else if (input == PRESS_DOWN) if (!isjumping_) isducking_ = true; setgraphics(image_duck); else if (input == RELEASE_DOWN) if (isducking_) isducking_ = false; setgraphics(image_stand);

Dalış saldırısı ekleyelim void Heroine::handleInput(Input input) if (input == PRESS_B) if (!isjumping_ &&!isducking_) /* Jump... */ else if (input == PRESS_DOWN) if (!isjumping_) isducking_ = true; setgraphics(image_duck); else isjumping_ = false; setgraphics(image_dive); else if (input == RELEASE_DOWN) if (isducking_) /* Stand... */

Hatayı farkettiniz mi?

Sorun Her aktiviteyi eklediğimizde kodu bozuyoruz Tekrardan tüm aktiviteleri dizayn etmek ve kodlamak gerekiyor 5 aktivite sonrasını hayal edin!

Sonlu Durum Makineleri

Nedir? SDM (FSM) Makinenin girebileceği sabit ve sonlu sayıda durum vardır Makine bir anda yalnızca bir durumda olabilir Makineye bir seri girdi veya olay gönderilir Her durumun bir geçiş kümesi vardır ve gönderilen girdi ve olaylara karşılık gelir

Hadi yapalım! enum State STATE_STANDING, STATE_JUMPING, STATE_DUCKING, STATE_DIVING ;

void Heroine::handleInput(Input input) switch (state_) case STATE_STANDING: if (input == PRESS_B) state_ = STATE_JUMPING; yvelocity_ = JUMP_VELOCITY; setgraphics(image_jump); else if (input == PRESS_DOWN) state_ = STATE_DUCKING; setgraphics(image_duck); break; case STATE_JUMPING: if (input == PRESS_DOWN) state_ = STATE_DIVING; setgraphics(image_dive); break; case STATE_DUCKING: if (input == RELEASE_DOWN) state_ = STATE_STANDING; setgraphics(image_stand); break;

Charge time Çökme sırasında enerji depolayıp saldırmak Ne kadar süre çökersek, o kadar enerji depolayabiliriz Bunu tutmak için bir sayaca ihtiyacımız var

update() void Heroine::update() if (state_ == STATE_DUCKING) chargetime_++; if (chargetime_ > MAX_CHARGE) superbomb();

handleinput() void Heroine::handleInput(Input input) switch (state_) case STATE_STANDING: if (input == PRESS_DOWN) state_ = STATE_DUCKING; chargetime_ = 0; setgraphics(image_duck); // Handle other inputs... break; // Other states...

Daha iyisini yapabilir miyiz?

Durum arayüzü class HeroineState public: virtual ~HeroineState() virtual void handleinput(heroine& heroine, Input input) virtual void update(heroine& heroine) ;

Her durum için bir sınıf class DuckingState : public HeroineState public: DuckingState() : chargetime_(0) virtual void handleinput(heroine& heroine, Input input) if (input == RELEASE_DOWN) // Change to standing state... heroine.setgraphics(image_stand); virtual void update(heroine& heroine) chargetime_++; if (chargetime_ > MAX_CHARGE) heroine.superbomb(); private: int chargetime_; ;

Sadece durum sınıfına bir işaretçi class Heroine public: virtual void handleinput(input input) state_->handleinput(*this, input); virtual void update() state_->update(*this); // Other methods... private: HeroineState* state_; ;

Durum objelerini yaratalım class HeroineState public: static StandingState standing; static DuckingState ducking; static JumpingState jumping; static DivingState diving; // Other code... ; Böylece tek durum örneğini ihtiyacı olan tüm Heroine'ler kullanabilir!

Durum'u Heroine'de tutmak void Heroine::handleInput(Input input) HeroineState* state = state_->handleinput(*this, input); if (state!= NULL) delete state_; state_ = state; HeroineState* StandingState::handleInput(Heroine& heroine, Input input) if (input == PRESS_DOWN) // Other code... return new DuckingState(); // Stay in this state. return NULL;

Giriş ve Çıkış Mevcut kodda oyuncunun Sprite'ı çıkış yaptığı durum tarafından değiştiriliyor Bu son derece yanlış bir yaklaşım Bunun yerine duruma giriş ve durumdan çıkış metodlarını kullanbiliriz

class StandingState : public HeroineState public: virtual void enter(heroine& heroine) heroine.setgraphics(image_stand); // Other code... ; void Heroine::handleInput(Input input) HeroineState* state = state_->handleinput(*this, input); if (state!= NULL) delete state_; state_ = state; // Call the enter action on the new state. state_->enter(*this);

Çökme kodu da basitleşti HeroineState* DuckingState::handleInput(Heroine& heroine, Input input) if (input == RELEASE_DOWN) return new StandingState(); // Other code...

İşler karmaşıklaşıyor Diyelim ki karakterimiz tüm bu hareketleri yaparken aynı zamanda ateş de edebilsin Bu durumda durum sayısı ikiye katlanacak! Ateş ederken zıplama Ateş etmeden zıplama Ateş ederek çöküş Ateş etmeden çöküş...

İki farklı durum makinesi class Heroine // Other code... private: HeroineState* state_; HeroineState* equipment_; ; void Heroine::handleInput(Input input) state_->handleinput(*this, input); equipment_->handleinput(*this, input);

Hiyerarşik durum makinesi class OnGroundState : public HeroineState public: virtual void handleinput(heroine& heroine, Input input) if (input == PRESS_B) // Jump... else if (input == PRESS_DOWN) // Duck... ;

Hiyerarşik Durum Makinesi class DuckingState : public OnGroundState public: virtual void handleinput(heroine& heroine, Input input) if (input == RELEASE_DOWN) // Stand up... else // Didn't handle input, so walk up hierarchy. OnGroundState::handleInput(heroine, input); ;

Pushdown Automata

Re ection

Aşağıdaki soruları cevaplayın Gözlemci örüntüsünde, gözlemci ve nesneyi tanımlayın Singleton örüntüsünde elde edilmek istenen iki özellik nedir? Sonlu Durum Makinelerinin bir oyunda kullanılmasının zor olmasının sebepleri sizce nelerdir?