<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>algorytmy &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/algorytmy/</link>
	<description>Feed of posts on WordPress.com tagged "algorytmy"</description>
	<pubDate>Fri, 18 Jul 2008 22:12:48 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Generatory liczb pseudolosowych cz.3]]></title>
<link>http://masterixzone.wordpress.com/?p=135</link>
<pubDate>Fri, 04 Jul 2008 17:19:59 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/?p=135</guid>
<description><![CDATA[Przyszedł czas na kolejne generatory liczb pseudolosowych. Znowu pojawi się nieco kodu oraz ogóln]]></description>
<content:encoded><![CDATA[<p>Przyszedł czas na kolejne generatory liczb pseudolosowych. Znowu pojawi się nieco kodu oraz ogólnego wyjaśnienia pt. "Why?" ( i odpowiedzią nie będzie "For money" ;) ).</p>
<p>Więc do kodu start..<br />
<!--more--></p>
<p>Kolejnym ważnym rozkładem, po wcześniej poznanym rozkładzie równomiernym, jest rozkład wykładniczy. Jest on bardzo ważny ponieważ obrazuje wiele zjawisk zarówno w telekomunikacji jak i informatyce. Przykładem są odstępy czasu pomiędzy kolejnymi zgłoszeniami w systemie telekomunikacyjnym, czy też między nowymi zadaniami w systemie operacyjnym. Jest to tzw. poissonowski strumień zgłoszeń, dotyczy on generalnie systemów kolejkowych. Poniżej kod generatora rozkładu wykładniczego o zadanej intensywności( intensywność w rozkładzie wykładniczym jest odwrotnością wartości oczekiwanej ).</p>
<blockquote><p>class ExpotentialGenerator : public Generator<br />
{<br />
public:<br />
ExpotentialGenerator( int _seed = 1, double _intensity = 0.5 );<br />
double NextValue();<br />
private:<br />
UniformGenerator* uniform;<br />
double intensity;<br />
};</p>
<p>ExpotentialGenerator::ExpotentialGenerator( int _seed, double _intensity ): intensity( _intensity )<br />
{<br />
uniform = new UniformGenerator( _seed );<br />
}</p>
<p>double ExpotentialGenerator::NextValue()<br />
{<br />
return -log( uniform-&#62;NextValue() )/intensity;<br />
}</p></blockquote>
<p>Generator opiera się na rozkładzie równomiernym [0,1], jak zdecydowana większość generatorów. Tutaj jest własnie losowana wartość z rozkładu równomiernego, z jej odwrotności liczony jest logarytm a następnie dzielimy przez intensywność ( lub mnożymy przez wartość oczekiwaną ). Zależnie co jest wygodniej dla pisanego programu można łatwo przerobić, aby argumentem wejściowym dla konstruktora była własnie wartość oczekiwana.</p>
<p>Przejdziemy teraz do drugiego omawianego dziś generatora - o rozkładzie Bernoulliego. Jest to rozkład, który może obrazować rzut monetą, teoretycznie prawdopodobieństwo wylosowania orła i reszki jest takie samo. Zwykle mamy dwa możliwe zdarzenia, których suma prawdopodobieństw wynosi 1. Stosujemy właśnie ten rozkład. Oto kod:</p>
<blockquote><p>class BernoulliGenerator : public Generator<br />
{<br />
public:<br />
    BernoulliGenerator( int _seed, double _probability );<br />
    double NextValue();<br />
private:<br />
    UniformGenerator* uniform;<br />
    double probability;<br />
};</p>
<p>BernoulliGenerator::BernoulliGenerator( int _seed = 1, double _probability = 0.5 ): probability( _probability )<br />
{<br />
    uniform = new UniformGenerator( _seed );<br />
}</p>
<p>double BernoulliGenerator::NextValue()<br />
{<br />
    double val = uniform-&#62;NextValue();<br />
    //// if random value belongs to "false" range return zero</p>
<p>        if( val &#60;= probability )<br />
            return 0.0;<br />
        else<br />
            return 1.0;<br />
    }</p></blockquote>
<p>Sztuczka polega na tym, że losujemy liczbę w przedziale [0,1] i przedział ten dzielimy na dwie części - zgodnie z wymaganymi prawdopodobieństwami. Wartości zwracane są oczywiście umowne i zwracamy wartość odpowiadającą danemu przedziałowi. Przyjąłem tu wartości 0.0 i 1.0 czyli graniczne całego dzielonego przedziału.</p>
<p>W następnej części poruszymy temat generatorów rozkładu normalnego.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Jak to było: Nauka cpp część 2]]></title>
<link>http://zenedith.wordpress.com/?p=17</link>
<pubDate>Thu, 26 Jun 2008 11:23:07 +0000</pubDate>
<dc:creator>zenedith</dc:creator>
<guid>http://zenedith.wordpress.com/?p=17</guid>
<description><![CDATA[Miałem chwilowy zawrót głowy więc się trochę ten wpis opóźnił. Przejdźmy jednak na powrót]]></description>
<content:encoded><![CDATA[<p>Miałem chwilowy zawrót głowy więc się trochę ten wpis opóźnił. Przejdźmy jednak na powrót do nauki cpp.</p>
<p>Zaczynamy od samych podstaw. Jak już pisałem w <a href="http://zenedith.wordpress.com/2007/12/22/java-cpp/" target="_blank">jednym z pierwszych wpisów na moim blogu</a>, można rozpocząć od dwóch następujących pozycji:</p>
<ol>
<li><a href="http://www.ifj.edu.pl/~grebosz/symfonia_c++_std_p.html" target="_blank">Symfonia  C ++ Standard</a> - mam wersję 3 tomową, wydanie 5 poprawione. Obecnie dostępna jest odświeżona wersja, opisująca i zgodna z obecnymi standardami języka cpp uzupełniona np. o opis i wykorzystywanie klasy std::string. Dokładne informacje można uzyskać ze <a href="http://www.ifj.edu.pl/~grebosz/symf_std_spis_tresci.pdf" target="_blank">spisu treści</a>.<br />
Uważam, że książka jest rzeczywiście "łatwym podręcznikiem", jak pisze sam autor - zawiera bardzo przyjazne zapoznanie czytelnika z prezentowanym zagadnieniem, odpowiada na szereg pytań które się nasuwają (bądź nie) przy czytaniu kolejnych rozdziałów. Uważam że książka przeznaczona jest dla każdego, kto chce się nauczyć programować. Bardzo dużo przykładów, tłumaczonych czytelnikowi linia po linii.<br />
Książka ta wprowadzi nas w solidne podstawy języka cpp. Jej uzupełnieniem była kiedyś seria Pasja C++, lecz nie wiem jak to obecnie wygląda.</li>
<li><a href="http://helion.pl/ksiazki/thicpp.htm" target="_blank">Thinking in C++</a> oraz <a href="http://helion.pl/ksiazki/thicp2.htm">Thinking in C++ Tom 2</a> - możliwa do pobrania w formie ebook'ów ze <a href="http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html" target="_blank">strony domowej autora.</a> Autor jest równie niesamowity w cierpliwym i przyjaznym tłumaczeniu zagadnień jak autor  wspomniany wyżej. Bardzo dużo przykładów, bardzo dobre wprowadzenie w świat obiektów. Drugi tom wprowadza w bardziej zaawansowane wykorzystywanie cpp. Olbrzymim plusem jest oczywiście inicjatywa udostępnienia wersji elektronicznych swoich (wybranych) książek - jedyną przeszkodę może stanowić znajomość języka angielskiego...</li>
</ol>
<blockquote><p>"Nie od razu Rzym zbudowano" i do tematyki programowania należy podejść z olbrzymią dozą samozaparcia i co najważniejsze: <strong>przepisywać kod do używanego IDE i kompilować. Zmieniać. Kompilować.</strong> Dzięki temu nasza wiedza będzie nie tylko teoretyczna (która nie będzie ugruntowana) ale również praktyczna (wyłapiemy wtedy bardzo szybko błędy składniowe, utrwalimy sobie słowa kluczowe języka, wzorce tworzenia metod, klas - jednym słowem praktyka).</p></blockquote>
<p>Gdy już mamy ten etap za sobą, warto jeszcze przeczytać <a href="http://xion.org.pl/productions/texts/coding/megatutorial/" target="_blank">kurs Xion'a - Megatutorial "Od zera do gier kodera"</a>. Stanowi on bardzo dobrą powtórkę materiały oraz zwraca uwagę na pewne niuanse, które mają szczególne znaczenie dla programistów gier. Oczywiście sam kurs jest podzielony na 3 części:</p>
<ol>
<li>Podstawy programowania,</li>
<li>Zaawansowane C++,</li>
<li>Windows API.</li>
</ol>
<p>Dla mnie szczególnie pomocny okazał się rozdział o szablonach (bardzo zaawansowane) oraz cześć 3 kursu (Windows API), ponieważ w jednym miejscu mamy solidną porcję wiadomości na temat programowania okienek.</p>
<p>W tym momencie posiadasz (konkretną) wiedzę na temat szablonów, proponuję zatem ustabilizować swoją wiedzę w temacie kontenerów. Bardzo dobrym punktem wyjścia w tym momencie może być portal <a href="http://www.cplusplus.com/reference/stl/" target="_blank">cplusplus.com</a> - zresztą wspomniany portal powinien być zawsze "pod ręką" czyli w zakładkach przeglądarki internetowej.<br />
Gdy wiedza o kontenerach jest na odpowiednim poziomie, przeskakujemy na <a href="http://www.cplusplus.com/reference/algorithm/" target="_blank">algorytmy</a> - tak naprawdę będziesz używał nielicznych z nich, ale wiedza o istnieniu właśnie "tych" użytecznych musisz przecież mieć.</p>
<p>Jeśli zainteresowany jesteś w ogólności programowaniem gier w cpp (chociaż niekoniecznie) to polecam książkę <a href="http://helion.pl/ksiazki/cpprog.htm" target="_blank">C++ dla programistów gier</a> lub całą serię Perełek programowania gier, ale to już temat na inny wpis.</p>
<p>Uff. Było tego trochę. Można przez to przejść spokojnie w 3-5 miesięcy. Warto sprawdzić czego się nauczyliśmy oraz poznać niuanse języka cpp przez odwiedzenie strony <a href="http://www.gotw.ca/gotw/" target="_blank">Guru of the Week</a>. Na stronie tej znajduje się około 90 (w tym momencie 88) zadań programistycznych z różnych zagadnień wykorzystywania języka cpp, które zawierają też poprawne odpowiedzi, z których można się naprawdę dużo jeszcze dowiedzieć. Jeśli chodzi o książkę to polecam <strong>Exceptional C++ Style 40 New Engineering Puzzles [Addison Wesley, 2004],</strong> oraz trochę starszą <strong>Herb Sutter - More Exceptional CPP [Addison Wesley, 2001]</strong>, które są pisane w ten sam sposób (gdyby ktoś miał problem ze zdobyciem to mogę pomóc).</p>
<p><strong></strong>Bardzo pomocne może się również okazać przeczytania FAQ twórcy języka cpp - <a href="http://www.research.att.com/~bs/bs_faq2.html" target="_blank">Bjarne Stroustrup's C++ Style and Technique FAQ</a>.</p>
<p>Oczywiście sam język programowania to nie wszystko - warto poświęcić trochę czasu na poznanie struktór i różnych algorytmów. Można wtedy sięgnąć po biblię <a href="http://www.wnt.com.pl/product.php?action=0&#38;prod_id=815&#38;hot=1" target="_blank">Wprowadzenie do algorytmów Cormen'a</a> lub trochę "nowszą" książę <a href="http://helion.pl/ksiazki/algpo.htm" target="_blank">Algorytmy. Od podstaw</a>.</p>
<p>Cóż, w tym momencie potrafię już tylko wskazać kierunek, którym sam będę podążał (jeśli chodzi o programowanie w cpp i gdy uporam się do końca z niektórymi z wymienionych wyżej):</p>
<ul>
<li>Meyers Scott - Effective C++,</li>
<li>Meyers Scott - More Effective C++.</li>
</ul>
<p>Na koniec jeszcze coś, co mogłem podać na początku...ale nikt by wtedy nie czytał mojego wpisu do końca - <a href="http://wiki.gamedev.pl/Z_czego_si%C4%99_uczy%C4%87" target="_blank">Z czego się uczyć (gamedev.pl)</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Generatory liczb pseudolosowych cz.2]]></title>
<link>http://masterixzone.wordpress.com/?p=125</link>
<pubDate>Sat, 10 May 2008 20:30:38 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/?p=125</guid>
<description><![CDATA[Jak już pisałem w pierwszej części serii o generatorach, tym razem opiszę generator liczb pseud]]></description>
<content:encoded><![CDATA[<p>Jak już pisałem w <a href="http://masterixzone.wordpress.com/2008/05/03/generatory-liczb-pseudolosowych-cz1/">pierwszej części</a> serii o generatorach, tym razem opiszę generator liczb pseudolosowych o rozkładzie równomiernym.</p>
<p>Rozkład równomierny dla zmiennej losowej ciągłej na podanym przedziale [a,b] oznacza, że prawdopodobieństwo wystąpienia każdej z wartości w tym przedziale jest dokładnie takie samo i wynosi dokładnie 1/(b-a)  - stąd widać, że a i b muszą być wartościami skończonymi, aby wynik był sensowny. Prawdopodobieństwo wystąpienia każdej wartości spoza przedziału wynosi 0. Analogicznie sytuacja ma się dla zmiennej losowej dyskretnej. Przykładem dla dyskretnej zmiennej losowej może być rzut monetą lub kostką sześcienną ( zakładając, że nie są w jakiś sposób zmodyfikowane ). Więcej teorii łatwo znaleźć na wikipedii - ten wpis nie ma na celu wykładu matematycznego.</p>
<p><!--more--><br />
Zajmijmy się teraz właściwym tematem czyli generatorami. Pomysłów na generatory liczb o takim rozkładzie było w historii kilka. Przedstawię tutaj dwa z nich: generator mieszany oraz multiplikatywny.</p>
<p>Generator mieszany opiera się na prostym wzorze matematycznym:</p>
<blockquote><p>X_(n+1) = ( a*X_n + c ) mod m</p></blockquote>
<p>Przy założeniu, że a, c, m &#62; 0. Te współrzynniki powinny być odpowiednio dobrano, przy czym kryteria są następujące:</p>
<ul>
<li>okres generatora powinien być możliwie długi</li>
<li>jak największe złudzenie losowości</li>
</ul>
<p>Pierwszy aspekt jest w miarę oczywisty natomiast w drugim, chodzi o to, że patrząc na wygenerowane liczby nie można zauważyć wzoru, który je generuje. Powiedzmy, że mamy 3 możliwe wartości do wylosowania: 1, 2 i 3. Wygenerowane wartości mogą wyglądać tak: 1 1 1 2 2 2 3 3 3 1 itd. widać, że rozkład jest równomierny, ale losowość żadna. Wracając do pierwszego kryterium, aby je spełnić trzeba trzymać się następujących zasad:</p>
<ul>
<li> współczynniki c i m powinny być liczbami wzajemnie pierwszymi</li>
<li>a = 1 mod p dla każdego czynnika pierwszego p liczby m</li>
</ul>
<p>Patrząc na wzór matematyczny, można dostrzec, że może być problem z jego implementacją tak, aby uzyskać najdłuższy możliwy okres na maszynie 32-bitowej czyli 2147483647. Wiąże się to z przepełnieniem w czasie dokonywania obliczeń. Powstał więc algorytm, który zapobiega takiemu obrotowi sprawy i implementuje wcześniejszy wzór dla c = 0. Oto on:</p>
<ol>
<li> h := floor( X/q )</li>
<li>X = a*( X - q*h ) - r*h</li>
<li>jeśli X &#60; 0 to X = X + 2147483647</li>
</ol>
<p>Oczywiście X jest wynikiem. Na potrzeby implementacji zostały opracowane trójki liczb, które spełniają wcześniej ustalone kryteria, poniżej trzy takie przykładowe trójki:</p>
<ul>
<li>a = 16807 q = 127773  r = 2836</li>
<li>a = 48271 q = 44488 r = 3399</li>
<li>a = 69621 q = 30845 r =  23902</li>
</ul>
<p>Czas na przykładową implementację w C++. Zacznę od klasy abstrakcyjnej, którą napisałem na potrzeby tworzonego projektu:</p>
<blockquote><p>class Generator<br />
{<br />
public:<br />
virtual double NextValue() = 0;<br />
};</p></blockquote>
<p>Jako, że w C++ nie ma typowo klas abstrakcyjnych, tworzomy je poprzez zadeklarowanie wszystkich metod jako czysto wirtualne. Teraz część właściwa, czyli generator liczb o rozkładzie równomiernym:</p>
<blockquote><p>class UniformGenerator : public Generator<br />
{<br />
public:<br />
UniformGenerator( int _seed = 1, double low = 0.0, double high = 1.0 );<br />
double NextValue();</p>
<p>static const int max = 2147483647;<br />
static const int a = 16807;<br />
static const int q = 127773;<br />
static const int r = 2836;<br />
private:<br />
int seed;<br />
double low_level;<br />
double high_level;<br />
};</p></blockquote>
<p>Widać tu statyczne stałe, które reprezentują wcześniej wspomniane współczynniki oraz wartość maksymalną. Składowe prywatne to seed czyli tzw jądro generatora, dolny i górny zakres ( czyli granice przedziału [a,b] ). Jądro generatora to X_0 czyli wartość startowa. Implementacja:</p>
<blockquote><p>UniformGenerator::UniformGenerator( int _seed, double low , double high ): seed( _seed ), low_level( low ), high_level( high )<br />
{</p>
<p>}</p>
<p>double UniformGenerator::NextValue()<br />
{<br />
int h = seed/q;<br />
seed = a*( seed - q*h ) - r*h;<br />
if ( seed &#60; 0 )<br />
seed += max;</p>
<p>return ( (double)seed/(double)max*( high_level-low_level ) + low_level );<br />
}</p></blockquote>
<p>Nie ma tu żadnych niespodzianek poza "regulacją zakresu". Domyślnie generator wg wcześniejszego wzoru i po podzieleniu przez maksymalną wartość generuje liczby na przedziale [0,1].</p>
<p>Przyszedł czas na generator multiplikatywny, tym razem będzie bez implementacji w C++, dlatego, że widać ją powyżej. Generator multiplikatywny to szczególny przypadek generatora mieszanego, właśnie przy założeniu c = 0. W zasadzie nic więcej na ten temat nie trzeba mówić.</p>
<p>W kolejnej notce dalej będę opisywał metody generacji, jednak innych rozkładów dość powszechnie używanych.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Generatory liczb pseudolosowych cz.1]]></title>
<link>http://masterixzone.wordpress.com/?p=124</link>
<pubDate>Fri, 02 May 2008 22:07:58 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/?p=124</guid>
<description><![CDATA[Czym są liczby pseudolosowe powinien każdy programista mniej więcej wiedzieć. Są to liczby, kt]]></description>
<content:encoded><![CDATA[<p>Czym są liczby pseudolosowe powinien każdy programista mniej więcej wiedzieć. Są to liczby, które mają rozkład mniej więcej losowy. Dlaczego nie są to liczby losowe tylko pseudolosowe? Otóż prawdziwie losowe liczby występują w zasadzie tylko w przyrodzie. Bo jak można nazwać liczby generowane za pomocą algorytmu całkowicie losowymi?</p>
<p>W praktyce daje nam to pewną wspaniałą własność, która może być zarówno być zarówno błogosławieństwem jak i przekleństwem. Dla mnie jest błogosławieństwem ponieważ aktualnie zajmuję się symulacją cyfrową, a tu "powtarzalność" eksperymentu jest bezcenna! Co oznacza owa "powtarzalnosć eksperymentu"? Jest to możliwość prześledzenia procesu, który symulujemy, kilka razy w _identycznych_ warunkach - jest to niemożliwe w rzeczywistości.</p>
<p>Postanowiłem napisać ten cykl artykułów o generatorach pseudolosowych ponieważ ich losowość polega na tym, że przechodzą testy, na zgodność z pewnym, założonym rozkładem prawdopodobieństwa. O testach tych być może również napiszę na koniec cyklu wpisów o samych generatorach różnych rozkładów.</p>
<p>Przy czytaniu przyda się znajomość rachunku prawdopodobieństwa. W następnej notce zacznę od rozkładu równomiernego, który stanowi podstawę dla innych rozkładów - jest więc swego rodzaju "królem". Przykładowe implementacje będę podawał w języku C++, ale pojawią się również algorytmy więc przełożenie ich na inne języki nie powinno stanowić problemu (zwłaszcza, gdy ma się kod podglądowy).</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[algorytmy]]></title>
<link>http://cellulitu.wordpress.com/?p=11</link>
<pubDate>Sat, 19 Apr 2008 12:24:15 +0000</pubDate>
<dc:creator>katalogpress</dc:creator>
<guid>http://cellulitu.wordpress.com/?p=11</guid>
<description><![CDATA[MAM oto nowa stronke godna uwagi strona o tematyce algorymów- (prawdopodobnie zbiorowy projekt na i]]></description>
<content:encoded><![CDATA[<p>MAM oto nowa stronke godna uwagi strona o tematyce algorymów- (prawdopodobnie zbiorowy projekt na informatyke)<br />
jak juz pisałem strona przedstawia dosc prosto i zwiezle <strong><a title="algorytmy" href="http://algorytmy.coolpage.biz/" target="_blank">algorytmy</a></strong> na stronie ukaane jest zastosowanie algorytmów w życiu codziennym poza tym przedstawia <a title="algorytmy" href="http://algorytmy.coolpage.biz/2_sposoby.html" target="_blank">sposoby prezentacji algorytmów</a> tak więc polecam i zycze miłej lektury.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Perełki programowania gier. Tom 1]]></title>
<link>http://dobraksiazka.wordpress.com/?p=250</link>
<pubDate>Wed, 12 Mar 2008 23:22:11 +0000</pubDate>
<dc:creator>Yves P.</dc:creator>
<guid>http://dobraksiazka.wordpress.com/?p=250</guid>
<description><![CDATA[Perełki programowania gier. Tom 1
Autor:  Mark DeLoura
 W niniejszej książce znajdziesz połączo]]></description>
<content:encoded><![CDATA[<p><strong>Perełki programowania gier. Tom 1</strong><br />
<em>Autor:  Mark DeLoura</em></p>
<p><a href="http://www.lideria.pl/sklep/opis?nr=13251&#38;idp=356" rel="nofollow"><img src='http://dobraksiazka.wordpress.com/files/2008/03/perelki-programowania-gier.jpg' alt='Perełki programowania gier. Tom 1' style="float:left;margin-right:10px;" /></a> W niniejszej książce znajdziesz połączoną wiedzę ponad 40 utalentowanych twórców gier. Współpracując, stworzyli zbiór wskazówek dotyczących programowania gier, dzięki któremu uzupełnisz swoją wiedzę. Jeśli zaimplementujesz zaprezentowane tutaj techniki (wypracowywane przez wiele godzin), wrogowie będą sprytniejsi, bohater płynnie powali przeciwników, a gracze z powodu wysoce realistycznego trójwymiarowego świata będą się bali zgasić światło w nocy.<!--more--></p>
<p>Niezależnie od tego, czy pytali mnie o nowinki techniczne wprowadzone w nowej konsoli, czy o złożone algorytmy, jedna rzecz stawała się dla mnie jasna: ciągle zadajemy pytania. Jako programiści gier często nie wiemy, jak wykonać postawione przed nami zadanie. Może właśnie dlatego tak bardzo lubimy tę pracę! Co masz jednak zrobić, gdy przytrafi Ci się opisana sytuacja? Przeszukasz domową biblioteczkę lub zasoby sieci WWW? A może zajrzysz do archiwalnych numerów fachowych czasopism? Żaden twórca gier nie korzysta z jednego określonego źródła. Czy nie byłoby wspaniale, gdyby jednak istniało takie miejsce, do którego zawsze zajrzysz w pierwszej kolejności? Właśnie w tym celu napisaliśmy książkę, którą trzymasz w ręce.</p>
<p>Rozdziały książki obejmują wiele problemów technicznych, na które możesz się natknąć, pisząc grę. Znajdziesz ogromną liczbę szczegółowo omówionych technik, ale i kilka bardziej ogólnych rozdziałów. Zadaniem książki jest zwiększenie Twojego stopnia zaawansowania niezależnie od aktualnej wiedzy, jaką posiadasz. Na przykład w bardziej ogólnych rozdziałach opisujemy techniki, nie zagłębiając się w szczegóły na ich omówienie czas przychodzi później. Dobrymi przykładami mogą być rozdziały o kwaternionach oraz część dotycząca algorytmów sztucznej inteligencji.</p>
<p><a href="http://www.lideria.pl/sklep/opis?nr=13251&#38;idp=356" rel="nofollow">Sięgnij po poradnik &#187;</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[QMC skończony]]></title>
<link>http://masterixzone.wordpress.com/2007/06/11/qmc-skonczony/</link>
<pubDate>Mon, 11 Jun 2007 19:38:17 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/2007/06/11/qmc-skonczony/</guid>
<description><![CDATA[Po długiej przerwie ( którą wypełniłem pisaniem programu ) pojawia się kolejny wpis.
Wczoraj o]]></description>
<content:encoded><![CDATA[<p>Po długiej przerwie ( którą wypełniłem pisaniem programu ) pojawia się kolejny wpis.</p>
<p>Wczoraj o godz. 23:46 skończyłem oficjalnie pisać QMC. Jeszcze jutro obrona tego i rozdział ten będę mógł zamknąć :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[QMC ciąg dalszy..]]></title>
<link>http://masterixzone.wordpress.com/2007/05/02/qmc-ciag-dalszy/</link>
<pubDate>Tue, 01 May 2007 22:22:51 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/2007/05/02/qmc-ciag-dalszy/</guid>
<description><![CDATA[Zmobilizowałem się wreszcie i odpaliłem Anjutę. Otworzyłem moje pliczki z kodem implementujący]]></description>
<content:encoded><![CDATA[<p>Zmobilizowałem się wreszcie i odpaliłem Anjutę. Otworzyłem moje pliczki z kodem implementującym algorytm minimalizacji funkcji logicznych ;)</p>
<p>Popatrzałem, zmodyfikowałem jedną klasę nieco dopisując kilka linijek. Również kilka linijek doszło do jednej z funkcji.</p>
<p>Na tym zakończyłem na dzisiaj, ale najważniejszy jest fakt, że wogóle się za to wziąłęm - powinno pójść z górki już :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Konkursowa minimalizacja]]></title>
<link>http://masterixzone.wordpress.com/2007/04/15/konkursowa-minimalizacja/</link>
<pubDate>Sun, 15 Apr 2007 13:14:31 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/2007/04/15/konkursowa-minimalizacja/</guid>
<description><![CDATA[No cóż.. na uczelni jest konkurs, ale tym się różni od innych, że jest obowiązkowy dla wszyst]]></description>
<content:encoded><![CDATA[<p>No cóż.. na uczelni jest konkurs, ale tym się różni od innych, że jest obowiązkowy dla wszystkich studentów drugiego roku z EiT ;] - piękne prawda ?</p>
<p>Nie powiem, że piszę program konkursowy z niechęcią, ale fakt, że mógłbym ciekawsze rzeczy robić niż wynajdywać koło od nowa - dokształcać się albo realizować zlecenia. No ale mus to mus.</p>
<p>O co chodzi ? Należy zaimplementować w C++ algorytm minimalizacji funkcji logicznych metodą <font size="-1">Quine'a-McCluskeya. Wszystko pięknie ładne poza kilkoma szkopułami. Nikt tego algorytmu nie przestawił w sposób informatyczny - pokazali nam tylko jak się to robi na kartce. No ale z tego da się sporo wywnioskować i napisać samemu ;) Kolejną rzeczą jest to, że ostatni krok w realizacji algorytmu jest problemem NP zupełnym....</font></p>
<p>Ale zabawy przy tym co nie miara :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Szyfr Cezara czyli jak nie szyfrować.]]></title>
<link>http://masterixzone.wordpress.com/2006/10/12/szyfr-cezara-czyli-jak-nie-szyfrowac/</link>
<pubDate>Thu, 12 Oct 2006 15:13:59 +0000</pubDate>
<dc:creator>masterix</dc:creator>
<guid>http://masterixzone.wordpress.com/2006/10/12/szyfr-cezara-czyli-jak-nie-szyfrowac/</guid>
<description><![CDATA[Szyfr Cezara, stosowany prze Juliusza Cezara do szyfrowania swoich listów jest bardzo prosty, ale i]]></description>
<content:encoded><![CDATA[<p>Szyfr Cezara, stosowany prze Juliusza Cezara do szyfrowania swoich listów jest bardzo prosty, ale i przy tym w zasadzie nieskuteczny. Choć podobno Rosjanie jeszcze na początku XX wieku korzystali w wojsku z tego szyfru, ze względu na jego prostotę :)</p>
<p>Algorytm jest wręcz banalny, opiera się na przesunięciu o 3 każdej litery alfabetu. Gdy szyfrujemy przesuwamy "w prawo", gdy deszyfrujemy "w lewo". Zapis matematyczny:</p>
<p>1. E(p) = ( p + 3 ) mod k<br />
2. D(p) = ( p- 3 ) mod k</p>
<p>Gdzie k jest ilością liter danego alfabetu a p aktualnie szyfrowaną literą. Zgodnie z oryginalnym szyfrem, nie szyfrujemy cyfr i innych znaków ( co oczywiście ułatwia deszyfrację ) . Oto kod szyfrowania w C++:</p>
<pre><code>string cezarEncode( string text )
{
    const unsigned int CEZAR_SHIFT = 3;
    const unsigned int ALPHABET_SIZE = 26;
    string result = "";
    unsigned int length = text.length();
    for ( int i(0); i &#60; length; ++i )
    {
        // 65 is ASCII code of A, 90 is ASCII code of Z
        if ( text[i] &#62;= 65 &#38;&#38; text[i] &#60;= 90 )
            result += ( text[i] - 65 + CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
        // 97 is ASCII code of a, 122 is ASCII code of z
        else if ( text[i] &#62;= 97 &#38;&#38; text[i] &#60;= 122 )
            result += ( text[i] - 97 + CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
        else
            result += text[i];
    }
    return result;
}</code></pre>
<p>Deszyfrowanie:</p>
<pre><code>string cezarDecode( string text )
{
       const unsigned int CEZAR_SHIFT = 3;
       const unsigned int ALPHABET_SIZE = 26;
       string result = "";
       unsigned int length = text.length();
       for ( int i(0); i &#60;   length; ++i )
       {
           // 65 is ASCII code of A, 90 is ASCII code of Z
            if ( text[i] &#62;= 65 &#38;&#38; text[i] &#60;= 90 )
                result += ( text[i] - 65 - CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
            // 97 is ASCII code of a, 122 is ASCII code of z
            else if ( text[i] &#62;= 97 &#38;&#38; text[i] &#60;= 122 )
                   result += ( text[i] - 97 - CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
            else
                result += text[i];
       }

       return result;
}</code></pre>
<pre>I na tym koniec</pre>
]]></content:encoded>
</item>

</channel>
</rss>
