Spisu treści:

Saper-Raspberry-Pi-Edition: 7 kroków (ze zdjęciami)
Saper-Raspberry-Pi-Edition: 7 kroków (ze zdjęciami)

Wideo: Saper-Raspberry-Pi-Edition: 7 kroków (ze zdjęciami)

Wideo: Saper-Raspberry-Pi-Edition: 7 kroków (ze zdjęciami)
Wideo: Raspberry Pi Pico - co to jest? Prezentacja płytki 2024, Lipiec
Anonim
Saper-Malina-Pi-Edycja
Saper-Malina-Pi-Edycja
Saper-Malina-Pi-Edycja
Saper-Malina-Pi-Edycja

Mój ostatni projekt dla serii CSC 130 na Louisiana Tech University to Saper Raspberry Pi Edition. W tym projekcie starałem się odtworzyć klasyczną grę Saper, wykorzystując bibliotekę Tkinter języka programowania Python. Siatka, którą obejmuje gra Saper, ma osiem płytek o szerokości i pięć płytek o wysokości. Formatowanie projektu zostało dostosowane i udoskonalone pod kątem korzystania z Raspberry Pi z zainstalowanym Pythonem 2.7.

Kod i obrazy do ostatecznego projektu Minesweeper Raspberry Pi Edition można pobrać pod następującym linkiem:

Saper-Malina-Pi-Edycja

Kieszonkowe dzieci

1x Raspberry Pi

Python 2.7 zainstalowany na Raspberry Pi

Microsoft Powerpoint (lub inne oprogramowanie do tworzenia obrazów przycisków)

Krok 1: Utwórz obrazy przycisków

Utwórz obrazy przycisków
Utwórz obrazy przycisków

WYJAŚNIENIE:

Każdy przycisk tworzący GUI będzie musiał zostać utworzony. Do tego zadania użyłem Microsoft Powerpoint, aby stworzyć obrazy, które musiałem wyświetlić na przyciskach.

Najpierw stworzyłem dziesięć przycisków kafelków potrzebnych do stworzenia siatki trałowca (pusta, bob, zero, jeden, dwa, trzy, cztery, pięć, sześć, siedem i osiem) za pomocą Microsoft Powerpoint.

Po drugie, stworzyłem cztery obrazy potrzebne do ekranu menu (wyświetlanie menu, przycisk łatwego poziomu trudności, przycisk średniego poziomu trudności i przycisk trudnego poziomu trudności) za pomocą programu Microsoft Powerpoint.

Po trzecie, stworzyłem obraz potrzebny do przycisku restartu i obrazy potrzebne do innych różnych przycisków wyświetlacza (wyświetlanie „koniec gry”, wyświetlanie „wygrywasz” i wyświetlanie „zasad”) za pomocą programu Microsoft Powerpoint.

Po czwarte, będziesz musiał zmienić rozmiar obrazów, aby zmieściły się na ekranie. W przypadku mojego Rasberry Pi użyłem następujących wymiarów okna (odnosząc się do pikseli w długości i szerokości): 432x576.

Krok 2: Formatuj program

Formatuj program
Formatuj program

WYJAŚNIENIE:

Zanim rozpocznie się jakiekolwiek programowanie, musimy zaimportować potrzebne nam biblioteki i napisać główną część naszego programu.

Najpierw musimy zaimportować * z biblioteki Tkinter i przetasować z losowej biblioteki. Po drugie, będziemy musieli wykonać następujące kroki w kodzie w głównej części programu: utwórz okno, ustaw okno tytułowe, wygeneruj GUI, wyświetl GUI i poczekaj na interakcję użytkownika. Ten kod jest napisany w odpowiednim formatowaniu w odniesieniu do biblioteki Tkinter (spójrz na kod podany w instrukcji, aby zobaczyć prawidłowe formatowanie).

Krok 3: Utwórz GUI (Menu i siatka Saper)

Utwórz GUI (Menu i Siatka Sapera)
Utwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)
Stwórz GUI (Menu i Siatka Sapera)

WYJAŚNIENIE:

Po uruchomieniu programu zostanie uruchomiony ekran menu. Po wybraniu trudności (klikając jeden z przycisków trudności na ekranie menu), GUI zostanie odświeżone z siatką trałowca, wyświetlaczem i przyciskiem restartu. Ponieważ dopiero zaczynasz pracę nad GUI, musimy tylko uruchomić menu, uruchomić przyciski trudności menu i odświeżyć GUI do ekranu gry z siatką trałowca.

Po pierwsze, możemy wyświetlić ekran menu po uruchomieniu programu, wywołując metodę „setupMenu” w konstruktorze klasy MainGUI.

Po drugie, możemy sprawić, by każdy z przycisków trudności menu wykonywał określone wiersze kodu po każdym kliknięciu, dodając metodę „process” (będzie również musiała dodać polecenie lambda: self.process(„returnButtonName”) w ramach parametrów użytej funkcji przycisku w tworzeniu każdego przycisku trudności). Trzy instrukcje if-else zostaną utworzone w metodzie "process" i wykonają pewne inne metody i linie dodatkowego kodu w zależności od tego, co jest równe przyciskowi (button jest równe dowolnej nazwie przycisku, który był ostatnio zarejestrowany).

Po trzecie, gdy ekran menu jest w górze i jeśli użytkownik kliknie jeden z przycisków trudności, program zapisze określoną wartość zmiennej „trudność” (poziom trudności oznacza „łatwy”, „średni” lub „trudny” który przycisk trudności jest kliknięty). To kliknięcie przycisku wie, którą instrukcję if-else należy wykonać na podstawie nazwy przycisku, która została ostatnio zarejestrowana (jaki przycisk jest równy). Dodatkowo, aby ponownie przypisać zmienną „trudność”, musimy najpierw utworzyć instancję poza klasą, więc ustawimy zmienną „difficulty” jako pusty ciąg przed utworzeniem klasy „MainGUI”.

Po czwarte, wyczyść GUI przycisków utworzonych przez metodę "setupMenu" poprzez wykonanie metody "clearMenu" (używając funkcji button.destroy() w wielu przypadkach) i wywołanie metody "clearMenu" w metodzie "process" (pod każdy z przycisków trudności rejestruje się po przypisaniu zmiennej trudności).

Po piąte, odśwież GUI wykonując metodę „setSLASHresetGUI” (przyciski wykonuje się tak samo jak w metodzie „setupMenu”) i wywołując metodę „setSLASHresetGUI” w metodzie „process” (pod każdym z przycisków trudności rejestruje się po przypisanie zmiennej trudności i wywołanie metody „clearMenu”).

Dodatkowo, zanim wszystkie przyciski zostaną przypisane w metodzie "setSLASHresetGUI" musimy skonfigurować wiersze i kolumny w siatce, a po przypisaniu wszystkich przycisków w metodzie "setSLASHresetGUI" musimy spakować całą zawartość w siatce (spójrz na kod podany w instrukcji, aby zobaczyć prawidłowe formatowanie).

Krok 4: Spraw, aby przyciski na ekranie w grze działały

Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały
Spraw, aby przyciski na ekranie w grze działały

WYJAŚNIENIE:

Aby przyciski wykonywały określone wiersze kodu po kliknięciu, będziemy musieli wykonać metody w ramach metody „procesu”. W tym zadaniu będziemy musieli stworzyć wiele nowych metod, zmiennych i list.

Najpierw zrobimy dwie listy. Pojawi się lista o nazwie „siatka”. Ta lista „siatka” będzie składać się tylko z liczb całkowitych 9 i 0. Na tej liście dziewiątki będą oznaczać bomby, a zera będą oznaczać nie-bomby. W ten sposób program rozróżni, czy kafelek jest bombą, czy nie. Zostanie sporządzona druga lista, która będzie się nazywać „statusem”. Ta lista "statusów" składa się tylko z jednego ciągu znaków ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Na tej liście każdy ciąg znaków będzie odpowiadał określonemu obrazowi. W ten sposób program będzie wiedział, jaki obraz wyświetlić na każdym przycisku w siatce trałowca. Każdy przycisk w siatce trałowca będzie miał odpowiedni indeks na każdej liście na podstawie jego umieszczenia w siatce. Odpowiedni indeks zostanie przypisany zgodnie z następującą procedurą (przycisk numer - 1). Na przykład odpowiedni indeks przycisku jeden na każdej liście to indeks zero. Na koniec te dwie listy zostaną wykonane przed wykonaniem klasy „MainGUI” i zostaną utworzone poza klasą „MainGUI”. Klasa „grid” zostanie utworzona jako pusta lista (grid = ), a lista „status” zostanie utworzona przez funkcję zakresu (dodanie czterdziestu pojedynczych ciągów znaków „n” do listy „status”).

Po drugie, stworzymy różne metody, które mogą wykryć liczbę otaczających go min i które mogą być wywołane po kliknięciu przycisku (decyzja, która metoda ma zostać wykonana, zależy od umiejscowienia przycisku). Te właśnie metody będą nazywane naszymi analizatorami kopalni. Te metody zwiększą licznik o nazwie „NumOfMines” i użyją pewnych indeksów z listy „siatki”, aby określić, ile bomb otacza kafelek. Ciąg, który będzie przechowywany w zmiennej „NumOfMines”, zostanie użyty do zastąpienia tego samego odpowiedniego indeksu na liście „status”. Teraz możesz się zastanawiać, skąd program będzie wiedział, którego indeksu użyć. Gdy przycisk zostanie zarejestrowany w metodzie „process”, to zmienna „index” zostanie utworzona/przypisana do określonej liczby całkowitej (na podstawie tego, jaki ciąg zarejestruje przycisk). Jedna z utworzonych metod użyje przypisanego indeksu, aby poznać położenie kafelka i indeksy sąsiadujących z nim kafelków (algorytm w ramach metody rozwiąże to). Dodatkowo, aby ponownie przypisać zmienną „indeks”, musimy najpierw utworzyć jej instancję poza klasą. Więc ustawimy zmienną "index" jako liczbę całkowitą zero przed utworzeniem klasy "MainGUI".

Po trzecie, zostaną stworzone metody „operacji”. Za każdym razem, gdy przycisk zostanie zarejestrowany, zostanie wykonana metoda „operacji”. Te metody „operacji” będą wykonywane w metodzie „procesu”. W metodzie "process" wiele instrukcji if-else określi, który przycisk został kliknięty (na podstawie tego, co jest równe przyciskowi). W tym miejscu zostanie wywołana pewna metoda "operacji" (w instrukcjach if-else).

Po czwarte, dowiemy się, jak działają przyciski. Jak wspomniano wcześniej, wiele instrukcji if-else znajduje się w metodzie "process" i wykonuje pewne inne metody i linie dodatkowego kodu w zależności od tego, co jest równe przyciskowi (przycisk jest równy temu, co był ostatnio zarejestrowany). W ramach tych instrukcji if-else wystąpią następujące zdarzenia w kolejności: indeks zostanie przypisany globalnie, odpowiedni indeks na liście „status” zostanie ponownie przypisany do ciągu „b” (jeśli odpowiedni indeks listy „siatka” będzie równy liczba całkowita dziewięć), zostanie wykonana odpowiednia metoda "operacji" (jeśli odpowiedni indeks na liście "siatka" jest równy liczbie całkowitej zero), odpowiedni indeks na liście "status" zostanie ponownie przypisany do łańcucha, który jest równy zmiennej "NumOfMines" (jeśli odpowiedni indeks listy "grid" jest równy zero), a GUI zostanie odświeżony poprzez wywołanie metody "setSLASHresetGUI".

Krok 5: Metoda „setDifficulty” i metoda „restart”

Obraz
Obraz
Obraz
Obraz

WYJAŚNIENIE:

Następnie trzeba będzie utworzyć metodę „setDifficulty”, a przycisk restartu znajdujący się na dole ekranu w grze będzie musiał zacząć działać (poprzez utworzenie metody „restart”, która będzie wykonywana po kliknięciu przez użytkownika).

Po pierwsze, metoda „setDifficulty” będzie musiała zostać zaimplementowana w instrukcjach if-else przycisków trudności w metodzie „process” oraz w metodzie „restart”. Linie kodu i metody wykonywane w tej metodzie są dość proste. W metodzie „setDifficulty” dodamy pewną ilość zer (nie-bomby) i dziewiątek (bomby) do listy „siatki” (poprzez dwie funkcje zakresu w każdej instrukcji if-else), a następnie przetasujemy Lista "grid" (z funkcją shuffle biblioteki losowej) w ramach metody "setDifficulty" (po wykonaniu instrukcji if-else). Stosunek zer do dziewiątek zależy od tego, jaki ciąg jest ustawiony na zmienną „trudność” („łatwy”: 34-6, „średni”: 28-12, „trudny”: 16-24).

Po drugie, w metodzie „restart” ustawimy globalnie zmienne „index” i „NumOfMinesLEFT” na zero, globalnie opróżnimy zarówno listy „status” jak i „grid”, zresetujemy listę „status” funkcją zakresu (dodanie czterdzieści pojedynczych łańcuchów znaków "n" do listy "status") i wywołaj metodę "setDifficulty".

Krok 6: Scenariusze kończące grę

Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę
Scenariusze kończące grę

WYJAŚNIENIE:

Każda gra w trałowiec ma dwa scenariusze zakończenia gry: wygraną i przegraną. W ramach tego programu zaimplementujemy te dwa scenariusze zakończenia gry za pomocą dwóch nowych metod: metody „You_A_Winner_Son” i metody „GameOver”. Zanim GUI zostanie odświeżony w ramach metody "procesu" i na podstawie indeksów zmienionych przez dwie metody scenariusza zakończenia gry, przycisk wyświetlania zostanie zmieniony, aby poprawnie reprezentować wynik.

Po pierwsze, gdy użytkownik kliknie ostatnią ukrytą płytkę niebędącą bombą, należy wykonać metodę „You_A_Winner_Son”. Wykonamy to zadanie, wywołując metodę „You_A_Winner_Son” za każdym razem, gdy klikniemy na płytkę i okaże się, że nie jest ona bombą (w ramach metod „operacji” wykonywanych w metodzie „process”). Jeśli warunki wygranej zostaną spełnione, zostaną wykonane dwie instrukcje if-else w ramach metody „You_A_Winner_Son”. Pierwsza instrukcja if-else zawsze zostanie wykonana, niezależnie od tego, czy gracz wygrał, czy nie, gdy ta metoda zostanie wywołana. W oparciu o wartość zmiennej „trudność” pewien algorytm, który określi, ile min/bomb pozostaje ukrytych. Liczba całkowita znaleziona przez ten algorytm zostanie zapisana w zmiennej „NumOfMinesLEFT”. Następnie, pomiędzy dwoma instrukcjami if-else, zostanie wykonany inny algorytm, aby znaleźć liczbę pozostałych płytek początkowych (nieklikniętych płytek). Liczba całkowita znaleziona przez ten algorytm zostanie zapisana w zmiennej „NumOfStartingTilesLEFT”. Druga instrukcja if-else zawsze zostanie wykonana, niezależnie od tego, czy gracz wygrał, czy nie, gdy ta metoda zostanie wywołana. W oparciu o wartość zmiennej „trudność” można wykonać jedną z trzech instrukcji if-else, jeśli spełnione są ich warunki. Warunki będą oparte na wartości dwóch zmiennych „NumOfMinesLEFT” i „NumOfStartingTilesLEFT”. W ramach tych trzech instrukcji if-else zostanie wykonany algorytm, który sprawi, że każdy przycisk będzie bezużyteczny (gra się skończyła).

Po drugie, gdy użytkownik kliknie jedną z ukrytych płytek bomby, należy wykonać metodę „GameOver”. Zadanie to wykonamy, wywołując metodę „GameOver” za każdym razem, gdy klikniemy kafelek i okaże się, że jest kafelkiem bombowym (w ramach metod „operacji” wykonywanych w metodzie „proces”). Po wywołaniu metody „GameOver” zostanie wykonany algorytm, który sprawi, że każdy kafelek startowy stanie się bezużyteczny (gra jest skończona), a ukryte kafelki bomb zostaną ujawnione (na podstawie odpowiednich indeksów z „listy siatki, pewnych indeksów na liście „status” zostanie ponownie przypisany do jednoznakowego ciągu „b”).

Po trzecie, wyświetlanie ekranu w grze będzie aktualizowane za każdym razem, gdy GUI zostanie odświeżone poprzez wprowadzenie kilku drobnych zmian w metodzie „setSLASHresetGUI”. Po skonfigurowaniu siatki GUI umieścimy trzy instrukcje if-else w miejscu, w którym znajduje się bieżące przypisanie przycisku wyświetlania. Jedna z trzech instrukcji if-else zostanie wykonana na podstawie wartości następujących zmiennych: „GameOverDETECTOR”, „difficulty”, „NumOfMinesLEFT” i „NumOfStartingTilesLEFT”. Jak można się zastanawiać, zmienna „GameOverDETECTOR” jest nowa zmienna. Ta zmienna zostanie utworzona tuż przed wykonaniem instrukcji if-else w ramach metody „setSLASHresetGUI”. Zmienna „GameOverDETECTOR” będzie równa liczbie całkowitej znalezionej za pomocą algorytmu, który znajduje ile indeksów w „siatce” lista została ponownie przypisana do liczby dziewięćdziesiąt dziewięć (w jaki sposób przyciski stają się bezużyteczne) Na podstawie tego, które warunki instrukcji if-else są spełnione, nastąpi odpowiednie ponowne przypisanie do wyświetlacza.

Krok 7: Uruchamianie przycisku restartu

Uruchamianie przycisku restartu
Uruchamianie przycisku restartu

WYJAŚNIENIE:

Ten krok jest najkrótszy. Większość pracy na tym etapie została już wykonana. Wszystko, co musimy teraz zrobić, to wykonać metodę „restart” za każdym razem, gdy użytkownik kliknie przycisk restartu.

Najpierw i na koniec wykonamy metodę „restart” w metodzie „process” z instrukcją if-else. Jeśli ciąg „!” jest zarejestrowana, należy wykonać metodę „restart”. Będziemy również musieli utworzyć przycisk o nazwie restart na końcu metody "setSLASHresetGUI", zanim zawartość siatki zostanie spakowana. Ten przycisk restartu przetworzy ciąg „!” (polecenie lambda: self.process("!")) i wykonaj odpowiednią metodę "restart" w ramach metody "process".

Zalecana: