Generowanie sudoku

13.01.2010 @ 13:24:59 by Rafał Kozik | gamedev freedoku

Największym (choć wcale nie tak dużym) wyzwaniem podczas robienia sudoku jest generowanie planszy. Musimy zadbać o to, żeby plansz było dużo, żeby były poprawne (i miały jedno, unikalne rozwiązanie) i żeby można było wybrać poziom trudności. Okazuje się, że rozwiązanie jest bardzo proste i powinno zadowolić każdego.

Jak więc wygląda to proste rozwiązanie? Weźmy dowolną planszę o odpowiednim poziomie trudności i przeróbmy ją tak, żeby wyglądała na unikalną. Gracze nie powinni zauważyć różnicy. Jeszcze tylko trochę terminologii -- grupami pionowymi (poziomymi) będę nazywał grupy trzech kolejnych kolumn (wierszy) na planszy. Mamy więc trzy grupy pionowe i trzy grupy poziome. Sposób w jaki należy przerabiać planszę:

  • zrobić permutację cyfr -- 9! możliwości
  • spermutować kolejność grup pionowych i poziomych -- 3!^2 możliwości
  • spermutować kolumny w grupach pionowych i wiersze w grupach poziomych -- 3!^6 możliwości

Zatem planszę można przerobić na 609 499 054 080 sposobów. Sporo, prawda? Oczywiście nie wszystkie są unikalne (np. gdy plansza ma dwie puste kolumny), ale jest tego wystarczająco dużo. Łatwo zauważyć, że plansza będzie wciąż poprawna i poziom trudności zostanie zachowany. Teraz wystarczy dla każdego poziomu trudności przypożądkować kilka plansz 'startowych' i mamy kompletny system generowania sudoku. Pozostaje tylko jedno pytanie -- skąd wziąć plansze startowe i jak ocenić ich poziom trudności? W sieci można znaleźć różnego rodzaju strony, które rozwiązują sudoku, niektóre z nich podają też ocenę trudności. Pozwala to już na dość dobre zbudowanie bazy plansz 'startowych' i zapewnienie, że żadne z nich nie są izomorficzne ;)


Nie takie iPhone SDK straszne jak je malują

04.01.2010 @ 23:00:04 by Rafał Kozik | iPhone gamedev

Wspomniałem ostatnio, że będę pisał więcej w związku z projektami nad którymi powoli pracuję. Na razie nie ma co pokazywać, więc postanowiłem napisać kilka słów o tym jak wygląda praca przy pisaniu czegoś na iPhone i ewentualnie dać jakieś drobne wskazówki.

To co może na samym początku przestraszyć to Objective-C. Na szczęście nie jest to problem, bo bardzo łatwo jest łączyć ten język z funkcjami pisanymi w C/C++. Przez to stanowi on tylko spoiwo między aplikacją (a przynajmniej w moim przypadku) a urządzeniem. W tej chwili większość kodu Objective-C w moim projekcie to szkielet aplikacji OpenGL ES dostarczany z xcode -- nie jest tego dużo i w żaden sposób nie przeszkadza w normalnej pracy. Jeżeli potrzebna jest jakaś funkcjonalność z systemu, w sieci można znaleźć gotowe kawałki kodu.

Do uruchomienia swojego kodu na iPhone przygotowywałem się już od jakiegoś czasu -- przeniosłem rendering z Direct3D do OpenGL ES 1.0 i zrobiłem spory refactoring. Gdy położyłem już swoje ręce na odpowiednim sprzęcie, uruchomienie na symulatorze zajęło jeden dzień. Po tym jak zapłaciłem za dostęp do programu developerskiego wystarczył jeden wieczór (spędzony na generowaniu certyfikatów), żeby uruchomić na sprzęcie. Spodziewałem się, że zajmie mi to więcej czasu, ale na szczęście poszło dość sprawnie -- w sumie nic dziwnego, bo na razie nie robiłem nic zaawansowanego.

Aktualnie projekt ściągnięty z repozytorium kompiluje się bez problemów pod xcode jak i w Visual Studio pod Windows. Zdecydowanie wolę pracę z tą drugą platformą i taka przenośność jest bardzo wygodna. Przydaje się implementacja OpenGL ES pod windows, żeby mieć pewność, że obejdzie się bez problemów.

Żeby nie było, że smęcę bez sensu i tylko korzystam z tego co znajdę gotowe w sieci, poniżej zamieszczam dwa kawałki kodu w dziwacznym języku, które mogą się komuś przydać. Nic odkrywczego, ale od czegoś trzeba zacząć ;)

// ukrycie górnej belki aplikacji, do użycia w widoku
[[UIApplication sharedApplication] setStatusBarHidden:YES];
// pobranie nazwy katalogu, w którym znajdują się zasoby
const char* getResourcesPath()
{
	NSString* path = [[NSBundle mainBundle] resourcePath];
	return [path UTF8String];
}

Postanowienia noworoczne

01.01.2010 @ 18:34:19 by Rafał Kozik | z życia iPhone iPod gamedev

Z końcem każdego roku miałem postanowienie, że w kolejnym będzie lepiej. Jakoś nigdy nie miałem konkretnej listy celów, które chcę osiągnąć, więc ciężko oceniać czy rok był udany czy nie.

