Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy GML
Treść artykułu
Jak stworzyć grę logiczną...
autor: Choosen (21.06.04)
Plik z wpisanym kodem znajduje się tu :
Goclone

Na wstępie chciałbym zaznaczyć, że jest to artykuł przeznaczony dla osób średnio zaawansowanych, tj. takich, które poznały podstawy pisania kodu GML i chciałyby nauczyć się czegoś nowego. Ci bardziej doświadczeni będą się zapewne nudzić ale być może będą zainteresowane poznaniem mojego toku myślenia ;-)
Zakładam, że osoby czytające poznały strukturę tablic dwu-wymiarowych a także opanowały pisanie skryptów.

No to zaczynamy...

Napiszemy gierkę dla dwóch osób siedzących przy jednym komputerze. Gra polegać będzie na tym, żeby po jej zakończeniu na planszy zostało jak najwięcej pionków naszego koloru. Każdy z graczy zaczyna z 2 pionami swojego koloru. Aby zdobyć pionki przeciwnika należy je wziąć w kleszcze, tzn. dostawić swojego pionka tak, aby pionki przeciwnika znalazły się między naszymi. Jeśli zasady gry nie są jeszcze jasne, myślę, że wyjaśnią się podczas pisania kodu...


Zacznijmy od podstaw...

Żeby w ogóle mówić o grze trzeba zacząć od zbudowania planszy i ustawienia pionków. Ja ustaliłem sobie, że szerokość pola będzie 60 pixeli. Tworzymy zatem sprite o rozmiarach 60x60 z czarną ramką i szarym wypełnieniem. To będzie nasze pole. Następnie przygotujemy pionki. Pionek będzie oddzielnym obiektem. Żeby nie przeciążać niepotrzebnie systemu, nasz pionek będzie narysowany na polu, dzięki czemu po ustawieniu pionka będzie można usunąć niepotrzebne od tego momentu pole. Tworzymy więc kolejne pole (kopiujemy poprzednie ) oraz rysujemy na nim czarnego pionka. Ten sam sprite wykorzystujemy do stworzenia pionka białego(dodajemy klatkę). Mamy zatem dwu-klatkowy sprite z wizerunkiem czarnego ( w klatce zerowej ) oraz białego ( klatka 1 ) pionka na polu planszy. Na koniec tworzymy obiekty pole i wybieramy odpowiedni sprite oraz obiekt pion i jemu również wybieramy odpowiedni sprite.

Tworzymy plansze...

Każda gra jakoś się zaczyna. Nasza będzie zaczynać się zawsze tak samo ( plansza , punkty , aktualna tura , ustawienie pionków ) zatem stworzymy skrypt który ustawi wszystko w odpowiednim miejscu co znacznie ułatwi późniejszą pracę.
Plansza składa się z 64 pól ułożonych w kwadrat 8x8. Każdy z graczy na początku 2 pionki swojego koloru ułożone na krzyż w centralnym obszarze planszy. Aby ułatwić sobie odwoływanie się do pól planszy, zamiast skakać po obiektach i wyszukiwać odpowiedniego obiektu na odpowiedniej pozycji, przedstawimy planszę w postaci tablicy dwuwymiarowej. Będzie to tablica 8x8 gdzie wartości wpisane w odpowiednie komórki będą stanowiły o tym jaki pionek aktualnie się tam znajduje.
Ja przyjąłem że :

-1 oznacza pole puste
0 oznacza czarnego pionka
1 oznacza białego pionka

Można do tego celu przeznaczyć dowolne wartości, ale zauważmy, że w naszym przypadku łatwo odszukać analogię między reprezentacją liczbową pionka a wyświetlaną klatką. ( 0 - czarny , zerowa klatka sprite'a to czarny pionek itd.. ) Takie analogie ułatwiają znacznie pracę i należy je wykorzystywać kiedy to tylko możliwe. Przekonanie się o tym w dalszej części tego artykułu.
Nadeszła pora na stworzenie planszy i ustawienie na niej pionków. Ja stworzyłem skrypt o nazwie stworz_plansze i wpisałem do niego poniższy kod.

gml:
for (i=2;i<10;i+=1)
for (j=1;j<9;j+=1)
{
if !(i==5&&(j==4||j==5) || i==6&&(j==4||j==5))
{
instance_create(i*60,j*60,pole);
global.tablica[i,j]=-1;
}}

global.tablica[5,4]=1;
global.tablica[6,4]=0;
global.tablica[5,5]=0;
global.tablica[6,5]=1;

for (i=5;i<7;i+=1)
for (j=4;j<6;j+=1)
{
instance_create(i*60,j*60,pion);
}


Skrypt wypełnia globalną tablicę dwu-wymiarową liczbami -1 wstawiając przy okazji obiekty pole w odpowiednie miejsce instance_create(i*60,j*60,pole);. Zauważmy jednak, że pomijamy przy tej czynności pola, które będą zajęte przez pionki, które są dane na początku gry. if !(i==5&&(j==4||j==5) || i==6&&(j==4||j==5))Na koniec wypełniamy centralną część planszy (tablicy) odpowiednimi wartościami ( 1 - czarny pionek, 0 - biały pionek ) oraz tworzymy pionki w tych właśnie miejscach instance_create(i*60,j*60,pion);
Tablica musi być znana ( wspólna ) wszystkim obiektom w grze dlatego należy zadeklarować ją globalnie. Zapewne zauważyliście, że tablica nie zaczyna się od komórki [0,0] tylko [2,1]. Zrobiłem tak dlatego, że pola wstawiane są za pomocą skryptu wykorzystującego współrzędne komórki tablicy ( i*60,j*60 ). Gdybym zaczął wypełniać tablicę od 0 nasza plansza również zaczynałaby się od miejsca 0,0 ( 0*60 = 0 ;-) ) czyli lewego górnego rogu ekranu. Nie jest to zbyt efektowne i dlatego zrobiłem to co zrobiłem.
Skrypt należy wykonać tuż po utworzeniu room'u. Do tego celu doskonale nadaje się dział "creation code", który znajduje się w każdnym pokoju w zakładce "settings". Wpisujemy tam stworz_plansze();
Na koniec, należy jeszcze zadbać o to aby pionek postawiony w danym miejscu na planszy "wiedział" jakiego jest koloru na podstawie miejsca w jakim się znajduje. W tym celu tworzymy skrypt o nazwie ustal_kolor:

