Hra bludiště – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra bludiště – Pascal – Fórum – Programujte.comHra bludiště – Pascal – Fórum – Programujte.com

 

magelord0
Newbie
8. 3. 2012   #1
-
0
-

Zdarec, mám za úkol naprogramovat údajně jednoduchou hru bludiště, ale ve škole nás učí jen jak vypočítat nějaký obvody čtverců, kvadratický rovnice, dph, objemy nádrže atd. , prakticky nic společnýho s tou hrou.
Tak bych chtěl poprosit o nějakou radu jak postupovat, nebo jak vůbec začít. Našel jsem tu  tohle  ale podle komentářů to asi není úplně štastný řešení. 

A ještě jsem se chtěl zeptat, jestli na to bude mít vliv když to budu programovat v Lazarusu namísto v Delphi (Codegear RAD Studio)

zadání :

1. Panáček nesmí procházet stěnami bludiště ani vyjet mimo něj.
2. Bludiště bude načteno před začátkem hry z externího předem připraveného souboru. Součástí programu budou alespoň 3 vhodně členitá bludiště.
3. Nejlepší výsledky hry budou evidovány v externím souboru a zobrazeny po jejím úspěšném dokončení. Součástí evidence bude název bludiště, jméno hráče a konečný čas hry.
4. Doporučené rozměry bludiště by měly být s ohledem na rozlišení maximálně 40 sloupců a 15 řádků.
5. Pohyb panáčka bude řešen v reálném čase, nikoli postupným vykreslováním obrazovek.
6. K programu vytvořte dokumentaci dle šablony. Součástí dokumentace budou snímky obrazovky představující funkci programu a popis algoritmu kontroly pohybu panáčka (metody detekce stěn, volného místa a cíle) pomocí vývojového diagramu nebo strukturogramu.

Doporučené symboly pro zobrazení ve hře: * - panáček, $ - poklad (cíl), mezera - volný průchod, ostatní znaky jsou stěny

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:b9bb:8ba...–
zlz
~ Anonymní uživatel
634 příspěvků
8. 3. 2012   #2
-
0
-

Ten odkazovaný článek opravdu není úplně šťastné řešení, ale je to lepší než žádné řešení.

Lazarus se od Delphi trochu liší, ale u tohoto programu na rozdíly nejspíš nenarazíš. A jestli je učitel aspoň trochu rozumný, tak ti to uzná i kdyby to v Delphi nešlo. Každopádně se ho raději zeptej.

Potřebuješ nastudovat pole, čtení ze souboru a zápis do souboru. Je to jednoduché a na netu najdeš spoustu příkladů. Pak už to bez problému nějak dáš dohromady - jen testuješ souřadnice panáčka a obsah toho pole. Kdyby ti něco nešlo, tak se zase zeptej.

Nahlásit jako SPAM
IP: 213.211.51.–
magelord0
Newbie
8. 3. 2012   #3
-
0
-

#2 zlz
no moc nevim jak mam udělat aby to bylo v reálnym čase, dokážu si představit, že by se to dycky znova vykreslilo, kdybych hnul s tim "panáčkem" , ale jinak nevim jak to udělat aby to bludiště bylo pořád jedno a jen se pohyboval ten panáček

jinak díky moc, něco takovýho jsem potřeboval číst

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:b9bb:8ba...–
zlz
~ Anonymní uživatel
634 příspěvků
9. 3. 2012   #4
-
0
-

To, že si dovedeš představit řešení s vykreslováním celé plochy a ten požadavek, abyste to tak nedělali, asi odpovídá tomu, jak jste doteď řešili předchozí úlohy. Takže kdyžtak více popiš, co jste dělali a jak bys řešil toto, ať vím o čem je řeč.

Nahlásit jako SPAM
IP: 213.211.51.–
magelord0
Newbie
10. 3. 2012   #5
-
0
-

#4 zlz

 proměnné, konstanta, blok begin ... end. ,načítání dat z klávesnice, výstup na monitor, matematické funkce, podmínkové příkazy, logické operátory, funkce a procedury...   No právě z tohohle vůbec netušim jak to udělat v tom reálnym čase, nevim jestli nám to třeba ještě neřikal, ale jelikož to chce do nějaký půlky dubna, tak se mi moc nechce čekat, že nám to řekne týden před odevzdáním.