Żeby mieć się z czego za rok rozliczać, garść postanowień:

  • Napisać pracę magisterską i skończyć studia. Studiowanie już długo trwa, trochę koliduje z pracą, więc warto zamknąć już ten etap życia ;)
  • Zmienić zwykły telefon na porządnego smartphona -- tutaj wybór jest dość prosty albo kolejna generacja iPhone, albo coś z Androidem. W tym roku, za sprawą mojego iPoda Touch, dopiero doceniłem tego typu sprzęt i mam zamiar rozwijać to zamiłowanie.
  • Do końca czerwca mieć w Apple AppStore co najmniej 3 gry. Głównym celem jest zbadanie platformy (sprzętowej i sprzedaży) na własnej skórze. Z czasem napiszę o tym trochę więcej.
  • Zrobić prawo jazdy. Mając już prawie ćwierćwiecze na karku, wypadałoby w końcu zdobyć ten plastik.
  • Kupić jakiegoś e-book readera. Odkąd usłyszałem o elektronicznym papierze interesowałem się urządzeniami w niego wyposażonymi, mam nadzieję, że stanę się posiadaczem jednego z nich. W tej chwili najbardziej podoba mi się nook.
  • Przeczytać kilka książek. Od kilku lat ilość czytanych przeze mnie książek systematycznie rośnie i mam nadzieję, że w tym roku też uda się to osiągnąć.

Nie jest tego za dużo, ale przynajmniej będzie można łatwo to zrealizować. Mam nadzieję, że taka deklaracja planów choć trochę mnie zmotywuje do ich realizacji ;)


Compo 3h

15.04.2009 @ 22:39:12 by Rafał Kozik | .NET C# gamedev warsztat programowanie

W poprzedni weekend na warsztacie zostało zorganizowane trzygodzinne compo.

Jeszcze nigdy nie brałem udziału w tak krótkim pisaniu gry na czas, ale postanowiłem, że zobaczę co z tego wyjdzie. Ostatecznie zająłem 2 miejsce i jestem z tego zadowolony.

Gra (oczywiście niedokończona ;)), którą pisałem była klonem crimson landa i wypadła nienajgorzej. Całkiem ciekawe wydają mi się szczegóły techniczne, bo jadąc do domu na święta nie miałem dostępu do swojego kodu i pisałem kompletnie od zera:

  • całość pisana w C# i GDI+ (standardowe rysowanie obiektem Graphics)
  • litery w 'intro' i 'outro' są zapisywane podczas preprocessingu do osobnych bitmap
  • podczas gry nie jest używana rotacja (która to byłaby dość wolna), ale podczas wczytywania danych generuję sporą ilość obróconych wersji robotów i pocisków
  • gdy robot jest niszczony, śmieci po nim pozostające zostają wkomponowane w bitmapę tła

Ciekawostką jest też to, że na procesorze C2D 1.8 GHz, użycie procesora według Menadżera zadań Windows nie przekracza 2%. Jak widać proste gry można spokojnie robić bez jakiejkowiek akceleracji ;)

Grę można zobaczyć tutaj.


Aktualizacja freedoku

19.03.2009 @ 00:15:27 by Rafał Kozik | gamedev freedoku

Jest to pierwszy z wpisów o freedoku na moim blogu. Z czasem pojawi się tu ich więcej i choć głównie będą informować o aktualizacjach, pojawią się też takie, które będą opisywać rzeczy dziejące się pod maską.

  • można grać po popełnieniu 3 błędów, jednak licznik czasu staje się czerwony i nie pokazuje się okienko z gratulacjami
  • można klikać na paskach z ilością poszczególnych cyfr, żeby je podświetlić na planszy
  • w końcu zrobiłem sitemapę, co powinno z czasem przełożyć się na zwiększenie odwiedzalności
  • dodałem link do tego bloga (do taga freedoku)

Jeżeli ktoś znajdzie jakieś błędy, to proszę o napisanie w komentarzu lub na e-mail. Miłego grania.


Deferred shading

02.03.2009 @ 08:51:06 by Rafał Kozik | grafika gamedev

Deferred shading jest coraz popularniejszą techniką oświetlenia. Idea jest bardzo prosta i wydaje się łatwa w implementacji. Szukając informacji na jej temat zebrałem odnośniki do kilku artykułów i postanowiłem się nimi podzielić:


2008: Starcraft II: Effects & Techniques Dominic Filion & Rob McNaughton
2008: Deferred Rendering in Leadwerks Engine Josh Klint
2008: Deferred Shading jako wydajna technika oswietlenia. Wojciech Toman, IGK'2008
2007: Deferred shading in Tabula Rasa Rusty Koonce, GPU Gems 3
2007: Deferred Rendering in Killzone 2 Michal Valient
2005: Deferred shading tutorial. Pontifical Catholic University of Rio de Janeiro
2005: Deferred Shading in S.T.A.L.K.E.R. Oles Shishkovtsov, GPU Gems 2
2004: Deferred Shading Shawn Hargreaves (CLIMAX) & Mark Harris (NVIDIA)

Jak widać jest tego sporo i możemy zobaczyć jak to robią inni zanim zabierzemy się do implementacji.