Tworzenie gry zręcznościowej typu „Dopasuj 3” za pomocą interfejsu wiersza poleceń Gemini

1. Wprowadzenie

W tym ćwiczeniu utworzysz CloudCrush, grę zręcznościową typu „dopasuj 3”, przy użyciu Gemini 3interfejsu wiersza poleceń Gemini, naszego agenta do kodowania w wierszu poleceń. Gra zostanie napisana w języku Go i wdrożona w Google Cloud za pomocą Cloud Run.

Głównym celem tego ćwiczenia jest zdobycie umiejętności koordynowania pracy agenta, aby tworzył aplikacje za Ciebie, zamiast ręcznie pisać kod. Wszystkie zadania związane z programowaniem możesz przekazać interfejsowi wiersza poleceń Gemini, nawet jeśli wcześniej nie korzystałeś(-aś) z tych technologii.

To ćwiczenie jest przeznaczone dla średnio zaawansowanych programistów, którzy chcą poznać przepływy pracy związane z kodowaniem agentowym. Szacowany łączny czas trwania tego modułu to 60 minut. Zasoby utworzone w tym ćwiczeniu korzystają z modelu cenowego opartego na wykorzystaniu.

Jakie zadania wykonasz

  • Stwórz podstawową logikę gry typu „match 3” za pomocą języka Go i platformy Ebitengine.
  • Dostosuj grę do uruchamiania w przeglądarce za pomocą WebAssembly (WASM).
  • Wdróż grę i jej interfejs API wyników w Cloud Run.
  • Orkiestracja wyspecjalizowanych sub-agentów i rozszerzeń na potrzeby testowania i inspekcji kodu

Wymagania wstępne

  • Podstawowa znajomość języków programowania
  • Podstawowa wiedza o infrastrukturze w chmurze
  • Podstawowa znajomość konsoli Google Cloud

Czego się nauczysz

  • Jak współpracować z agentem do kodowania przy tworzeniu złożonych aplikacji
  • Jak korzystać z Gemini w kontekście multimodalnym
  • Jak wdrażać aplikacje w chmurze za pomocą Cloud Run

Czego potrzebujesz

Te warsztaty można w całości przeprowadzić w chmurze za pomocą Cloud Shell, ale jeśli wolisz używać komputera lokalnego, potrzebujesz tych elementów:

  • interfejs wiersza poleceń Gemini. Pobierz i zainstaluj go, postępując zgodnie z instrukcjami na stronie geminicli.com.
  • Łańcuch narzędzi Go (wersja 1.26 lub nowsza). Pobierz i zainstaluj go, postępując zgodnie z instrukcjami na stronie go.dev.
  • gcloud CLI do interakcji z Google Cloud; Pobierz i zainstaluj go, postępując zgodnie z instrukcjami w dokumentacji Google Cloud.
  • Konto rozliczeniowe Google Cloud (do wdrożenia gry w chmurze).

Kluczowe technologie

Więcej informacji o technologiach, z których będziemy korzystać, znajdziesz tutaj:

2. Konfiguracja środowiska

Konfigurowanie projektu

Tworzenie projektu Google Cloud

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt w chmurze Google.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.

Uruchamianie Cloud Shell

Cloud Shell to środowisko wiersza poleceń działające w Google Cloud, które zawiera niezbędne narzędzia.

  1. Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud.
  2. Po połączeniu z Cloud Shell sprawdź uwierzytelnianie:
    gcloud auth list
    
  3. Sprawdź, czy projekt jest skonfigurowany:
    gcloud config get project
    
  4. Jeśli projekt nie jest ustawiony zgodnie z oczekiwaniami, ustaw go:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

3. Konfiguracja projektu

Tworzenie katalogu projektu

Najpierw musimy utworzyć nowy katalog dla Twojego projektu. W terminalu uruchom te polecenia:

mkdir -p codelab-match3 && cd codelab-match3

Uruchom interfejs wiersza poleceń Gemini

Najpierw sprawdźmy, czy interfejs wiersza poleceń Gemini został prawidłowo zainstalowany. Uruchom w terminalu:

gemini --version

Powinien pojawić się ekran podobny do tego:

$ gemini --version
0.37.1

Teraz uruchom interfejs wiersza poleceń Gemini za pomocą polecenia gemini:

gemini

Powinien pojawić się prompt interfejsu wiersza poleceń Gemini:

b9f33e9786c58b61.png

Jeśli widzisz prompt interfejsu wiersza poleceń Gemini, wszystko jest w porządku. Jeśli nie, sprawdź, czy nie pominięto żadnego z poprzednich kroków konfiguracji.

Włącz sterowanie modelem

Sterowanie modelem to funkcja, która umożliwia dodawanie dodatkowego kontekstu do agenta, gdy ten nadal pracuje nad danym zadaniem. Możesz go używać, aby korygować działanie agenta, gdy zauważysz, że zmierza w złym kierunku, dodawać informacje wyjaśniające, aby ulepszyć jego odpowiedź, lub uwzględniać drobne funkcje, które zostały pominięte w pierwotnym promcie.

Aby włączyć sterowanie modelem, otwórz menu ustawień za pomocą polecenia /settings i w polu wyszukiwania wpisz „steering”. Następnie ustaw opcję Włącz sterowanie modelem na wartość „true”.

8ed164e05654a79.png

Aby zmiana została zastosowana, może być konieczne ponowne uruchomienie interfejsu wiersza poleceń (naciśnij klawisz „r”).

Pobieranie komponentów

Musimy pobrać obrazy, które będą używane w grze. Pliki są przechowywane w repozytorium GitHub tutaj. Możesz pobrać je ręcznie lub poprosić o to Gemini, używając tego prompta:

Create a folder named "assets" and download the images
background.png, gcp_sprites.png, gemini.png and logo.png,
from this GitHub repository to the "assets" folder:
https://github.com/GoogleCloudPlatform/devrel-demos/tree/main/codelabs/gemini-cli/gemini-cli-match3-golang

4. Tworzenie gry w trybie planowania i sterowania modelem

Zacznij od stworzenia podstawowej logiki gry typu „dopasuj 3”. Jest to złożone zadanie, dlatego najlepiej użyć interfejsu wiersza poleceń Gemini w trybie planowania, aby skoordynować proces tworzenia.

Przełącz tryb planowania za pomocą polecenia po ukośniku /plan w prompcie interfejsu wiersza poleceń Gemini:

/plan

Po włączeniu trybu planowania skopiuj i wklej do interfejsu wiersza poleceń Gemini ten prompt:

Build a Match-3 game called 'Cloud Crush' in Go using Ebitengine v2.
The entire game screen should have background.png as background.
The play area should be an 8x8 grid with white background. 
On the right side of the play area include a side panel with UI elements 
like player score and how to play instructions.
The side panel should have a solid background colour to help with readability of the UI.

Use standard GCP product logos (e.g. Compute Engine, Cloud Storage, BigQuery, etc.)
as icons. These icons are provided in the gcp_sprites.png file.

The icons are saved as 64x64 sprites but scale them as necessary
based on the screen resolution. Implement swapping, clearing 3+ gems, and gravity.

Use ebitengine native font rendering (size 48 for titles and size
24 for normal text) for all text and not the debug print.

The font should be monospaced (golang.org/x/image/font/gofont/gomono).
Keep the UI tidy and harmonic, e.g. centered text should always be
adjusted based on text length, not just guess based on estimates.

Przed wygenerowaniem planu interfejs wiersza poleceń Gemini może zadać Ci kilka pytań wyjaśniających.

Na przykład tutaj pyta, czy wolisz aplikację z jednym plikiem czy z wieloma:

ba0d58fecaef343b.png

A tutaj pyta o nasze preferencje dotyczące animacji:

432cbe7c747b2f3.png

Ostatnie pytanie dotyczy osadzania zasobów w samym pliku binarnym za pomocą go:embed:

98ae4d6786d24c9b.png

Po udzieleniu odpowiedzi na wszystkie pytania możesz je jeszcze raz sprawdzić, zanim naciśniesz Enter, aby przesłać formularz.

47c44052fafdc1bf.png

Po zakończeniu planu pojawi się prośba o jego sprawdzenie:

5e474a04a060d28b.png

U dołu okna opinii możesz zaakceptować plan w obecnej formie lub dodać swoje uwagi.

b0ad1350cd1ae6c5.png

Skorzystaj z tej możliwości, aby dodać nowy wymóg, który został pominięty w pierwotnym promcie:

Add a 60-seconds countdown timer and an in-memory high-score tracker
to enhance the arcade game experience.
Combos should give a score bonus of 10% per combo number.

Po raz ostatni pojawi się prośba o potwierdzenie planu wdrożenia:

2f52c3c43efafd0e.png

Naciśnij Enter, aby agent rozpoczął pracę. Agent opuści teraz tryb planowania i zacznie pisać kod.

W tym momencie zwykle musielibyśmy poczekać na zakończenie działania lub przerwać je klawiszem ESC, jeśli chcielibyśmy wprowadzić zmiany w implementacji. Jednak ponieważ mamy włączone sterowanie modelem, możemy umieścić w kolejce instrukcje, aby skorygować działanie modelu.

Gdy agent pracuje, wklej w oknie czatu agenta ten tekst, aby zademonstrować funkcję „sterowania modelem” i pokazać, jak można kolejkować polecenia, aby zmienić kierunek wdrożenia:

Update the implementation to include: 'Q' to quit, 'F' for full-screen
and 'A' for Accessibility Mode: swap GCP logos for high-contrast coloured blocks.

Also enable Arrow Keys to move the selection cursor and Space to select the gem to 
swap (space is pressed once to select, then arrow key immediately makes 
the move - no need to press space again).

Use a golden square (4 px border, transparent fill) with a simple animation
to highlight where the cursor is at the moment.

Zobaczysz, że prompt jest w kolejce jako „wskazówka sterująca”:

75652d5d67e247b3.png

Zaakceptuj plan i obserwuj, jak agent realizuje wszystkie Twoje wymagania.

Gdy agent zakończy wdrażanie, uruchom go run main.go w folderze projektu, aby zaprezentować wersję komputerową. Aby uruchomić to polecenie, nie musisz opuszczać interfejsu wiersza poleceń Gemini. Wpisz ! (wykrzyknik), aby przejść do trybu powłoki i uruchomić polecenie:

a2ead65c4efe9d52.png

Zaletą uruchamiania w trybie powłoki jest to, że wszelkie problemy, które mogą wystąpić, są natychmiast rejestrowane w kontekście agenta. Na przykład w tym przypadku agent zapomniał pobrać niektóre zależności:

c7caf0bc02bc29ce.png

Aby wyjść z trybu powłoki, naciśnij klawisz Escape, a następnie poproś agenta o sprawdzenie i naprawienie błędu:

ef1773f2efffe886.png

Wynik powinien wyglądać podobnie do tego:

2f69de852e625951.png

Zagraj w grę i dostosuj jej parametry, aż będziesz zadowolony(-a) z wyniku (np.przyspiesz lub spowolnij animację, dostosuj reakcję na polecenia itp.).

5. dostosować grę do działania w przeglądarce,

Utworzona właśnie gra Ebitengine to aplikacja na komputery. Aby umożliwić jego działanie w internecie, możemy przekonwertować go na WebAssembly.

Aby poprowadzić agenta, użyj tego promptu:

We need to enable this game to run on a web browser. Compile the game to WASM
and create a Go web server to serve the compiled WASM and the assets.

Gdy agent wykona zadanie, możesz polecić mu uruchomienie serwera gry w tle.

880f19b60981d191.png

Procesami w tle możesz zarządzać za pomocą kombinacji klawiszy Ctrl+B:

b72391e3963db37b.png

Aby zamknąć to okno, naciśnij ponownie Ctrl+B.

Teraz otwórz w przeglądarce adres http://localhost:8080, aby zobaczyć grę działającą w internecie:

909e328eb1771bb4.png

Teraz, gdy działa już w internecie, wystarczy ją dopracować przed wdrożeniem w chmurze.

6. Tworzenie ekranu tytułowego i tabeli wyników

Gra działa, ale brakuje w niej kilku kluczowych funkcji, które zapewniają odpowiednie wrażenia z gry na automatach. Najpierw dodaj ekran tytułowy, a potem tablicę wyników, aby móc rywalizować ze znajomymi.

Rozwiąż oba problemy za pomocą tego prompta:

Create a title screen that displays the game logo (logo.png) over the cloud background.
The logo should be centered and occupy no more than 75% of the screen area.
The title screen should display "Press ENTER to play" (black/bold) right below the logo,
with every letter animated in a slow wavy (cosine) pattern.
Once the player presses ENTER, it should be prompted to add their name, which 
will then be recorded to populate the leaderboard at the end of the round.

Once the game is over, play the animated leaderboard with the top 10 highest scores.
The animated leaderboard should render entries one by one up to 10 entries, 
using a fade in effect just like old school arcade games. The leaderboard
should fade out to the title screen after 15 seconds.

Please note that name entry should be processed independently of the play state
key handlers (e.g. pressing A during name entry should not toggle accessibility mode).

Oto przykład ekranu tytułowego:

8babe90fc0d1079f.png

Zaczyna to wyglądać bardziej profesjonalnie. 🙂

7. Wdrażanie gry w Cloud Run

Nadszedł czas, aby podzielić się naszym dziełem ze światem. Wdróż grę w Google Cloud Run, aby mieć do niej dostęp z dowolnego miejsca.

Use the gcloud CLI to provision and deploy the Go web server and its assets to
Google Cloud Run. Provide the live URL when complete.

Skoro gra jest już dostępna w chmurze, byłoby szkoda nie umożliwić jej uruchamiania na urządzeniach mobilnych. Możesz to zrobić za pomocą tego prompta:

Now enable this game to run on mobile devices. You need to update the input
system to handle "taps" as well as key presses and clicks. Since mobile devices
most likely won't have a keyboard, add a button to generate a random name and
a confirmation button to the name entry.

Also generate a QR code for the CloudRun link and display it on the screen so
that people can scan it to access the mobile version and compete against their
friends for the high score.

Uruchom grę ponownie w przeglądarce. Spróbuj też uzyskać dostęp do gry na urządzeniu mobilnym za pomocą kodu QR.

8. Testowanie gry za pomocą agenta przeglądarki

W interfejsie wiersza poleceń Gemini subagent to odizolowana persona z nowym kontekstem, która idealnie nadaje się do długotrwałych lub wymagających dużej precyzji zadań, w których nie chcesz, aby bieżący kontekst wpływał na wyniki.

Gry są trudne do testowania za pomocą konwencjonalnych narzędzi testowych (np. testów jednostkowych i integracyjnych), ale możemy użyć agenta przeglądarki, aby przeprowadzić niektóre testy. Agent przeglądarki może uruchomić własną przeglądarkę Chrome i poruszać się po ekranach gry, wydając polecenia DOM. Może też robić zrzuty ekranu, które możemy wykorzystać do udokumentowania testu, a także przekazać agentowi, aby później wprowadził drobne poprawki w interfejsie.

Agent przeglądarki jest obecnie w fazie eksperymentalnej, więc musimy go najpierw włączyć. Wpisz ten prompt w interfejsie wiersza poleceń Gemini, aby włączyć agenta na poziomie projektu.

Create a .gemini/settings.json file with the following content to
configure the browser sub agent:

{
  "agents": {
    "overrides": {
      "browser_agent": {
        "enabled": true
      }
    }
  }
}

Aby zastosować tę zmianę, musisz ponownie uruchomić agenta. Zapisz bieżącą rozmowę za pomocą polecenia /chat save:

3a3ae7e3c610614b.png

Zamknij interfejs wiersza poleceń Gemini, naciskając dwukrotnie Ctrl+D, a następnie uruchom go ponownie. Przywróć rozmowę z użytkownikiem /chat resume cloud-crush.

Powinien być teraz dostępny agent przeglądarki. Jeśli chcesz przekazać zadanie agentowi przeglądarki, możesz o tym wspomnieć, używając symbolu @browser_agent:

977af2400fdd6ae7.png

Teraz użyj agenta przeglądarki, aby ocenić wdrożoną grę:

@browser_agent perform an end-to-end test of the Cloud Run deployment URL.
Navigate the homepage, start a game, submit a score, and verify the new score 
appears correctly on the leaderboard. Take screenshots to show each step of the 
investigation and save to ./screenshots.

Powinien pojawić się ekran potwierdzenia:

3af4096f5d903115.png

Po wyrażeniu zgody na dostęp do agenta i wymaganych narzędzi powinno otworzyć się nowe okno przeglądarki Chrome. Jest to przeglądarka kontrolowana przez agenta. Wizualnym sygnałem będzie niebieskie obramowanie ekranu i komunikat u dołu „interfejs wiersza poleceń Gemini steruje tą przeglądarką”:

ddfaed4cd8fe3a80.png

Po zakończeniu pojawi się komunikat podobny do tego:

d69a9241ae8a9b71.png

Oto kilka zrzutów ekranu wykonanych przez agenta przeglądarki:

title_screen.png:

fb0a1b38b05e104f.png

game_board.png:

2ef025b6130c31.png

Teraz jest dobry moment, aby użyć jednego ze zdjęć zrobionych przez agenta do optymalizacji interfejsu gry. Na przykład możesz powiedzieć:

