Próbuję stworzyć generator łamigłówek Sudoku. Jest to o wiele trudniejsze niż się spodziewałem, a im bardziej się w to pakuję, tym trudniej jest!
Moje obecne podejście polega na podzieleniu problemu na 2 kroki:
- Wygeneruj kompletną (rozwiązaną) łamigłówkę Sudoku.
- Usuwaj liczby, aż da się rozwiązać i ma tylko 1 rozwiązanie.
W kroku 1, ponieważ używam metod brutalnej siły, mam problemy z czasem wykonywania. Czy istnieje optymalny sposób wypełnienia pełnej łamigłówki Sudoku?
W kroku 2 jakiego algorytmu powinienem użyć do „puzzlowania” rozwiązanego sudoku?
algorithm
puzzle
content-generation
użytkownik223150
źródło
źródło
Odpowiedzi:
Mam najlepiej sprzedającą się grę Sudoku w sklepie z aplikacjami na iOS. Oto jak wygenerowałem puzzle.
Najpierw mam aplikację generatora puzzli. Ale to nie jest część kodu gry. Jest to samodzielna aplikacja, której używam do układania puzzli. Jest wysoce zmodyfikowany, więc mogę ustawić go tak, aby tworzył różne typy wzorów, stopnie trudności, liczbę dawców itp. Generowanie zagadek i uzyskanie stałego poziomu trudności jest trudne w locie i zajmuje więcej czasu, niż gracz chciałby czekać. Generuję więc coś, co nazywam „łamigłówkami źródłowymi” i właśnie tego używa kod gry do generowania łamigłówek, w które grają ludzie.
Nie odpowiadam tutaj, jak zakodować generator. Możesz google i znaleźć mnóstwo kodu generatora puzzli online. Zacznij tam. Ale aby stworzyć dobrą grę, musisz stworzyć dobrą grę. Moja gra nie generuje puzzli w locie.
Moja aplikacja do generowania puzzli działa w ten sposób, że generuje tysiące puzzli na minutę, ale nie wszystkie są dobre i nie wszystkie odpowiadają konkretnemu poziomowi trudności. Generator tworzy układankę, a następnie rozwiązuje ją i oblicza stopień trudności, a następnie ocenia układankę na podstawie technik potrzebnych do rozwiązania układanki i określa, czy należy ją zgadnąć (co zwykle jest złe). Wyrzuca wszystkie łamigłówki, które nie spełniają kryteriów. W przypadku trudnych, ale nie niemożliwych łamigłówek na szybkiej maszynie wygenerowanie 100 łamigłówek zgodnych z moją dokładną specyfikacją może zająć godzinę. Dlatego nie robię tego w aplikacji. Generowanie puzzli w locie przy tych trudnych specyfikacjach nie działałoby dla jakości puzzli, które mam w mojej aplikacji.
Łamigłówki to ciągi znaków, długość 162 znaków, 81 znaków z cyframi i myślnikami lub kropkami w miejscu pustych znaków, a następnie kolejne 81 z rozwiązaniem. Następnie kolumny dla każdej statystyki, takie jak liczba pojedynczych, podwójnych itp.
Moje wyniki ze wszystkich sesji generowania to rozdzielone przecinkami wiersze ze statystykami w postaci kolumn. Wezmę może 10 000 zagadek, sprowadzę je do doskonałości i posortuję według trudności. Następnie przenieś je do aplikacji, aby zobaczyć je na planszy. Patrzę też na nie pod względem wizualnym i widocznych wzorów układanki. Następnie ręcznie wybieram spośród nich.
Nazywam je łamigłówkami i oto co mam na myśli. Liczby w grze sudoku to tak naprawdę tylko tokeny. Zamiast być cyframi 1-9, mogą to być kolory, symbole lub litery. Więc moje łamigłówki nasienne nie są liczbami, to litery ai. Każda łamigłówka nasienna zmienia się w locie, tworząc układankę do gry:
Każda łamigłówka nasienna może zatem utworzyć 5 806 080 odmian. Przetestowałem to w terenie z prawdziwymi graczami. Ludzie nie wiedzą, że grają w tę samą łamigłówkę. To właściwie niemożliwe. Tylko jeśli zauważą, że wzór, w którym są dane, są za każdym razem takie same. Ale nawet przy 100 różnych nasionach nikt tego nie zauważy. Milion użytkowników mojej gry tego nie zrobił. Przetestowałem to również z aplikacjami solver. Aplikacja solver nie rozwiąże układanki w ten sam sposób, gdy zostanie obrócona lub wyrzucona. Czasami nawet analizuje to jako inny stopień trudności, chociaż technicznie jest to ta sama łamigłówka.
Jednak książka Big Bad Sudoku Book zawiera 10 z 1000 łamigłówek z nasionami na 5 poziomach trudności i wiele rodzajów wzorów puzzli. Oznacza to, że w mojej grze są miliardy łamigłówek. Na każde 10 000 łamigłówek nasiennych jest 58 060 800 000 różnych łamigłówek.
W Sudoku Book w wersji 4 (wydanej w 2016 roku) wymyśliłem sposób, aby móc określić dokładną łamigłówkę z tych 58 miliardów i uzyskać tę samą łamigłówkę na urządzeniu każdego gracza.
źródło
Istnieje prosty sposób na wypełnienie kompletnej łamigłówki Sudoku - wypełnianie grupowe i cykliczne przesunięcie.
Aby uniemożliwić użytkownikowi zauważenie oczywistego wzorca, dobrym pomysłem może być losowa kolejność wierszy i kolumn, aby nie było już żadnego wzorca. Tak długo, jak wszystkie 9 liczb w każdym rzędzie / kolumnie przesunie się razem jako jedna jednostka atomowa, plansza Sudoku zawsze pozostanie ważna.
Otrzymasz kompletnie wypełnioną łamigłówkę Sudoku. Aby uzyskać więcej informacji, możesz wyszukać „make Sudoku”.
źródło
Nie jest to zbyt trudne, pod warunkiem, że masz solver sudoku.
Tworzenie sudoku to trudny / interesujący problem, więc najlepiej zachować go na inne pytanie. Lub możesz po prostu przeczytać to i zobaczyć, jak sobie radzisz.
1, 2, 3, 4, ...
i wybierz pierwszy, który działa. Trzeba przetasować że kolejność tak, że stara, powiedzmy4, 7, 2, 9, ...
. Ten proces powinien przebiegać tak szybko, jak twój solver.Jest to bardzo prosta (i naiwna) metoda, więc nie ma gwarancji, że otrzymasz łamigłówki o określonej trudności - oprócz liczby brakujących liczb - lub jeśli możesz nawet usunąć liczbę liczb, którą chcesz. Mam nadzieję, że i tak to pomaga.
źródło
Myślę, że interesujące jest wskazanie tej strony , ponieważ bardzo pomogło mi to w rozwoju naszych projektów. Tworzenie sudoku z unikalnym rozwiązaniem jest dalekie od prostego zadania. W linku można znaleźć, w jaki sposób autor (naprawdę wykonał świetną robotę, to nie ja, eh!), Znalazł kilka różnych strategii. Możesz mieć pomysł na wygenerowanie własnego solwera Sudoku.
Teraz, przechodząc do tematu, istnieje również sposób na wygenerowanie podobnego sudokusa, tuż
Pozdrawiam i powodzenia z algorytmem: D
źródło
Mój solver używa brutalnej siły i może znaleźć rozwiązanie w ciągu 20 milisekund. Używając opisanej powyżej metody usuwania, mój generator generuje układankę w ciągu 200 milisekund.
Zwykle generuje układankę z około 24-34 cyframi, a ja nadal nie wiem, jak na świecie udało im się stworzyć 17-cyfrową układankę.
źródło