Nahlásit jako SPAM
IP: 93.91.144.–
adam
~ Anonymní uživatel
176 příspěvků
10. 3. 2012   #6
-
0
-

To vykreslovani v realny case je jednoduchy. Misto toho abys vykresloval jedno bludiste za druhym, tak nejdriv smazes consoli a pak vykreslis vystup nejakou procedurou. No a kdyz se v bludisti pohnes, tak zavolas tu vykreslovaci proceduru.

Nahlásit jako SPAM
IP: 77.78.83.–
zlz
~ Anonymní uživatel
634 příspěvků
10. 3. 2012   #7
-
0
-

#5 magelord
Takže to byly konzolové programy? (vstup z klávesnice pomoci read/readln a výstup na monitor pomocí write/writeln)

Tak to může být tak jak píše odam, nebo pomocí gotoxy (přesune kurzor na zadané souřadnice).

Nahlásit jako SPAM
IP: 213.211.51.–
magelord0
Newbie
11. 3. 2012   #8
-
0
-

jj přesně jak píšeš readln a writeln, tyjo to s tim mazáním je dost dobrý a přitom jednoduchý.

jinak ještě jedna otázka, je v Lazarusu nějakej příkaz, (nebo knihovna, která by ho obsahovala), kterej by rozpoznával, která klávesa je stisknutá?

díky moc chlapi, pustim se do toho.

Nahlásit jako SPAM
IP: 93.91.144.–
Mircosoft+1
Věrný člen
12. 3. 2012   #9
-
0
-

Readkey ti funguje? Jestli jo, tak asi nic víc nebudeš potřebovat. Pokud nějaká klávesa byla stisknuta, rovnou ji přečte; pokud ne, počká na ni. Jinak na samotné testování je Keypressed.

Načítání bludiště ze souboru: jestli to bude texťák, tak to je skoro stejné jako čtení z klávesnice, jenom místo Readln(proměnná) píšeš Readln(soubor,proměnná), plus na začátku Assign a Reset a na konci Close (viz help). Řádky můžeš načíst do stringů a pak si je buď překopírovat do 2D pole, do kterého ukládáš bludiště, nebo mít bludiště rovnou jako pole stringů (vyjde to nastejno).

Souřadnice panáčka bych si asi uložil zvlášť, a vykresloval bych ho přes Gotoxy a Write. Nebo by to šlo i tak, že by se zapisoval přímo do bludiště - v tom případě by Gotoxy nebylo potřeba, ale zase by se musel před každým krokem smazat z minulé pozice.

Detekce průchodnosti je jednoduchá: podle stisknuté klávesy si zjistíš, na které políčko máš jít. Jestli je tam mezera nebo dolar, jdi tam, jinak zůstaň na místě.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
magelord0
Newbie
15. 3. 2012   #10
-
0
-

Nevíte proč mi to vykresluje s těma mezerama (a s tim ˙ţ )  když je v texťáku nemam ? Nebo spíš jak se toho zbavit.

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:d42e:218...–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2012   #11
-
0
-

#10 magelord
spatnej font a nejaky smeti co tisknes na obrazovku (treba ten prvni radek obsahuje "tab" nebo neco takovyho)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JoDiK
~ Anonymní uživatel
987 příspěvků
16. 3. 2012   #12
-
0
-

#10 magelord
Podle mně je v tom texťáku máš...

Zobraz si obsah toho souboru hexadecimálně a uvidíš...

Nahlásit jako SPAM
IP: 88.103.236.–
magelord0
Newbie
16. 3. 2012   #13
-
0
-

Nemam, ani mezeru, tabulátor, vloží se mi to tam (před to) i když ty dva řádky předtim smažu.

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:45ae:654...–
Mircosoft+1
Věrný člen
16. 3. 2012   #14
-
0
-

Tak sem hoď kompletní zdroják a ten soubor, ať se na to můžeme podívat.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
JoDiK
~ Anonymní uživatel
987 příspěvků
16. 3. 2012   #15
-
0
-

#13 magelord
V tom případě máš chybu v programu...

Nahlásit jako SPAM
IP: 88.103.236.–
magelord0
Newbie
16. 3. 2012   #16
-
0
-

   

