Snake játék JAVA-ban. Szeretnék adni egy terv ötletet és arra szeretnélek titeket kérni, hogy mondjátok el kti milyen "hiearchiával" valósítanátok meg?
Szóval annyi lenne a lényeg, hogy adok egy mintát ami alapján szeretném megcsinálni a Snake játékot. Ez a minta legfőképpen classokból áll, csak nem tudom, hogy hogyan mondják normálisan.
Szóval én véleményem szerint:
Program - public static void main(...)
GUI - JFrame (..)
Grid - GUI-ra kirajzolna egy négyzethálót (drawLine-al), a kígyót és a kaját, valamint a kígyó animálása is itt lenne (ugye?)
Snake - Itt lenne a játék logikája
Key - Ez lenne a KeyListener osztálya
Nálam az objektum orientáltság azt jelenti (valamiért), hogy minden olyan dolog amely egy külön objektumnak mondható (grid, gui, key) legyen külön osztályban. Ezt tényleg így kéne felfogni?
Viszont, hogy tudom megoldani, hogy a Key.class elérje a Grid.class-t és mondjuk az egyik változoját (irány) változtassa ha private?
Szabad-e olyat csinálni, hogy a Key extends Grid?
Ismerem az IS-A megközelítést az öröklődésben, de az, hogy a billentyűfigyelő egyfajta pálya legyen nem jön össze nálam.
Remélem érthető, hogy mit kérdezek, ha nem akkor sorry csak nem tudom, hogy hogy fogalmazzam meg normálisan :D
Gui - Ablak
Grid - Rajzolások [kígyó, kaja, négyzetháló] (Itt van az animáció is ugye?)
Snake - Milyen hosszú a kígyó, merre néz
Game - Itt van a logic [kígyó eszik, kígyó nő, kígyó ütközik stb...]
Key - Billentyűleütés figyelő
Jól értelmezem?
Hát ha teljesen őszinte akarok lenni, akkor úgy elakadtam, hogy csak na.
Ezt úgy kell értelmeznem, hogy a Game class-nak kell, hogy legyen egy példánya az összes többi classból?
Viszont így ha állítani akarom a kígyó irányát akkor a Snake classnak is kell, hogy legyen egy Grid class, hogy legyen hova változtatni a feje irányát, ugye?
Egyedül a Game-nek kell ismernie (példányosítania) a többit (Snake, Grid). :)
A Snake-ben a fejállás csak egy tulajdonság és van hozzá egy beállító metódus, egy setter, pl. setFejirany(...);
Ezt a metódust pedig az hívja meg, aki tudja, hogy merre kell, merre lehet állítani a fejet. Ezt pedig a Game tudja, mert ő ismeri a pályát, meg hogy milyen művelet van éppen (milyen gombnyomás, stb.).
Rajzolgattam és arra jutottam, hogy:
A Gui-t a Game csinálja
A game állít tulajdonságot a Snake-ben és a Grid-ben (a grid is tárolja az irányt azért mert ott van az animáció)
Viszont amit nem értek, hogy ha a Key-nek nincs semmi beleszólása a Snake-be akkor a billentyű leütésnél, hogy fog megváltozni a fejirány?
Jól érzem, hogy ez megvalósítási gondolkodásmód problémák oka, hogy ilyeneket nem látok? xD
> "Viszont amit nem értek, hogy ha a Key-nek nincs semmi beleszólása a Snake-be akkor a billentyű leütésnél, hogy fog megváltozni a fejirány? "
A Key irányítja a Game-et, a Game irányítja a Snake-et és a Grid-et. :)
Tehát én valahogy így képzelem el, most példa kódrészletekkel:
public class Key ... {
private Game game;
public Key(Game game) { this.game=game; }
public void keyEvent(...) {
.. if (leütöttBillentyű.equals('W')) game.felfele();
.. if (leütöttBillentyű.equals('A')) game.balra();
}
} // Key
public class Game() {
private Snake snake;
private Grid grid;
public void felfele() {
.. if (snake fejiránya nem felfelé) {
.... snake.setFejirány(felfelé);
.... grid.rajzoldÚjraAKígyót(snake); // és a snake-kel együtt az irány is átmegy:)
.. }
}
} // Game
Én így csinálnám. :) De nem muszáj ezt követned, nyugodtan csináld úgy ahogy jobban átlátod, aztán megpróbálhatod csoportosítani. A cél (az OOP-ben) az, hogy modulokra bontsunk, és a modulok legyenek újrafelhasználhatóak, könnyen cserélhetőek, bővíthetőek. Itt az én elgondolásomban a Snake csak egy sima POJO (annyit tesz, hogy csak pár adattag + getterek-setterek), csak egy modell, amit bármikor átvihetek másik programba.
public class Game {
.........Grid grid = new Grid();
.........Key key = new Key(this);
.........Gui gui = new Gui(grid, key);
}
Azért van így, mert a Gui class-nak kell, hogy legyen egy Grid és Key. Ezek miatt:
- frame.add(grid);
- frame.addKeyListener(key);
Ugye ez így jó?
Egy főbb kérdésem privátban tudsz adni egy elérhetőséget, hogy ha valaha elkészülök vele, akkor áttudjam küldeni normálisan a kódot, hogy megnézd?
[Amúgy mozog a kígyó :) ]
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!