Tło
Mój syn Leonhard (4 lata) uwielbia labirynty. Nie wiem, skąd on zna labirynty, ale maluje je i wie całkiem dobrze, jak działają:
Ostatnio zaczął tworzyć grę ze swoich obrazów. Oto jego zasady:
- czarny kwadrat oznacza punkt początkowy.
- hak oznacza wyjście z labiryntu (tam zostajesz wyciągnięty).
- możesz zbierać korony.
- możesz zbierać bryłki złota (rzeczy okrągłe).
- możesz iść do przodu i do tyłu, ale nie więcej.
- strzałki mogą prowadzić do wyjścia. (Jeśli maluje dla mnie labirynt do rozwiązania, często wprowadzają w błąd).
Wersja z adnotacjami:
- niebieski: punkt początkowy
- pomarańczowy: korony
- żółty: obszar ze złotymi bryłkami
- zielony: hak (wyjście)
- różowy: strzałki (głównie wprowadzające w błąd)
Zadanie
Być może wiesz, że w wieku 4 lat dzieci zaczynają opowiadać wieprzowe ciasta, a czasami nie przestrzega własnych zasad, zwłaszcza jeśli dowiaduje się, że nie może już dotrzeć do końca labiryntu.
Właśnie tam wchodzisz: ponieważ i tak szukam gier dla dzieci , zamieniasz jego pomysł w grę, w której oszukiwanie nie jest możliwe.
Potrzebujemy więcej definicji, które powiedziałbym:
- boisko jest
n
*m
prostokątem kwadratów o równej wielkości. - kwadrat może mieć od 0 do 4 ścian, po jednej z każdej strony.
- korona jest warta 50 punktów.
- samorodek złota jest wart 20 punktów.
- chodzenie po już przejechanym kwadracie odejmuje 1 punkt.
- kwadraty są oznaczone w taki sposób, aby określić, jak często gracz po nim chodził (0, 1 lub 2 razy)
- gracz może chodzić w 4 kierunkach, z wyjątkiem muru.
- Urządzeniem wejściowym może być wszystko. Proszę rozważyć obsługę klawiatury.
- Labirynt musi być rozwiązalny. Tzn. Musi istnieć możliwość dotarcia do haka od punktu początkowego i musi być możliwe zebranie wszystkich kosztowności (nawet jeśli nie daje to najwyższego możliwego wyniku).
- Jeśli gracz utknie, gra się kończy.
- Gracz nie może umrzeć, spadając z planszy. Możesz postawić ścianę wokół całego labiryntu lub owinąć krawędzie, cokolwiek zechcesz.
- program pobiera na wejściu argument słowo (0–65535). To jest ziarno generatora liczb losowych. Ponowne wywołanie programu z tym samym nasieniem powoduje ten sam labirynt.
Premia:
- obliczyć maksymalną liczbę punktów, które można zebrać. Weź pod uwagę, że z powodu -1 punktów lepiej nie zbierać wszystkich przedmiotów.
- Pokaż najlepsze rozwiązanie (najkrótsza droga do uzyskania maksymalnej liczby punktów)
Zasady
To konkurs popularności, ponieważ chcę być w stanie przeczytać i zrozumieć kod i być może dostosować się do nowych pomysłów mojego syna. Przepraszamy, koduj golfistów, może chcesz utworzyć kopię tego pytania z regułami bardziej odpowiednimi do gry w golfa, np. Wersja konsoli ze wszystkimi zdefiniowanymi znakami.
Najpopularniejsza gra 3 maja stanie się akceptowaną odpowiedzią. I dlaczego nie opublikować go w sklepie z aplikacjami?
źródło
Odpowiedzi:
JavaScript
Praca w toku. Niestety labirynt nie zawsze jest do rozwiązania - ograniczenie przeszkód jest prawdziwą przeszkodą.
Edytuj 1 Kosmetyk
Edytuj 2 Lepsza rozgrywka, ale wciąż istnieje duży problem
źródło
Jawa
Nigdy nie narzekałem na GolfScript lub CJam, ale i tak jest dla ciebie odpowiedź Java. To było naprawdę przyjemne wyzwanie. ;)
Proces tworzenia rzeczywistego labiryntu wykorzystuje algorytm wyszukiwania w pierwszej kolejności , ale z iteracyjnym podejściem. Oto jak to działa.
Zaczynamy od tablicy 2D
int
wartości, przy czym każdy element ma wartość -1. Wybrany jest element losowy z parzystymi indeksami, a jego wartość wynosi 0:Następnie program wchodzi w pętlę, sprawdzając dostępne komórki, aż osiągnie stan, w którym nie ma dostępnych komórek. Może się to zdarzyć kilka razy i właśnie wtedy zaczyna się cofać. W tej chwili wszystkie zera, które napotyka, stają się 1. Również w tym czasie określa się, czy w tym miejscu należy umieścić wyjście. Na koniec tablica mogłaby wyglądać następująco:
Gdy w określonych punktach tablicy występuje z góry określona liczba zer lub zer, pętla kończy się. Następnie za pomocą tablicy rysowany jest wynikowy labirynt:
Łatwo zauważyć, że -1 w tablicy reprezentują ściany, a 0 i 1 to korytarze. Przedmioty są losowo rozmieszczone w labiryncie. Czerwona elipsa to „gracz”, którym kontrolujesz.
Labirynt jest owinięty w okienko przewijania dla wygody, więc jeśli rozmiar przekracza maksymalny rozmiar ramki, możesz przewinąć, aby zobaczyć resztę labiryntu.
Powiedziałbym, że jedynym problemem jest sposób przeprowadzania kontroli końca gry. Pomyślałem o kilku sposobach zrobienia tego, ale ostatecznie postanowiłem to wszystko zakodować na stałe. Jestem otwarty na sugestie, jak to zrobić.
źródło
MazeMaker.java:168: error: cannot find symbol printArray(); ^ symbol: method printArray() location: class MazeMaker
printArray
, której użyłem do wyprowadzenia tablicy, ale usunąłem ją i zapomniałem usunąć wywołanie metody.Pyton
Zdaję sobie sprawę, że spóźniłem się na przyjęcie, ale oto moje podejście do tego wyzwania. Poszedłem na podstawie tekstu, ponieważ jeszcze nie zacząłem uczyć się gry w gry. Jest to Python 3. Zmień dane wejściowe na raw_input i powinno również działać w python2.
Zaczep (wyjście) jest reprezentowany przez „J”. „W” to korony (50). „G” to samorodki złota (20). Gracz ma „O”. Eksperymentowałem z użyciem „P” dla odtwarzacza, ale znalazłem „O” łatwiejszy do zidentyfikowania.
Użyłem pierwszej generacji standardowego labiryntu, a następnie dodałem złoto, korony, haczyk i aktualną pozycję gracza. Nie wdrożyłem kryteriów, według których można zdobyć cały skarb.
źródło