program bludiste;

{$APPTYPE CONSOLE}

uses
  SysUtils, Crt;

type
 TBlud = class

   a, b, ch : real;

   procedure nactiSoubor;
   procedure prejdi;
   procedure pohybuj;

 end;

  var
  Blu : TBlud;



{ TBlud }

procedure TBlud.nactiSoubor;
    var f: text;
    pom: string;

    begin
    writeln;

    assign(f, 'blu3.txt');            
    reset(f);                         

    while not eof(f) do
      begin                          
      readln(f, pom);         
      writeln(pom);           
      end;

    close(f);                 
    end;


procedure TBlud.prejdi;
    begin
    gotoXY(4,5);                   
    write('*');                     
    readkey;
    end;


procedure TBlud.pohybuj;
var x,y,p :integer;
ch :char;

procedure DOLEVA;
    Begin
    x:=x-1;
    if x<1 then x:=1;
    gotoxy(x,y);
    if p=1 then write('*') else write(' ');
    gotoxy(x,y);
    End;

procedure NAHORU;
    Begin
    y:=y-1;
    if y<1 then y:=1;
    gotoxy(x,y);
    if p=1 then write('*') else write(' ');
    gotoxy(x,y);
    End;

procedure DOPRAVA;
    Begin
    x:=x+1;
    if x<1 then x:=1;
    gotoxy(x,y);
    if p=1 then write('*') else write(' ');
    gotoxy(x,y);
    End;


procedure DOLU;
    Begin
    y:=y+1;
    if y<1 then y:=1;
    gotoxy(x,y);
    if p=1 then write('*') else write(' ');
    gotoxy(x,y);
    End;

  BEGIN
  x:=4;y:=5;p:=1;
  gotoxy(x,y);
  repeat {nacteni kodu sipky, jedna se o kod klavesy}
  ch:=readkey; {na klavesnici, ne kod ASCII, to jsou kody znaku}
  case ord (ch) of
  {ord je funkce určující pořadí, nebylo možno použít jen ch, kurzorové klávesy se nenačtou jako znak}
  75: DOLEVA; {pohyb odpovidajicim smerem}
  77: DOPRAVA;
  72: NAHORU;
  80: DOLU;
  //32: p:=-p; {kód mezery}
  end;
  until ord (ch)=27; {kod 27 ma klavesa ESC}
  end;


begin
   Blu := TBlud.Create;
   Blu.nactiSoubor;
   Blu.prejdi;
   Blu.pohybuj;
   Blu.Free;
   readln;


 end.

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:45ae:654...–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2012   #17
-
0
-

by byla sranda kdyby to byl  BOM a mezery protoze to ma v UNICODE :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mircosoft+1
Věrný člen
16. 3. 2012   #18
-
0
-

Ten řádek navíc způsobuje Writeln na začátku tblud.nactisoubor. Ale nevím, proč se tam objevil ten divný znak - normálně by to mělo jenom zalomit řádek a hotovo. Možná opravdu záležitost znakové sady, ale nevím, tenhle překladač neznám. Tamto Writeln vyhoď a mělo by to zmizet.

Ještě technická: takhle by hra nefungovala, protože se bludiště jenom zobrazí na obrazovku a tam se s ním nedá pracovat. Bude potřeba uložit ho do proměnné. Ale předpokládám, že to je zatím pracovní verze a ještě to doděláš.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
magelord0
Newbie
16. 3. 2012   #19
-
0
-

#17 KIIV
nevim jestli to je sranda, ale rozhodně jo to byl ten problém... díky

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:45ae:654...–
KIIV
~ Moderátor
+43
God of flame
16. 3. 2012   #20
-
0
-

a mame viteze:  0xFF 0xFE to sou ty znaky co tam mas na zacatku -> unicode

EDIT: sranda jako "tak dlouho se to resi a pritom takova kravina" - jinak to bylo jasny hned jak si sem dal zdrojak ze se to nevypisuje v nem

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
magelord0
Newbie
16. 3. 2012   #21
-
0
-

#18 Mircosoft
No tvořim to takovym poznávacím způsobem, na netu najdu nějakej program a pak ho upravuju a zkoušim co kterej příkaz způsobí. Jsem to chtěl udělat pak u toho chození, že nějak pokud je znak 0 vrat se na původní souřadnice jinak smazani předchozí pozice a přesun na novou

Nahlásit jako SPAM
IP: 2a01:490:11:74d8:45ae:654...–
magelord0
Newbie
31. 3. 2012   #22
-
0
-

 hele mohli by jste mi prosim někdo vysvětlit, jak funguje to od Inc(pomRadek) az k vykesli?

procedure TBludiste.nactibludiste;
    var f: text;
    radek: string;
    pomRadek, pomSloupec: Integer;

  begin
    assign(f,'blu1.txt');                   // přiřadí jména souboru do proměné f
    reset(f);                               // otevře soubor
    pomRadek := 0;                          
    while Not Eof(f) do                     // dokud nedojdeme na poslední řádek souboru (end of file)
    begin
      readln(f, radek);                     //uloží řádek do proměnné
      Inc(pomRadek);
      for pomSloupec := 1 to Length(radek) do
        begin
          Case radek[pomSloupec] of
            '$': begin
                  TPole[pomSloupec, pomRadek] := radek[pomSloupec];
                  vykresli(pomSloupec, pomRadek, '$')
                 end;

            Else begin
                  TPole[pomSloupec, pomRadek] := radek[pomSloupec];
                  vykresli(pomSloupec, pomRadek, radek[pomSloupec])
                 end;
          end;
      end;
    end;
    close(f);                                 //ukončí práci se souborem
  end;
Nahlásit jako SPAM
IP: 93.91.144.–
Mircosoft+1
Věrný člen
31. 3. 2012   #23
-
0
-

Upřímně řečeno, nejsem si úplně jistý. Inc(pomradek) zvětšuje proměnnou Pomradek o 1, tím prochází budoucí bludiště od prvního do posledního řádku - OK. Cyklus for pomSloupec:=1 to Length(radek) prochází řetězec Radek a příslušný řádek bludiště od prvního do posledního znaku - taky OK. Příkaz TPole[pomSloupec,pomRadek]:=radek[pomSloupec] vloží do proměnné Tpole na pomsloupec-tý sloupec a pomradek-tý řádek příslušný znak z řetězce Radek - taky OK, tím se bludiště naplní načtenými daty ze souboru.

Jediné, co nechápu, je ten case. Původní účel asi byl, že políčko se "$" se obsluhuje jinak a místo přímého uložení do pole se z něj třeba udělají souřadnice panáčka a do pole se zapíše volno. Ale panáček měl být *, tak nevím. Taky nevím, co přesně dělá procedura Vykresli - v jejích parametrech nevidím žádné informace o tom, kdy končí řádek, takže by je nejspíš nedokázala na obrazovce správně zalamovat, to bude asi problém. Nejradši bych z tohohle místa kreslení vyhodil a řešil ho až potom během hlavního cyklu hry, tady v tomhle místě by asi nemělo být vůbec.

Místo case bych tam dal if, ale to už je jenom detail, na funkci by to nic nezměnilo.

Potom tam chybí výpočet a zapamatování rozměrů bludiště. Chtělo by to si počet a délku řádků někam uložit.

Jinak to vypadá plus mínus funkčně (tedy jestli je bludiště definované jako array[1..něco,1..něco] of char). Mimochodem, jestli nemáte objektovost v zadání, možná by stálo za to to napsat normálně, bez objektů - bylo by to asi jednodušší.

Nahlásit jako SPAM
IP: 93.91.144.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
magelord0
Newbie
31. 3. 2012   #24
-
0
-

políčko $ mělo byt jako cíl, ale to jsem vyřešil nakonec přes souřadnice

jj mam to přes pole ... TPole: array [1..40, 1..15] of char;

 jinak opět díky

procedure vykresli(var poziceX, poziceY : integer; znak : char);
  begin
    gotoXY(poziceX, poziceY);
    Case znak of
      '0': write(0);
      '$': write(#36);
      else write(' ');
    end;
  end;
Nahlásit jako SPAM
IP: 93.91.144.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

C# - bludiště — založil kena

C#-bludiště — založil Systém

Bludiště — založil don_Dominique

Databáze + bludiště — založil databáze + bludište

Bludiště popis — založil Kralon

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý