Spisu treści:

Zaprogramuj własną grę 2048 w Javie!: 8 kroków
Zaprogramuj własną grę 2048 w Javie!: 8 kroków

Wideo: Zaprogramuj własną grę 2048 w Javie!: 8 kroków

Wideo: Zaprogramuj własną grę 2048 w Javie!: 8 kroków
Wideo: 6 Miesięcy Tworzenia Gier | Moje początki 2024, Lipiec
Anonim

Przez PranP1My (niekompletna) SiteŚledź Więcej autora:

Maszyna CNC Arduino z odzyskanych części PC
Maszyna CNC Arduino z odzyskanych części PC
Maszyna CNC Arduino z odzyskanych części PC
Maszyna CNC Arduino z odzyskanych części PC
DIY Nowoczesne drewniane ławki
DIY Nowoczesne drewniane ławki
DIY Nowoczesne drewniane ławki
DIY Nowoczesne drewniane ławki
Bezdotykowy mechanizm otwierania drzwi (vSTEM)
Bezdotykowy mechanizm otwierania drzwi (vSTEM)
Bezdotykowy mechanizm otwierania drzwi (vSTEM)
Bezdotykowy mechanizm otwierania drzwi (vSTEM)

Uwielbiam grę 2048. Postanowiłem więc zaprogramować własną wersję.

Jest bardzo podobny do rzeczywistej gry, ale samodzielne programowanie daje mi swobodę zmiany wszystkiego, co chcę, kiedy tylko chcę. Jeśli chcę gry 5x5 zamiast typowego 4x4, prosta zmiana przy użyciu konstruktora „Board” pozwoli mi to zrobić. Powiedzmy, że chcę utrudnić grę, dodając elementy w pozycjach, które uczynią ją najbardziej złożoną dla gracza, a nie losowo. Używając prostego algorytmu, mogę to zrobić. Chociaż nie omówię wszystkich tych modyfikacji w tym Instruktażowym, planuję dodawać więcej, gdy idę.

Na razie jednak zaprogramujemy typową grę 2048.

Zacznijmy!

(Uwaga: ten Instructable wymaga umiarkowanej znajomości programowania - szczególnie w języku Java)

Krok 1: Materiały

Materiały
Materiały

Do tego projektu nie będziesz potrzebować wiele, ponieważ jest to tylko przewodnik po programowaniu.

Materiały:

  • Laptop
  • Eclipse (lub dowolne IDE do wyboru)

Tak. Otóż to.

Krok 2: Poznaj program – Zarząd

Cały kod wgrałem na GitHub - sprawdź tutaj:

Podzieliłem grę na 3 klasy: Board, Tile i Game.

Deska:

Opis: Klasa Board zajmuje się planszą do gry, konfigurując tablicę elementów 'Tile', pobierając bieżący wynik i najwyższy kafelek oraz umieszczając tablicę w ciągu (do użycia później w 'Game'). Większość logiki również jest tutaj, klasa zapewnia metody odradzania się 2 i 4 w losowych miejscach, poruszania się w górę, w dół, w lewo i w prawo oraz powiadamiania graczy o zakończeniu gry.

Konstruktorzy:

/* Domyślny konstruktor tablicy - ustawia macierz 4x4 */

tablica publiczna() {…}

/* Konstruktor tablicy - ustawia macierz o określonej wielkości siatki */

tablica publiczna (siatki wewnętrzne) {…}

Metody:

/* Metoda pobierająca zwracająca tablicę */

Płytka publiczna getBoard() {…}

/* Metoda pobierająca zwracająca wynik */

public int getScore() {…}

/* Znajduje najwyższą płytkę na planszy i zwraca ją */

public int getHighTile() {…}

/* Wypisuje tablicę na konsolę - w celach testowych */

public void print() {…}

/* Zwraca tablicę jako ciąg znaków - używany w GUI */

public String toString() {…}

/* Odradza 2 (lub 4) na pustym polu w momencie wykonania ruchu */

public void spawn() {…}

/* Sprawdza, czy tablica jest całkowicie zaciemniona, a jeśli tak, skłoni graczy do ponownego uruchomienia */

public boolean blackOut() {…}

/* Sprawdza, czy gra się skończyła - gdy plansza jest zaciemniona i żadna z płytek nie może się łączyć */

publiczna gra logicznaOver() {…}

/* Wywoływane po naciśnięciu 'w' lub strzałki w górę - wywołuje 'verticalMove' dla każdej płytki na planszy z parametrem 'up' */

public void up() {…}

/* Wywoływane po naciśnięciu 's' lub strzałki w dół - wywołuje 'verticalMove' dla każdej płytki na planszy z parametrem 'down' */public void down() {…}

/* Wywoływane po naciśnięciu 'd' lub strzałki w prawo - wywołuje 'horizontalMove' dla każdej płytki na planszy z parametrem 'right' */public void right() {…}

/* Wywoływane po naciśnięciu 'a' lub strzałki w lewo - wywołuje 'horizontalMove' dla każdej płytki na planszy z parametrem 'left' */

public void left() {…}

/* Porównuje wartości dwóch płytek razem i jeśli są takie same lub jeśli jedna jest równa 0 (płytka gładka) - ich wartości są dodawane (pod warunkiem, że porównywane płytki to dwie różne płytki i poruszają się w odpowiednim kierunku) - rekursywnie porusza się po rzędzie */

public void horizontalMove (int row, int col, String direction) {…}

/* Porównuje wartości dwóch płytek razem i jeśli są takie same lub jeśli jedna jest równa 0 (płytka gładka) - ich wartości są dodawane (pod warunkiem, że porównywane płytki to dwie różne płytki i poruszają się w odpowiednim kierunku) - rekursywnie porusza się po kolumnie */

public void verticalMove (int row, int col, String direction) {…}

Tak, to wiele metod - ale nie martw się, większość z nich jest niezwykle łatwa do zrozumienia. Do tego klasa 'Board' jest najbardziej złożona, więc wszystko po niej będzie stosunkowo proste.

Krok 3: Poznaj program - kafelek

Płytka:

Opis: Klasa Tile zajmuje się poszczególnymi płytkami i jest najmniejszą ze wszystkich klas. Każda płytka ma wartość całkowitą i kolor. Ma dwa konstruktory, które tworzą kafelki o wartości 0 (domyślnie) lub o wartości #. Metody są w większości oczywiste, przy czym metody „getter” i „setter” stanowią większość całości.

Konstruktorzy:

/* Konstruuje podstawowy kafelek o wartości 0 */

Płytka publiczna() {…}

/* Konstruuje kafelek o wartości liczby */

Płytka publiczna (numer wewnętrzny) {…}

Metody:

/* Pobiera wartość kafelka */

public int getValue() {…}

/* Ustawia wartość kafelka - używana przy dodawaniu dwóch kafelków razem */

public void setValue (wartość int) {…}

/* Reprezentuje kafelek jako String - używany w GUI */

public String toString() {…}

/* Ustawia kolor kafelka na podstawie jego wartości */

public void setColor() {…}

/* Pobiera kolor kafelka */

public void pobierzKolor() {…}

Krok 4: Poznaj program - Gra

Gra

Opis: Klasa gry zawiera główną metodę, większość metod GUI i interakcje z klawiszami. Wykorzystuje zarówno klasy Tile, jak i Board i umożliwia im współpracę.

Konstruktorzy:

Nic

Metody:

/* ustawia GUI o odpowiednich rozmiarach i dodaje Key Listener */

public static void setUpGUI() {…}

/* Sprawdza, czy naciśnięto klawisze wasd lub strzałek i wykonuje odpowiednie akcje - aktualizuje JFrame przy każdym ruchu */

public void keyPressed (KeyEvent e) {…}

/* Maluje GUI serią ciągów, planszy, kafelków i zapewnia, że zostaną odmalowane po zakończeniu gry */

public void paint (Grafika g) {…}

/* rysuje pojedynczy kafelek - wywoływany z metody paint */

public void drawTiles (Grafika g, Tile tile, int x, int y) {…}

/* Metoda główna - ustawia GUI i uruchamia grę */

public static void main(String args) {…}

Krok 5: Ważne metody - ruch

Najważniejsze do zrozumienia są metody poruszania się, ale dobrą wiadomością jest to, że gdy zrozumiesz ruchy pionowe, możesz zastosować to zrozumienie do ruchów poziomych. W rzeczywistości trzy metody ruchu pionowego są dokładnie takie same, jak trzy ruchy metodą poziomą, z wyjątkiem jednego ruchu przez rzędy, a drugiego przez kolumny. Z tego powodu skupmy się tylko na metodach ruchu pionowego.

private void verticalMove(int row, int col, String direction)

{ inicjał płytki = tablica[granica][kol]; Porównanie kafelków = tablica[rząd][kol]; if (initial.getValue() == 0 || initial.getValue() == porównaj.getValue()) { if (wiersz > granica || (kierunek.equals("w dół") && (wiersz < granica))) { int addScore = początkowa.getValue() + porównaj.getValue(); if (initial.getValue() != 0) { score += addScore; } Initial.setValue(addScore); porównaj.setValue(0); } } else { if (direction.equals("w dół")) { border--; } inny { granica++; } verticalMove(wiersz, kolumna, kierunek); } }

Powyższa metoda, verticalMove, jest wywoływana przez metody 'up' i 'down'. Przyjrzyjmy się metodzie „w górę”.

publiczne nieważne w górę ()

{ for (int i = 0; i < siatki; i++) { obramowanie = 0; for (int j = 0; j < grids; j++) { if (tablica[j].getValue() != 0) { if (granica <= j) { verticalMove(j, i, "w górę"); } } } } }

Ta metoda przechodzi przez całą planszę i wywołuje verticalMove dla każdej płytki z parametrem „w górę”. verticalMove następnie porównuje płytkę na pozycjach „j” i „i” z płytką na pozycjach „border” i „i”. Jeśli oba są równe, są połączone. Jeśli tak nie jest, kafelek obramowania jest zwiększany o 1 (ponieważ parametr w miejscu to „w górę”) i ponownie wywoływana jest funkcja verticalMove.

Zalecana: