Udemy
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
Turn what you know into an opportunity and reach millions around the world.
Learn More
Your cart is empty.
Keep shopping
C# – Zbuduj Własnego Tetrisa! Kompletny Przewodnik
Rating: 5.0 out of 5(6 ratings)
50 students

C# – Zbuduj Własnego Tetrisa! Kompletny Przewodnik

Od pierwszego klocka po pełnoprawną grę – ucz się, koduj i rozwijaj swoje umiejętności!
Last updated 2/2025
Polish

What you'll learn

  • Nauczysz się, jak zaprojektować i zaimplementować podstawową wersję Tetrisa w C#, zaczynając od struktury planszy po pełną logikę rozgrywki.
  • Opanujesz mechaniki opadania klocków, wykrywania kolizji, usuwania linii oraz sterowania grą przy użyciu klawiatury.
  • Poznasz zasady modularnego kodu poprzez podział na warstwy Domain, Application, Presentation, stosując najlepsze praktyki programistyczne.
  • Wdrożysz Clean Code, SOLID, DRY, TDD oraz Clean Architecture, co pozwoli Ci pisać lepszy, czytelniejszy i łatwiejszy do rozbudowy kod.

Course content

7 sections104 lectures9h 31m total length
  • Rozpoczecie Projektu - Podział Na Warstwy9:39
  • Rozpoczynamy Kodowaniw - warstwa Domain - klasa Block2:39
  • Warstwa Domain - klasa GameBoard11:56
  • Warstwa Application - klasa GameService2:49
  • GameService dodajemy metodę Utworzenie Nowego Klocka2:41
  • GameService dodajemy metodę do Przesuwania Klocka w dół6:40
  • GameService dodajemy metodę do Pobierania Bloków Na Planszy7:13
  • Warstwa Presentation - klasa MainWindow11:19
  • MainWindow dodajemy metodę do Aktualizowania Stanu Gry1:42
  • MainWindow dodajemy metodę do Rysowania Elementów Gry7:05
  • Zagadka2:47
  • MainWindow dodajemy metodę do Pobierania Koloru2:41
  • Analiza kodu pod kątem Najlepszych Praktyk i Zasad SOLID8:24
  • Rozwiązanie Zagadki1:07
  • Dwa Podejścia do kolejności wymiarów w tablicy 2D5:47
  • Optymalizacja Renderowania2:18

Requirements

  • Ten kurs jest przyjazny dla początkujących, ale kilka rzeczy pomoże Ci w pełni go wykorzystać:
  • Podstawowa znajomość C# – warto znać zmienne, pętle, warunki i funkcje.
  • Podstawowe pojęcia programowania obiektowego (OOP) – klasy, metody i obiekty.
  • Nie znasz jeszcze C#? Nie martw się! Kurs prowadzony jest krok po kroku, a jeśli chcesz uzupełnić wiedzę, sprawdź mój kurs "C# Podstawy Programowania"

Description

Chcesz nauczyć się programowania gier w C#?
Zbuduj od podstaw kultowego Tetrisa i poznaj kluczowe koncepcje programowania! W tym kursie przeprowadzimy Cię przez cały proces – od minimalnej wersji gry (MVP) po bardziej zaawansowane mechaniki i optymalizację.

Czego się nauczysz?

Rozpoczniemy od implementacji z podziałem na warstwy i utrzymaniem najlepszych praktyk programowania.
Zaczniemy od utworzenie projektu w Visual Studio z odpowiednimi warstwami:

  • Tetris.Domain: Logika gry i modele.

  • Tetris.Application: Zasady działania gry, logika aplikacji.

  • Tetris.Infrastructure: Integracja z zewnętrznymi komponentami (jeśli będzie potrzebne).

  • Tetris.Presentation: WPF – interfejs użytkownika.


Krok 1. MVP naszej gry Tetris, skupiamy się na najbardziej podstawowych elementach gry, takich jak:

  • Reprezentacja planszy jako siatki.

  • Jeden prosty klocek.

  • Mechanika opadania bloku w dół.

  • Podstawowy interfejs (np. wyświetlanie planszy w WPF).

Nie dodajemy od razu zaawansowanych funkcji, takich jak różne kształty klocków, poziomy trudności czy interakcje gracza, ponieważ najważniejsze jest przetestowanie podstawowej mechaniki. Gdy MVP działa poprawnie i spełnia oczekiwania,
możemy zacząć rozwijać bardziej zaawansowane funkcjonalności.

Następnie przeanalizujemy kod pod kątem zgodności z najlepszymi praktykami i zasadami:

1. SOLID

· Single Responsibility Principle (SRP):

· Open/Closed Principle (OCP):

· Liskov Substitution Principle (LSP):

· Interface Segregation Principle (ISP):

· Dependency Inversion Principle (DIP):

2. Separation of Concerns (SoC)

3. KISS (Keep It Simple, Stupid)

4. DRY (Don’t Repeat Yourself)

5. YAGNI (You Aren’t Gonna Need It)

6. Cohesion i Coupling


Krok 2. Dodamy testy jednostkowe zgodnie z podejściem TDD dla naszego kodu gry Tetris.

Stworzymy testy dla głównych komponentów, zaczynając od podstawowych funkcjonalności.

  1. Testy naszej planszy do gry - klasy GameBoard:

  • Sprawdzenie poprawnego tworzenia planszy czyli - Testy konstruktora

  • Weryfikacja, czy komórki są początkowo puste - Testy metody IsCellEmpty

  • Testowanie umieszczania bloków na planszy - Testy metody PlaceBlock

  • Testy warunków brzegowych

  1. Testy naszego serwisu - klasy GameService:

  • Sprawdzenie poprawnego tworzenia nowych bloków - SpawnBlock

  • Testowanie ruchu bloków w dół - MoveBlockDown

  • Weryfikacja zachowania przy osiągnięciu dna

  • Sprawdzenie poprawnego zbierania wszystkich bloków na planszy - GetBlocks

Testy będą wykorzystywać:

  • xUnit jako framework testowy

  • Moq do mockowania zależności

  • FluentAssertions do czytelniejszych asercji

Krok 3 Dodanie różnych typów bloków

Dodanie różnych typów bloków w projekcie wymaga wprowadzenia odpowiednich modyfikacji w kodzie, które będą zgodne z zasadami projektowymi. W szczególności zastosujemy polimorfizm, co pozwoli na efektywne zarządzanie różnymi kształtami bloków. Dzięki temu nasz kod stanie się bardziej czytelny, elastyczny i zgodny z najlepszymi praktykami programowania.


Krok 4 Zastosowanie wzorca Factory Method.

Cel wzorca :

  • Oddzielenie logiki tworzenia klocków od reszty kodu,
    co ułatwi zarządzanie i rozszerzanie aplikacji.

  • Zamiast tworzyć obiekty GameBlock bezpośrednio w różnych miejscach kodu,
    będziemy korzystać z fabryki (GameBlockFactory),
    co poprawia czytelność i elastyczność kodu.

Plan działań:

  1. Przeniesiemy IGameBoard do folderu Interfaces, aby lepiej uporządkować kod nasz kod.

  2. Dodamy GameBlockType (enum) – reprezentujący różne typy klocków (I, O, T, S, Z, J, L).

  3. Stworzymy interfejs IGameBlockFactory, który określi, jak powinna działać fabryka klocków.

  4. Zaimplementujemy GameBlockFactory, która będzie:

    • Tworzyć klocek na podstawie zadanego typu (CreateGameBlock).

    • Tworzyć losowy klocek (CreateRandomGameBlock).

Dzięki temu jeśli w przyszłości dodamy nowe typy klocków,  wystarczy zmodyfikować fabrykę, zamiast zmieniać kod w wielu miejscach!


Krok 5 Dodanie obsługi obracania klocków za pomocą klawiatury.


Aby poprawnie zaimplementować obrót klocków w grze, należy uwzględnić kolizje zarówno ze ścianami planszy, jak i innymi blokami. Jeśli obrót nie jest możliwy, kształt klocka powinien pozostać bez zmian.

Plan Implementacji:

1. Modyfikacja klasy GameBlock

- Istniejąca metoda Rotate zostanie dostosowana tak, aby zwracała obrócony kształt klocka.

2. Aktualizacja klasy GameService

- Dodanie metody CanRotate, która sprawdzi, czy obrót jest możliwy.

- Implementacja RotateCurrentBlock do obsługi rotacji klocka.

- Dodanie metod MoveBlockLeft i MoveBlockRight w kontekście obrotów.

3. Dodanie Strategi

- Dodamy interfejs IRotationStrategy.

- Dodamy implementację strategii standardowej rotacji klocka o 90 stopni w prawo.

- Dodamy implementacja braku rotacji dla klocka.

- Dodamy Rotacja o 180 stopni

- Dodamy Obracanie klocek przeciwnie do ruchu wskazówek zegara

- Dodamy Rotację Losową, wybiera jedną z dostępnych strategii rotacji


Krok 6 Dodanie logiki detekcji i usuwania pełnych linii i dodanie punktacji

Dodamy logike detekcji i usuwania pełnych linii oraz punktację do naszej gry. Zacznijmy od stworzenia odpowiednich elementów w domenie.
Implementacja zapewnia:

- Prawidłowe wykrywanie pełnych linii – system skutecznie identyfikuje wiersze wypełnione klockami.
- Usuwanie linii i przesuwanie klocków w dół – po usunięciu pełnych linii pozostałe klocki są automatycznie przesuwane w dół.
- Naliczanie punktów według zadanej tabeli – wynik jest aktualizowany zgodnie z liczbą usuniętych linii i przyjętymi zasadami punktacji.
- Wyświetlanie aktualnego wyniku – UI natychmiast odświeża wynik oraz licznik usuniętych linii po każdej zmianie.


Zastosuj wzorzec Observer Pattern

Observer Pattern idealnie pasuje do powiadamiania UI o zmianach w grze. Observer Pattern pozwoli na oddzielenie logiki gry od interfejsu użytkownika.  Dzięki temu UI będzie reagować na zmiany, takie jak:

- Aktualizacja punktacji
- Licznik usuniętych linii
- Czy Możliwość dodania innych zmian (np. Informowanie o końcu gry co teraz też dodamy)


Krok 7 Dodanie Zapisywania wyników i wyswietlania Top 5

Dodamy funkcjonalność zapisywania wyników oraz ich wyświetlania
w formie listy Top 5 najlepszych rezultatów.

Dzięki temu gracze będą mogli śledzić swoje osiągnięcia
oraz rywalizować o najwyższe miejsca w rankingu.

Następnie Dodamy teraz wzorzec Memento,
który pozwala na zapamiętanie stanu wyników graczy w danym momencie - HighScoreMemento

Dzięki temu można cofnąć się do wcześniejszego stanu listy wyników
bez ryzyka ich przypadkowej zmiany.

Who this course is for:

  • Początkujących programistów C#, którzy chcą nauczyć się praktycznego wykorzystania języka i stworzyć swój pierwszy projekt gry.
  • Entuzjastów game developmentu, którzy chcą zrozumieć podstawy mechaniki gier, takie jak sterowanie, kolizje i logika rozgrywki.
  • Osób znających podstawy C#, które chcą przećwiczyć zasady Clean Code, SOLID i architekturę warstwową w praktyce.
  • Każdego, kto chce stworzyć swoją pierwszą grę! Jeśli marzyłeś o napisaniu własnego Tetrisa, ten kurs poprowadzi Cię przez cały proces – od podstaw do zaawansowanych funkcji.