Zostaliśmy klonowania 2048, analizując 2048, ale dlaczego nie graliśmy go jeszcze? Napisz fragment kodu javascript o długości 555 bajtów, aby automatycznie grać w 2048, liczy się najlepszy wynik po godzinie (patrz punktacja poniżej).
Ustawiać:
Przejdź do 2048 i uruchom:
a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
a
jest przedmiotem do kontrolowania gry.
Zasady:
Po instalacji możesz uruchomić 555 bajtów javascript z konsoli, aby kontrolować grę. Kod źródłowy gry można znaleźć tutaj (w tym komentarze).
- Może robić tylko rzeczy, które są możliwe dla użytkownika:
a.move(n)
aby uruchomić kluczową akcję w jednym z 4 kierunków.- 0: góra, 1: prawo, 2: dół, 3: lewo
a.restart()
aby ponownie uruchomić grę. Ponowne uruchomienie jest dozwolone w środku gry.
- Informacje o stanie gry można znaleźć w
a.grid.cells
. Ta informacja jest tylko do odczytu - Podłączenie do dowolnej funkcji jest dozwolone, zmiana ich zachowania w jakikolwiek sposób nie jest (ani zmiana jakichkolwiek innych danych)
- Przenoszenie jest dozwolone tylko raz na 250ms
Przykład
To bardzo prosty przykład na początek. Bez komentarzy i wprowadza 181 bajtów .
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; b(); };
//number of move fails
mfs = 0;
setInterval(function() {
//set global moved tracking variable to false
m = !1;
a.move(Math.floor(4 * Math.random()));
m || mfs++;
//restart after 10 moves failed
10 < mfs && (mfs = 0, a.restart());
}, 250);
Punktacja i wyniki
Będę działał przez jedną godzinę z rzędu, a najlepszy wynik będzie się liczył. Rzeczywiście istnieje szansa, że randombot
powyżej wygra w ten sposób, ale 1 godzina powinna wystarczyć:
- Król
Bottomstacker VII
: 9912 - Królowa
Bottomstacker V
: 9216 - Książę
Bottomstacker II
: 7520 - Pan
Bottom and Right
: 6308 - Chłop
Randombot
: 1413 Zdyskwalifikowany za wykonanie dwóch ruchów w jednym przedziale (w ciągu 250 ms)Bottomstacker IV
: 12320
FAQ
- Dlaczego to wyzwanie nie jest agnostyczne pod względem językowym przez terminal?
- Z tego prostego powodu, że jest to tak zabawne. Graficzne oglądanie samej gry jest po prostu o wiele bardziej fascynujące niż konsola wyrzucająca liczby. Nawet nie znając javascript, powinieneś być w stanie dołączyć do tego wyzwania, ponieważ nie chodzi przede wszystkim o funkcje językowe (użyj tego narzędzia, aby zminimalizować kod)
code-challenge
game
javascript
ai-player
sliding-puzzle
David Mulder
źródło
źródło
...best score after an hour will count...
Dlaczego tylko godzina?Odpowiedzi:
Nie mogę kodować javascript, więc ukradłem twoją odpowiedź.
Wykorzystuje strategię, której również używam.
EDYCJA: Fajnie, właśnie pobiłem Twój wynik po około 5 minutach na mojej maszynie: D
EDYCJA: Zapomniałeś zejść dwa razy w dół zamiast tylko raz, to jest kod, którego powinieneś użyć:
Jest też błąd, który uruchamia się ponownie, gdy nie jest potrzebny, ale nie jestem pewien, jak to naprawić. EDYCJA: Obecnie ma najwyższy wynik 3116 (po 3 minutach). Myślę, że można bezpiecznie powiedzieć, że ten algorytm jest lepszy niż wykonywanie przypadkowych ruchów.
EDYCJA Nowsza wersja:
EDYCJA: Kolejna nowa wersja, ta przechodzi w dół bezpośrednio po przejściu w górę.
EDYCJA: Aktualizacja: właśnie pobił mój osobisty rekord z dość szalonym wynikiem 12596.
EDYCJA: Hej, jestem na dole: D Także:
(W rzeczywistości nie jest to zmiana, tylko skompresowane).
Piąty raz to urok? Niepewny. W każdym razie:
i:
Kolejna nowa wersja:
i:
(Mam nadzieję, że nie jest to zbyt wielkim problemem, że problem ten utrzymuje się za ekranem Gameover? Myślę, że możesz dodać coś
a.over=0
, co będzie często wykonywane. Pewnego dnia to rozwiążę ).EDYCJA (ponownie): zrezygnowałem ze standardowego sposobu zmiany gry i powróciłem do starego sposobu robienia rzeczy. Testuję teraz dodatek, który zawsze będzie się łączyć, jeśli będą razem 2 płytki po 16 lub więcej:
źródło
mfs=0
środkaaddRandomTile
, w ten sposób zacznie się odliczanie po udanym ruchu.Prawy i dolny bot: 345 bajtów
Krótka wersja
Długa wersja
W słowach
Przesuń w dół, a następnie w prawo, jeśli nie możesz się poruszać, przejdź w górę (lub jeśli nie możesz, przejdź w lewo), jeśli zarówno prawy górny, jak i prawy dolny róg są wypełnione, przesuń w prawo, w przeciwnym razie zacznij od nowa.
Aktualny wynik
Mój najlepszy wynik to 7668, ale był on prowadzony z dużo większą prędkością niż
t=250
(a zatem pośrednio dłużej niż godzinę).źródło
Jakoś natknąłem się na ten starszy konkurs dziś rano, a ponieważ kocham 2048, uwielbiam sztuczną inteligencję, a JS jest jednym z niewielu języków, które obecnie znam dobrze, pomyślałem, że dam temu szansę.
GreedyBot (
607536 bajtów)Krótka wersja:
Wersja długa (nieaktualna):
Dłuższa wersja w ogóle nie była golfa (oprócz kurczących się nazw zmiennych), więc można ją było nieco skrócić, jednocześnie zachowując czytelność. Krótsza wersja została stworzona przy użyciu kompilatora Closure (dzięki za link!), Który skończył się na 650. Z pewnymi modyfikacjami z mojej strony udało mi się zgolić kolejne
43114 bitów.Zasadniczo wyszukuje w siatce możliwe ruchy i za każdym razem, gdy je znajdzie, dodaje swoją wartość do sumy poziomej lub pionowej. Po przeszukaniu każdego możliwego ruchu określa, w którym kierunku powinien się poruszać, na podstawie tego, czy suma H lub V jest wyższa, i kierunków, które już próbował. Prawo i dół to pierwsze opcje.
Patrząc wstecz na to, zdaję sobie teraz sprawę, że jeśli suma jest różna od zera, pierwsza próba przesunięcia płytek w tym kierunku z pewnością się powiedzie. Być może mógłbym na tej podstawie uprościć sekcję dotyczącą decydowania o ruchu.
Zostawiłem ten program uruchomiony na godzinę i skończyłem z wysokim wynikiem
6080
. Jednak w jednym z testów (przedminifikacja) udało się osiągnąć wysoki wynik6492
, zaledwie 128 za moim osobistym wynikiem6620
. Jego logikę można znacznie poprawić, od czasu do czasu przesuwając ją w lewo, ponieważ liczby zwykle się piętrzą:( EDYCJA: Zostawiłem go trochę dłużej i udało mu się zdobyć kilka
7532
punktów. Cholera, mój program jest mądrzejszy ode mnie ....)Jeszcze jedna ciekawa ciekawostka: w jednej z moich niedbałych prób stworzenia czegoś użytecznego, jakoś skończyło się to tak, że za każdym razem, gdy dwa kafelki były w tym samym rzędzie lub kolumnie, były łączone. Doprowadziło to do interesujących zmian, ponieważ losowe 2 lub 4 były wielokrotnie łączone z najwyższą płytką, podwajając ją za każdym razem. Pewnego razu udało mu się zdobyć ponad 11 000 w ciągu 15 sekund, zanim go wyłączyłem ... XD
Wszelkie sugestie dotyczące ulepszeń są bardzo mile widziane!
źródło
Wycieraczki przedniej szyby: 454 bajty
Po prostu idzie w prawo, w górę, w lewo, w górę ... powtarzając (podobnie jak wycieraczki w samochodzie), chyba że się zablokuje. Jeśli się zablokuje, spróbuje wyłączyć wycieraczki i włączyć je ponownie. Najwyższy wynik, jaki uzyskałem w ciągu godziny, wynosił 12 156 - Jednak większość wyników mieści się w przedziale 3–7 tys.
Po każdej próbie wyświetli wynik w konsoli.
źródło
UpAndLeftBot
Jak sugeruje tytuł, przesuwa się w górę i w lewo poprzez kradzież pracy Davida Muldera i zamianę niektórych liczb (nie znam Jacka o JavaScript, więc najlepiej mogę to zrobić).
źródło