Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Tutorial :: Pravljenje igara u Pascal-u... moze?

[es] :: Pascal / Delphi / Kylix :: Tutorial :: Pravljenje igara u Pascal-u... moze?
(TOP topic, by X Files)
Strane: 1 2 3

[ Pregleda: 31420 | Odgovora: 53 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 20:10 - pre 205 meseci
Ovih dana imam dosta slobodnog vremena, a nadam se da ce tako i ostati pa bih mogao da napisem neki tutorial o pravljenju multiplatform igara u Pascal-u (Free Pascal Compiler + Lazarus). Poenta bi bila da napisem prvo tekst i potom postavim kod, ali nekompletan... cim ga neko zavrsi, postavim svoje resenje (mozda se na kraju ispostavi da je moje resenje pogresno ) i idemo dalje. Interesuje me samo da li ima ljudi koje bi to interesovalo da ne pisem bezveze?

Isli bi od pocetka (tekstualni prikaz i osnovni tipovi podataka) pa do OOP igara koje koriste razne API-je za kreiranje prozora, crtanje, pustanje zvuka, fiziku...


 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
217.23.204.*



+19 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 22:19 - pre 205 meseci
Bilo bi dobro da uradimo igru cisto u free pascal-u nekoristeci nikih biblioteka iz lazarus-a.
 
Odgovor na temu

PeroGenijalac
Križevci, Hrvatska

Član broj: 136690
Poruke: 8
*.cmu.carnet.hr.

ICQ: 459843816


Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 22:44 - pre 205 meseci
evo jedna igra koju je jedan moj prijatelj (drug kako god) napisao drugom prijatelju jer mu je to trebalo za školu, i sad je ovaj upao u živo blato, njemu profesor kaže da će ići na natjecanje, a nema zapravo pojma.... Inače u igri se radi o tome da treba u posudu hvatati slova koja padaju:

Code:


(*
========================
Napravio Matija *****
travanj 2007
========================
*)
PROGRAM Igra;                                                                  {Naslov Programa}
USES Crt,Dos,Graph;                                                            {Potrebno za neke funckcije kao KeyPressed,ReadKey,GotoXY...}
TYPE postavke=RECORD                                                           {Zapis,sadrži postavke slova}
posx,posy,slova : integer;                                                     {X,Y pozicija slova i sam broj koji preko chr naredbe pretvaramo u slovo}
END;                                                                           {Kraj zapisa}
slovo=ARRAY[1..40] OF postavke;                                                {Niz slova}
postavke2 = RECORD                                                             {Zapis,sadrži postavke za highscore}
ime :STRING;                                                                   {ime}
bodovi:integer;                                                                {bodovi}
END;                                                                           {kraj zapisa}
scores=ARRAY[1..40] of postavke2;                                              {niz zapisa imena i rezultata}
var KrajIgre,kraj,Pauza : boolean;                                             {Dali je igra gotova,kraj repeat petlje u Kraj_Igre procedure, i provjera pauze}
Key : LONGINT;                                                                 {Služi za provjeru koja je tipka pritisnuta}

(*varijable i,j služe za popunjavanje podataka kroz for petlju,padslova služi za spremanje koliko je slova palo zaredom,
maxslova koliko slova pada,TimeCount služi za određivanje brzine padanja umjesto Delay Funkcije,zivot služi za spremanje broja života,
bodovi za spremanje broja bodova,MaxRez-potreban broj bodova za novi "nivo",DelayTime zajedno sa TimeCount služi za ubrzavanje ili usporavnja slova
iako to nije prava vremenska funkcija već više ovisi o brzini procesora*)
i,j,padslova,maxslova,TimeCount,zivot,bodovi,MaxRez,DelayTime :integer;
kosaricax,kosaricay : byte;                                                    {GotoXY Traži Byte tip, iako radi i sa običnim integer tipom,sadrži x i y poziciju košarice}
s: slovo;                                                                      {Spremanje postavki slova}
sc :scores;                                                                    {Spremanje imena i bodova iz datoteke i u datoteku}
izbor: char;                                                                   {Spremanje Početnog Izbora}
data:text;                                                                     {Tex Tip}
ime: string;                                                                   {Ovdje Spremamo ime}
(*
==============================================================
Procedura koja resetira poziciju slova i samo slovo          |
==============================================================
*)
PROCEDURE gReset;                                                              {Naziv procedure}
BEGIN                                                                          {Početak procedure}
             s[i].slova:=65;                                                   {Po ASCII Kodu slovo A je na 65->trebamo obična slova}
             s[i].slova:=s[i].slova+random(25);                                {Do 90 su velika slova(65+25=90), dodajmo nasumičan broj da dobijemo nasumično slovo}
             s[i].posx:=random(75)+1;                                          {Sirina do 76(75+1) +1 zato da uvijek bude veće od 1}
             s[i].posy:=0;                                                     {Pozicija 0}
             s[i].posy:=s[i].posy-(5*i);                                       {Da slova ne bi bila u istom redu}
END;                                                                           {Kraj procedure}
(*
===============================================================
Procedura koja se poziva na kraju igre, sprema svaki          |
rezultat koji igrač napravi  u  datoteku i omogućuje          |
ponovno igranje ili izlaz iz igre        |                    |
===============================================================
*)
PROCEDURE Kraj_Igre;                                                           {Naziv procedure}
BEGIN                                                                          {Početak procedure}
    IF bodovi<0 THEN bodovi:=0;                                                {U slučaju da su nam bodovi ispod 0}
    assign(data,'Scores.txt');                                                 {Zadano ime datoteke}
    {$I- iskljuci I/O provjeru}
    append(data);                                                              {Dodaj rezultat na kraj}
    IF IOresult<>0 THEN rewrite(data);                                         {Ako datoteka ne postoji, napravi novu, IOresult vraća 0 ako je sve prošlo u redu}
    close(data);                                                               {Zatvori datoteku}
    {$I+ ukljuci I/O provjeru}
    append(data);                                                              {Dodavanje teksta na kraj datoteke}
    writeln(data,ime);                                                         {Piše ime u datoteku}
    writeln(data,bodovi);                                                      {Piše bodove u datoteku}
    close(data);                                                               {Zatvara datoteku}
    clrscr;                                                                    {Čisti ekran}
    kraj:=false;                                                               {Da nebi došlo do beskonačne petlje}
    REPEAT                                                                     {Repeat petlja}
         gotoxy(30,10);                                                        {Oko sredine ekrana}
         writeln('KRAJ IGRE');                                                 {Ispiši poruku}
         gotoxy(10,11);                                                        {Oko sredine}
         writeln('Pritisnite P ako zelite igrati ponovo ili Q za izlaz: ');    {Ispiši poruku}
         IF KeyPressed THEN                                                    {Ako je tipka pritisnuta, procesuiraj}
           BEGIN                                                               {Početak if naredbe}
             Key:=ORD(READKEY);
             IF Key=0 THEN Key:=ORD(READKEY) SHL 8;                            {Funkcijska tipka}
             CASE Key OF                                                       {Ako želimo igrati ponovo resetirajmo postavke}
                  ORD('p'): BEGIN
                            MaxRez:=500; bodovi:=0;
                            kosaricay:=23; kosaricax:=23;
                            zivot:=1;
                            maxslova:=1; DelayTime:=100;
                            greset; kraj:=true;
                            END;
                  ORD('q'): halt(1);                                           {Direktan izlaz iz programa}
             END;                                                              {End case}
            END;                                                               {end if}
     UNTIL kraj=true;                                                          {Sve dok kraj nije true}
END;                                                                           {Kraj procedure}

{Procedura za zamjenu brojeva}
PROCEDURE zamijeni(var x,y : integer);
var t:integer;
begin
t:=x;
x:=y;
y:=t;
end;
{Procedura za zamjenu stringova}
PROCEDURE zamijeni2(var x,y : string);
var t:string;
begin
 t:=x;
 x:=y;
 y:=t;
 end;
(*
========================================================================================================================
Procedura za ispis rezultata                                                                                           |
========================================================================================================================
*)
PROCEDURE HighScore;                                                           {Naziv procedure}
BEGIN                                                                          {Početak procedure}
assign(data,'Scores.txt');                                                     {Zadano ime datoteke}
{$I- iskljuci I/O provjeru}
reset(data);                                                                   {Pokušava otvoriti datoteku}
IF IOresult<>0 THEN                                                            {Ako nije uspjelo}
               BEGIN                                                           {Početak if naredbe}
                   rewrite(data);                                              {Napravi datoteku}
                   writeln('Rezultati 15 najboljih');                          {Ispiši poruku}
                   writeln;                                                    {Jedan prazan red}
                   FOR i:=1 TO 15 DO                                           {Popuni datoteku i ispiši na ekran}
                                 BEGIN                                         {Početak for naredbe}
                                      writeln(data,'Igrac',i);                 {Spremi ime igrača u datoteku}
                                      write('igrac',i);                        {Ispiši ime na ekran}
                                      writeln(data,' ',1000 div i);            {Spremi broj bodova u datoteku}
                                      writeln(' ',1000 div i);                 {Ispiši na ekran}
                                 END;                                          {Kraj for petlje}
               END                                                             {Kraj if naredbe}
ELSE                                                                           {Ako je uspjelo}
BEGIN                                                                          {Početak else naredbe}
         writeln('Rezultati 15 najboljih');                                     {Ispiši poruku}
         writeln;                                                              {Jedan prazan red}
         FOR i:=1 TO 40 DO                                                     {Za i=1 do 9 radi}
         BEGIN                                                                 {Početak for petlje}
              IF (IOresult=0)AND NOT eof(data) THEN                            {Ako nema greške i nije kraj datoteke}
              BEGIN                                                            {Početak if naredbe}
                   readln(data,sc[i].ime);                                     {Učitaj ime}
                   readln(data,sc[i].bodovi);                                  {Učitaj bodove}
              END;                                                             {Kraj if naredbe}
         END;                                                                  {Kraj for petlje}
(*
=====================
Sortiraj podatke    |
=====================
*)
    FOR i:=1 TO 39 DO                                                          {Za i=1 do 9 radi}
    FOR j:=i+1 TO 40 DO                                                        {Za j=i+1 do 10 radi}
                    IF sc[i].bodovi<sc[j].bodovi THEN                          {Ako su bodovi manji}
                    BEGIN                                                      {Početak if petlje}
                         zamijeni(sc[i].bodovi,sc[j].bodovi);                  {Zamijeni bodove}
                         zamijeni2(sc[i].ime,sc[j].ime);                       {Zamijeni imena}
                    END;                                                       {Kraj If naredbe}
    FOR i:=1 TO 15 DO                                                          {Od i=1 do 9 radi}
    BEGIN                                                                      {Početak for petlje}
        IF sc[i].ime<>'' THEN writeln(sc[i].ime,' ',sc[i].bodovi);             {Ako ime nije prazno ispiši ga i ispiši bodove}
    END;                                                                       {Kraj for petlje}
END;                                                                           {Kraj else}
close(data);                                                                   {Zatvori datoteku}
readln                                                                         {Čekaj pritisak tipke}
END;                                                                           {Kraj procedure}
(*
==============================================
Procedura koja se poziva na početku programa |
==============================================
*)
PROCEDURE Upute;
BEGIN
writeln('Za svako ulovljeno slovo igrac dobiva 25 bodova a za svako izgubljeno gubi');
writeln('30 bodova. Svakih 500 bodova dobiva 1 zivot, igra se ubrzava i pada jedno');
writeln('slovo vise. Kada izgubi sve bodove gubi 1 zivot. Ako nema zivota igra zavrsava ');
writeln('Ako padnu 3 slova zaredom takoder gubi zivot.');
TextColor(14);                                                                 {Boja teksta}
TextBackground(9);                                                             {Boja pozadine}
for i:=0 to 76 do                                                              {Za i=1 do 76 radi}
write('=');                                                                    {Nacrtaj marginu}
writeln;                                                                       {Jedan prazan red}
writeln('Unesite S za pocetak, Q za izlaz ili H za High Score :');             {Ispiši poruku}
readln (izbor);                                                                {Sprema izbor}
END;                                                                           {Kraj procedure}

(*
=====================================================================================================================
Glavna funckija
=====================================================================================================================
*)

BEGIN                                                                          (*Početak glavne funkcije*)
(*
====================
Početne definicije |
====================
*)
randomize;                                                                     {Nasumični brojevi}
TimeCount:=0;                                                                  {Brojač vremena}
MaxRez:=500;                                                                   {Svakih 500 bodova "novi nivo"}
padslova:=0;                                                                   {Spremamo koliko slova padne zaredom van košarice}
DelayTime:=100;                                                                {Vrijeme odgode kod padanja slova}
zivot:=1;                                                                      {Početni broj života}
bodovi:=0;                                                                     {Početni bodovi}
maxslova:=3;                                                                   {Koliko slova pada}
kosaricax:=25;                                                                 {X pozicija košarice}
kosaricay:=23;                                                                 {Y pozicija košarice}
kraj:=false;                                                                   {Kod procedure Kraj_Igre za Repeat petlju}
KrajIgre:=false;                                                               {U glavnoj funkciji repeat petlja}
Pauza:=false;                                                                  {Spremamo Status pauze}
(*
=============================
Popunjavanje postavki slova |
=============================
*)
FOR i:=1 TO maxslova DO
gReset;                                                                        {Resetirajmo poziciju svakog slova}
(*
=========================
Sama igra               =
=========================
*)
TextColor(15);                                                                 {Čista bijela boja}
Upute;                                                                         {Pozivanje procedure upute}
CASE izbor OF                                                                  {Ako u proceduri upute unesemo H pozovi HighScore Proceduru}
'H','h':
BEGIN
     clrscr;                                                                   {Očistimo ekran}
     HighScore;                                                                {Pozovimo proceduru HighScore}
END;                                                                           {Kraj case izbora of h}
'S','s' :                                                                      {Ako unesemo S pokreni igru}
BEGIN
      clrscr;                                                                  {Očistimo ekran}
      write('Unesite ime:');                                                   {Ispiši poruku}
      readln(ime);                                                             {spremi unos u varijablu ime}
      REPEAT                                                                   {Repeat petlja}
        GotoXY(1,1);                                                           {Lijevi gornji kut}
        writeln('Bodovi: ',bodovi,' Zivoti: ',zivot,'       Pritisnite P za Pauzu, Q za Izlaz');
        writeln('-------------------------------------------------------------------------------');
        IF KeyPressed THEN                                                      {Pritisak tipke}
           BEGIN
             Key:=ORD(READKEY);
             IF Key=0 THEN
                  Key:=ORD(READKEY) SHL 8;
             CASE Key OF
                  ORD('j'):IF pauza=false THEN kosaricax:=kosaricax-1;          {Ako nismo u pauzi pomakni kosaricu lijevo}
                  ORD('k'):IF pauza=false THEN kosaricax:=kosaricax+1;          {Ako nismo u pauzi pomakni kosaricu desno}
                  ORD('p'): BEGIN                                               {U slučaju tipke p}
                            IF pauza=false then                                 {Ako pauza nije uključena}
                            pauza:=true                                         {Uključi ju}
                            ELSE                                                {inače}
                            pauza:=false;                                       {isključi pauzu}
                            END;
                  ORD('q'): Kraj_Igre;                                          {Ako pritisnemo q pozovi proceduru za kraj igre}
             END;                                                               {End Case}
           END;                                                                 {End if}
  (*Za makivanje "dopplerovog" efekta kosarice maknuti komentare*)
(*GotoXY(1,23);
writeln('                                                                                  ');*)
     GotoXY(kosaricax,kosaricay);                                               {Postavi pokazivac na poziciju kosarice}
     writeln('\__/');                                                           {"Nacrtaj" kosaricu}
     (* Naš Brojač umjesto delay funkcije*)
      FOR i:=1 to maxslova DO                                                   {Procesuiraj svako slovo}
      BEGIN
      TimeCount:=TimeCount+1;                                                   {Povečaj brojač svaki krug}
           IF s[i].posy>2 THEN                                                  {Samo ako je y kordinata slova veća od 2-> da ne pišemo preko bodova}
           BEGIN
                GotoXY(s[i].posx,s[i].posy);                                    {postavi slovo i ispiši ga na ekran}
                writeln(chr(s[i].slova));
           END;                                                                 {End if}
      IF pauza=false THEN                                                       {Ako nije pauzirano}
      IF TimeCount>DelayTime THEN BEGIN                                         {Ako je prosao određen period vremena}
      TimeCount:=0;                                                             {Postavi brojač na 0}
      s[i].posy:=s[i].posy+1;                                                   {Simulacija padanja}
      clrscr;                                                                   {Očisti ekran}
      END;
      IF (s[i].posy=kosaricay) AND (s[i].posx<kosaricax) OR (s[i].posy=kosaricay) AND (s[i].posx>kosaricax+3) then {Ako slovo ne padne u košaricu gubimo bodove}
         BEGIN
              bodovi:=bodovi-30;                                                {Smanji bodove za 30}
              padslova:=padslova+1;                                             {Brojac koliko slova pada zaredom povećaj za 1}
              gReset;                                                           {Ponovno postavi slovo}
              IF bodovi<0 THEN zivot:=zivot-1;                                  {Ako su bodovi ispod 0 gubimo život}
              IF padslova>2 THEN                                                {Ako su pala 3 slova zaredom također gubimo život}
              BEGIN
              zivot:=zivot-1;
              padslova:=0;
              END;

         END;
      IF (kosaricay=s[i].posy) AND (s[i].posx>=kosaricax) AND (s[i].posx<=kosaricax+3)THEN {Ako su košarica u slovo na istoj poziciji, povećajmo bodove i ponovno postavimo slovo na random poziciju}
         BEGIN bodovi:=bodovi+25;                                              {Povečaj bodove}
         IF padslova>0 THEN padslova:=0;                                       {Resetiraj brojac koji broji koliko je slova palo zaredom}
         gReset;                                                               {Resetiraj poziciju slova}
         END;                                                                  {End if}
      END;                                                                     {End For}
      IF kosaricax<1 THEN kosaricax:=1;                                        {Da nebi mogli sa košaricom previše lijevo}
      IF kosaricax>76 THEN kosaricax:=76;                                      {Niti previše desno}
      IF bodovi>=MaxRez THEN                                                   {Ako imamo potreban broj bodova}
      BEGIN
           zivot:=zivot+1;                                                     {Dodaj novi život}
           DelayTime:=DelayTime-10;                                            {Ubrzaj padanje slova}
           maxslova:=maxslova+1;                                               {Dodaj slovo više}
           MaxRez:=MaxRez+500;                                                 {Povećaj potreban broj bodova}
      END;                                                                     {End if }
      IF pauza=true then                                                       {Ako je pauzirano}
      BEGIN
       GotoXY(25,10);                                                          {Oko sredine ekrana}
       TextColor(8);                                                           {Boja teksta}
       writeln('PAUZA');                                                       {Ispiši poruku}
       TextColor(14);                                                          {Vrati boju teksta}
       END;
        IF zivot=0 THEN                                                        {Ako nemamo života}
      Kraj_Igre;                                                               {Poziva proceduru za kraj programa}
    UNTIL KrajIgre=true;                                                       {Repeat until}
END;                                                                           {End izbor 'P','p'}
END;                                                                           {End Case}
clrscr;                                                                        {Očistimo ekran}
GotoXY(30,10);                                                                 {Postavimo pokazivač na zadanu poziciju}
writeln('KRAJ IGRE');                                                          {Ispišemo poruku o kraju igre}
readln                                                                         {Čeka pritisak tipke}
END.                                                                           (*Kraj glavne funkcije *) 

 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
*.opera-mini.net.

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 22:45 - pre 205 meseci
Pisanje multiplatform igre bez upotrebe third party biblioteka je prilicno tesko. Ja licno odlicno poznajem WIN API, medjutim, nemam pojma kako da kreiram prozor u Linuxu ili MAC OSu. Gde je zvuk, gde je rad sa periferijama...
 
Odgovor na temu

Nemanja Avramović
Engineering Manager
MENU Technologies
Beograd, Srbija

Član broj: 32202
Poruke: 4391
77.46.244.*

Sajt: https://avramovic.info


+46 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 23:13 - pre 205 meseci
AFAIK, GLScene radi i na Lazarusu (Win/Lin)... zato, kreni(mo)
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 23:39 - pre 205 meseci
Ne planiram da koristim GLScene... od third party stvari planiram da koristim sto manje... SDL za prozore, Vampyre za rad sa texturama, FMOD za zvuk, Newton za fiziku... mozda jos nesto, ali sigurno ne neki gotov 3D ili game engine, ali korak po korak... pocetak ce da bude cista konzola. Kada se nauci kako bi trebalo da se cuvaju podaci vezani za igru, onda malo Lazarus i LCL da se malo upozna sa keydown, keyup, mousemove i slicnim stvarima, a kad to prodje onda SDL and friends.
 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
217.23.204.*



+19 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?14.05.2007. u 10:54 - pre 205 meseci
Nisam vidio da mislis raditi za vise platformi igru, mislio sam samo za WIN. Volio bi ucestovati, a nekoristim lazarus vec Delphi. Nije problem instaliracu ga na Linux samo ajmo se dogovoriti sta cemo raditi. GLScene ne moramo koristi, u GLSceni cu ja pokrenuti temu na ljeto, jer imam jednu ideju za jednu igru koju bas necu moci sam da uradim.
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
77.46.176.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?14.05.2007. u 11:19 - pre 205 meseci
Kao sto rekoh, tutorial ce biti tipa ja napisem tekst, postavim veci deo koda i cim neko zavrsi kod idemo dalje. Sve sto budem objasnjavao ce biti za Lazarus. Ako neko zeli moze da ispravi kod i da dodatna objasnjenja za Delphi.

Prvi tutorial bi bilo nesto kao Hello World... X-O za 2 igraca u konzoli. Bice objasnjene neke osnovne stvari kao sto su inicijalizacija, game loop, nacin cuvanja i pristupanja podataka vezanih za igru i slicno... kod sam vec napisao, sad samo cekam da vidim da li ima dovoljno zainteresovanih ljudi... trenutno ste tu Nemanja_666 i Nemanja Avramović... ako se javi jos 2-3 zainteresovana korisnika pocecu sa pisanjem teksta.
 
Odgovor na temu

Nikolavlasotince
Nikola Stojiljkovic
Vlasotince/Beograd

Član broj: 139391
Poruke: 109
*.info-net.co.yu.



+1 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?14.05.2007. u 11:52 - pre 205 meseci
Ja sam zainteresovan, mada ne znam bas nesto mnogo. Mozda bih mogao da pomognem u necemu, a usput i nesto da naucim.
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
77.46.176.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?14.05.2007. u 15:05 - pre 205 meseci
Srki, znas da ja ovakve teme uvek pratim iz prikrajka ;). Znaci i ja sam tu, a ako stignem ( zbog kolokvijuma koji sada napadaju ) i aktivno cu da ucestvujem, a radicu u Lazarusu pod Linuxom ;).
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
77.46.183.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?15.05.2007. u 12:56 - pre 205 meseci
Ok... pocecu sa pisanjem texta kad stignem kuci pa cemo da vidimo kako sve to ide
 
