Předmět Autor Datum
Ahoj, poradil, znamená, něco už mám a nevím jak dál, nebo nevím jak začít, nebo napsal za mě?:-)
MašinkaTomáš 05.05.2013 13:18
MašinkaTomáš
:D,... jsem na tom hodně bídně, takže nevím jak začít. Nechci aby to za mě někdo napsal, chtěl bych…
Delmos 05.05.2013 13:25
Delmos
Umíš anglicky? Pokud ano, na google toho spusty najdeš :-)
MašinkaTomáš 05.05.2013 13:28
MašinkaTomáš
Na netu jsem hledal dlouho a už na to nemam nervy. Pokaždý, když něco najdu tak je to řešení na mě a…
Delmos 05.05.2013 13:31
Delmos
Nejsem si jist, zdali je programování jednoduché, pokud máš konrétní problém, rád poradím, ale jinak…
MašinkaTomáš 05.05.2013 13:36
MašinkaTomáš
Chápu, že není lehký. Řeknu to jinak..potřeboval bych aby to někdo řešil semnou udělal mi takovej ná…
Delmos 05.05.2013 13:41
Delmos
Je to časově náročné, ja teď nemám tolik času abych ti pomohl, pochybuji že se někdo hodný najde. Př…
MašinkaTomáš 05.05.2013 13:42
MašinkaTomáš
Todle chápu, ale děkuju :) budu se to snažit nějak vyřešit.
Delmos 05.05.2013 13:44
Delmos
Největší radost a nejvíc zkušeností budeš mít, když to uděláš sám.
MašinkaTomáš 05.05.2013 13:46
MašinkaTomáš
Jak "jednoduše"? Toto nie je aplikácia typu "Hello world", tu už musíš niečo aj vedieť... jsem na t…
pme 05.05.2013 13:45
pme
Mám představu jak by hra měla vypadat. Při spuštění programu by se mělo objevit hrací pole s hadem.…
Delmos 05.05.2013 14:00
Delmos
:-) Základ ako má hra vyzerať už máš, teraz tá "jednoduchšia" časť... Skús pozrieť na hada v zdroják…
pme 05.05.2013 14:08
pme
asi mi chvilku zabere než se v tom vyznám .. :D
Delmos 05.05.2013 14:17
Delmos
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; t…
Delmos 08.05.2013 20:46
Delmos
procedure DrawSnake; var i : integer; Begin if direction = dnone then exit; Form1.Canvas.Brush.Color…
Delmos 08.05.2013 20:47
Delmos
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…
Delmos 08.05.2013 20:47
Delmos
Komentáře přece už v tom kódu máš.
Wikan 08.05.2013 20:50
Wikan
ja vím, ale ty kontáře popisujou co ma funkce/procedura vykonat..ale ne jak je řešena..nebo jak bych…
Delmos 08.05.2013 20:52
Delmos
co se vní vykonává*
Delmos 08.05.2013 20:53
Delmos
A co kdyby ses taky trochu snažil? Je to tvůj úkol.
Wikan 08.05.2013 20:54
Wikan
Ved si tu procedutru najdi v zdrojakoch a citaj si ze co jak vykonava. Citat mas kod, ne komentare.
MM.. 08.05.2013 20:57
MM..
Ty chceš komentovať každý príkaz? Čo si sa udrel do hlavy? Ty si niečo skopíroval a nemáš ani páru o…
pme 08.05.2013 20:59
pme
Upravil jsem ti prvni cast - hned je to lip citelne. Vezmi si vzdy jednu proceduru nebo funkci a ok…
Jan Fiala 08.05.2013 21:17
Jan Fiala
jen abych se do toho dostal.. pfdimention : tpoint = (x:200; y:200); // playfield width and hight pf…
Delmos 08.05.2013 22:01
Delmos
jeto myšleno jako zed ??
Delmos 08.05.2013 22:02
Delmos
Anglicky moc neumim, ale nejak jsem si to přeložil ..
Delmos 08.05.2013 22:18
Delmos
Z překladu by to měla být pozice hrací plochy ve formuláři, asi tam je okraj.
albru123 09.05.2013 07:33
albru123
Sirka zdi. Kdyz se podivas do kodu, tak pokud pozice hada dosahne pfposition, tak hra konci.
Jan Fiala 09.05.2013 12:32
Jan Fiala
Chtěl bych se zeptat ohledně toho vykreslení hracího pole (DrawPlayfield) Jestli jsem vlastně pochop…
Delmos 09.05.2013 23:07
Delmos
tpoint len uchovava dve celociselne hodnoty, nemusi to byt bod. Zmysel tych hodnot moze byt cokolvek…
MM.. 10.05.2013 00:34
MM..
Musím to mít v delphi... A trochu blbě si mě pochopil...
Delmos 10.05.2013 00:47
Delmos
.. resp. tym ze do FormPaint (co je asi OnPaint event to musis si pozret ty v tvojom projekte) nasta…
MM.. 10.05.2013 00:49
MM..
FormPaint je udalost, ktera se vola pri potrebe o prekresleni formulare (pohnes s nim, prekreje jej… poslední
Jan Fiala 10.05.2013 12:51
Jan Fiala

:D,... jsem na tom hodně bídně, takže nevím jak začít. Nechci aby to za mě někdo napsal, chtěl bych pochopit jak se došlo k výsledku.¨
Ta hra by měla mít nějaký kritéria, jakože když had narazí do zdi nebo sam do sebe ukončí se hra. Bude se počítat skóre při sbírání jídla. A nějaký 3 obtížnosti podle rychlosti. A to, že se při každým sebrání jídla zvětší to se snad ani řešit nemusí.

Jak "jednoduše"? Toto nie je aplikácia typu "Hello world", tu už musíš niečo aj vedieť...

jsem na tom hodně bídně

Toto nenaprogramuješ ani za pol roka...
Máš aspoň predstavu ako má hra vyzerať, čo asi budeš musieť vymyslieť/naprogramovať? Máš už nejaký "bojový plán" na papieri?
Pre Tvoju predstavu:

initialise variables for game

wait for user input to start game

while ( player is alive )

move player

check players status ( ie. is the snake still alive )

check for user input and apply to the sname

draw background

draw snake

endwhile

cleanup

exit

Veľa šťastia. ;-)

Mám představu jak by hra měla vypadat. Při spuštění programu by se mělo objevit hrací pole s hadem. Když hrat sebere jidlo tak na náhodným místě se objeví další a mělo by se počítat skóre při sebrání jídla. Když narazí do sebe nebo do stěny ukončí se hra. Nějak takhle bych sito představoval..

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 score
function HitWall : Boolean; // returns true if snake hits the wall
function HitFood : Boolean; // Returns true if snake hits food
procedure 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 array
implementation

{$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 snake
var
    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 wall
function 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 food
function 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 location
procedure 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
    begin
        inc(food.x)
    end;
    while (pfdimention.y - (food.y - pfposition.y)) Mod snakewidth <> 0 do
    begin
        inc(food.y)
    end;
    if HitFood then
    begin
        PlaceFood
    end;
    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 score
Procedure 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 array
Procedure EndGame;
Begin
form1.snaketimer.enabled := false;
snake := nil;
End;
// snaketimerTimer: Updates the old direction and draws the snake
procedure 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 game
procedure 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říklad
Procedure 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.

Ty chceš komentovať každý príkaz? Čo si sa udrel do hlavy? Ty si niečo skopíroval a nemáš ani páru o tom čo tie príkazy znamenajú...
Tu nejde o logiku programu, tú pochopíš po prezretí kódu raz-dva.(V tomto je Delphi takmer neprekonateľné na rozdiel od iných jazykov. :-p).
Ty máš zásadný problém, že neovládaš programovanie ako také...

Upravil jsem ti prvni cast - hned je to lip citelne.

Vezmi si vzdy jednu proceduru nebo funkci a okomentuj co nejvic radku, co si myslis, ze to dela. Bud to pochopis sam, nebo to proste posli sem na konzultaci.

Vic se naucit a lide zde uvidi snahu a pomohou.
Jde o to, aby ses neco naucil. Kdyz uz jsi ten kod nepsal, aspon musis rozumet, o co tam jde. Je to jen par radku kodu.

jen abych se do toho dostal..
pfdimention : tpoint = (x:200; y:200); // playfield width and hight
pfposition : tpoint = (x:5; y:5); // playfield position on form

Pfdimention to chápu to je šírka víška hracíplochy a Pfposition je teda co ? Z toho komentaře to má být pozice hrací plochy na formulaři ?

když pozměním v kodu x a y tak se mi okraj hraci plochy zvětší/zmenší (podle změny)

Chtěl bych se zeptat ohledně toho vykreslení hracího pole (DrawPlayfield)
Jestli jsem vlastně pochopil co se děje v proceduře.

var
pfdimention : tpoint = (x:200; y:200);\\ hrací plocha je jakýsi bod o výšce a šířce 200 pixelů
pfposition : tpoint = (x:5; y:5)\\ umístění na formuláři (jakási pomyslná zeď) je bod o výše a šířce 5 pixelů
pfcolor : tcolor = clWhite; \\ barva hrací plochy nastavena na bílou

procedure DrawPlayfield;
begin
Form1.Canvas.Brush.Color := pfcolor; \\ barva plátna nastavena na bílou
Form1.Canvas.Pen.Color := pfcolor; \\ barva pera natavena na bílou
Form1.Canvas.Rectangle(pfposition.x, pfposition.y, pfdimention.x + pfposition.x, pfdimention.y + pfposition.y);
end
\\ na form1 se vykreslí čtvercový bod který bude mít odsazení od formuláře Left/Top 5 pixelů a bude mít výšku/šířku nastavenou na 200 pixelů.

procedure TForm1.FormPaint(Sender: TObject);
begin
form1.ClientWidth := pfdimention.x + (pfposition.x * 2);
form1.ClientHeight := pfdimention.y + (pfposition.y * 2);
form1.Color := clBlack;
end

\\ Na výšku/šířku formuláře se nastaví naše hrací pole a barva formuláře je černá.
Takže tím pádem, ta naše pomyslná zeď dostane barvu černou protože to je ten formulář. ??
Kdyby Vám něco nesedělo nebo to chápu špatně byl bych moc rád kdyby jste mě opravili a dovysvětlily.

tpoint len uchovava dve celociselne hodnoty, nemusi to byt bod. Zmysel tych hodnot moze byt cokolvek. Trebars v tom pripade vyska a sirka nejakej plochy.

Brush neni platno ale stetec (= Brush po anglicky), t.j. farba vyplne ak kreslim nejaky vyplnitelny objekt, napr. obdlznik.

Na form1 sa nenakresli bod, ale obdlznik (= Rectangle po anglicky).

procedura FormPaint je tam pouzita dost dementne, nastavuje to len parametre objektu form1, ta procedura je ale volana systemom (kniznicou) z uplne inych dovodov. Niekde tu sirku platna autor nastavit musel, tak to robi tam lebo ine ho nenapadlo.

Vseobecne ak sa pouziva nejaky kniznicny objekt napr. ten Form.Canvas tak si nastuduj ze jake to ma parametre a co vsetko musis tomu objektu nastavit, a jake procedury ti system bude volat a kedy. Snad k tomu delphi bol pribaleny aj nejaky help, referencna prirucka, apod. Ak nemas tak google Form.Canvas reference, apod. Alebo si googli rovno slova programovani v delphi pro zacatecniky a citaj si nejaky tutorial od zaciatku. Aby si aspon chapal jak sa strukturuje Windows program a co to je riadenie eventami apod.

P.S> a nechapem preco to nutne chces v Delphi, imho mrtva platforma.

.. resp. tym ze do FormPaint (co je asi OnPaint event to musis si pozret ty v tvojom projekte) nastavuje clientwidth a height co je asi sirka a vyska okna na pevnu hodnotu, a OnPaint je volany pri kazdom prekresleni okna, by mal tym padom dosiahnut ze sa okno neda zvacsit/zmensit. Nie som si isty ptz delhi nerobim a neda sa k tomu najst poriadna referencia googlom, je to mrtve.

FormPaint je udalost, ktera se vola pri potrebe o prekresleni formulare (pohnes s nim, prekreje jej jiny formular apod.).
V teto procedure by melo probehnout veskere kresleni na Canvas formulare.
Jak psal MM, nastaveni ClientWidth a ClientHeight staci pouze jednou v OnCreate formulare. Je to oblast, na ktere muzes umistovat komponenty apod.
To same plati o nastaveni cerne barvy formulare.

V podstate to melo probehnout nasledovne:
inicializace hry - vygenerujes si pole (2 rozmerna hraci plocha) s hadem, jidlem, prekazkami, ...
V OnPaint formulare budes mit pouze vykresleni pole na plochu formulare, nic jineho - obycejne 2 cykly v sobe, ktere vykresli mrizku a hada.
Po stisku klavesy nebo v udalosti Timeru budes aktualizovat pouze pole, zadne kresleni a na konci obsluhy zavolas Form.Refresh, Form.Invalidate pripadne jinou metodu, ktera vynuti prekresleni formulare

Zpět do poradny Odpovědět na původní otázku Nahoru