gml:
image_single=global.tablica[x/60,y/60];


Możemy tak zrobić, gdyż każdy obiekt ma dostęp do tablicy globalnej. Teraz widać czemu liczby w tablicy odpowiadają klatkom wyświetlanych spritów. Bez żadnych przekształceń możemy w łatwy sposób nakazać aby numer wyświetlanej klatki odpowiadał liczbie na odpowiednim miejscu w tablicy.
Skrypt wywołujemy w dziale CREATE dla pionka.



Zaczynamy gre

Kiedy mamy już gotową planszę a na niej pionki w odpowiednim kolorze, możemy przystąpić do definiowania zasad rozgrywki. Główna reguła to ta, opisująca zasady na jakich wstawiamy nowy pionek i od niej właśnie zaczniemy. Gra jest na dwóch graczy, zatem należy ustalić czyja jest aktualnie tura. Wiadomość tak musi być przekazana na samym początku rozgrywki wraz z definicją planszy. Dopiszmy zatem do działu "creation code" linijkę, która załatwi tą sprawę.
gml:
global.tura=1;

Dlaczego 1 ? Założę się, że nie pamiętacie już jak pisałem o analogiach. Otóż liczbę oznaczającą aktualną turę, możemy również wykorzystać do wielu rzeczy podczas rozgrywki. Żeby wam to ułatwić powiem np. że liczba 1 może oznaczać ze ruch ma gracz, którego pionki wyświetlają 1 klatkę animacji... tak białe. Dzięki temu nie musimy się już martwić o interpretację oznaczeń zmiennej global.tura.
Przejdźmy zatem do czegoś trudniejszego. Zastanówmy się jak będzie przebiegał każdy ruch gracza. Żeby nie łapać się za wszystko naraz przygotujemy sobie punktowy przebieg całej rozgrywki.

1) Kiedy zaczyna się tura ( ale nie tura pierwsza ) powinno zostać sprawdzone czy któryś z graczy ma możliwość wykonania jakiegoś ruchu. Jeśli nie to oznacza to koniec gry. Jeśli ruch ma ten gracz na którego przyszła kolej to czekamy na jego posunięcie, jeśli nie zmieniamy turę.
2) Kiedy gracz wskaże dane pole celem wykonania ruchu, należy sprawdzić czy ruch był legalny i wykonać lub zabronić wykonania takiego posunięcia.
3) Jeśli ruch okazał się legalny należy pozmieniać kolory odpowiednich pionków na planszy i zmienić turę na następną.
4) Na koniec sprawdzić czy nie był to czasem ostatni możliwy do wykonania ruch, który kończy tym samym rozgrywkę.

Teraz kiedy mamy już ogólne pojęcie o tym co pozostało do zrobienia, przystępujemy do pisania kodu. Zauważmy ze aby wykonać ruch gracz musi kliknąć w pole planszy. Dlatego właśnie przypadek "left_pressed" będzie idealnym miejscem na wstawienie skryptu, który wykonuje te wszystkie czynności. W tym miejscu powiem jeszcze, że w celu optymalizacji kodu należy za wszelką cenę unikać działów "step" oraz "draw". Wykonują one zadeklarowane instrukcje w każdym cyklu zegarowym procesora ( często niepotrzebnie ) co znacznie obciąza procesor. Wracając do wstawiania pionkow... Tworzymy skrypt o nazwie "wstaw_piona" a tam wpisujemy odpowiedni kod :
gml:

if global.tura==0
{
if sprawdz_ruch(x,y,global.tura)
{
global.tablica[x/60,y/60]=global.tura;
instance_create(x,y,pion);
global.zmiany_tur=0;
if sprawdz_czy_ruch(1)
{
global.tura=1;
Tura.image_single=global.tura;
} else sprawdz_czy_ruch(0)
instance_destroy();
}
}
else
{
if sprawdz_ruch(x,y,global.tura)
{
global.tablica[x/60,y/60]=global.tura;
instance_create(x,y,pion);
global.zmiany_tur=0;
if sprawdz_czy_ruch (0)
{
global.tura=0;
Tura.image_single=global.tura;
} else sprawdz_czy_ruch(1)
instance_destroy();
}
}


Należy się wam trochę wyjaśnień. Zwłaszcza, że nazwy niektórych skryptów pojawiają się tu po raz pierwszy. Skrypt rozpoczyna działanie po kliknięciu w pole planszy. Pierwszą rzeczą jaką sprawdza jest aktualna tura. Dzieje się tak dlatego, że inne czynności zostaną wykonane dla pionków białych a inne dla czarnych. ( Można ten kod zoptymalizować ale poprawa jaką zyskamy w ten sposób będzie niczym w porównaniu z wysiłkiem jaki musielibyście włożyć w zrozumienie interpretacji tego rozwiązania. Jako, że artykuł przeznaczony jest dla osób średnio zaawansowanych pozostaniemy przy aktualnym rozwiązaniu. )
Po określeniu aktualnej tury, należy sprawdzić czy żądana operacja ( wstawienia pionka ) jest dozwolona. Będzie to robił oddzielny skrypt. Podzielenie problemu na mniejsze części jest jedną z zalecanych technik programowania. Złożony problem podzielony na łatwiejsze zadania staje się dużo łatwiejszy do rozwiązania, a kod napisany w ten sposób jest o wiele bardziej przejrzysty i czytelny.
Skrypt sprawdz_ruch zwracać będzie jedną z dwóch wartości ( true lub false ) dlatego dozwolony jest zapis :

gml:
if sprawdz_ruch(x,y,global.tura)


Jak widać do skryptu przekazujemy 3 parametry. Współrzędne pola dla którego należy sprawdzić ruch oraz turę czyli w istocie gracza który wykonuje ruch. Jest to minimalna ilość informacji konieczna do określenia poprawności ruchu. Dokładniej tym skryptem zajmiemy się za chwile.
Jeśli okaże się że żądany ruch jest wykonalny na miejscu pola zostanie stworzony pion a w odpowiednie miejsce w tablicy zostanie wpisana wartość definiująca jego kolor. Należy pamiętać o tym, że kolor pionka zależy jednoznacznie od liczby wpisanej w tablicy, dlatego zanim stworzymy obiekt należy aktualizować tablicę.

gml:
global.tablica[x/60,y/60]=global.tura;
instance_create(x,y,pion);


Pomińmy na chwilę zapis : global.zmiany_tur=0; wrócimy do niego za chwilę.

Tak oto wstawiliśmy pionka na dane pole. Spostrzeżeniem, które może nam zaoszczędzić wiele kłopotów jest fakt, że gra może się skończyć jedynie wówczas kiedy ktoś wstawi odpowiedni pionek. Pozwoli nam to sprawdzać warunki końca gry jedynie wtedy kiedy dany ruch został wykonany i co więcej był poprawny. Nie trzeba zatem robić tego za każdym razem w dziale "step" jak robi to większość mniej doświadczonych twórców gier.

gml:
if sprawdz_czy_ruch(1)
{
global.tura=1;
Tura.image_single=global.tura;
} else sprawdz_czy_ruch(0)


Następnie sprawdzamy, czy gdybyśmy zmienili turę to gracz który miałby wówczas ruch będzie miał do wykonania jakikolwiek ruch. Gdyby bowiem okazało się, że nie, to nie ma po co zmieniać tury. Wykonujemy skrypt sprawdz_czy_ruch w parametrze podając turę jaka będzie po zmianie i dopiero jeśli okaże się że w kolejnej turze będzie jakiś ruch do wykonania zmieniamy turę. Dodatkowo pamiętamy, że może wystąpić sytuacja, kiedy żaden z graczy nie może już wykonać ruchu, co oznaczałoby koniec gry. Dlatego jeśli okaże się, że po zmianie tury żaden ruch nie będzie dostępny, sprawdzamy czy znajdzie się jakiś ruch dla aktualnego gracza. Zliczamy przy okazji zmiany tur. Jeśli okaże się, że żaden z graczy nie będzie miał ruchu ( będą 2 zmiany tur bez wykonania ruchu ) będzie można uznać ze gra jest skonczona. Jeśli jednak ruch zostanie wykonany, należy wyzerować licznik zmian. Tym właśnie zajmowała się linijka, którą wcześniej pomineliśmy.

gml:
global.zmiany_tur=0;


Sprawdzamy czy ruch jest dozwolony...


Jak wspomniałem wcześniej, przed wstawieniem pionka, należy sprawdzić czy ruch jest wykonalny. Robimy to wywołując skrypt :
gml:
sprawdz_ruch(x,y,global.tura)


Zanim zaczniemy pisać taki skrypt, należy się zastanowić kiedy można uznać, że żądane posunięcie jest istotnie legalne. W przypadku naszej gry jest to stosunkowo proste, aczkolwiek kod zajmuje trochę miejsca i bez uprzedniego wyjaśnienia mógłby się nawet wydawać skomplikowany ;-)
Przede wszystkim wskazane pole musi być wolne. To chyba oczywiste, że nie można wskazać pola na którym jest już pionek przeciwnika a tym bardziej nasz własny. Tu właśnie przyda się tablica. Zamiast sprawdzać czy na danej pozycji jest już pionek, sprawdzimy jaka liczba jest wpisana w tablicy. Następnie należy przesuwając się w każdą stronę od miejsca w które klikneliśmy sprawdzać czy na pozycji "obok" znajduje się pionek przeciwnika, czyli ten, którego tury właśnie nie ma. Chciałbym to podkreślić, gdyż sprawdzenie czy pionek jest przeciwnika za pomocą dyrektywy "if" nie jest wcale takie proste. Można do tego użyć kodu

gml:
If argument2(czyli nasza global.tura) == 1
{
//wpisać kod sprawdzający czy pionek obok jest koloru 0
}
else
If argument2(czyli nasza global.tura) == 0
{
//wpisać kod sprawdzający czy pionek obok jest koloru 1
}


Takie rozwiązanie ( chociaż poprawne ) nastręcza wielu kombinacji i strasznie komplikuje kod. Tutaj po raz kolejny zyskujemy na tym, że do oznaczeń tury i pionków użyliśmy liczb 0 i 1. To czego nam trzeba to sprawny algorytm zmieniający liczbę 0 na 1 i odwrotnie. Wbrew pozorom taki algorytm wcale nie jest taki trudny. Zauważcie, że:

0*(-1)+1=1
1*(-1)+1=0

Co więcej Game Maker przyjmuje domyślnie, że jedynka oznacza prawdę a zero fałsz. Dzięki temu ten sam efekt uzyskamy używając negacji czyli operatora "!". Możemy zatem wpisać kod sprawdzający czy pionek obok ma kolor "!nasz" ( czytaj nie nasz ).

Kiedy już okaże się, że pionek znajdujący się obok jest pionkiem przeciwnika, wystarczy "iść" w tym kierunku tak długo, aż napotkamy na pole puste ( co będzie oznaczać ze w tą stronę nie można wykonać ruchu ) lub na pionek naszego koloru ( co będzie oznaczać ze należy odmienić pionki które minęliśmy w międzyczasie sprawdzania. Do odwracania pionków będzie służył prosty skrypt zamien_piona(x,y) który za pomocą negacji zamienia aktualny kolor na przeciwny.

gml:
with(instance_position(argument0,argument1,pion))
{
image_single=image_single*(-1)+1;
global.tablica[argument0/60,argument1/60]=global.tablica[argument0/60,argument1/60]*(-1)+1;
}


Czynności te należy powtórzyć 8 razy dla wszystkich kierunków linii w jakich mogą ułożyć się pionki, uważając przy tym żeby nie "wyjść" poza obszar planszy. Cały skrypt będzie wyglądał następująco.

gml:
mozliwy=false;

if (argument0/60)<8
{
if global.tablica[argument0/60+1,argument1/60]==(argument2*(-1))+1
{
xx=argument0/60+1
do
{
xx+=1
if global.tablica[xx,argument1/60]==argument2
{
mozliwy=true;
for (i=xx-1;i>argument0/60;i-=1)
zamien_piona(i*60,argument1);
}
}
until (global.tablica[xx,argument1/60]=argument2||xx==9||global.tablica[xx,argument1/60]=-1)
}
}

if (argument0/60)>3
{
if global.tablica[argument0/60-1,argument1/60]==(argument2*(-1))+1
{
xx=argument0/60-1
do
{
xx-=1
if global.tablica[xx,argument1/60]==argument2
{
mozliwy=true;
for (i=xx+1;i<argument0/60;i+=1)
zamien_piona(i*60,argument1);
}
}
until (global.tablica[xx,argument1/60]=argument2||xx==2||global.tablica[xx,argument1/60]=-1)
}
}

if (argument1/60)<7
{
if global.tablica[argument0/60,argument1/60+1]==(argument2*(-1))+1
{
yy=argument1/60+1
do
{
yy+=1
if global.tablica[argument0/60,yy]==argument2
{
mozliwy=true;
for (i=yy-1;i>argument1/60;i-=1)
zamien_piona(argument0,i*60);
}
}
until (global.tablica[argument0/60,yy]=argument2||yy==8||global.tablica[argument0/60,yy]=-1)
}
}

if (argument1/60)>2
{
if global.tablica[argument0/60,argument1/60-1]==(argument2*(-1))+1
{
yy=argument1/60-1
do
{
yy-=1
if global.tablica[argument0/60,yy]==argument2
{
mozliwy=true;
for (i=yy+1;i<argument1/60;i+=1)
zamien_piona(argument0,i*60);
}
}
until (global.tablica[argument0/60,yy]=argument2||yy==1||global.tablica[argument0/60,yy]=-1)
}
}

if (argument0/60)<8 && argument1/60<7
{
if global.tablica[argument0/60+1,argument1/60+1]==(argument2*(-1))+1
{
xx=argument0/60+1
yy=argument1/60+1
do
{
yy+=1
xx+=1
if global.tablica[xx,yy]==argument2
{
j=xx-1;
mozliwy=true;
for (i=yy-1;i>argument1/60;i-=1)
{
zamien_piona(j*60,i*60);
j-=1;
}
}
}
until (global.tablica[xx,yy]=argument2||xx==9||yy==8||global.tablica[xx,yy]=-1)
}
}


if (argument0/60)>3 && argument1/60>2
{
if global.tablica[argument0/60-1,argument1/60-1]==(argument2*(-1))+1
{
xx=argument0/60-1
yy=argument1/60-1
do
{
yy-=1
xx-=1
if global.tablica[xx,yy]==argument2
{
j=xx+1;
mozliwy=true;
for (i=yy+1;i<argument1/60;i+=1)
{
zamien_piona(j*60,i*60);
j+=1;
}
}
}
until (global.tablica[xx,yy]=argument2||yy==1||xx==2||global.tablica[xx,yy]=-1)
}
}

if (argument0/60)>3 && argument1/60<7
{
if global.tablica[argument0/60-1,argument1/60+1]==(argument2*(-1))+1
{
xx=argument0/60-1
yy=argument1/60+1
do
{
yy+=1
xx-=1
if global.tablica[xx,yy]==argument2
{
j=xx+1;
mozliwy=true;
for (i=yy-1;i>argument1/60;i-=1)
{
zamien_piona(j*60,i*60);
j+=1;
}
}
}
until (global.tablica[xx,yy]=argument2||yy==8||xx==2||global.tablica[xx,yy]=-1)
}
}

if (argument0/60)<8 && argument1/60>2
{
if global.tablica[argument0/60+1,argument1/60-1]==(argument2*(-1))+1
{
xx=argument0/60+1
yy=argument1/60-1
do
{
yy-=1
xx+=1
if global.tablica[xx,yy]==argument2
{
j=xx-1;
mozliwy=true;
for (i=yy+1;i<argument1/60;i+=1)
{
zamien_piona(j*60,i*60);
j-=1;
}
}
}
until (global.tablica[xx,yy]=argument2||yy==1||xx==9||global.tablica[xx,yy]=-1)
}
}

if mozliwy return true else return false;



Kolejna rzecz jaką sprawdzaliśmy to czy po wykonaniu ruchu nie należy stwierdzić, że to już koniec gry. Do problemu można podejść w dwojaki sposób. Można by wymieniać przypadki, w których gra się zakończy ( nie ma już wolnych pól lub są same białe lub czarne pionki itd.. ) lub podejść do tego bardziej ogólnie. Zauważmy, że gra się skończy wtedy i tylko wtedy, jeśli żadna ze stron nie będzie miała już żadnych ruchów do wykonania. Takie stwierdzenie obejmuje także przypadek kiedy na planszy został już tylko jeden kolor lub nie ma już wolnych pól, gdyż wówczas również żadna ze stron nie będzie mogła wykonać ruchu. Jak więc sprawdzić czy został jeszcze do wykonania jakiś ruch ? Wykonujemy to bardzo podobnie jak w przypadku sprawdzania jednego pola, z tą róznicą że sprawdzamy warunek dla wszystkich wolnych pól, przerywając sprawdzanie kiedy napotkamy na dozwolony ruch lub koncząc grę w przeciwnym wypadku. Modyfikujemy skrypt sprawdz_ruch i otwrzymujemy :

gml:
for (k=2;k<10;k+=1)
for (r=1;r<9;r+=1)
{
if global.tablica[k,r]=-1
{

if (k)<8
{
if global.tablica[k+1,r]==(argument0*(-1))+1
{
xx=k+1
do
{
xx+=1
if global.tablica[xx,r]==argument0
{
return true;
}
}
until (global.tablica[xx,r]=argument0||xx==9||global.tablica[xx,r]=-1)
}
}

if (k)>3
{
if global.tablica[k-1,r]==(argument0*(-1))+1
{
xx=k-1
do
{
xx-=1
if global.tablica[xx,r]==argument0
{
return true;
}
}
until (global.tablica[xx,r]=argument0||xx==2||global.tablica[xx,r]=-1)
}
}

if (r)<7
{
if global.tablica[k,r+1]==(argument0*(-1))+1
{
yy=r+1
do
{
yy+=1
if global.tablica[k,yy]==argument0
{
return true;
}
}
until (global.tablica[k,yy]=argument0||yy==8||global.tablica[k,yy]=-1)
}
}

if (r)>2
{
if global.tablica[k,r-1]==(argument0*(-1))+1
{
yy=r-1
do
{
yy-=1
if global.tablica[k,yy]==argument0
{
return true;
}
}
until (global.tablica[k,yy]=argument0||yy==1||global.tablica[k,yy]=-1)
}
}

if (k)<8 && r<7
{
if global.tablica[k+1,r+1]==(argument0*(-1))+1
{
xx=k+1
yy=r+1
do
{
yy+=1
xx+=1
if global.tablica[xx,yy]==argument0
{
return true;
}
}
until (global.tablica[xx,yy]=argument0||xx==9||yy==8||global.tablica[xx,yy]=-1)
}
}


if (k)>3 && r>2
{
if global.tablica[k-1,r-1]==(argument0*(-1))+1
{
xx=k-1
yy=r-1
do
{
yy-=1
xx-=1
if global.tablica[xx,yy]==argument0
{
return true;
}
}
until (global.tablica[xx,yy]=argument0||yy==1||xx==2||global.tablica[xx,yy]=-1)
}
}

if (k)>3 && r<7
{
if global.tablica[k-1,r+1]==(argument0*(-1))+1
{
xx=k-1
yy=r+1
do
{
yy+=1
xx-=1
if global.tablica[xx,yy]==argument0
{
return true;
}
}
until (global.tablica[xx,yy]=argument0||yy==8||xx==2||global.tablica[xx,yy]=-1)
}
}

if (k)<8 && r>2
{
if global.tablica[k+1,r-1]==(argument0*(-1))+1
{
xx=k+1
yy=r-1
do
{
yy-=1
xx+=1
if global.tablica[xx,yy]==argument0
{
return true;
}
}
until (global.tablica[xx,yy]=argument0||yy==1||xx==9||global.tablica[xx,yy]=-1)
}
}}}

global.zmiany_tur+=1;
if global.zmiany_tur=2 { Licz.alarm[0]=10; }
return false;


Kiedy okaże się, że gra jest skonczona uruchamiamy alarm[0] po czym wyświetlamy komunikat o zakończeniu rozgrywki.

Mamy zatem planszę, pionki i cały engine gry pozwalający na rozgrywkę dwu-osobową. Aby uatrakcyjnić partię dodamy na koniec obiekt który będzie wyświetlał aktualną turę oraz liczył punkty ( pionki ) obu graczy.
W tym celu stworzyłem sobie mniejszą kopię sprite'a pionka i wyświetlam odpowiednią klatkę sprite'a za pomocą kodu obiekt.image_single=global.tura
Myślę, że na tym etapie nie muszę już tego wyjaśniać. Do liczenia punktów stworzyłem obiekt Licz który wyświetla 2 sprit'y ( biała ikonka pionka oraz czarna ikonka pionka ) a pod spodem wyświetla ilość pionków wyliczoną za pomocą skryptu licz_pionki , który uruchamiam po każdym wykonanym ruchu.

gml:
Licz.bialych=0;
Licz.czarnych=0;

for (i=2;i<10;i+=1)
for (j=1;j<9;j+=1)
{
if global.tablica[i,j]=0 Licz.czarnych+=1;
if global.tablica[i,j]=1 Licz.bialych+=1;
}


W ten oto sposób doszliśmy do końca artykułu i mamy gotową grę logiczną. Zdaję sobie sprawę, że wymaga ona jeszcze nieco ładniejszej grafiki, menu , tabeli wyników oraz chociażby gry z komputerem. Gra napisana została jednak w celach edukacyjnych i służy tylko jako przykład.
głosów: 8 | ocena: 8.25 oceń zasób | dodał: Choosen
Komentarze
stron: 1

1


av

mastara (20:28, 27.03.2008)

Spoko, z poczatku nie zkapowalem, ale jest OK!

av

Skovv (20:59, 31.05.2008)

a umiesz zrobic szachy przez neta?? ;p

av

Tymon (21:27, 31.05.2008)

Ta.

av

I am Lord (19:54, 4.06.2008)

O lol wypas ściągam i archiwum jest uszkodzone. Ściągam po raz drugi i to samo.

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
1 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
ANtY (9:07, 22.08.18):
elo co tam
ANtY (9:06, 22.08.18):
jak na swój wiek, doświadczenie w branży zarabiają mniej niż ludzie, którzy sami doszli do tej pozycji, dodatkowo wydają znacznie więcej co sprawia, że akumulują też dużo mniej pieniędzy, po prostu nigdy ich nie szanowali i nie nauczyli się odpowiedniego podejścia przez rozpieszczanie, głównie skupiają się na rozmyślaniu kiedy wjedzie główna część spadku i braniem kredytów akonto niż na inwestowaniu, czy zwiększaniu swoich zarobków
ANtY (9:04, 22.08.18):
ale jesli myslisz ze przepis na sukces w zyciu to miec bogatych rodzicow, ktorzy nie nauczyli cie pokory to polecam przeczytac ksiazke Millionaire Next Door, w skrocie takie osoby pomimo (a raczej przez to, że) otrzymywania dużych ilości pieniędzy na konsumpcję i innych giftów typu dom, czy auto, czy studia
ANtY (9:03, 22.08.18):
po pierwsze są zawody gdzie faktycznie po studiach będzie się trzepać niezłe hajsy (dentyści, specjaliści inni medyczni, dobrzy księgowi, czy prawnicy - szczegolnie jesli celujesz w rynek usług dla "bogatych" ludzi)
Wojo (7:58, 22.08.18):
i wiem, że te moje historyjki nie brzmią wiarygodnie ale taka jest prawda. Jeden z tych kolegów nawet pokazał mi GMCLAN w latach świetności
Wojo (7:44, 22.08.18):
więc nie ma też reguły na to, że bez studiów będzie zarabiać się miliony ale możesz zobaczyć po moim przykładzie na którego z tych kolegów pracodawcy będą patrzeć przychylniejszym okiem
Wojo (7:42, 22.08.18):
I jeśli mówimy teraz o umiejętnościach, mam kolegę, który jest cholernie inteligentnym człowiekiem, całą edukację otrzymywał w szkole same piątki, stypendia itp. i z tego co się dowiedziałem pracował/pracuje jako młodszy programista i zgarnia wydaje mi się gdzieś w granicach 4k mimo, że nie ma matury i technika. Drugi zaś znajomy, który jest niemniej mądry od niego wyjechał do Anglii na studia i wygląda na to, że całkiem dobrze mu tam idzie
Wojo (7:38, 22.08.18):
I Max nie wyjeżdżaj tutaj z Anglią bo ten argument jest trochę bez sensu. Równie dobrze można w Polsce odłożyć kilka pensji i na Ukrainie przez chwilę żyć na dobrym poziomie (jak to robią tamtejsi emigranci)
Wojo (7:36, 22.08.18):
moi rówieśnicy jeżdżą teraz wypasionymi samochodami bo ich starzy wzięli je dla nich w leasingu na firmę, a oni studiują dziennie, wożą się z laskami i całe dnie balują. To jest przepis na sukces - mieć bogatych rodziców, którzy zapomnieli nauczyć dziecko pokory
Wojo (7:33, 22.08.18):
moim wzorcem jest Piotr Kaszubski bo wieku 20 lat został milionerem (w POLSCE) i to bez studiów, nauki itp. !!!
I am Lord (0:41, 22.08.18):
Ten pierwszy z telekomunikacji robi diagnostyke i naprawy swiatlowodow
I am Lord (0:34, 22.08.18):
Jeszcze inny spelnia sie czysto naukowo gdzies tam robiac jakies wyklady i laboratoria ciekawe dla maluchow i młodzieży. Akurat to nie jest typowa praca ale bez studiow by sie nie obylo bo potrzebowal solidnych kontakow w uczelnianych kregach
I am Lord (0:30, 22.08.18):
Studia elektrotechniczne
I am Lord (0:29, 22.08.18):
i zarabiają solidne pieniądze
I am Lord (0:29, 22.08.18):
Mój znajomy po studiach zarabia około 3000 w firmie telekomunikacyjnej lokalnej, a innych też z tych samych studów robi w elektrowni wodnej zaś kolejny robi na wiatrakach
MaxGaming (22:05, 21.08.18):
Moi znajomi rzucający szkołę dawno temu kupują teraz auto po 100-200tyś a znajomi na studiach w tym samym wieku cieszą się z tego że w wolnym czasie podczas studiowania sa w stanie zarobić na kebsa i piwo
MaxGaming (22:03, 21.08.18):
zresztą nawet za 20tyś miesięcznie nie chciałbym do końca życia siedzieć po 8h dziennie programując na przykład
MaxGaming (22:02, 21.08.18):
Tym samym znajomi wobec których zachowywałem się wtedy tak jak większośc osób teraz gdy ja wam to mówię mają już dawno pensje o których chell ty marzysz a jak ty będziesz miał 20tyś wreszcie to oni będą dawno dalej. Ja tym bardziej mogę pomarzyć o ich życiu żeby nie było że kogoś tu obrażam osobiście. Po prostu zrozumiałem dlaczego mają rację i dlaczego zamiast słuchać babcinych rad lepiej odpalić excel i zrobić chłodną kalkulację
MaxGaming (21:59, 21.08.18):
Nie wiem czy to jest moja droga nawet ale wiem że zmarnowałem 4 lata(nic się nie nauczyłem tak na prawdę cennego w szkole, jeśli coś było cennego w szkole to sam się tego uczyłem w domu) a mogę lepszą pracę znaleźć bez technika niż z tym tytułem
MaxGaming (21:58, 21.08.18):
i czemu rozsądne? Bo konserwatywne a Polacy są mistrzami w zacofaniu? Bo mamy tak mówiły że idź na studia? Kiedyś mówiły dzieciom że mechanik to zawód z przyszłością. Wtedy był ale zanim nastał czas tych dzieci już dawno był to przeterminowany pomysł
MaxGaming (21:56, 21.08.18):
Poza tym nie dramatyzuj nikt nikogo nie opluwa. Nie twierdzę też że to droga dl wszystkich, ale mówię tylko że żałuje że mi ktoś tego nie uświadomił wcześniej
MaxGaming (21:56, 21.08.18):
Poza tym może pogadamy o Anglii? Kumam nie każdy chce wyjeżdzać ale czasy są takie że można za pomocą internetu robić interesy na całym świecie. Możesz być polakiem i sprzedawać na terenie Anglii siedząc w Polsce i zarabiać w ten sposób jakbyś tam mieszkał
MaxGaming (21:53, 21.08.18):
Jeśli masz umiejętności warte 20 kafli misięcznie to nikt nie pyta Cię o wykształcenie(w większości branży przynajmniej, oprócz np medycyny/państwówki itp)
Wojo (21:19, 21.08.18):
I dobrze mówisz chell. Wykształcenie to fajny dodatek do pozycji a nie magiczne konto premium
Chell (18:26, 21.08.18):
najbardziej mi się podoba fakt, że w tej swojej wizji świata który będzie ci lizał stopy tak bezczelnie plujesz na wszystko co rozsądne
Chell (18:25, 21.08.18):
tylko mam zdrową świadomość, że gdy zapracuje sobie na przebicie bariery 10 tysi kogoś w końcu zacznie interesować moje wykształcenie, i nie będę miał sufitu w postaci wykształcenia podstawowego
Chell (18:24, 21.08.18):
mój drogi, nie liczę na to, że studia mi podbija wypłatę z 2 do 20k
MaxGaming (14:34, 21.08.18):
w sumie teraz tak myślę że ja też wierzyłem w to bo ktoś tak powiedział a fajnie wierzyć że Twój naród jest lepiej wykształcony, ale gdy poznałem fakty szybko zmieniłem zdanie
MaxGaming (14:33, 21.08.18):
ja też ile nie słyszałem o tej wyższości polskich szkół. Dopóki nie pogadałem z kimś kto faktycznie uczy się np w anaglii
MaxGaming (14:32, 21.08.18):
ja te il
MaxGaming (14:30, 21.08.18):
to jest kompletny absurd. Albo przedmioty na które po prostu trzeba chodzić to chyba tylko polski pomysł. Mam na myśli takie przedmioty na których i tak wiesz że jest taki luz że nie musisz robić nic ale musisz mieć obecności i tracisz swój cenny czas
MaxGaming (14:29, 21.08.18):
więc każdy szedł żeby mieć obecności a albo sam z siebie wydedukował po kilku przykładowych zadaniach jak coś działa albo wracał do domu i uczył się z internetu
MaxGaming (14:28, 21.08.18):
matematyki wyglądała tak że pani profesor nawet nie miała opcji wyjaśnić czegoś tak żeby dotarło do 30 osób bo każdy jest inny
MaxGaming (14:28, 21.08.18):
ale polakom się coś powie i oni bezmyślnie powtarzają dlatego mamy fatalne szkoły i jeszcze fatalniejsze domniemanie że ta szkoła wpłynie poztytywnie na przyszłość. Tak brutalnie mówiąc jeśli musisz iść na studia by np być dobrym programistą to znaczy że jesteś zbyt głupi na bycie dobrym programistą. Wiedza nigdy nie była tak tania i tak powszechna jak dziś. Na prawdę jak wykładowca nie będzie kazał się czegoś nauczyć to nie będziesz umiał sam z siebie się tego
exp (14:25, 21.08.18):
polacy to ogólnie strasznie zakompleksiony naród i sytuację tego kraju powoduje głęboko zakorzeniona polska mentalność. ale to nie zmieni się jeszcze przez długi, długi czas albo i nigdy
exp (14:23, 21.08.18):
a pamiętam, jak za czasów szkolnych wszyscy płonęli dumą, bo podobno polska edukacja jest dużo wyżej i jak polscy uczniowie jadą na wymianę na zachód, to są zawsze kilka szczebli wyżej
MaxGaming (14:15, 21.08.18):
osoby w wieku 16 lat w anglii mają większą wiedzę niż u nas po studiach, ale.. nie mają za to zbędnych ton wiedzy którą w polsce przyjeło się że "wypada mieć"
MaxGaming (14:15, 21.08.18):
Znajomi w anglii którzy się uczą gdy mówią mi jak tam wygląda szkoła to już rozumiem dlaczego polska szkoła zwyczajnie nie może działać
MaxGaming (14:14, 21.08.18):
Nie wiem czemu jako polacy mamy takie kompleksy na punkcie wykształcenia takiego typowo akademickiego. Cieżko do polaków dotrzeć że można się wykształcić poza szkołami, ale to wina PRLu i tego jak później każdy myślał że będzie kimś wielkim bo pójdzie na studia i w nowym systemie będzie bogatym
MaxGaming (14:12, 21.08.18):
miałem też przyjemność rozmawiać z szefem marketingu w polskim startupie mającym 200zł na godzinę i ... wykstzałcenie podstawowe. To jest po prostu śmieszne. Moi znajomi idący na studia liczą że po zrobieniu ich będą zarabiali 3-4tyś a ich rówieśnicy po gimnazjum zarabuają 3-4tyś. I to żadne wyjątki a norma. Wyjątki to są które bez studiów zarabiają czterocyfrowe sumy
MaxGaming (14:10, 21.08.18):
masz studia czy nie
MaxGaming (14:10, 21.08.18):
Chell ile my mamy lat żeby wierzyć że jak zrobisz wyższe to będziesz nagle z 2 tyś zarabiał 20tyś? Nie rozumiem jakie mam mieć arguemnty inne niż znajomi lub inne osoby z którymi się spotykam w swoim życiu. Poza tym przez 4 lata można spokojnie zostać ekspertem w czymś albo skończyć technikum po którym niczego się nie nauczy. Jeśli celujesz powyżej 10 tyś to nawet nie ma mowy o liczeniu na studia. Tutaj już trzeba dać coś z siebie coś więcej ale w takiej sytuacji nic
Wojo (13:47, 21.08.18):
I żeby nie było, nie hejtuję nauki tylko chodzi mi o to, że wykształcenie nie jest wszystkim co człowiek powinien posiadać.
Wojo (12:43, 21.08.18):
A w szkołach wpaja się do głowy bzdurną regułkę "idź na studia bo bez studiów będziesz pracował za minimalną!"
Wojo (12:42, 21.08.18):
I jak dla mnie to wartość człowieka jest istotna bo możemy zobaczyć magistrów, licencjatów robiących na tym samym stanowisku za te same pieniądze co ludzie po zawodówce czy bez szkoły.
Wojo (12:39, 21.08.18):
a jeśli faktycznie ktoś będzie dobry w swoim kierunku i zrobi doktorat to minie wiele lat. Pomijam tutaj kierunki, które faktycznie wymagają nauki i wielu wyrzeczeń (np. lekarskie), ale studia dzienne na badziewnych kierunkach to przedłużenie gimnazjum MOIM ZDANIEM.
Wojo (12:36, 21.08.18):
jak dla mnie całe liceum to była propaganda. wpajanie uczniom do głów tekstów w stylu "idź na studia dzienne na polonistkę to coś z ciebie będzie" i później wielkie zdziwienie, że 23 letni chłopak nigdy nie pracował i nie ma pracy w tym kraju z jego wykształceniem
gnysek (11:49, 21.08.18):
Ja się w szkole nauczyłem assemblera, także cośtam dała.
Chell (10:47, 21.08.18):
no niestety nie zyjemy w czasach, gdy kazdy jest unikalnym platkiem sniegu i byle komu sie cos nalezy na podstawie tego, ze ma fajne pomysly
Chell (10:46, 21.08.18):
koles z niepelnym zawodowym moze sobie zalozyc firme blacharska i dorobic sie 10k miesiecznie, ale to przypadek jeden na milion, i nie brzmi jakos zajebiscie dumnie
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
[ Polityka prywatności ]
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.03143 sekund ] [ Liczba zapytań MySQL: 13 ]