» Poradna » Programy

Hra v Delphi

Odpovědět  |  Zobrazit bez stromu  |  Upozornit redakci  |  nových odpovědí: 28/28
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [85.71.163.---]

Dobrý večer,potřeboval bych poradit jak naprogramovat hru v Delphi. Hra je na způsob hada. Představu u o hře bych měl takovou, že při spuštění programu se objeví hrací pole s hadem. Na náhodných místech se bude objevovat jídlo a had ho bude sbírat a bude se sčítat skóre. Prostě klasický had. Každý si tudle "legendární" hru pamatuje.. ;) Potřeboval bych nějaký návod, postup..něco podobnýho podle čeho bych to mohl naprogramovat.

Odpovědi na otázku

 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [80.87.177.---]
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Bylo by fajn něco podobnýho naprogramovat :D

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Opera 9.80

Pouzij draw grid, pripadne stringgrid s uzivatelskym vykreslovanim. Stringgrid ma vyhodu, ze primo v bunkach muzes ukladat hodnoty.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

pomohl by mi to tady někdo naprogramovat. Jsem už zoufalý.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64

A co už máš?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Nemam nic... Jsem si vybral na sebe moc velký sousto.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

Doufám, že to máš jen fakt pro zábavu a není to zadání semestrálky....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

No mám to jako semestrálku ....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64

A termín odevzdání předpokládám do pátku...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

Tak v tom případě nečekej, že jí za tebe bude někdo vypracovávat.....holt si ten předmět zopákneš příští rok. A zajímalo by mě, co jsi dělal o hodinách, když nejsi schopen ani vygenerovat blbé pole!

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Odevzdat to mám až v červnu. A to "blbý pole" jsem schopnej vydegenerovat.... ja na to prostě nemám to myšlení až tak dobrý. A už vůbec nechci aby to za mě někdo dělal ..ja se to chci naučit. Spíš bych potřeboval aby to někdo dělal semnou a vysvětloval mi to nebo mi dal aspon nějakej návod. Chápu, že je by to bylo hodně časově náročné to semnou programovat..

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

No nevím, nevím.....pole se generuje, nikoliv degeneruje. Degenerace je něco jiného (stačí se například podívat na jistého předsedu 1 parlamentní strany, který pořád spí i při prezidentském projevu). Co si domluvit konzultaci s vyučujícím? A nechci být nějak zlý, ale jak si představuješ, že budeš programovat u zkoušky? Tam budeš taky muset programovat sám.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Nemusíš mě tu zesměšňovat...jsem se přepsal to se může stát každému. Nejsem ten typ člověka za kterého mě považuješ ( o hodinách nic nedělá, je na FB) snaží se na hodinách látku pochopit. Blbý na to je, že někdo na to myšlení má a někdo zase ne ..jako já ..neříkám že jsem se nic nenaučil. Naučil, ale s tímdle tu pomoct prostě potřebuju. Ja se to chci naučit a ne to jen zkopírovat a odevzdat..

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

snažím*

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

To tě šlechtí. Takže předpokládám, že spíš holduješ sítím a ostatním předmětům, ale nebyl ti dán programátorský talent. Uznávám, že ne každý tomu přijde na kloub. Ale co se zkusit domluvit s vyučujícím, přijít s tím, že už něco máš naprogramováno a dál zkrátka tápeš? Nevím, jak to máš, jestli máš zkoušku nebo pouze klasifikovaný zápočet, ale pokud jen ten zápočet, tak ti učitel třeba pomůže (s tím že to ve finále samozřejmě nebude za jedna).

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Asi tak, ostatní odborný předměty mi jdou ..ale v programování plavu..Jde o závěrečnou známku 2. ročníku. Blbý je že v 1. ročníku jsme na hodinách programování skoro nic nedělali. Měli jsme mladou učitelku a ve 2. ročníku jsem dostali vyučenýho programátora. Budu muset něco vymyslet a pak za ním dojít..

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

Takže ročníkovka? A on je vedoucí práce? Pokud je férovej a solidní, tak by ti měl pomoct. Chce to mít nějakej základ, kterej bude správně a na to zkusit něco nabalit a pak s ním řešit, proč to nejde nebo jak na to jít jinak.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

Tak děkuju aspon za tu podporu, jdu něco vymyslet.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Opera 9.80

Tak s myšlením ti možná trošku pomůžu. Takové ty "hlavní" stavební prvky:1) herní plocha - Bude to dvourozměrné pole, jehož buňky budou nabývat 4 hodnot (nic, zed, had, jidlo)2) had - Bude to jednorozměrné pole (nebo spíše dynamické pole co se může natahovat) a prvkem tohoto pole budou souřadnice (X,Y) toho jednoho článku hada v té herní ploše. Na indexu 0 (ikdyž ted nevím delphi to možná indexuje od 1, takže prostě na začátku) bude jeho hlava, a postupně bude růst směrem k vyšším indexům.3) Pohyb hada - Vždy když se had pohne o 1 pozici, tak nejprve zkontroluješ zda poslední a předposlední článek hada nejsou na stejné souřadnici, pokud ne tak z herní plochy smažeš článek hada na souřadnici, která je uložená na konci toho "hadího pole" (tj jeho ocas), následně to pole projdeš od posledního prvku do druhého prvku. A v tom cyklu budeš kopírovat souřadnice z předchozího indexu na ten aktuální. (nelze to dělat od začátku - od hlavy, to by sis vše přepsal stejnou hodnotou) To posune téměř celého hada až na hlavu. A pak podle "proměných" určujících směr určíš novou pozici pro hlavu a zapíšeš jí do hadího pole na první index. Pak v herní ploše zkontroluješ zda na souřadnicích nové hlavy něco není a podle toho se zachováš. (když nic nebude, umístíš tam hlavu, když tam bude zed nebo jiná část hada, tak game over a když tam bude jídlo, tak tam zase umístíš hlavu a navíc protáhneš tělo hada o 1 článek (stačí když ten poslední článek zkopíruješ se stejnou souřadnicí a dáš ho na konec toho pole). 4) Reakce na klávesy - Doporučuju proměnou kde bude uložený směr pohybu hada. a při stisku šipky zjistit co se stisklo a podle toho tu proměnou nastavit.5) Snědení jídla - když při pohybu hada dojde ke snězení jidla, tak je nutné vygenerovat nové na náhodných souřadnicích a umístit ho do herního pole. A náhodně souřadnice generovat tak dlouho dokud se netrefíš do místa, kde je "prázdno". Případně třeba vyhlásit výhru, pokud pro postup do dalšího kola stačí sníst X kousků.6) Timer - celou hru bude pohánět timer (nebo nějaký časovač), který s intervalem cca 0,5s (změnou intervalu lze regulovat rychlost pohybu) bude spouštět tu funkci na pohyb hada.Tohle je imho takový ten "základ enginu" co bude potřeba. Jakým způsobem budeš zobrazovat herní plochu a jak budeš detekovat zmáčklé klávesy nechám na tobě. Ale když to co jsem tu popsal převedeš do kódu, tak budeš mít funkční prototyp. Pak to můžeš vyšperkovat třeba tím, že budeš mít různé mapy nějakých tvarů, nebo třeba přecházení mezi horní/dolní a levou/pravou hranou. případně zvuky, atd.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 7 IE 10.0

Já navrhuji si najít tutoriály nebo různé řešené úlohy a postupovat podle nich a zkombinovat více "materiálů" dohromady.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

To jsem zkoušel taky, našel jsem par tutoriálu a nebo samotný kódy, ale nedá se to udělat tak jednoduše když každej to řeší trochu jinak.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

No hlavně obšlehnout kódy umí každej.....učitel bude chtít tvoje vlastní řešení, s tím, že se tě zeptá, co děláš v konkrétních krocích apod.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 7 IE 10.0

To mi je jasné, že to nemůže úplně opsat, ale měl jsem na mysli, spíš, aby z toho řešeného příkladu pochopil postup jak dál

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

Jenže postup tam právě nemusí být úplně zřetelný, obvzlášť pokud tomu programování zrovna neholduje. Proto sem píše, aby mu to někdo rovnou vysvětloval....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

Základy a vzorové příklady se řeší na hodinách a cvičeních. A netuším, jak by na toto téma něco podobného zbastlil (možná by našel něco na to generování pole, ale to je tak všechno). A navíc pozor, učitelé nejsou tak blbí a kontrolují, zda-li to někde neobšlehnul....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows XP Firefox 20.0

Co je to za školu, že se tam učí Delphi? To ještě existuje?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.64  |  [89.24.138.---]

My jsme měli taky Delphi na TUL, Java se pak brala až ve třeťáku. V prváku Assembler a programování PLC, pak Pascal.....druhák Delphi a SQL.....třeťák Java.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.64  |  [213.168.183.---]

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;type TForm1 = class(TForm) snaketimer: TTimer; // Updates the old // direction and // draws the snake procedure snaketimerTimer(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); // Handles key input procedure FormPaint(Sender: TObject); // Draws the form // and resets the // game private public end;var Form1: TForm1; score : integer;Procedure ResetGame; // Resets the snake and scoreFunction HitWall : Boolean; // returns true if snake hits the wallFunction HitFood : boolean; // Returns true if snake hits foodprocedure DrawSnake; // Draws the snake, increase points if // snake hit food, Procedure PlaceFood;procedure DrawPlayfield; // Draws the playfield // (the area which the snake navigates on)Procedure EndGame; // Stops the snake timer and free memory // allocated by the snake arrayimplementation{$R *.dfm}const snakewidth = 10; // specify how wide the snake is snakegrow : integer = 2; // specify how fast snake grows snakecolor : tcolor = clBlack; foodcolor : tcolor = clRed; pfcolor : tcolor = clWhite; // playfield color pfdimention : tpoint = (x:200; y:200); // playfield width and hight pfposition : tpoint = (x:5; y:5); // playfield position on form dup = 0; ddown = 1; dleft = 2; dright = 3; dnone = 4; speed : integer = 100; // snake speed higher value // equals slower snakevar snake : array of tpoint; // dynamic array holding snake // coordinates snakelength : integer; // length of snake food : tpoint; // food position direction : dup..dnone; olddirection : dup..dnone;// HitWall: returns true if snake hits the wallFunction HitWall : Boolean;var i : integer;Begin For i := 0 to snakelength - 1 do begin if (snake[i].x < pfposition.X) or (snake[i].x + snakewidth > pfposition.X + pfdimention.X) or (snake[i].y < pfposition.y) or (snake[i].y + snakewidth > pfposition.y + pfdimention.y) then begin hitwall := true; exit; end; end; hitwall := false;End;// HitFood: Returns true if snake hits foodFunction HitFood : boolean;var i : integer;Begin for i := 0 to snakelength - 1 do begin if (snake[i].x = food.x) and (snake[i].y = food.y) then begin hitfood := true; exit; end; end; hitfood := false;End;// PlaceFood: Draws the food on the playfield on a random locationProcedure PlaceFood;Begin food.x := random(pfdimention.x - snakewidth - pfposition.x) + pfposition.x; food.y := random(pfdimention.y - snakewidth - pfposition.y) + pfposition.y; while (pfdimention.x - (food.x - pfposition.x)) mod snakewidth <> 0 do inc(food.x); while (pfdimention.y - (food.y - pfposition.y)) mod snakewidth <> 0 do inc(food.y); if HitFood then PlaceFood; Form1.Canvas.Brush.Color := foodcolor; Form1.Canvas.Pen.Color := snakecolor; Form1.Canvas.Ellipse(food.x + 1, food.y + 1, food.x + snakewidth - 2, food.y + snakewidth - 2);End;procedure DrawSnake;var i : integer;Begin if direction = dnone then exit; Form1.Canvas.Brush.Color := pfcolor; Form1.Canvas.Pen.Color := pfcolor; Form1.Canvas.Rectangle(snake[snakelength - 1].X, snake[snakelength - 1].Y, snake[snakelength - 1].X + snakewidth, snake[snakelength - 1].Y + snakewidth); For i := snakelength - 1 downto 1 do snake[i] := snake[i-1]; snake[0]:= snake[1]; case direction of dup : dec(snake[0].y, snakewidth); ddown : inc(snake[0].y, snakewidth); dleft : dec(snake[0].x, snakewidth); dright : inc(snake[0].x, snakewidth); end; if HitFood then begin inc(score, 5); inc(snakelength, snakegrow); setlength(snake, snakelength); for i := 1 to snakegrow do snake[snakelength-i] := snake[(snakelength-snakegrow)-1]; PlaceFood; end; if HitWall then begin EndGame; ResetGame; end; Form1.Canvas.Brush.Color := snakecolor; Form1.Canvas.Pen.Color := snakecolor; case direction of dup : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y+1, snake[0].X + snakewidth-1, snake[0].Y + snakewidth+1); ddown : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y-1, snake[0].X + snakewidth-1, snake[0].Y + snakewidth-1); dleft : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y+1, snake[0].X + snakewidth+1, snake[0].Y + snakewidth-1); dright : Form1.Canvas.Rectangle(snake[0].X-1, snake[0].Y+1, snake[0].X + snakewidth-1, snake[0].Y + snakewidth-1); end;End;// DrawPlayField: Draws the playfield (the area where the snake navigates on)procedure DrawPlayfield;begin Form1.Canvas.Brush.Color := pfcolor; Form1.Canvas.Pen.Color := pfcolor; Form1.Canvas.Rectangle(pfposition.x, pfposition.y, pfdimention.x + pfposition.x, pfdimention.y + pfposition.y);end;// ResetGame: Resets the game; resets the snake and scoreProcedure ResetGame;var i : integer;Begin form1.snaketimer.enabled := false; randomize; snake := nil; snakelength := 10; setlength(snake, snakelength); snake[0].x := pfposition.x + (pfdimention.x div 2) - (snakewidth div 2); snake[0].y := pfposition.y + (pfdimention.y div 2) - (snakewidth div 2); while ((pfdimention.x-(snake[0].x-pfposition.x)) mod snakewidth <> 0) do inc(snake[0].x); while ((pfdimention.y-(snake[0].y-pfposition.y)) mod snakewidth <> 0) do inc(snake[0].y); for i := 1 to snakelength - 1 do snake[i] := snake[0]; score := 0; food.x := 0; food.y := 0; direction := dright; olddirection := direction; DrawPlayfield; DrawSnake; PlaceFood; form1.snaketimer.Interval := speed; form1.snaketimer.enabled := true;End;// EndGame: Stops the snake timer and free memory allocated by the snake arrayProcedure EndGame;Begin form1.snaketimer.enabled := false; snake := nil;End;// snaketimerTimer: Updates the old direction and draws the snakeprocedure TForm1.snaketimerTimer(Sender: TObject);begin olddirection := direction; DrawSnake;end;// FormKeyPress: Handles the key input (#32 = space, stops the snake movement)procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);begin case key of 'w', 'W': if olddirection <> ddown then direction := dup; 's', 'S': if olddirection <> dup then direction := ddown; 'a', 'A': if olddirection <> dright then direction := dleft; 'd', 'D': if olddirection <> dleft then direction := dright; #32: direction := dnone; end;end;// FormPaint: Draws the form and resets the gameprocedure TForm1.FormPaint(Sender: TObject);begin form1.ClientWidth := pfdimention.x + (pfposition.x * 2); form1.ClientHeight := pfdimention.y + (pfposition.y * 2); form1.Color := clBlack; ResetGame;end;end.Našel jsem kod na hada, který je podle mě dobře řešený. Kod si ještě upravím aby mi vyhovoval a pozměním pár věcí podle sebe, ale základy řešení bych ponechal. Snažím se pochopit jak ruzne funkce a procedury byli řešeny. Co mají dělat je mi jasné, ale to jak se řešili v tom trochu plavu. Chtěl bych proto poradit. Kdyby mi tu třeba někdo ke každy funkci a proceduře napsal takovej menší popisek co se tam děje. Dám příkladProcedure PlaceFood; \\ souradnice jidla x se nastavy na nahodnou....atd. Nechci to všechno podrobně, ale jen tak stručně. Jde mi to abych dobře pochopil algoritmus. Je mi jasné, žeto bude asi trochu náročné na čas, ale kdyby se někdo tak ochotný tu našel a pomohl by mi stim trochu, byl bych mu moc zavázán.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Jídlo, Skóre



Určitě si přečtěte