Odgovor na temu

anon28907

Član broj: 28907
Poruke: 647
*.eunet.yu.



Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?15.05.2007. u 12:59 - pre 205 meseci
Evo jos jednog zainteresovanog
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?15.05.2007. u 19:18 - pre 205 meseci
Pocecemo od vrlo jednostavne igre - X-O u konzoli. Nema kreiranja prozora, inicijalizacije za crtanje 3D objekata, pustanja zvuka i slicnih stvari. Pozabavicemo se osnovnim operacijama koje uglavnom svaka igra ima.

Za pocetak cemo sve da uprostimo i prikazemo kako ce program izgledati:
Code:
program helloxo;
begin
  Inicijalizacija promenljivih

  Izvrsavanje glavne petlje

  Oslobadjanje resursa
end.

Posto je glavna petlja cesto velika i komplikovana, praksa je da se ona i pomocne funkcije nalaze u drugom unit-u, a da se u programu sve inicijalizuje i samo pozove funkcija koja pokrece glavnu petlju. Tako cemo i mi uraditi bez obzira sto je XO vrlo jednostavno napraviti.

Napravicemo nov unit u kojem cemo postaviti promenljive i sve potrebne funkcije. Pocecemo od promenljivih... tabela u XO je velicine 3x3 i svako polje moze imati 3 moguce verdnosti: X, O ili prazno. Za takav podatak nam dvodimenzionalni niz (3x3) sasvim odgovara. Posto svako polje moze da ima 3 razlicite vrednosti, tip podatka za niz takodje mora da bude u stanju da ima bar 3 vrednosti. Integer moze da mnogo razlicitih vrednosti i operacije nad njim se vrlo brzo izvrsavaju pacemo napraviti dvodimenzionalni niz celobrojnih vrednosti.
Code:
Table: array[1..3, 1..3] of Integer;

Da nam se u kodu ne bi desilo da zaboravimo da li X predstavlja broj 1 ili broj 2 ili neki treci, nije lose da napravimo konstante koje ce nam pomoci i da se lakse snadjemo u kodu i da ne moramo da pamtimo sta koji broj znaci:
Code:
CX = 1;
CO = 2;

Dobro... imamo tabelu... bilo bi lepo da mozemo da zapamtimo imena igraca koji igraju i da mozemo kasnije da kazemo na redu je Pera umesto na redu je igrac koji igra sa znakom X. Niz od dva clana (jedan za X jedan za O) nam je sasvim dovoljan za to:
Code:
Players: array[CX..CO] of String;

Sta nam je jos potrebno... potrebno nam je da znamo koji igrac trenutno igra. Posto postoje samo X i O igrac bilo bi nam dovoljno da uzmemo Boolean tip i da True predstavlja igraca X, a False igraca O, ali da bi kod bio citljiviji i laksi za trazenje greske, bolje je da ovaj podatak cuvamo u tipu Integer i da ga postavimo na konstantu CX kada igra igrac X ili na CO kada igra igrac O:
Code:
CurrentPlayer: Integer;

Za kraj nam jos trebaju 2 promenljive u koje ce igrac upisati na koje polje zeli da igra (X i Y koordinatu polja):
Code:
CurrentX, CurrentY: Integer;


Imamo sve potrebne promenljive, sada krecemo na proceduru koja ce da predstavlja glavnu petlju u igri i na pomocne procedure i funkcije. U nasem slucaju bi glavna petlja trebala da radi sledece:
Code:
procedure Run;
begin
  Nacrtaj trenutno stanje na tabeli

  Uzmi od igraca polje na koje zeli da igra i postavi ga na
  vrednost koja zavisi od igraca koji je na potezu (X ili O)

  Promeni igraca

  Ako nije kraj igre, ponovi sve
end;

Kod koji uzima od igraca koordinatu polja i postavlja znak bi mogao da izgleda ovako:
Code:
Write('Postavi znak na (X Y): ');
ReadLn(CurrentX, CurrentY);

Table[CurrentX, CurrentY] := CurrentPlayer;

Sve deluje lepo, ali sta ako igrac pokusa da odigra na vec zauzeto polje ili da odigra na polje 10, 10 koje ne postoji? Treba nam neka provera. Da ne bi bez potrebe komplikovali glavnu petlju, tu proveru cemo napraviti u pomocnoj funkciji:
Code:
function GetField(aX, aY: Integer): Integer;
begin
  if (aX in [1..3]) and (aY in [1..3]) then
    Result := Table[aX, aY]
  else
    Result := -1;
end;

Ova funkcija ce nam vratiti -1 ako igrac bira nepostojece polje ili vrednost iz polja koja se trenutno tamo nalazi. Dakle, prolje je prazno ako nije -1, CX ni CO. Da ne bi morali da proveravamo sva tri uslova, prilikom inicijalizacije promenljivih cemo celu tabelu popuniti nulama i ona ce nam predstavljati prazno polje (nula i nil uglavnom uvek znace da je nesto prazno pa necemo definisati konstantu za prazno polje).
Sada kod za postavljanje znaka izgleda ovako:
Code:
repeat
  Write('Postavi znak na (X Y): ');
  ReadLn(CurrentX, CurrentY);
until GetField(CurrentX, CurrentY) = 0;

Table[CurrentX, CurrentY] := CurrentPlayer;


Imamo deo glavne petlje... idemo dalje... kod za promenu igraca je prilicno jednostavan i ne treba ga objasnjavati... ako nekom nije jasan neka uzme knjigu i prvo nauci Pascal pa neka nastavi sa citanjem ovog tutoriala:
Code:
Inc(CurrentPlayer);
if CurrentPlayer > CO then
  CurrentPlayer := CX;


Kod za proveru da li je igra zavrsena je takodje velik da bi ga ostavili u proceduri za glavnu petlju pa cemo i njega izvuci u pomocnu funkciju. Funkcija bi mogla da vracam samo True ili False, ali onda ne bi znali da li je igra gotova zato sto je neko pobedio ili je nereseno. Zato mozemo da uradimo funkciju tako da vrati -1 ako jos moze da se igra, 0 ako je nereseno, CX ako je pobedio igrac X ili CO ako je pobedio igrac O. Kako bi trebalo da izgleda ta funkcija... to je na vama da odlucite. Dacu vam samo malu pomoc. Imate polje na kojem je poslednji znak postavljen, dovoljno je da pogledate gore, dole i ukoso od tog polja i vidite da li imate 3 spojena znaka, ako nema 3 znaka ostaje samo jos da se proveri da li je tabela puna. Resenje koja ja trenutno imam je da svaki put prodjem kroz celu tabelu i vidim da li su sva polja puna, ali to moze da se resi na mnogo bolji i jednostavniji nacin... ako ima samo 9 polja koliko puta moze da se postavi znak do se tabla ne popuni

Jos jedna funkcija koju vam prepustam je funkcija za crtanje tabele. Ova funkcija je prilicno jednostavna... ja sam je uradio tako da ona ispisuje znak iz tabele i pravi razmak posle njega i, poels svakog reda ubacuje jedan prazan, a vi mozete da se igrate i da probate da nacrtate okvir i linije izmedju.

Kada imamo sve ovo, program je jednostavno napisati... prvo inicijalizujemo promenljive:
Code:
FillChar(Table, SizeOf(Table), 0);
  
Write('Unesite ime prvog igraca: ');
ReadLn(Players[CX]);
Write('Unesite ime drugog igraca: ');
ReadLn(Players[CO]);

Posle toga pozivamo glavnu petlju:
Code:
Run;

To je dovoljno da bi igra radila... ali, igraci bi voleli da vide ko je pobedio. Jedno od resenja je da u programu ponovo pozovemo funkciju koja nam je rekla zbog cega je doslo do kraja igre i na osnovu toga ispisemo poruku (tako sam uradio u kodu koji cu kasnije postovati)... ali zasto pozivati istu funkciju 2 puta kad mozemo da uradimo nesto drugo Ko se seti neka kaze.

Jos jedna stvar koja nervira igrace... zavrse igru i ona se zatvori bez pitanja da li zelis da igras ponovo. Funckija koja pita igraca bi mogla da izgleda ovako:
Code:
function PlayAgain: Boolean;
var
  YesNo: Char;
begin
  Write('Da li zelite da igrate ponovo (D/N): ');
  ReadLn(YesNo);

  Result := upCase(YesNo) = 'D';
end;

Kod glavnog programa bi onda ovako izgledao:
Code:
repeat
  FillChar(Table, SizeOf(Table), 0);
  
  Write('Unesite ime prvog igraca: ');
  ReadLn(Players[CX]);
  Write('Unesite ime drugog igraca: ');
  ReadLn(Players[CO]);
    
  Run;

until not PlayAgain;


E, sad... na nekom od vas je da napise ceo kod i da ga postuje. Cim dobijemo funkcionalnu igru, postovacu svoj kod i onda cemo na kraju zajedno da doteramo kod tako da bude lak za pregled, jednostavan, da ima sve sto treba da ima od funckionalnosti (bio bi lepo da i u sred igre da se izadje iz programa, zar ne) i da korisniku izgleda sto je lepse moguce
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?15.05.2007. u 22:17 - pre 205 meseci
Dok ovo neko radi da najavim sta je sledece. Idalje ostajemo u textualnom rezimu i idalje cemo da se zezamo s nacinom cuvanja i pristupanja podataka. Ovog puta cemo napraviti 2 programa. Jedan za kreiranje nivoa i jedan za igranje igre. Igra ce biti tipa idi na sever, idi na jug, pogledaj i slicno. Nivo koji cemo kreirati ce izgledati ovako:



Znaci svaka soba ima 4 moguca prolaza. Neki vode u druge sobe, a neki su zatvoreni. Postoje sobe koje mogu da imaju portale i da vode u sobe sa kojima naizgled nisu povezane (iz jedne sobe se ide na sever, a posle ne moze da se vrati na jug ili se vracanjem na jug ne vrati u istu sobu neko u neku trecu i slicno).

Sta nam treba... treba da se osmisli mehanizam koji ce cuvati podatke o sobama, ali i da podaci mogu da se snime u fajl, a kasnije i procitaju iz njega.

Svaka soba treba da ima 5 podataka:
Description: Opis sobe (to ce se videti kad igrac ukuca POGLEDAJ).
N, W, S, E: Podatak koji kaze u koju sobu dospemo kad podjemo na sever, zapad, jug ili istok.
Prikačeni fajlovi
 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
80.242.126.*



+19 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 10:59 - pre 205 meseci
Nisam ni siguran dali radi najbolje, uradio sam za koji minut. Trebalo bi da radi. Nije bas kako Srki objasni, ja vise folim klase. Kompajlirano je sa FreePascal-om.

Code:

program XO;
{$mode objfpc}
uses
  Crt;

const
  PlayerX = 1;
  PlayerO = 2;    
  
type
  TGame = class
    private
      FTable : array[1..3, 1..3] of integer;
      FPlayerX : string;
      FPlayerO : string;
      FTurn : integer;
      FPuts : integer;
      procedure Paint;
      function Over : integer;
      function Valid(X, Y : integer) : boolean;
    public
      constructor Create;
      procedure Run;
  end;
  
var
  Game : TGame;  
  
{class TGame}

constructor TGame.Create;
begin
  FillChar(FTable, SizeOf(FTable), 0);
  TextColor(Random(14) + 2);
  Writeln('XO by Nemanja Tatic');
  Writeln;
  Writeln('PlayerX, vase ime:');
  Readln(FPlayerX);
  Writeln('PlayerO, vase ime:');
  Readln(FPlayerO);  
  FPuts := 0;
  FTurn := 1
end;  

procedure TGame.Paint;
var
  i, j : integer;
begin
  ClrScr;
  TextColor(Random(14) + 2);
  Writeln('XO by Nemanja Tatic');
  for i := 1 to 3 do
    begin
      Writeln();
         for j := 1 to 3 do
        case FTable[j, i] of
          0: Write(' ' : 2);
          1: Write('X' : 2);
          2: Write('O' : 2);
        end;
    end;
  Writeln;  
  Writeln;
  case FTurn of
    1: Writeln(FPlayerX, ' je na redu!');
    2: Writeln(FPlayerO, ' je na redu!');
  end;  
  Writeln;
end;

function TGame.Over : integer;
var
  X, Y : integer;
  i, Player : integer;
begin
  Result := -1;
  repeat
    Writeln('Unesite poziciju(x, y):');
    Readln(X, Y);
  until Valid(X, Y);
  FTable[X, Y] := FTurn;
  Inc(FPuts);
  Player := FTurn;
  Inc(FTurn); if FTurn = 3 then FTurn := 1;
  //Vertkalno
  Result := Player;
  for i := 1 to 3 do
    if FTable[i, Y] <> Player then Result := -1; 
  if Result = Player then exit;
  //Horizontalno
  Result := Player;  
  for i := 1 to 3 do
    if FTable[X, i] <> Player then Result := -1;
  if Result = Player then exit;  
  //Dijagonalno
  if ((FTable[1, 1] = FTable[2, 2]) and (FTable[2, 2] = FTable[3, 3])) or
     ((FTable[3, 1] = FTable[2, 2]) and (FTable[2, 2] = FTable[1, 3])) and (FTable[2, 2] <> 0) then
    begin
      Result := Player;
      exit;
    end;  
  if FPuts = 9 then 
    begin
      Result := 0;
      exit;
    end;   
end;

function TGame.Valid(X, Y : integer) : boolean;
begin
  if (X in [1..3]) and (Y in [1..3]) and (FTable[X, Y] = 0) then result := true
  else
    begin
      Writeln('Pogresan ulaz!');
      result := false;
    end;
end;

procedure TGame.Run;
var
  TempInt : integer;
begin
  repeat
    Paint;
    TempInt := Over;
  until TempInt > -1;
  Paint;
  if TempInt = 1 then Writeln(FPlayerX, ' JE POBJEDNIK!');
  if TempInt = 2 then Writeln(FPlayerO, ' JE POBJEDNIK!');
  if TempInt = 0 then Writeln('NERESENO!');
end;

function Play : boolean;
var
  TempStr : string;
begin
  result := false;
  Writeln('Unesite "d" za pocetak igre ili "n" za izlaz:');
  Readln(TempStr);
  if TempStr = 'd' then result := true;
end;
    
begin
  While Play do
    begin
      Game := TGame.Create;
      Game.Run;
      Game.Free; 
    end;
  Writeln('KRAJ PROGRAMA');
  Readln;
end.


[Ovu poruku je menjao Nemanja_666 dana 16.05.2007. u 14:40 GMT+1]
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
77.46.183.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 13:15 - pre 205 meseci
Lepo, lepo... moras samo paziti kod dinamickog kreiranja objekata. Vidim da kreiras nov objekat TGame svaki put kad igrac zeli da pocne novu igru, a nikad ga ne oslobadjas.

Postovacu danas svoj kod kad se vratim kuci pa cemo uporediti kodove i iskomentarisati sta je moglo bolje, sta bi trebalo drugacije i dati konacnu verziju programa.

BTW jos uvek cekamo da neko da ideju kako bismo trebali da cuvamo podatke o sobama za sledeci tutorial.
 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
217.23.204.*



+19 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 13:50 - pre 205 meseci
Ono sam radio u skoli na odmoru. Sad sam popravio.

Za ovu drugi problem. Zasto se muciti kad je najlakse:

Code:

program sobe;
{$mode objfpc}
const
  North = 1;
  West = 2;
  South = 3;
  East = 4;
  NoRoom = 0;
  RoomsCount = 1000;
  
type
  TRoom = record
    Decription : string[20];
    Doors : array[North..East] of word;
  end;
  
var
  Rooms : array[1..RoomsCount] of TRoom;
  
procedure SaveData(FileName : string);
var
  fRoom : file of TRoom;
  i : integer;
begin
  AssignFile(fRoom, FileName);
  Rewrite(fRoom);
  for i := 1 to RoomsCount do
    Write(fRoom, Rooms[i]);
  CloseFile(fRoom);
end;

procedure LoadData(FileName : string);
var
  fRoom : file of TRoom;
  i : integer;
begin
  AssignFile(fRoom, FileName);
  Reset(fRoom);
  i := 0;
  repeat
    Inc(i);
    Read(fRoom, Rooms[i]);
  until FilePos(fRoom) = FileSize(fRoom);  
  CloseFile(fRoom);
end;

begin
  SaveData('c:\room1.dat');
  LoadData('c:\room1.dat')
end.
 
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
77.46.183.*

ICQ: 246436949


+10 Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 14:00 - pre 205 meseci
Odlicno je... doradi samo tako da je moguce imati neogranicen broj soba (memorija treba da bude jedino ogranicenje) i da svaka soba moze da ima opis bilo koje duzine (tesko da ces opisati mracnu pecinu, svetlost koja se probja sa vrha, pacove u vodi i slicno u samo 20 slova).

To bi znacilo da moras malo da modifikujes kod za upis i citanje iz fajla.
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 14:01 - pre 205 meseci
Verujem da većina vas zna šta je magični kvadrat.

Za one koji ne znaju, to je kvadrat sa ciframa, gde je zbir cifara horizontalno, vodoravno ili ukoso isti, odnosno 15 u najprostijem slučaju.

Najprostiji magični kvadrat izgleda ovako:

4 9 2
3 5 7
8 1 6

Kakve sad to ima veze sa ovom pricom?

Postoji nešto što se zove teorija igra. Jedna od osnovnih stvari je upravo igra "tic-tac-toe" ili što bi mi rekli "iks oks".

Cilj igre je imati 3 spojena znaka horizontalno, vodoravno ili ukoso.

Da li sad vidite vezu? :)

Znači posle svakog odigranog poteza treba sabrati cifre koje se nalaze na pozicijama na koje su igraci igrali.

Pobednik je onaj ko prvi skupi 15.

Kod nek napravi neko drugi.

Toliko od mene. :)
viking ®
 
Odgovor na temu

Jovan Prokopović
Jovan Prokopović
Niš

Član broj: 43689
Poruke: 31
*.ptt.yu.



Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?16.05.2007. u 14:20 - pre 205 meseci
U kodu za cuvenje podataka o sobama fali deo koji kaze u koju se sobu ulazi kad se prodje kroz vrata, zato bi ja umesto informacije koja vrata postoje cuvao informaciju u koju sobu vode neka vrata (kad nema vrata vrednost nekog prolaza je 0, a u suprotnom slucaju redni broj sobe), redni broj sobe je ustvari redni broj u nizu.

Otprilike ovako

Code:

TRoom = record
    Decription : string;
    North, West, South, East: integer;
  end;


Time resavamo i portale koji u jednom smeru vode u jednu sobu, a u drugom u neku drugu sobu.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Tutorial :: Pravljenje igara u Pascal-u... moze?
(TOP topic, by X Files)
Strane: 1 2 3

[ Pregleda: 31420 | Odgovora: 53 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.