Naucz się Pythona i elektroniki z Minecraft Pi Edition

Naucz się Pythona i elektroniki z Minecraft Pi Edition

Czy zawsze chciałeś nauczyć się kodować, ale nie wiedziałeś od czego zacząć? Dowiedz się, jak sterować Minecraft na Raspberry Pi za pomocą Pythona i prostej elektroniki. Oto wynik końcowy:





Do tego projektu będziesz potrzebować Pi 2 lub nowszego i chociaż większość tych zadań możesz wykonać za pomocą wiersza poleceń przez Secure Shell (SSH), ten samouczek skupi się na kodowaniu bezpośrednio na Pi.





Nowy w Minecrafcie? Nie martw się - oto nasz Przewodnik dla początkujących Minecraft .





Wprowadzenie do Minecraft Pi

Minecraft dla Raspberry Pi został opracowany do nauki i majsterkowania (i jest darmowy). Jest wyposażony w interfejs programowania aplikacji (API), który umożliwia łatwe komunikowanie się kodu z Minecraft. Świetnie nadaje się do nauki programowania w Pythonie, a także do rozpoczęcia pracy z elektroniką.

Co to jest Python?

Pyton to język programowania. To jest zinterpretowany , co oznacza, że ​​kiedy uruchamiasz plik lub program Pythona, komputer musi najpierw wykonać niewielką część pracy z plikiem. Wadą jest to, że można go uznać za powolny w porównaniu do języków skompilowanych [Usunięto uszkodzony adres URL].



Zaletami języków tłumaczonych jest szybkość kodowania i ich przyjazność. Nie musisz mówić komputerowi Co dane, które chcesz przechowywać, po prostu chcesz coś przechowywać, a komputer wymyśli, co zrobić. Oczywiście są wyjątki i jest to nieco uproszczony widok, jednak programowanie powinno być zabawne! Jeśli zaczniesz zagłębiać się w skomplikowane szczegóły techniczne, może to być nieco pracochłonne.

Python rozróżnia wielkość liter. Warto to wiedzieć, ponieważ Python nie rozpoznaje obiektów nawet jeśli są napisane poprawnie jeśli sprawa jest zła. „Dosomething()” nie będzie działać, jeśli metoda faktycznie nazywa się „Dosomething()”. Python używa również wcięć . Inne języki programowania mogą nie dbać o to, ile wcięć ma twój kod, podczas gdy Python czy opieka. Wcięcia są używane do wskazania Pythonowi, gdzie należy kod. Inne języki mogą używać „nawiasów klamrowych” ({}) do grupowania kodu — Python ich nie używa. Python używa skrótu (#) do komentarzy, a komentarze są używane do informowania innych programistów lub ludzi przeglądających kod, co robi konkretna część lub dlaczego jest potrzebna. Python ignoruje wszystko po hashu.





Wreszcie istnieją dwie główne wersje Pythona — Python 2.7.xi Python 3.x. Istnieją pewne różnice między tymi dwoma ( jakie są różnice? ). Ten samouczek będzie używał Pythona 3.

Początkowe ustawienia

Podanie twojego Pi już jest konfiguracja i uruchamianie Raspbian , nie trzeba wiele wstępnej konfiguracji.





Otwórz terminal ( Menu > Akcesoria > Terminal ) i uruchom to polecenie. Zawsze dobrą praktyką jest aktualizowanie listy repozytoriów, co spowoduje pobranie najnowszej listy programów (nie będzie pobierać samych programów, dzięki temu Pi wie, jakie programy są nazywane i gdzie je znaleźć).

sudo apt-get update

Teraz zaktualizuj Pi (może to chwilę potrwać):

sudo apt-get upgrade

Python i Minecraft Pi są już zainstalowane, jednak jeśli Minecraft Pi nie jest zainstalowany z jakiegokolwiek powodu, instalacja jest prosta:

sudo apt-get install minecraft-pi

Przejdź do dokumentów i utwórz nowy folder o nazwie „Minecraft”:

cd Documents/
mkdir Minecraft

Możesz wyświetlić zawartość tego nowego folderu:

ls

Oto wskazówka — jeśli zaczniesz pisać i naciśniesz klawisz TAB, wiersz poleceń spróbuje automatycznie uzupełnić instrukcję.

Możesz sprawdzić ścieżkę do bieżącego katalogu za pomocą pwd, co oznacza Print Working Directory:

pwd

Uruchom grę Minecraft, przechodząc do Menu > Gry > Minecraft Pi . Będziesz potrzebował tego biegu, ale wrócisz do niego później.

Otwórz Pythona 3 z Menu > Programowanie > Python 3 (BEZCZYNNY) . Ten program umożliwia uruchamianie poleceń Pythona i pisanie programów.

Teraz możesz wpisać tutaj swoje polecenia Pythona, ale nie jest to zbyt praktyczne. Iść do Plik > Nowy plik i wtedy Plik > Zapisz i zapisz to w utworzonym wcześniej folderze. ( Dokumenty > Minecraft ). Nazwijmy to ' hello_world.py „. Nie musisz używać rozszerzenia .py, zostanie ono dodane automatycznie, ale to dobra praktyka.

Jeśli wrócisz do terminala i przejdziesz do folderu Minecraft, powinieneś zobaczyć właśnie utworzony plik:

cd Minecraft/
ls

Możesz uruchomić ten plik w ten sposób:

python hello_world

Zwróć uwagę, że „python” jest pisany małymi literami. Musi to być przed nazwą pliku, ponieważ mówi Pi, że następujący plik to Python, więc powinien być wykonywany jako taki.

Przełącz się z powrotem do edytora Pythona i wpisz:

print 'Hello, World!'

Zapisz ten plik i uruchom go ponownie — powinieneś teraz zobaczyć „Hello, World!” pojawiają się w wierszu poleceń -- schludnie! Polecenie print po prostu mówi Pythonowi, aby wypisał następujący tekst w podwójnych cudzysłowach. To jest dobre, ale niezbyt przydatne dla Minecrafta, połączmy to:

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat('Hello, World!')

Teraz, jeśli zapiszesz i uruchomisz ten plik, powinieneś zobaczyć „Hello, World!” pojawiają się w grze Minecraft. Podzielmy kod:

from mcpi.minecraft import Minecraft

Ta linia mówi Pythonowi, że chcesz użyć kodu z innego pliku. Ten plik mcpi.minecraft został opracowany, aby umożliwić łatwą kontrolę nad Minecraft.

mc = Minecraft.create()

Linia ta tworzy obiekt o nazwie „mc” (Minecraft). Musisz to stworzyć, aby umożliwić komunikację z grą Minecraft -- nie wystarczy tylko dołączyć plik.

mc.postToChat('Hello, World!')

Na koniec ten wiersz mówi Minecraftowi, aby napisał jakiś tekst na czacie. Spróbuj zmienić „Witaj świecie!” do czegoś innego i zobacz, co się stanie, ale pamiętaj, aby uwzględnić oba cudzysłowy. Jeśli masz problemy z oprogramowaniem, oto kilka typowych błędów Pythona i Minecrafta Pi:

  • AttributeError -- jest to literówka, np. pint lub prnt zamiast print
  • NameError: nazwa 'Minecraft' nie jest zdefiniowana - pamiętaj, aby zaimportować potrzebne moduły
  • NameError: nazwa „true” nie jest zdefiniowana — Python rozróżnia wielkość liter, zmień na „true”
  • socket.error: [Errno 111] Połączenie odrzucone -- Upewnij się, że Minecraft jest uruchomiony

Projektowanie

Teraz, gdy znasz już podstawy Pythona i Minecrafta, zróbmy kilka fajnych projektów. Cały kod można pobrać z Github.

Zautomatyzowany konstruktor mostów

Ten program skutecznie zbuduje most nad wodą. Gdy gracz zbliży się do akwenu, program zamieni kilka bloków na kamień. Ponieważ Minecraft używa układu współrzędnych, bardzo łatwo jest określić lokalizację gracza, wraz z rodzajem bloków wokół gracza. Minecraft Pi jest nieco ograniczony, więc nie można zbiorczo aktualizować wielu różnych bloków. Możesz jednak łatwo zakodować to zachowanie samodzielnie.

Utwórz nowy plik ( Plik > Nowy plik ) i zapisz jako „ bridge_builder.py „.

from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos() # store player position

# store the surrounding blocks
a = mc.getBlock(x, y - 1, z + 1)
b = mc.getBlock(x, y - 1, z - 1)
c = mc.getBlock(x - 1, y - 1, z)
d = mc.getBlock(x + 1, y - 1, z)
if a == 8 or a == 9 or b == 8 or b == 9 or c == 8 or c == 9 or d == 8 or d == 9:
# 8 or 9 is water. Set surrounding blocks on floor to a solid (stone) if water is found
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z - 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z - 1, 1)

Zauważ, że wartość y faktycznie wygląda na y - 1. To jest poziom podłogi. Gdyby użyto wartości y, skrypt szukałby bloków mniej więcej na poziomie kolan -- to nie działałoby zbyt dobrze! Mc.getBlock() zwraca id bloku dla podanych współrzędnych. Ponieważ x, y i z są współrzędnymi gracza, można je dodawać lub odejmować, aby uzyskać pozycje wokół gracza. Nie musisz używać wartości x, y i z, możesz użyć dowolnej liczby, jednak możesz nie wiedzieć, jak ten konkretny blok odnosi się do gracza - lepiej jest użyć wartości względem gracza. Uruchom ten plik z wiersza poleceń i zobacz, co się stanie.

Powinieneś zauważyć, że mały obszar ziemi zamienia się w kamień, gdy gracz dotrze do akwenu. To nie jest wspaniałe — jesteś w stanie chodzić wystarczająco szybko, aby spowodować problem. Możesz rozwiązać ten problem, przekształcając większą ilość wody w ląd. Ostatnią częścią metody mc.setBlocks() jest identyfikator bloku. Jednym z nich jest identyfikator bloku kamienia. Możesz to zmienić na drewno, trawę lub cokolwiek. Gdybyś chciał, mógłbyś łatwo przekształcić to w złożony projekt - może most wiszący!

Przycisk Super Mining

Ten przykład ułatwi wydobycie. Składa się z fizycznego przycisku, który po naciśnięciu wykopie 10 bloków sześciennych. Zacznijmy od przycisku. Podobnie jak w przypadku przycisków na Arduino, będziesz potrzebować niewielkiej ilości elektroniki, która powinna znaleźć się w podstawowym zestawie startowym:

  • 1 x deska do krojenia chleba
  • 1 x przełącznik chwilowy
  • Rezystor 1x220 omów,
  • Kable żeńskie> męskie
  • Męskie > Męskie kable połączeniowe

Oto obwód:

Połączenie przycisku Pi

Rezystor ten nazywany jest rezystorem „pull down”. Pomaga to upewnić się, że to, co Pi myśli, że jest wciśnięty przycisk, naprawdę jest wciśniętym przyciskiem. Nie musisz tego używać, jednak jest to zalecane, ponieważ bez niego możesz znaleźć wiele szumów i fałszywych odczytów.

Przycisk jest podłączony do pinu 14 General Purpose Input Output (GPIO). Możesz użyć dowolnego pinu GPIO, jednak spójrz na pinout po pierwsze, ponieważ nie wszystkie są sterowane z Pi i różnią się nieznacznie między modelami.

Teraz, gdy przycisk jest podłączony, czas go przetestować. Utwórz nowy plik i zapisz go jako „ button_test.py „. Dodaj ten kod, zapisz go, a następnie uruchom w Terminalu.

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
print 'BUTTON WORKS!' # log result
time.sleep(0.5) # wait 0.5 seconds

naciskać Kontrola + C aby zatrzymać skrypt. Jeśli wszystko działa poprawnie, powinieneś zobaczyć 'BUTTON WORKS!' w Terminalu. Zwróć uwagę, jak podobnie jak moduł Minecraft, ten test używa modułów RPi.GPIO i czasu. Pozwalają one Pi na dostęp do pinów sprzętowych i zapewniają przydatne funkcje czasowe.

Teraz dokończmy resztę kodu. Utwórz nowy plik o nazwie ' super_mina.py „. Oto kod:

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
x, y, z = mc.player.getPos() # read the player position
mc.setBlocks(x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blocks
mc.setBlocks(x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blocks
time.sleep(0.5) # wait 0.5 seconds

mc.player.getPos() zwraca bieżące współrzędne gracza, które są następnie przechowywane w x, y i z. ten setBlocks() Metoda mówi Minecraftowi, aby wypełnił wszystkie bloki między początkiem a końcem następującym blokiem. Zero to identyfikator bloku dla powietrza. Możesz zmienić to na inny identyfikator bloku, aby wypełnić cały obszar. Możesz także zmienić współrzędne na +100 lub nawet +1000 bloków, jednak Pi może zacząć walczyć, jeśli za bardzo zwariujesz. Zauważ, że y + 10 jest takie samo dla obu linii. Możesz zmienić to na y - 10, jeśli chcesz usunąć bloki pod ziemią.

Teleportacja

Innym prostym zastosowaniem tego przycisku może być „teleportacja”. Minecraft Pi Api umożliwia ustawienie pozycji gracza. Poniższy kod „teleportuje” gracza do określonej lokalizacji:

mc.player.setPos(0, 0, 0)

Zauważ, że jego metoda przyjmuje trzy parametry; x, y i z – więc możesz ustawić je na dowolne, aby natychmiast teleportować gracza do tej lokalizacji.

Utwórz kopię pliku super_mine ( Plik > Zapisz kopię jako ) i zmodyfikuj go, zastępując if następującym:

if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Ten plik powinien teraz wyglądać tak:

import RPi.GPIO as GPIO
from mcpi.minecraft import Minecraft
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Zapisz to jako „ teleport.py ' i biegnij.

Możesz zauważyć, że gracz utknie w niektórych blokach podczas korzystania z tego, w takim przypadku musisz dostosować współrzędne do znanej otwartej przestrzeni (górny lewy róg ekranu pokazuje Twoją aktualną lokalizację).

Zbudować dom

Ostatnim zadaniem tego przycisku jest zbudowanie domu. Podobnie jak w powyższym przykładzie szybkiego wydobycia, po prostu zastąpi to bloki otaczające gracza, aby stworzyć dom. Dla różnych materiałów (okna, ściany itp.) zostaną użyte różne identyfikatory bloków. Aby ułatwić kodowanie, zostanie utworzony solidny blok, a następnie usunięte wnętrze (ustaw blok na powietrze), co stworzy pustą powłokę. Możesz dodać dodatki, takie jak łóżko lub drzwi, jednak projekt Minecraft Pi jest trochę niekompletny i chociaż te obiekty działają po umieszczeniu przez gracza, nie są genialne w przypadku korzystania z Pythona.

from mcpi.minecraft import Minecraft
import RPi.GPIO as GPIO
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True:
x, y, z = mc.player.getPos()
mc.setBlocks(x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # make shell
mc.setBlocks(x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # remove inside
mc.setBlocks(x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # make doorway
mc.setBlocks(x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make window 1
mc.setBlocks(x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make window 2
mc.setBlocks(x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make window 3

Zapisz to jako „ dom.py ' i biegnij. Wszystko dobrze, powinieneś zobaczyć pojawienie się małego domu (być może będziesz musiał się odwrócić, aby go znaleźć). To bardzo proste, otwór i kilka okien. Teoretycznie nie ma ograniczeń co do wielkości i złożoności budynku, który można zbudować.

Zrób mini grę

Następnie zróbmy mini-grę! Będzie to dość proste, gdy gracz nadepnie na blok piasku, po losowym czasie zamieni się on w lawę. To dobra gra do zrobienia, ponieważ możesz zaprojektować własne poziomy lub zmodyfikować je, aby utrudnić. W tym przykładzie przycisk nie będzie potrzebny.

Utwórz nowy plik i zapisz go jako „ mini_gra.py „. Oto kod:

from mcpi.minecraft import Minecraft
import random
import time
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos()
block_under_player = mc.getBlock(x, y - 1, z)

if block_under_player == 12:
# player standing on sand, start the timer
random_time = random.uniform(0.1, 2.5) # generate random number
time.sleep(random_time); # wait
mc.setBlock(x, y - 1, z, 11) # turn it into lava

Ten kod to dobry początek na losowy() funkcjonować: losowy.jednolity(0.1, 2.5) wygeneruje losową liczbę z zakresu od 0,1 (1/10 sekundy) do 2,5 (2 1/2 sekundy). Zwiększenie tych liczb ułatwi grę.

Wypróbuj to! Stań na bloku piasku, a wkrótce zamieni się w lawę. To może być podstawa bardziej złożonej gry.

Zrób kolejną mini grę

Założenie tej gry jest proste - nie stój na drewnianej podłodze, gdy skończy się czas. Gracz zostaje teleportowany na „arenę”. Są zmuszeni stać w miejscu, dopóki gra się nie rozpocznie. Po uruchomieniu podłoga zamieni się w wodę, gdy skończy się czas. Aby przeżyć, gracz musi stać w bezpiecznej strefie (diamentowe klocki). Każdy poziom skraca czas o jedną sekundę. Po każdym udanym poziomie bezpieczny obszar się powiększa. Sprawdź poniższy kod:

import time
import random
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
# clear area
mc.setBlocks(-10, 1, -10, 25, 5, 25, 0)
# create arena shell
mc.setBlocks(0, 0, 0, 25, 10, 25, 17)
# hollow out arena
mc.setBlocks(1, 1, 1, 24, 10, 24, 0)
# move player to arena
mc.player.setPos(14, 25, 20) # teleport player
# make them stay put
# teleport player to start position every 1/10th second.
# do this for 5 seconds then start the game
time.sleep(2)
total_wait = 0
mc.postToChat('Waiting to Start')
while total_wait <5:
mc.player.setPos(14, 1, 20) # teleport player
time.sleep(0.1)
total_wait += 0.1
mc.postToChat('BEGIN!')
# 10 levels
for level in range(10):
x, y, z = mc.player.getPos()
level_time = 10 - level # reduce time by 1 second for each level
mc.postToChat('Level - ' + str(level + 1) + ' start')
# build floor
mc.setBlocks(0, 0, 0, 25, 0, 25, 17)
# make safe area
safe_area_start = random.uniform(0, 22)
safe_area_end = random.uniform(0, 22)
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
elapsed_time = 0
while elapsed_time <10:
x, y, z = mc.player.getPos()
time.sleep(0.25)
elapsed_time += 0.25
# check player is still on floor
if y <0.75:
mc.postToChat('Game Over')
break;
else:
# remove floor
mc.setBlocks(-10, 0, -10, 25, 0, 25, 8)
# put safe area back
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
time.sleep(2.5)
continue
break

Zapisz to jako „ mini_game_2.py ' i daj mu bieg.

Pi 2 ma pewne problemy z wydajnością podczas uruchamiania gry Minecraft. Wykres użycia jednostki centralnej (CPU) ( prawy górny róg ) nigdy nie pokazuje dużego obciążenia, więc musi to być spowodowane złym projektem i optymalizacjami przez programistów. Problemy te nie są związane z uruchamianiem kodu (ponieważ występują, gdy Python nie jest uruchomiony), jednak potęguje je ta minigra. Jeśli twoje Pi naprawdę walczy, możesz zmniejszyć rozmiar areny lub przetaktować swoje Pi.

dysk google nie można odtworzyć tego filmu

Wykrywacz diamentów

Zróbmy kolejny obwód. Spowoduje to użycie diody elektroluminescencyjnej (LED), która zaświeci się, gdy pod spodem znajdują się diamenty (w obrębie 15 bloków). Oto, czego potrzebujesz:

  • 1 x deska do krojenia chleba
  • 1 x LED
  • Rezystor 1x220 omów,
  • Kable żeńskie> męskie
  • Męskie > Męskie kable połączeniowe

Oto obwód:

Podłącz anodę (długa noga) do GPIO Pin 14. Ten pin działa jak +5v. Podłącz katodę (krótka noga) do uziemienia.

Użyłem taniej zabawki z rudy i zmodyfikowałem ją, zdejmując tylną pokrywę i elektronikę, a następnie umieściłem pod nią diodę LED. Możesz łatwo zrobić to trwale za pomocą gorącego kleju lub czegoś podobnego.

Zapisz ten kod jako „ diamenty.py ':

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
led_pin = 14 # store the GPIO pin number
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
while True:
# repeat indefinitely
x, y, z = mc.player.getPos()
for i in range(15):
# look at every block until block 15
if mc.getBlock(x, y - i, z) == 56:
GPIO.output(led_pin, True) # turn LED on
time.sleep(0.25) # wait
GPIO.output(led_pin, False) # turn LED off
time.sleep(0.25) # wait

Gdy pod graczem znajduje się blok rudy diamentu (w promieniu 15 bloków), lampka zacznie migać.

ThinkGeek Minecraft Light-Up Blue Stone Diamond Ore - na pewno powstrzyma Pigmenów z daleka KUP TERAZ NA AMAZON

Zrobiłeś coś fajnego z Minecraft Pi? Daj mi znać w komentarzach, co zrobiłeś lub jak daleko zaszedłeś w grach.

Mamy nadzieję, że podobają Ci się polecane i omawiane przez nas przedmioty! MUO posiada partnerstwo partnerskie i sponsorowane, więc otrzymujemy udział w przychodach z niektórych Twoich zakupów. Nie wpłynie to na cenę, którą płacisz, i pomoże nam zaoferować najlepsze rekomendacje produktów.

Udział Udział Ćwierkać E-mail Czy warto uaktualnić do systemu Windows 11?

Windows został przeprojektowany. Ale czy to wystarczy, aby przekonać Cię do przejścia z Windows 10 na Windows 11?

Czytaj dalej
Powiązane tematy
  • majsterkowanie
  • Programowanie
  • Minecraft
  • Malina Pi
  • Elektronika
  • Pyton
O autorze Joe Coburn(136 opublikowanych artykułów)

Joe jest absolwentem informatyki na Uniwersytecie w Lincoln w Wielkiej Brytanii. Jest profesjonalnym programistą, a kiedy nie lata dronami ani nie pisze muzyki, często można go spotkać wykonującego zdjęcia lub produkującego filmy.

Więcej od Joe Coburna

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować