Lazarus - Piškvorky

Programovacie jazyky, rady, poradňa...
frazer
Novice
Novice
Príspevky: 4
Registrovaný: 27 dec 2013, 20:34

Lazarus - Piškvorky

Príspevok od používateľa frazer »

Ahojte, potrebovala by som pomôcť. Potrebujem v Lazaruse naprogramovať jednoduché piškvorky na 4 vitazne pre dvoch hráčov. Urobila by som to ako obrázky / tlačidlá, po kliknutí na nich sa vykreslí krúžok / krížik. Problém mám však s vytvorením funkcie / kontrolou, či niekto vyhral. Viete mi s tým pomôcť? Musí to byť urobené v Lazaruse. Za pomoc Vám vopred patrí veľká vďaka!
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: Lazarus - Piškvorky

Príspevok od používateľa xadman »

Najľahšie pre teba bude natvrdo cez if skontrolovať všetky riadky, stĺpce a diagonály.
frazer
Novice
Novice
Príspevky: 4
Registrovaný: 27 dec 2013, 20:34

Re: Lazarus - Piškvorky

Príspevok od používateľa frazer »

no len o to ide, ze ako to skontrolujem, ked mam pole 3x3, cize tam mam 9-krat image, a do kazdeho sa mi po kliknuti vykresli kruzok/krizik podla toho, ci je boolean true alebo false?
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: Lazarus - Piškvorky

Príspevok od používateľa xadman »

no, keď chceš piškvorky na 4 víťazné, musíš mať pole 4x4.

pre krúžok si do pola zapíšeš 1, pre krížik 2 a keď je miesto prázdne, bude tam 0.

potom zisťuješ, či v celom riadku/stĺpci/diagonále sú jednotky alebo dvojky
frazer
Novice
Novice
Príspevky: 4
Registrovaný: 27 dec 2013, 20:34

Re: Lazarus - Piškvorky

Príspevok od používateľa frazer »

no áno, lenže takto tam budem mať pre každý z image-ov veľké množstvo if-ov.. skôr som myslela či sa nedá na to vytvoriť nejaká funkcia/predpis ktorá by to kontrolovala, miesto toho, aby som vytvárala veľké množstvo if-ov..
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: Lazarus - Piškvorky

Príspevok od používateľa xadman »

Skús nejako takto. Kod asi nebude syntakticky správne, tak si ho oprav

Funkcia na ocheckovanie vsetkých riadkov. Stačí ju trochu prerobiť, a máš aj stĺpce.

Kód: Vybrať všetko

function isWin(pole, player){
    function checkRow(row){
        for x=0 to 3 do{
             if (not row[x] == player) { return false; }
        }
        return true; 
    }
    return checkRow(pole[0]) || checkRow(pole[1]) ..... atd vsetky riadky
}
winner = isWin(2D_pole, 1);
winner = isWin(2D_pole, 2);
frazer
Novice
Novice
Príspevky: 4
Registrovaný: 27 dec 2013, 20:34

Re: Lazarus - Piškvorky

Príspevok od používateľa frazer »

no ak mám byť úprimná, veľmi to nepomohlo, lazarus mi to ani náhodou neskompiluje.. nevie mi niekto pomôcť s kódom v lazaruse?
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: Lazarus - Piškvorky

Príspevok od používateľa Everhard »

celkom nerozumiem co myslis tymi imagami.

urob si dvojrozmerne pole typu Byte napr 20x10 ako hracia plocha. nazaciatku maj v kazdej bunke hodnotu 0. pocas hry zapisujes tahy pre prveho hraca znak 1, pre druheho hraca znak 2.
nacitas si do pamate jeden obrazok X (1), druhy obrazok O (2). tie budes vykreslovat nejakou funkciou Vykresli(hrac, poziciaX, poziciaY)

ovladacia plocha bude jeden velky obrazok (image), na ktory sa bude klikat mysou. zvolis si kolko pixelov bude mat mriezka (grid), napr 15x15px pre jeden stvorcek. a podla toho si budes prepocitavat poziciu v tej ploche 20x10.

vykreslenie si navrhnes bud jednu funkciu ktora toto pole 20x10 po kazdom tahu poznaci tah do pola 20x10 a potom to pole jednorazovo vykresli na tvoj velky obrazok. alebo si poznacis tah do 20x10 pola a vykreslis len jeden posledny tah (stvorcek) co je menej narocne na grafiku postacuje to.

striedanie hracov si zabezpecis jednou premennou kde sa bude striedat hodnota 1 a 2 (podla toho, ktory hrac je na tahu).

overenie vyhry, kto vyhral:
vymyslam to teraz z hlavy. ak hras na 4 vytaznych ako si chcela, po kazdom tahu overis pre ten posledny tah vodorovne, zvislo, diagonalu a druhu diagonalu.
cize napr. pre vodorovne to bude od toho tahu 3 bunky dozadu a 3 bunky dopredu (treba osetrit aby si nevysla von z pola, lebo ti bude pisat error ze si vysla von z pola), ci sa nachadza v tychto 7 polickach 4 za sebou rovnakych znakov, ak hej, hrac ten posledny vyhral. a vykresli to nejakou ciarou cez tie 4 bunky.
premennu na striedanie hracov nastav na 3, a to bude znamenat koniec hry.
lowmanek
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 977
Registrovaný: 04 apr 2010, 8:53
Bydlisko: 221B Baker Street

Re: Lazarus - Piškvorky

Príspevok od používateľa lowmanek »

Everhard ti to napisal pekne, s tou kontrolou vyhry ti to uz asi nechcel komplikovat, ale dalo by sa to aj trochu elegantnejsie.
Hrac H klikne na stvorec so suradnicami X, Y.
Zacne cyklus s kodom

Kód: Vybrať všetko

vysledok = 0
for I := 1 to 8 do begin
uz_bodov = 1;
vysledok = kontrola(H, X, Y, I, uz_bodov);
if (vysledok)
    break;
end;
A funkcia kontrola vyzera takto

Kód: Vybrať všetko

switch(I) begin
   case 1: X := X - 1;       //kontrola vodorovne vlavo
               break;
   case 2: X := X + 1;     //vodorovne vpravo
               break;
   case 3: Y := Y - 1       //vertikalne hore
               break;
   case 4: Y := Y + 1;     //vertikalne dole
               break;  
   case 5: X := X - 1; Y := Y - 1   //po diagonale vlavo dole
               break;
    atd az po case 8
end;
if (X > 0 and X < sirka_pola and Y > 0 and Y < vyska_pola and pole[X,Y] = H) begin
    uz_bodov := uz_bodov+1;
    if ( uz_bodov = do_kolko_sa_hra)
         return 1;
    return kontrola(H, X, Y, I, uz_bodov);
end;
return 0;
Nepoznam dobre pascal, takze si oprav syntax. Pointa je v tom, ze cisla v cykle od 1 po 8 znacia smery. Podla tohto cisla sa upravi X a Y na zaciatku funkcie kontrola. Potom sa zisti, ci je vobec tento bod v poli a "ma" ho hrac H. Ak ano, tak sa pripocita "bod" a ak uz ich je dost, tak funkcia vrati 1, ak este nie, pokracuje v kontrole, ale so zmenenymi suradnicami a zvacsenym poctom bodov. Ak vsak bod nebol v poli alebo ho nemal hrac H, tak sa vrati hodnota 0.
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: Lazarus - Piškvorky

Príspevok od používateľa Everhard »

lowmanek napísal:...Pointa je v tom, ze cisla v cykle od 1 po 8 znacia smery. Podla tohto cisla sa upravi X a Y na zaciatku funkcie kontrola. Potom sa zisti, ci je vobec tento bod v poli a "ma" ho hrac H. Ak ano, tak sa pripocita "bod" a ak uz ich je dost, tak funkcia vrati 1, ak este nie, pokracuje v kontrole, ale so zmenenymi suradnicami a zvacsenym poctom bodov. Ak vsak bod nebol v poli alebo ho nemal hrac H, tak sa vrati hodnota 0.
Prepac, ale ani po 15min som z kodu ani popisu nepochopil tu cast, ako funkcia kontrla() beha po polickach:
a) Ked sa hra na 4 vyherne, zbehne 8-krat a prekontroluje kazdy smer teda 8-krat po 7policok(3+1+3)? Lebo je zbytocne kontrolovat kazdy smer dvakrat. Vertikala zhora-dole je to iste ako zdola-hore. Staci prejst 4-krat po 7policok a zastavit sa, ked sa najdu 4 rovnake policka zasebou, ako som pisal v mojom prvom prispevku. Toto riesenie sa mi najviac pozdrava. Teda spolu prejst maximalne 28 policok.
b) Alebo ten tvoj kod skusi vsetky 4-rice? Cize pri vertikale 4-krat 4policka, spolu 16. Pri vsetkych smeroch 16*8=128policok. To by bolo dost zle neefektivne riesenie. Ale fungovalo by.
c) Este do tretice som kod pochopil tak, ze ten tvoj algoritmus od posledneho tahu zkontroluje 8smerov - od posledneho tahu hore, od posleneho tahu vpravohore, vpravo, atd. Ale takyto algoritmus by bol zle navrhnuty, lebo najde iba vyherne 4rice ktore vznikli doplnenim tahu do 3jice. Ale nenajde 4rice ktore vznikli z prerusenej 4rice (ked do prerusenej 4rice bol dopisany tah). Snad je to zrozumitelne :)
Napísať odpoveď