Analyse the screenshot @screenshots/game_board.png and adjust the side panel to
have better contrast and be more harmonic with the rest of UI elements. Focus
on readability and color theory to achieve the best possible visuals.

9. Tworzenie agenta niestandardowego do zabezpieczania gry

Jednym z częstych problemów związanych z aplikacjami „zakodowanymi w określonym stylu” jest utrzymanie wysokiej jakości i najlepszych praktyk zarówno z perspektywy kodowania, jak i bezpieczeństwa. Możesz spróbować ulepszyć prompty, aby były bardzo rygorystyczne w obu tych aspektach, ale im więcej dodasz do promptu, tym mniej skoncentrowany będzie agent, co często prowadzi do suboptymalnych wyników. W takim przypadku idealne jest użycie subagentów, ponieważ działają oni w innym kontekście niż główny agent i mogą się skupić na powierzonym im zadaniu. Utwórzmy niestandardowego agenta, który przeprowadzi audyt bezpieczeństwa tego kodu i sprawdzi, czy nie wyciekają żadne dane logowania ani czy nie narażamy się na niepotrzebne ryzyko podczas wdrażania tej gry w Cloud Run.

Create a new custom agent in .gemini/agents/security_auditor.md using the following content:

---
name: security_auditor
description: Specialized in finding security vulnerabilities in code.
kind: local
tools:
  - read_file
  - grep_search
model: gemini-3-flash-preview
temperature: 0.2
max_turns: 10
---

You are a ruthless Security Auditor. Your job is to analyze code for potential
vulnerabilities.

Focus on:

1.  SQL Injection
2.  XSS (Cross-Site Scripting)
3.  Hardcoded credentials
4.  Unsafe file operations

When you find a vulnerability, explain it clearly and suggest a fix. Do not fix
it yourself; just report it.

Aby zmiana zaczęła obowiązywać, musisz ponownie uruchomić interfejs CLI. Zapisz sesję czatu za pomocą /chat save i wznów ją za pomocą /chat resume, tak jak wcześniej.

Po wznowieniu działania interfejsu CLI automatycznie wykryje on nowego agenta podczas uruchamiania:

36a78465019aee07.png

Kliknij Acknowledge and Enable, a następnie poproś agenta o przeprowadzenie kontroli bezpieczeństwa kodu gry, używając tego prompta:

@security-auditor please run a security audit on this code and cloud run 
deployment to make sure it is safe against common attack patterns and that it is 
not leaking any credentials

Powinien pojawić się ekran podobny do tego:

7dd0440a539c735a.png

Po zakończeniu audytu przedstawi rekomendacje. W tym przykładzie wykryto kilka ważnych elementów do poprawy:

e6d8d7965a003c16.png

Jeśli znajdziesz jakieś wyniki, po prostu zapytaj interfejs wiersza poleceń Gemini o ich rozwiązanie. 🙂

10. Podsumowanie

Gratulacje! Udało Ci się użyć interfejsu wiersza poleceń Gemini do utworzenia, wdrożenia, przetestowania i sprawdzenia gry zręcznościowej, co pokazuje zaawansowane przepływy pracy oparte na agentach od początkowego szkieletu po wdrożenie.

Czyszczenie

Jeśli nie planujesz wrócić do tego ćwiczenia z programowania, najlepiej usunąć zasoby utworzone podczas niego.

  1. Usuń usługę Cloud Run:

Poproś interfejs wiersza poleceń Gemini o usunięcie go:

I'm finished with this project. Delete the cloud run deployment.
  1. Usuń katalog projektu:
cd .. && rm -rf codelab-match3

Możesz też usunąć cały projekt w chmurze Google, jeśli został utworzony wyłącznie na potrzeby tego ćwiczenia.

Dalsze kroki

Możesz kontynuować naukę, zapoznając się z innymi modułami Codelabs na tej platformie lub samodzielnie ulepszając Cloud Crush.

Kilka sugestii dotyczących ulepszenia gry:

  • Dodaj specjalny klejnot „Gemini” (używając pliku gemini.png), który pojawia się po dopasowaniu co najmniej 4 klejnotów. Dopasowanie co najmniej 3 klejnotów Gemini daje graczowi dodatkowy czas.
  • Dodaj muzykę. Muzykę możesz generować za pomocą Lyrii 3 na stronie głównej Gemini.
  • Dodawanie efektów dźwiękowych
  • Dodawanie innych trybów gry

Pozdrawiamy