Skip to content

A NetAcademia "Bevezetés az objektumorientált világba: a SNAKE projekt" tanfolyamának kiegészítő kódtára

License

Notifications You must be signed in to change notification settings

Snake201806/Snake201806

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A NetAcademia "Bevezetés az objektumorientált világba: a SNAKE projekt" tanfolyamának kiegészítő kódtára

Snake játék programozása

A snake játék szabályai

  • egy kígyót irányítunk úgy, hogy a fejének az irányát szabjuk, a kígyó követi a fejét.
  • a játékterületen megjelennek ételek, ezeket a kígyónak meg kell ennie.
  • a játék célja az, hogy minél több ételt megegyünk.
  • a játék vége akkor következik be, ha
    • nekimegyünk a falnak
    • beleütközünk a saját fakunkba
  • minél több ételt eszünk meg, a kígyó
    • annál hosszabb
    • annál gyorsabb

A játék képernyői

Kezdőkép

+-------------------------------------------+
|                                           |
|   A játékszabályokat megjelenítjük az     |
|   indulásig                               |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                    ++                     |
|                    ++                     |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
|                                           |
+-------------------------------------------+

Játék közben

           +-------------------------------------------+
           |                                           |
           |                                           |
Étel       |             +--------------------+        |  A háttérben a játékinformációk
           |             |                    |        |  áttetsző betűkkel, nem zavaró
     +------->  ++       |                    |  <--------módon------+
           |    ++       |                    |        |  A megjelenítéskor animálhatjuk is
           |             |                    |        |
           |             +--------------------+        |
           |                                           |
           |                                           |
           |                    ^^                     |
           |                    ||                     |
           |                    ||                     |    Kígyó
           |                    ||                     |
           |                    ||  <---------------------------+
           |                    ||                     |
           |                    ||                     |
           |                    ++                     |
           |                                           |
           |                                           |
           |                                           |
           |                                           |
           |                                           |
           +-------------------------------------------+

Záróképernyő

+-----------------------------------+
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
|     A játékinformációk            |
|     megjelenítése                 |
|     - játék időtartama            |
|     | kígyó hossza                |
|     - megevett ételek             |
|     . top 5 eredménylista         |
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
|                                   |
+-----------------------------------+

Vázlat az alkalmazás felépítéséhez

Az alkalmazásunk felépítése a következő lesz:

  Képernyő (View)                                 Alkalmazás logika (Model)
+---------------------------------------+       +-----------------------------------+
|                                       |       |                                   |
|  A megjelenítést végzi, illetve       |       |   A feladata a játékmenethez      |
|  a felhasználó vezérlését fogadja.    |       |   szükséges tudás birtoklása      |
|                                       | +---> |   Fontos, hogy célunk szerint     |
|                                       |       |   nem tudja, hogy a megjelenítés  |
|                                       | <---+ |   pontosan mi.                    |
|                                       |       |   (Ezt nem tudjuk maradéktalanul  |
|                                       |       |   megoldani a jelenlegi           |
|                                       |       |   tudásunkkal, de egy nagy        |
|                                       |       |   lépést teszünk ebbe az irányba  |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
|                                       |       |                                   |
+---------------------------------------+       +-----------------------------------+

1. feladat

  • elkészíteni a képernyőt (View: MainWindows.xaml)
    • tudnia kell megjeleníteni a kígyó fejét
      • ehhez kell a játéktábla
        • meg kell tudni jeleníteni a megevett ételek számát
    • tudnia kell megjeleníteni a játékszabályokat
    • tudnia kell elkapni a felhasználó vezérlőparancsait (billentyűleütések), és továbbítni a Model felé.
  • elkészíteni az alkalmazáslogikát (Model)
    • tudnia kell átvenni a billentyűparancsokat
    • tudnia kell elindítani a játékmenetet
      • el kell tudnia tüntetni a játékszabályokat
  • ezt a két réteget összekötni

2. Feladat

Játékmenet programozása

  • a kígyó megy amerre irányítjuk

1. Házi feladat

  • meg kell tudni jeleníteni az eltelt időt
  • meg kell tudni jeleníteni a kígyó hosszát
  • elgondolkodni az ütközések programozásáról
  • csatlakozás a DotNet cápákhoz a facebookon

3. Feladat

  • meg kell tudni jeleníteni a kígyó hosszát
    • a játék kezdetekor megmutatni a kígyót, "ahogy kibújik a kígyóveremből"
    • a kígyó testét navigálni a kígyófej mögött
    • a kígyó evés után nő

Áttekintő ábra

                                         A kígyó feje
    A kígyófarok eleje  +------------>   +    (Head)
       (Neck)                        |   |
                                     v   v

                                  ++ ++ ++
                                  ++ ++ ++
                                      ^+
                                  ++   |
                                  ++ <--<----------------+
                                       |                 |
                                  ++   |                 |
A kígyófarok vége   +-----------> ++ <-+                 +
  (End)                                               A kígyó farka
                                  ^                    (Tail)
                                  |
                                  |
                                  |
                                  |
                                  |
                                  +

                       A legmesszebb ez az elem van a kígyó
                       fejétől, így ez került bele legrégebben
                       a listába (List<ArenaPosition> Tail),
                       ahova az új elemek
                       mindig a legvégére kerülnek, így ez az
                       elem értelemszerűen a legelső lesz
                       a listában mindig
  • elgondolkodni az ütközések programozásáról
    • ha ütközik a fallal vége a játéknak
    • ha ütközik magával vége a játéknak
  • étel megjelenítése és evés
    • az étel megjelenítése
      • egyszerre mindig egy étel
    • evés
  • a kígyó evés után gyorsul
  • a kígyó evés után nőjön

2. Házi feladat

  • helyezzük át a fodds.Remove hívása előtti ellenőrzést a Remove-ba, és az adja vissza, hogy: true=létezett és töröltem, false=nem létezik
  • meg kell tudni jeleníteni az eltelt időt
  • meg kell tudni jeleníteni a kígyó hosszát
  • továbbfejlesztés: egyszerre több étel megjelenítése

4. Feladat

  • helyezzük át a fodds.Remove hívása előtti ellenőrzést a Remove-ba, és az adja vissza, hogy: true=létezett és töröltem, false=nem létezik
  • az ismétlődések kiszervezése
  • egy második megjelenítési típus befezetése (Canvas)

Tudnivalók

  • A Canvas megjelenítéskor egy Children gyűjteményben rögzíti a megjelenítendő elemeket
  • Amilyen sorrendben megjelennek ezek az elemek, olyan sorrendben kerülnek ebbe a gyűjteménybe
  • ha törlök ezekből az elemekből, az indexelés megváltozik a tömbnek
 Canvas

+-----------------------------------------------+
|                                               |
|                 3                             |
|                 +----+                        |
|                 |    |   +------------------------------->        Children
|                 +----+                        |                  +---------------------+
|                                               |          +       |                     |
|                                               |          |       | +-----------------+ |  0
|    1                                          |          |       | +-----------------+ |
|    +-----+                                    |          |       |                     |
|    |     | +-------------------------------------------> |       | +-----------------+ |  1
|    +-----+                                    |          |       | +-----------------+ |
|                              2                |          |       |                     |
|                              +-----+          |          |       | +-----------------+ |  2
|                              |     | +-----------------> |       | +-----------------+ |
|                              +-----+          |          |       |                     |
|                                               |          |       |                     |
+-----------------------------------------------+          |       |                     |
                                                           |       |                     |
                                                           |       |                     |
                                                           |       +---------+-----------+
                                                           |                 ^
                                                           |                 |
                                                           |                 |
                                                           v +-------------->+

Megoldási lehetőségek:

  • RemoveAt() : ehhez ismerni kell az indexet

    • létrehozunk mi is egy listát, amiben ugyanazokat az elemeket nyilvántartjuk, mint amit a Canvas.Children nyilvántart. Tehát:
      • ha felviszünk egy új elemet, akkor a mi listánkba is felviszünk egy új elemet,
      • ha törlünk a Childrenből, akkor töröljük a listánkról is a megfelelő elemet.
    • teszünk egyéb megkötéseket, például
      • az ételeket mindig a 0. elemre tesszük, (az InsertAt függvény segítségével), így
        • mindig az elején lesznek az ételek,
        • és mindig a végén a kígyó
  • Remove() : ehhez meg kell tartani az eredeti elemet

    • Nyilván kell tudni tartani a kirajzolt elipsziseket a meglévő adatok mellé

Osztályok leszármaztatása, létrehozás

 CanvasPosition                            ArenaPosition

+------------------------+               +-------------------------+
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        | +-----------> |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
|                        |               |                         |
+------------------------+               +-------------------------+



             A CanvasPosition leszármazottja az ArenaPosition-nek
             vagy
             Az ArenaPosition ősosztálya a CanvasPosition-nek
             ez a kettő ugyanazt jelenti

             Ebből az következik, hogyha mi létrehozunk egy CanvasPosition-t,
             akkor mindig létrejön egy ArenaPosition példány, ő fogja mindazt
             megoldani, amit az ArenaPosition tud.
             Ebből az következik, hogy MINDIG tudnuk kell példányosítani egy
             ArenaPosition-t.
  • vissza kell tudni kapni a kereséskor azt az elemet, amit éppen törölni szeretnénk
  • így tudjuk majd törölni a kirajzolt elemet a Canvas.Childrenből

3. Házi feladat

  • továbbfejlesztés: egyszerre több étel megjelenítése
  • Záróképernyő
  • Játék megállítása és újraindítása gomb
  • meg kell tudni jeleníteni az eltelt időt
  • meg kell tudni jeleníteni a kígyó hosszát

Továbbiak:

mindenkit várok a következő tanfolyamon: étterem projekt illetve a Facebokon a dotnet cápák csoportban netacadémia blog: http://netacademia.blog.hu/

Minden nap kódoljatok!

Releases

No releases published

Packages

No packages published

Languages