Eli kun minulla on tällainen koodi joka tarkistaa onko ristinollassa rivejä. kohta-taulukko kertoo mikä merkki on missäkin.
for i := 1 to 3 do begin if (kohta[i,1] = kohta[i,2]) and (kohta[i,1] = kohta[i,3]) then voittaja := kohta[i,1] else if (kohta[1,i] = kohta[2,i]) and (kohta[1,i] = kohta[3,i]) then voittaja := kohta[1,i] else end; if (kohta[1,1] = kohta[2,2]) and (kohta[1,1] = kohta[3,3]) then voittaja := kohta[1,1] else if (kohta[3,1] = kohta[2,2]) and (kohta[3,1] = kohta[1,3]) then voittaja := kohta[3,1];
Mutta jostain syystä se vaatii, että merkkejä on vähintään yksi joka rivillä ja sarakkeella. Mikä vikana?
...Outoa. Kirjoitin saman itse hieman eri muotoon, toimiiko tämä? Tuota viimeistä else-sanaa ei tarvita.
for i := 1 to 3 do begin {Onko vaakarivillä voittoa?} if (kohta[i,1] = kohta[i,2]) and (kohta[i,1] = kohta[i,3]) then begin voittaja := kohta[i,1]; {Jos ei tuolla, niin entäs sitten pystyrivillä?} end else if (kohta[1,i] = kohta[2,i]) and (kohta[1,i] = kohta[3,i]) then begin voittaja := kohta[1,i]; end; end; if (kohta[1,1] = kohta[2,2]) and (kohta[1,1] = kohta[3,3]) then begin voittaja := kohta[1,1]; end else if (kohta[3,1] = kohta[2,2]) and (kohta[3,1] = kohta[1,3]) then begin voittaja := kohta[3,1]; end;
Eikun ahaa... Löysin vian, kun mietin vähän. Voitto tulee tuolla koodilla myös, jos on rivi tyhjiä...
Eli tarkista myös, että jokaisessa tarkistettavassa kohdassa on merkki.
lainaus:
Eikun ahaa... Löysin vian, kun mietin vähän. Voitto tulee tuolla koodilla myös, jos on rivi tyhjiä...
Eli tarkista myös, että jokaisessa tarkistettavassa kohdassa on merkki.
Siis kyllä minulla löytyy tämmönenkin.
Loogisesti ajatellen kaiken pitäisi olla kunnossa, ja ainoa mahdollinen vika on tuossa tarkistus koodissa.
if voittaja = 1 then begin {nolla voittaa} end else if voittaja = 2 then begin {risti voittaa} end else begin end;
Niin ja olisi varmaan pitänyt mainita heti alussa, että
ohjelma toimi ihan hyvin sisäkkäisillä if-lauseilla. Se oli kuitenkin niin sekavan näköistä koodia, joten ajattelin muokata sen tämmöiseen muotoon. Eli ongelmaa ei periaatteessa ole, mutta ihmetyttää miksi se ei toimi tuolla lailla.
Ei vaan katsos - jos jollain rivillä/sarakkella on voitto, niin myöhemmin tulevat mahdolliset tyhjät rivit nollaavat voittajan. Laita siis tarkistuskoodiin noiden voitta := ... - rivien perään komento break;, joka keskeyttää tarkastuksen (silmukan suorituksen, siis)
Kiitos!
En ollut kyllä ikinä kuullutkaan silmukan katkasemisesta (johtuen siitä, että en ole varsinaisesti opiskellut ohjelmointia, vaan opetellut ne asiat mitä olen tarvinnut)
Se alkoi heti toimia kun lisäsin tämän viimeiseksi silmukkaan:
if voittaja <> 0 then break;
Aihe on jo aika vanha, joten et voi enää vastata siihen.