ITV0110 2. töö 2015: CSS, javascript: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
Uus lehekülg: 'left|Täringud <!-- == <font color="red"> NB! </font> == <font color="red"> Dijkstra serveris, kuhu mh praksid tuleb laadida, tekkis tõrge sisselogimise s...'
 
 
(ei näidata sama kasutaja 50 vahepealset redaktsiooni)
1. rida: 1. rida:
[[Pilt:dice.jpg|left|Täringud]]
[[Pilt:Battleship2.jpg|left|Battleship]]


<!--


<!--
== <font color="red"> NB! </font> ==
== <font color="red"> NB! </font> ==


<font color="red">
<font color="red">
Dijkstra serveris, kuhu mh praksid tuleb laadida, tekkis tõrge sisselogimise süsteemis (tõrge on seotud ülikooli üldise sisselogimissüsteemiga). Mitte keegi sisse logida ei saa. Eeldatavalt parandatakse tõrge esmaspäeva jooksul.
Hetkel on praksiülesanne muutmisel, palun ignoreeri allolevat poolikut teksti!
</font>
</font>


13. rida: 14. rida:
== Mida tuleb teha ==
== Mida tuleb teha ==


Sinu ülesandeks on kirjutada brauseris jooksev, javascripti ja css-i peale ehitatud ülilihtne kahe inimese
Sinu ülesandeks on kirjutada  
täringumäng [http://en.wikipedia.org/wiki/Pig_%28dice_game%29 Pig], konkreetsemalt selle kahe mängija versioon. Loe kõigepealt läbi ülevaade
[https://en.wikipedia.org/wiki/Battleship_%28game%29 laevade pommitamise] mängu brauseris töötav lihtsustatud eriversioon, kasutades ainult html-i, css-i ja javascripti.  
[http://en.wikipedia.org/wiki/Pig_%28dice_game%29 wikipediast] ja vaata tausta mõttes lisaks [http://cs.gettysburg.edu/~tneller/resources/pig/index.html optimaalset programmi ja kogumikku artikleid] (need on küll ühe täringuga versiooni jaoks).


Big Pig reeglid vastavalt [http://en.wikipedia.org/wiki/Pig_%28dice_game%29 wikipedia lingile] on siis:
Loe kõigepealt läbi ülevaade [https://en.wikipedia.org/wiki/Battleship_%28game%29 wikipediast] ja mängi katseks standardset täisversiooni [http://en.battleship-game.org/ siin] või [http://boomboomboat.com/ siin] või [http://www.superkids.com/aweb/tools/logic/bship/ siin]: see on hea insipiratsioon sinu enda mängu tegemiseks.
<!--
* Kui on mängija kord, siis ta viskab kahte täringut.
* Kui üks täring annab 1 (aga teine ei anna 1) siis on mängija kord lõppenud ja sellest mängukorrast ta punkte ei saa.
* Kui mõlemad täringud annavad 1, siis on mängija kord lõppenud ja ta kaotab üldse kõik oma seni kogutud punktid.
* Kui täringutel olid erinevad numbrid N ja M, siis liidetakse selle-mängukorra-punktidele N+M
* Kui täringutel olid samad numbrid N ja N (aga mitte 1 ja 1), siis liidetakse selle-mängukorra-punktidele samuti N+N, aga mängija ei tohi oma mängukorda katkestada.
* Kui mängija otsustab anda oma korra üle, siis kõik tema korra ajal saadud punktid (selle-mängukorra-punktid) summeeritakse ja lisatakse tema koguseisule ning mängukord läheb üle teisele mängijale.
-->
 
* Kui on mängija kord, siis ta viskab kahte täringut.
* Kui üks täring annab 1 (aga teine ei anna 1) siis on mängija kord lõppenud ja sellest mängukorrast ta punkte ei saa.
* Kui täringutel olid erinevad numbrid N ja M, siis liidetakse selle-mängukorra-punktidele N+M
* Kui mõlemil täringul oli sama number N (näiteks 3 ja3 või 1 ja 1) siis liidetakse selle-mängukorra-punktidele kas: (a) 1 ja 1 korral 25 punkti, (b) muu N ja N korral 2*(N+N) ehk 4*N.
* Kui mängija otsustab anda oma korra üle, siis kõik tema korra ajal saadud punktid (selle-mängukorra-punktid) summeeritakse ja lisatakse tema koguseisule ning mängukord läheb üle teisele mängijale.
 
<b>Põhipoint:</b> ühe "mängija korra" ajal võib ta visata täringupaari mitu korda, seejuures kõik saadud punktid liidetakse,
aga nad kõik lähevad raisku, kui täringud annavad 1. Et nad raisku ei läheks, tuleb mängijal mingil hetkel
oma kord vabatahtlikult üle anda.
 
[http://nrich.maths.org/1260 See applet] on illustreeriv variant kahe täringuga pig'st (applet ei kasuta meil nõutud Big Pig reegleid, kuid
illustreerib üldisi mängupõhimõtteid).


Ühe mängija asemel mängib sinu programmis arvuti, st programmi kasutaja mängib arvuti vastu.  
Ühe mängija asemel mängib sinu programmis arvuti, st programmi kasutaja mängib arvuti vastu.  
Optimaalne mängustrateegia on suhteliselt keeruline (sellest saab lugeda viidatud artiklitest), sestap piisab, kui arvuti mängib lihtsa mitteoptimaalse põhimõttega:
* kui 100 punkti on juba täis, siis katkesta kohe.
* muidu võta alati täis mingi X punkti ja siis anna käik vastasele. Mis võiks olla sobiv X? Tõenäoliselt kuskil 10 ja 20 vahel. X-i ettemääramise asemel peab sinu lehel olema X-i valiku väli: kasutaja peab ise saama (katseteks) X-i sisestada.


Valmis töö tuleb riputada üles ülikooli serverisse dijkstra (vaata altpoolt). Ehk, arvestatakse ainult dijkstra-s olevaid töid.
Valmis töö tuleb riputada üles ülikooli serverisse dijkstra (vaata altpoolt). Ehk, arvestatakse ainult dijkstra-s olevaid töid.


Selles praksis teed ühe inimese variandi, aga kolmandas praktikumis tuleb samale mängule lisada serveripoolset funktsionaalsust, näiteks tulemuste salvestamine ja vaatamine ja statistika, samuti mäng kahe inimese vahel, mis toimub siis serverirakenduse vahendusel.
Selles praksis teed arvuti vastu mängimise variandi, aga kolmandas praktikumis tuleb samale mängule lisada serveripoolset funktsionaalsust, näiteks tulemuste salvestamine ja vaatamine ja statistika, samuti mäng kahe inimese vahel, mis toimub siis serverirakenduse vahendusel.
 
== Nõuded ja hindamispõhimõtted ==


Kõige olulisem: ära kasuta htmli, cssi ega javascripti konstruktsioone/funktsioone, millest sa aru ei saa. Teisisõnu, enne kasutamist loe, mida see-ja-see asi teeb.
== Detailid ==


Kui põhialgoritm ei tööta korralikult, siis praks ei ole arvestatud, kui aga töötab ja leht ei näe väga kole välja, saab arvestuse eest baaspunktid ehk <b>seitse</b> punkti.
Meie praksiülesande detailid ja erisused standardsest laevade pommitamisest on järgmised:


Lisaks põhialgoritmile on hea mõte realiseerida hulk täiendavat funktsionaalsust, mis ei ole aga kohustuslik: iga täiendav realiseeritud funktsionaalsus annab lihtsalt lisaks punkte. Täispunktide - kaksteist - jaoks peavad kõik funktsioonid olema korralikult tehtud.
* Lihtsustus: kasutame ainult ühte tüüpi laeva: kahene horisontaalpaigutusega laev. Ehk, alati kaks kõrvuti horisontaalset ruutu.
* Neid standardse pommitamise reegleid tuleb järgida:
** Laevad ei tohi olla üksteisega külgepidi/otsapidi koos. Diagonaali ehk nurgaga puudutamine on ok.
** Lui sina või masin on mõnda ruutu pommitanud, aga läks mööda, peab sinna ilmuma nähtav märge.
** Lui oled laevaruudule pihta saanud, peab sinna ilmuma teistsugune nähtav märge, millest saab aru, et said pihta.
** Kui sina või masin saab laevaruudule pihta, saab ta kohe uuesti pommitada, kuni ta kas võidab või pommitab mööda: alles siis antakse käik teisele üle.
* Sina mängid arvuti vastu, seejuures on ok, kui arvuti käib lihtsalt juhuslikult, kuid ta ei tohi pommitada kohti, mida ta on juba varem pommitanud.
* Mängu alguses pead saama valida maatriksi suuruse: konkreetselt kas 3x3, 4x4, ... või 10x10 ruudustik.
* Mängu alguses peab saama valida laevade arvu: kas 1, 2, 3, ..., 10 laeva. Laevade arv ei tohi olla suurem, kui valitud maatriksi küljepikkus miinus üks: näiteks 4x4 ruudustikul võib olla maksimaalselt kolm laeva. Kui sul ei õnnestu kõiki laevu maatriksile paigutada, siis pole hullu, kui paigutad ühe vähem.
* Laevade algse paigutuse nii sinu maatriksil kui tema enda maatriksil määrab arvuti juhuslikult, arvestades seejuures, et laevad ei tohi külgepidi ega otsapidi kokku puutuda. <b>NB!</b> Juhusliku paigutamise meetodid ja piirangud võid ise valida. Ei pea olema nö "täiesti juhuslik", peaasi, et nö mõistlik juhuslikkus oleks sees. Kui sul praksis kõik nõutud osad valmis, võid lisaks realiseerida ka enda laevade ise-paigutamise: see ei ole kohustuslik ja annab ühe punkti võimalikust 12-st.
* Lehel peab olema nupp mängu alustamiseks, mida võib vajutada ka käimasoleva mängu korral: sel juhul mäng katkestatakse ja alustatakse nullist uut, koos uute maatriksisuuruse ja laevade arvu valikuga.
* Mängu alustab ehk esimese pommi tulistab inimene.
* Mängu lõppedes pead kuvama, kes võitis ja mitu pommitamist tegid sina ja mitu masin.
* Pead salvestama ja lehel pidevalt kuvama viimase kümne mängu tulemusi ridade kaupa, igal real selline info: maatriksi suurus, laevade arv, sinu pommitamiste arv, masina pommitamiste arv. Vabatahtliku lisana mängu aeg sekundites: see ei ole kohustuslik ja annab ühe punkti 12-st.
* Kujunduslikud ja tehnoloogilised nõuded:
** Kujundus ei tohi olla väga kole. Hea mõte on lähtuda [[htmli kujunduse üldpõhimõtted| sellest juhendist]].
** Erinevad elemendid lehel peavad mängu käigus püsima stabiilsed, ei tohi ringi nihkuda.
** Lehel peavad olema sinu maatriks ja masina maatriks sama suured ja horisontaalis kõrvuti. Mobiilivariandis (kui selle teed) peab masina maatriks aga olema sinu maatriksi kohal.
** Ei tohi kasutada canvast, svg-d, flashi ega java applette. Maatriksi jaoks kasuta kas div-e või tabelit koos css-i ja javascriptiga.
** Nii laevade maatriksi kui seniste tulemuste tabeli võid teha tabeli või div tagidega, aga mujal ei tohi tabeli tagi kasutada.


* Täringud visates pöörlevad (ei pea pöörlema kuidagi "õigesti"). 1 punkt.
Kõiki eeltoodud nõudeid tuleb järgida, klassikaline laevade pommitamine praksilahenduseks ei sobi.
* Mängu käigus ilmuvad lehe äärele ülalt alla ridades mängija ja arvuti saadud punktid oma mängukordadel (kaks tulpa): mängu uuesti alustades tehakse see vaade jälle tühjaks. 2 punkti.
* Rakendus näeb hea välja ja on mängitav nii suurel ekraanil kui ka mobiilibrauseris ilma zoomimata vms eritegevusi tegemata: teisisõnu, on olemas on ka mobiilile optimeeritud variant (seal ei pea olema kõiki kellasid ja vilesid, kui need ära ei mahu). 2 punkti.


Kui oled selle kõik valmis teinud, on hea mõte katsetada erinevate strateegiatega, et tuvastada, mis oleks sobiv X valik ja kas õnnestub leida veel kavalamat strateegiat. Selleks pane arvuti iseenda vastu eri strateegiatega
== Kohustuslikud ja mittekohustuslikud osad ja punktiarvestus ==
palju kordi mängima ja kogu statistikat, milline strateegia millist võidab. Kuva tulemused juhendajale tabelis ja selgita. Selle lisaülesande eest võib saada kuni kolm lisapunkti.


Eeltoodud nõuete punktid peavad arvestamiseks olema täidetud, nad annavad kokku 6 punkti. Lisaks - kuni maksimaalse 12ni - saad teha järgmised osad:


== Mis veel nõutud ==
* Kuvad oma laevasid pildina, mitte lihtsalt märgendatud ruutudega: 1 punkt.
* Mõõdad ja kuvad tulemuste tabelis mängu peale kulunud aega: 1 punkt.
* Laevade ise-paigutamine mängu alguses: 1 punkt (see on veidi keerulisem ja jäta viimaseks!)
* Mobiilivariant, mis näeb hea välja ja on mugavalt mängitav: 3 punkti. Selleks pead mobiilivariandis saavutama:
** Sisse zoomida ei ole vaja ja parem, kui ei saagi.
** Paremale-vasakule scrollida ei saa, kõik scrollimine on ülevalt alla.
** Maatriks on enamvähem lehe vasakust äärest parema ääreni.
** Suure display variant ja mobiilivariant on sama lähtekoodiga, mitte kaks täiesti erinevat lehte.
** Suure display paigutus (tavapaigutus) on teistsugune, kui mobiilipaigus, kindlasti ses mõttes, et tavapaigutuses ei raisata liiga palju ruumi, nupud, fondid jne pole liiga suured, maatriksid on kõrvuti (mobiilis üksteise all) ja scrollida pole üldse vaja, ka mitte üles-alla.


Info paigutus ekraanil peab olema stabiilne, tekst ei tohi hüpata vahel ühte, vahel teise kohta. Leht peab olema selge, arusaadava ja kena disainiga, mõttetut/segast infot ja arusaamist raskendavaid kujunduselemente ära kasuta. Arvesta kindlasti [[htmli kujunduse üldpõhimõtted| selle juhendi soovitustega]].
== Koodist arusaamine ja plagiaadikontroll ==


Täringud tuleb kuvada täringupildiga (võib olla programmi genereeritud või foto vms), mitte lihtsalt numbritega.
Kogu esitatud kood peab jääma prax2 alamkataloogi alles kuni kursuse lõpuni.


Ära unusta lehele lisamast eelmainitud X-i välja!
Teiste inimeste - ka õppejõu - kirjutatud lahendusi aluseks võtta ei ole OK. Kui juhendaja tuvastab, et sinu koodil on väga suured sarnasused mõne teise koodiga, siis pead töö uuesti kirjutama. Järelkontrollid toimuvad ka pärast töö esitamist.


Leht tohib kasutada ainult html+css+javascripti, seejuures ei tohi kasutada freime ega ifreime. Html lehed võivad kasutada sisselaetavaid css ja javascripti faile ja pilte. Kogu rakendus tuleb teha üheainsa html failiga, millele lisanduvad siis pildi-, css- ja javascripti failid vastavalt sinu vajadusele ja eelistustele.
Kõigist osadest oma koodis pead ise hästi aru saama ja suutma neid juhendajale selgitada, kui ta küsib. Ei ole OK võtta võrgust juppe, mille funktsioneerimisest sa aru ei saa (ehk, kui võtad mõne jupi, siis tee endale kõigepealt selgeks, mida see jupp täpselt teeb).


CSS-i harjutamise eesmärgil tuleb minimeerida/vältida puht-kujunduslikke html tage (font, b, center jne)
== Css-i ja javascripti teegid ja erivariandid javascriptist ==
ja teha kujundus eeskätt CSS-ga. Elementaarsed tagid nagu p ja br ning head, script, body, mitte-nestitud tabelid, h1, h2 jms on ok. Põhiliselt soovitav kasutada id-de ja class-dega varustatud div ja span tage.


Väliste teekide, ntx [http://jquery.com/ Jquery] või [http://getbootstrap.com Bootstrap] kasutamine on ok, <b>aga</b> siis sa pead hästi aru saama, mida sinu tehtavad teegi-callid või stiilid teevad.  
Väliste teekide, ntx [http://jquery.com/ Jquery] või [http://getbootstrap.com Bootstrap] kasutamine on ok, <b>aga</b> siis sa pead hästi aru saama, mida sinu tehtavad teegi-callid või stiilid teevad.  
Reaalselt on see praks piisavalt lihtne selleks, et teekide kasutamine eriti vajalik ei oleks. Kui otsustad siiski teeki kasutada, siis väga soovitav on
Reaalselt on see praks piisavalt lihtne selleks, et teekide kasutamine vajalik ei oleks. Kui otsustad siiski teeki kasutada, siis väga soovitav on
valida [http://jquery.com/ jquery] kui suhteliselt lihtne ja domineerivalt populaarseim javascripti teek, kujunduse jaoks aga [http://getbootstrap.com Bootstrap].
valida [http://jquery.com/ jquery] kui suhteliselt lihtne ja domineerivalt populaarseim javascripti teek, kujunduse jaoks aga [http://getbootstrap.com Bootstrap].


Tee programm kõigepealt valmis oma arvutis ja seejärel riputa kogu materjal - html, css, javascript ja pildid - serverisse. TTÜ serveri (dijkstra) ligipääsu- ja kasutamisõpetust loe altpoolt.
Kogu javascript peab olema esitatud minimiseerimata ja nö normaalse taandega, et oleks kergesti loetav.  


<b>NB!</b> Ära unusta, et lähema nädala jooksul lisandub siia lehele hulk täpsustavaid nõudeid, detaile, soovitusi jne. Kuna põhialgoritm jääb samaks, võid kohe alustada, lihtsalt kontrolli siit lehelt regulaarselt, mis uuendusi on lisandunud.
Ei ole OK kasutada süsteeme nagu typescript, mis kompileerivad sinu lähtekoodi javascriptiks: see muudaks juhendajate töö liiga raskeks.


== Soovitusi htmli ja cssi osas ==
== Soovitusi htmli ja cssi osas ==


Hea mõte on jagada lehekülg mitmeks horisontaalseks reaks ja vertikaalseks kõrvuti tulbaks. Kõige lihtsam - ja selle rakenduse jaoks piisav - on seada ridadele ja tulpadele fikseeritud laiused ja kõrgused. NB! Selline fiks laiuste/kõrguste lähenemine ei ole enamiku harilike veebisaitide jaoks päris hea mõte, ja on hoopis halb mobiilile sobiva saidi tegemisel.  
Hea mõte on algul jagada lehekülg mitmeks horisontaalseks reaks ja vertikaalseks kõrvuti tulbaks. Kõige lihtsam - ja selle rakenduse jaoks piisav - on seada ridadele ja tulpadele fikseeritud laiused ja kõrgused. NB! Selline fiks laiuste/kõrguste lähenemine ei ole enamiku harilike veebisaitide jaoks päris hea mõte, ja on hoopis halb mobiilile sobiva saidi tegemisel.  


[http://www.w3.org/Style/Examples/007/center.en.html Siit] ja [http://www.thesitewizard.com/css/center-div-block.shtml siit] leiad tsentreerimise õpetused (point: <tt>margin-left: auto; margin-right: auto;</tt>)
[http://www.w3.org/Style/Examples/007/center.en.html Siit] ja [http://www.thesitewizard.com/css/center-div-block.shtml siit] leiad tsentreerimise õpetused (point: <tt>margin-left: auto; margin-right: auto;</tt>)
100. rida: 98. rida:


Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale CSS bloki alt.
Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale CSS bloki alt.
Moblale sobiva lehe põhimõtete kohta tasub lugeda [https://developer.apple.com/design/tips/ neid lihtsaid suuniseid Applelt]


== Soovitusi javascripti osas ==
== Soovitusi javascripti osas ==
111. rida: 111. rida:
Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale javascripti bloki alt.
Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale javascripti bloki alt.


== Näitekood laevade paigutamiseks ==


== Dijkstra server ==
Laevade juhuslikul paigutusel ei ole rangeid nõudeid "juhuslikkuse" osas: lihtsalt paigutus peaks igakord "juhuslikult" muutuma, laevad ei tohi olla kõrvuti ja otsapidi koos, suuremal laual peaks olema rohkem laevu.


Kodutööde tarbeks on kasutusel server nimega dijkstra (see keeruline nimi on ühe tuntud arvutiteaduse teerajaja nimi ja keeruline seepärast, et see nimi teile paremini meelde jääks).
Siin all on veidi poolik kood, mis paigutab randomiga laevu tabelisse laiusega size. Sa ei pea seda üldse kasutama, aga ta võib olla abiks.  


<b>NB! Kõik kodutööd tuleb riputada Dijkstra serverisse</b> - ka siis, kui sa neid sealt käima ei pane, vaid kasutad mõnda oma serverit - et õppejõud saaks lähtekoode Dijkstra
Ta eeldab, et sul on juba olemas javascripti array <b>table</b> kujul (näitena küljepikkuse 3 jaoks)
serveris vaadata ja plagiaadituvastus-tarkvara abil kontrollida.
<pre>
[[0,0,0],[0,0,0],[0,0,0]]
</pre>
ja muudab selle table sisu, täites laevaruudud numbritega 1, näiteks selliseks:
<pre>
[[1,1,0],[0,0,0],[0,1,1]]
</pre>


Nõuded kataloogile/failinimedele:
Seejuures pannakse igale reale üks laev, vaadates, et ta ei sattuks eelmise rea
laevaga külgepidi kokku.


* Teine kodutöö tuleb panna sinu kodukataloogi alamkataloogi <b><tt>public_html/prax2</tt></b> mille pead ise looma.
Kui 20 randomkatsel rea kohta sobivat positsiooni ei leitud  (näiteks kolmese küljepikkusega tabelis ei olegi võimalik teist rida täita!) siis jäetakse see rida
* Kodutöö html-põhifaili nimi peab olema <tt>index.html</tt>.
lihtsalt tühjaks.
* Kodutöö sinu tehtud javascripti-fail fail olgu nimega <tt>prax2.js</tt> ning sinu tehtud css-fail nimega <tt>prax2.css</tt>
* Pildifailide ja mujalt võetud javascripti/css teekide osas mingeid nõudeid ei ole.


Enne failide serverisse riputamist on mõistlik teha kogu süsteem valmis lihtsalt oma arvutis/arvutiklassi arvutis.
Sul on mõistlik seda koodi edasi arendada selliselt, et:


=== Ligipääs ===
* ta ei kasutaks alati arrayd nimega <i>table</i> vaid sa saaksid selle array ehk tabeli nime ise ette anda.
* sa saaksid ette anda soovitud laevade arvu: kui soovitud laevu on hulga vähem, kui ridu, siis võiks lihtsalt mõned read randomiga vahele jätta: muidugi, soovitud laevade arv peaks kokku tulema.


Dijkstrasse sisselogimiseks  on sul vaja omada TTÜ arvutiklasside klasside kontot kujul <b>Eesnimi.Perenimi</b> (siin võib tekkida probleem täpitähtede, tühikutega jne).  
funktsioon <i>gid</i> on lihtsalt enda tehtud abifunktsioon  <tt>function gid(x) {return document.getElementById(x); }</tt>
<!-- * tXXXXXX, kus XXXXXX on sinu matriklinumbri numbriline osa. Selliseid kontosid tudengitele enam ei tekitata: kellel olemas, saab kasutada.
-->


Kasutajatunnuse saad lasta teha arvutiklasside administraatorite juures.
<pre>
function fillBoard(size) {
  var r,c,i,foundok,count;
  size=parseInt(size);
  // loop over all the rows, to place one ship to each (most) rows   
  for(i=0;i<size;i++) {
    foundok=false;
    count=0;
    // try different random column positions until OK pos found:
    // if no position OK during 20 tries, give up and
    // do not put a ship on this line at all
    while(!foundok && count<20) {
      c=Math.floor(Math.random()*(size-1));
      console.log("try ship for row "+i+" at col "+c);
      if (i>0) {
        if (table[i-1][c]==1) { foundok=false; }
        else if (c>0 && table[i-1][c-1]==1) { foundok=false; }
        else if (c<size-1 && table[i-1][c+1]==1) { foundok=false; }
        else foundok=true;
      } else {
        foundok=true;
      } 
      count++;
    } 
    if (foundok) {
      console.log("got ship for row "+i+" at col "+c); 
      table[i][c]=1;
      table[i][c+1]=1;
      console.log(table);
    }     
  }   
}
</pre>


=== Sisselogimine ===
Järgnev on lihtne näide numbritega 0 ja 1 täidetud andmetabeli (parameeter tbl) kuvamiseks
html tabelis, kus iga ruut on id-ga <i>divid+reanr+tulbanr</i> a la "mytable21". Arusaadavalt eeldab see kood, et selliste id-dga html tabel on juba loodud.


Sisselogimiseks kasutatakse SSL ühendust: kõige lihtsam on kasutada programmi [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html putty] (Windows) või ssh (Linux). Tegemist on siis käsurealigipääsuga Linuxipõhisele serverile.
<pre>


Putty leiad arvutiklassidest programmi "Application catalog" jaotusest terminals: sealt saad ta ise installeerida. Mõistlik on panna endale putty viit desktopile.
function showBoard(tbl,divid) {
  var r,c,place;
  console.log(tbl);
  for(r=0;r<tbl.length;r++) {
    for(c=0;c<tbl.length;c++) {
      console.log((divid+r)+c);
      place=gid((divid+r)+c);
      if (tbl[r][c]==1) {
        place.innerHTML="s"
        place.style.backgroundColor="#666666";
      } else {
        place.innerHTML=""
        place.style.backgroundColor="#eeeeee";
      }     
    }
  } 
}


Mujal masinates lihtsalt lae endale veebist putty.exe: selle saab otse käima lasta, mingit eri-installeerimist ei ole vaja.
</pre>


Sul on vaja sisestada:
== Dijkstra server ==


* Dijkstra aadress: dijkstra.cs.ttu.ee (see tuleb puttyl sisestada "Host name" väljale)
Kodutööde tarbeks on kasutusel server nimega dijkstra: kindlasti loe [[Dijkstra server|dijkstra kasutusõpetust]].
* Teie kasutajanimi ja parool: TTÜ kasutajanimi + parool (neid küsib putty siis, kui ta serveriakna avab).


Puttyl tasub Window/appearance alt seada meeldiv font ja Window/color alt meeldiv värv (ntx valge tagapõhi ja must värv). Samuti tasub kindlasti teha "save session" (enne pane "Saved session" väljale endale meeldiv nimi), siis jätab Putty settingud meelde ja sisenemisel ei pea enam arvuti nime sisestama: valid listist sessiooninime ja teed "Load" ja seejärel "open".
Kõik kodutööd tuleb riputada Dijkstra serverisse, et õppejõud saaks lähtekoode Dijkstra serveris vaadata ja plagiaadituvastus-tarkvara abil kontrollida.


Hea alternatiiv puttyle on [http://kitty.9bis.net/ kitty], mis on muidu täpselt nagu putty, aga on valmis sinu kasutajanime ja parooli meelde jätma, et ei peaks igakord uuesti sisestama.
Nõuded kataloogile/failinimedele:


<!--
* Teine kodutöö tuleb panna sinu kodukataloogi alamkataloogi <b><tt>public_html/prax2</tt></b> mille pead ise looma.
=== Kui sisselogimine ei õnnestu ===
* Kodutöö html-põhifaili nimi peab olema <tt>index.html</tt>.
* Kodutöö sinu tehtud javascripti-fail fail olgu nimega <tt>prax2.js</tt> ning sinu tehtud css-fail nimega <tt>prax2.css</tt>
* Pildifailide ja mujalt võetud javascripti/css teekide osas mingeid nõudeid ei ole.


Tõenäoline põhjus on see, et sinu kasutajatunnus ei ole jõudnud õppejõuni õigel kujul.
Enne failide serverisse riputamist on mõistlik teha kogu süsteem valmis lihtsalt oma arvutis/arvutiklassi arvutis.
 
Loe [http://dijkstra.cs.ttu.ee/~tammet/kasutajad.html seda õpetust] ja salvesta veebivormi kaudu oma kasutajatunnus.
-->
 
=== Veebikeskkonna ettevalmistamine ===
 
Kõik asjad, mis paigutad oma dijkstra kodukataloogi alamkataloogi <tt>public_html</tt>, on veebis nähtavad. See kataloog peaks olema sulle juba ette valmis tehtud. Kui aga seda miskipärast ei ole, saad ta ise luua niimoodi:
 
  mkdir public_html
 
Käsurea saamiseks tuleks üle SSH ühenduse dijkstra käsureale logida ([http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html putty] või ssh vms)
 
Kui kataloog on olemas ja sinna mõned faili pandud, suunake oma brauser dijkstra aadressile, mille saate, kui lisate serveri nime järgi tilde ja kasutajanime ja siis kataloogi või faili, mis olete pannud public_html alla (näiteks sedasi, aga asendage oma kasutajanimi ära):
 
http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/prax2/index.html
või
http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/prax2/
või
http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/index.html
 
Idee selles, et urlis http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/ järel tulevad failid/kataloogid on täpselt need, mis sul public_html kataloogi sees.
 
vanade kontode korral siis ~Eesnimi.Perenimi asemel ~tXXXXXX
 
Tekita algul prooviks otse public_html alla katse.html nimeline fail ja vaata, kas brauserist avaneb
 
http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/katse.html
 
Sul on tõenäoliselt vaja muuta katse.html failiõigused, nagu järgmises lõigus kirjas.
 
Nüüd loo <tt>public_html</tt> alla kataloog <tt>prax2</tt>
 
  mkdir public_html/prax2
 
ja pane oma rakenduse failid otse sinnasamasse prax2 alla, kasutades failinimesid, mis eelpool nõutud (index.html, prax2.js, prax2.css).
 
<b>Failiõiguste seadmine:</b>
 
<!--
Juhul, kui te kataloogi või oma index.html sisu ei näe, kontrollige, et nii teie kodukataloog kui public_html kuuluksid grupile "tudengid" ja et sellel grupil oleks nii lugemis-kui kataloogisisu vaatamise pääsuõigused. Samuti peab tudengigrupil olema võimalus lugeda kõiki veebi ülesminevaid faile.
-->
 
Kui oled värskelt public_html alla kataloogi teinud,
on vaja anda talle lisaks lugemis-ja nimekirjanäitamise õigus niimoodi:<br/> 
  chmod  a+rx public_html/prax2
 
Failile lugemisõiguse andmine (see tekib üldjuhul automaatselt ja ei ole vaja ise teha):<br/>
  chmod a+r index.html
 
=== Failide kopeerimine serverisse ===
 
Failide serverisse kopeerimiseks kasutage SFTP protokolli: soovitavad programmid selleks on windowsil [http://winscp.net/eng/docs/ui_editor winscp] ja [http://filezilla-project.org/ Filezilla]. Linuxist ja Macist kopeerimiseks kasutage käsurea programmi [https://linuxacademy.com/blog/linux/ssh-and-scp-howto-tips-tricks/ scp]
 
Arvutiklassides leiad Winscp "Application catalog" programmi jaotusest "terminals": sealt saad ta installeerida. Nagu ka putty, on teda mujal masinates võimalik lihtsalt alla laadida ja ilma eri-installeerimiseta käivitada.
 
<b>Winscp</b> esmakordsel käivitamisel vajuta "New" ja täida host (dijkstra.cs.ttu.ee) ja kasutajanime ning parooli väljad, muid asju pole vaja seada.
 
Winscp kasutamise juures tasub teda veidi mugavamaks sättida:
* Options->preferences menüü alt mine Environment/interface ja vali "Commander", siis tekib kahe alamaknaga kasutajaliides, kus ühes on sinu masin ja teises server: nii on mugavam faile kopeerida.
* Options->preferences menüü alt mine "Editors", vajuta "add", vali oma progeredaktor (otsi näiteks C:\Program Files(86) alt Notepad++ ja nihuta ta seejärel samal lehel tabelis päris üles (vali tabelist tema rida ja vajuta "up" kuni lõpuni): siis saad sellesama redaktoriga oma masinast otse redigeerida serveris olevaid faile (katsetatud scite ja notepad++ ja bracketsiga, töötab).
* Options->preferences menüü alt mine Integration/applications ja vali sealt "Browse" abil oma masinast putty.exe (täispath) ja sea "Remember password ..." peale: siis saad winscp tööriistariba keskel oleva väikese putty ikooni abil otse putty käivitada ja seal piisab siis ainult kasutajanimest.
* Session menüü alt tee "Save session" ja checki "Save password", siis on edaspidi serverisse logimine lihtsam: ei pea sisestama kasutajanime ega parooli.
 
Need muutused käivituvad - vist - alles peale winscp taaskäivitamist.
 
<b>Filezilla</b> puhul vali menüüst File->Site Manager, vajuta "New site", täida "Host" (dijkstra.cs.ttu.ee), <b>vali Protocol: FTP asemel SFTP</b>, Logon type Normal ja täida seejärel User ja Password ning vajuta Connect. Nagu ka Winscp puhul, tasub teda mugavamaks sättida. Mine Edit->Settings ja sea sealt "File editing" endale meeldivama redaktori peale oma masinas. Muid settinguid, nagu Interface->Layout jne tasub ka korra vaadata.
 
Lisaks on täiesti OK variant windowsil kasutada putty-ga komplektis olevat DOS-i käsurea programmi [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html <b>pscp.exe</b>] näiteks nii (loomulikult pead oma failide, programmide asukohad ja nime ära muutma):
 
    F:\Lectures\Vorgurak1\Cgilect>c:\Users\tanel\Desktop\pscp tst1.html tammet@dijkstra.cs.ttu.ee:public_html/
    F:\Lectures\Vorgurak1\Cgilect>c:\Users\tanel\Desktop\pscp * tammet@dijkstra.cs.ttu.ee:public_html/
 
=== Linuxi käsurida ja serveris tegutsemine ===
 
Põhimõtteliselt peaks piisama neist käskudest:
 
  pwd (mis kataloogis ma praegu olen)
  ls -l (vaata kataloogi sisu pikas formaadis)
  cd katalooginimi (mine sinna kataloogi)
  cd .. (mine üks tase kõrgemasse kataloogi)
  less failinimi (näita faili sisu: seal sees liigu nooleklahvidega ja lõpeta tähega q)
  cp kust kuhu (kopeerib)
  rm failinimi (kustutab)
  mkdir katalooginimi (teeb uue kataloogi)
  rmdir katalooginimi (kustutab kataloogi: see tuleb enne tühjendada)
  chmod a+r failinimi (teeb faili kõigile loetavaks, et ntx veebist kuvada)
  chmod a+rx failinimi (teeb faili kõigile käimapandavaks, eeskätt cgi programmide jaoks)
  vi failinimi (redigeeri faili lihtsa redaktoriga vi)
 
 
Linuxi käsurea kasutamist tuleb uurida  omal käel. Sobivat lugemist lihtsamatest keerulisemateni:
* päris algajatele on hea [http://www.freesoftwaremagazine.com/articles/command_line_intro see selgitustega leht]
* seejärel tasub korra lisaks vaadata [http://www.pixelbeat.org/cmdline.html seda kompaktset kokkuvõtet] erinevatest käskudest (enamust vaja ei lähe)
* ning lugeda [http://www.funtoo.org/wiki/Linux_Fundamentals,_Part_1 seda väga head ja põhjalikku õpetust] funtoo saidilt (vt ka järgmisi sarja osi lehe lõpust!)
* või alternatiivina [http://linuxcommand.org/learning_the_shell.php seda põhjalikumat õpetust].
* Alati tasub lisaks ise googeldada.
 
<b>Väga kasulikud asjad meelde jätta:</b>
* Üles ja alla nooleklahvid võtavad automaatselt ette varasemaid/hilisemaid käske, et neid ei peaks uuesti sisse tippima
* kui tipid failinime esimese otsa ja vajutad tab klahvi, otsib süsteem automaatselt failinime lõpu (kui sul muidugi pole mitut sama algusega faili)
* Suured ja väikesed tähed on unixis täiesti erinevad asjad, erinevalt windowsist. Näiteks sinu html/javascript sources olevad failinimed peavad olema antud täpselt selliselt, nagu failinimi tegelikult on (kui sources failinimi pilt.jgp, siis peab olema tegeliku faili nimi ka pilt.jpg, aga mitte näiteks pilt.JPG).
* Üldiselt <b>ei ole</b> hea mõte kasutada failinimesid, kus sees tühikud ja/või täpitähed. See on võimalik, kuid tekitab rohkem probleeme ja ebamugavusi, kui asi väärt on. Seega kasuta näiteks "minu überpilt.jpg" asemel "minu_yberpilt.jpg" vms.
* oma programmide käivitamiseks (oletame, et sul on kataloogis programm <b>minuproge</b>) tipi  <b>./minuproge</b> . Seda punkt-slashi ei ole vaja panna, kui sul on PATH muutuja sobivaks seatud, aga selle seadmisega pole tingimata vaja jännata.
 
=== Failide muutmine otse serveris ===
 
Siin on kolm veidi erinevat võimalust:
 
* redigeerida faile mõne serveris oleva redaktoriga, näiteks vi ([http://www.guckes.net/vi/quotes.php3 loe veidi vi kohta]).
* redigeerida faile oma masinas oleva redaktoriga, mis võimaldab neid otse serverist avada ja sinna kirjutada (head variandid selleks on [http://winscp.net/eng/docs/ui_editor winscp] ja redaktoriks sea endale meeldiv redaktor, a la notepad++, scite või brackets.
* ja lõpuks on alati variant redigeerida faile oma masinas ja kopeerida nad peale muutmist serverisse (nagu varem kirjeldatud)
 
Üldiselt on kõige mugavam teha võimalikult kõik oma masinas valmis, katsetada ära ja alles siis kopeerida valmis asjad serverisse, ning teha serveris ainult pisimuutusi.

Viimane redaktsioon: 1. oktoober 2015, kell 14:20

Battleship
Battleship



Mida tuleb teha

Sinu ülesandeks on kirjutada laevade pommitamise mängu brauseris töötav lihtsustatud eriversioon, kasutades ainult html-i, css-i ja javascripti.

Loe kõigepealt läbi ülevaade wikipediast ja mängi katseks standardset täisversiooni siin või siin või siin: see on hea insipiratsioon sinu enda mängu tegemiseks.

Ühe mängija asemel mängib sinu programmis arvuti, st programmi kasutaja mängib arvuti vastu.

Valmis töö tuleb riputada üles ülikooli serverisse dijkstra (vaata altpoolt). Ehk, arvestatakse ainult dijkstra-s olevaid töid.

Selles praksis teed arvuti vastu mängimise variandi, aga kolmandas praktikumis tuleb samale mängule lisada serveripoolset funktsionaalsust, näiteks tulemuste salvestamine ja vaatamine ja statistika, samuti mäng kahe inimese vahel, mis toimub siis serverirakenduse vahendusel.

Detailid

Meie praksiülesande detailid ja erisused standardsest laevade pommitamisest on järgmised:

  • Lihtsustus: kasutame ainult ühte tüüpi laeva: kahene horisontaalpaigutusega laev. Ehk, alati kaks kõrvuti horisontaalset ruutu.
  • Neid standardse pommitamise reegleid tuleb järgida:
    • Laevad ei tohi olla üksteisega külgepidi/otsapidi koos. Diagonaali ehk nurgaga puudutamine on ok.
    • Lui sina või masin on mõnda ruutu pommitanud, aga läks mööda, peab sinna ilmuma nähtav märge.
    • Lui oled laevaruudule pihta saanud, peab sinna ilmuma teistsugune nähtav märge, millest saab aru, et said pihta.
    • Kui sina või masin saab laevaruudule pihta, saab ta kohe uuesti pommitada, kuni ta kas võidab või pommitab mööda: alles siis antakse käik teisele üle.
  • Sina mängid arvuti vastu, seejuures on ok, kui arvuti käib lihtsalt juhuslikult, kuid ta ei tohi pommitada kohti, mida ta on juba varem pommitanud.
  • Mängu alguses pead saama valida maatriksi suuruse: konkreetselt kas 3x3, 4x4, ... või 10x10 ruudustik.
  • Mängu alguses peab saama valida laevade arvu: kas 1, 2, 3, ..., 10 laeva. Laevade arv ei tohi olla suurem, kui valitud maatriksi küljepikkus miinus üks: näiteks 4x4 ruudustikul võib olla maksimaalselt kolm laeva. Kui sul ei õnnestu kõiki laevu maatriksile paigutada, siis pole hullu, kui paigutad ühe vähem.
  • Laevade algse paigutuse nii sinu maatriksil kui tema enda maatriksil määrab arvuti juhuslikult, arvestades seejuures, et laevad ei tohi külgepidi ega otsapidi kokku puutuda. NB! Juhusliku paigutamise meetodid ja piirangud võid ise valida. Ei pea olema nö "täiesti juhuslik", peaasi, et nö mõistlik juhuslikkus oleks sees. Kui sul praksis kõik nõutud osad valmis, võid lisaks realiseerida ka enda laevade ise-paigutamise: see ei ole kohustuslik ja annab ühe punkti võimalikust 12-st.
  • Lehel peab olema nupp mängu alustamiseks, mida võib vajutada ka käimasoleva mängu korral: sel juhul mäng katkestatakse ja alustatakse nullist uut, koos uute maatriksisuuruse ja laevade arvu valikuga.
  • Mängu alustab ehk esimese pommi tulistab inimene.
  • Mängu lõppedes pead kuvama, kes võitis ja mitu pommitamist tegid sina ja mitu masin.
  • Pead salvestama ja lehel pidevalt kuvama viimase kümne mängu tulemusi ridade kaupa, igal real selline info: maatriksi suurus, laevade arv, sinu pommitamiste arv, masina pommitamiste arv. Vabatahtliku lisana mängu aeg sekundites: see ei ole kohustuslik ja annab ühe punkti 12-st.
  • Kujunduslikud ja tehnoloogilised nõuded:
    • Kujundus ei tohi olla väga kole. Hea mõte on lähtuda sellest juhendist.
    • Erinevad elemendid lehel peavad mängu käigus püsima stabiilsed, ei tohi ringi nihkuda.
    • Lehel peavad olema sinu maatriks ja masina maatriks sama suured ja horisontaalis kõrvuti. Mobiilivariandis (kui selle teed) peab masina maatriks aga olema sinu maatriksi kohal.
    • Ei tohi kasutada canvast, svg-d, flashi ega java applette. Maatriksi jaoks kasuta kas div-e või tabelit koos css-i ja javascriptiga.
    • Nii laevade maatriksi kui seniste tulemuste tabeli võid teha tabeli või div tagidega, aga mujal ei tohi tabeli tagi kasutada.

Kõiki eeltoodud nõudeid tuleb järgida, klassikaline laevade pommitamine praksilahenduseks ei sobi.

Kohustuslikud ja mittekohustuslikud osad ja punktiarvestus

Eeltoodud nõuete punktid peavad arvestamiseks olema täidetud, nad annavad kokku 6 punkti. Lisaks - kuni maksimaalse 12ni - saad teha järgmised osad:

  • Kuvad oma laevasid pildina, mitte lihtsalt märgendatud ruutudega: 1 punkt.
  • Mõõdad ja kuvad tulemuste tabelis mängu peale kulunud aega: 1 punkt.
  • Laevade ise-paigutamine mängu alguses: 1 punkt (see on veidi keerulisem ja jäta viimaseks!)
  • Mobiilivariant, mis näeb hea välja ja on mugavalt mängitav: 3 punkti. Selleks pead mobiilivariandis saavutama:
    • Sisse zoomida ei ole vaja ja parem, kui ei saagi.
    • Paremale-vasakule scrollida ei saa, kõik scrollimine on ülevalt alla.
    • Maatriks on enamvähem lehe vasakust äärest parema ääreni.
    • Suure display variant ja mobiilivariant on sama lähtekoodiga, mitte kaks täiesti erinevat lehte.
    • Suure display paigutus (tavapaigutus) on teistsugune, kui mobiilipaigus, kindlasti ses mõttes, et tavapaigutuses ei raisata liiga palju ruumi, nupud, fondid jne pole liiga suured, maatriksid on kõrvuti (mobiilis üksteise all) ja scrollida pole üldse vaja, ka mitte üles-alla.

Koodist arusaamine ja plagiaadikontroll

Kogu esitatud kood peab jääma prax2 alamkataloogi alles kuni kursuse lõpuni.

Teiste inimeste - ka õppejõu - kirjutatud lahendusi aluseks võtta ei ole OK. Kui juhendaja tuvastab, et sinu koodil on väga suured sarnasused mõne teise koodiga, siis pead töö uuesti kirjutama. Järelkontrollid toimuvad ka pärast töö esitamist.

Kõigist osadest oma koodis pead ise hästi aru saama ja suutma neid juhendajale selgitada, kui ta küsib. Ei ole OK võtta võrgust juppe, mille funktsioneerimisest sa aru ei saa (ehk, kui võtad mõne jupi, siis tee endale kõigepealt selgeks, mida see jupp täpselt teeb).

Css-i ja javascripti teegid ja erivariandid javascriptist

Väliste teekide, ntx Jquery või Bootstrap kasutamine on ok, aga siis sa pead hästi aru saama, mida sinu tehtavad teegi-callid või stiilid teevad. Reaalselt on see praks piisavalt lihtne selleks, et teekide kasutamine vajalik ei oleks. Kui otsustad siiski teeki kasutada, siis väga soovitav on valida jquery kui suhteliselt lihtne ja domineerivalt populaarseim javascripti teek, kujunduse jaoks aga Bootstrap.

Kogu javascript peab olema esitatud minimiseerimata ja nö normaalse taandega, et oleks kergesti loetav.

Ei ole OK kasutada süsteeme nagu typescript, mis kompileerivad sinu lähtekoodi javascriptiks: see muudaks juhendajate töö liiga raskeks.

Soovitusi htmli ja cssi osas

Hea mõte on algul jagada lehekülg mitmeks horisontaalseks reaks ja vertikaalseks kõrvuti tulbaks. Kõige lihtsam - ja selle rakenduse jaoks piisav - on seada ridadele ja tulpadele fikseeritud laiused ja kõrgused. NB! Selline fiks laiuste/kõrguste lähenemine ei ole enamiku harilike veebisaitide jaoks päris hea mõte, ja on hoopis halb mobiilile sobiva saidi tegemisel.

Siit ja siit leiad tsentreerimise õpetused (point: margin-left: auto; margin-right: auto;)

Tulpade tegemine tabeliga on lihtne, aga puhtalt div-dega ei ole päris triviaalne. Vaata seda ja seda või seda seletust põhimõtete osas. Kogu värgi lehekülje keskele panekuks, headeri ja footeri lisamiseks jne pakuvad ideid ja näiteid need õpetused, alates lihtsamast ja lõpetades põhjalikuga:

Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale CSS bloki alt.

Moblale sobiva lehe põhimõtete kohta tasub lugeda neid lihtsaid suuniseid Applelt

Soovitusi javascripti osas

Kui sa ei kasuta mõnda javascripti teeki nagu jquery (algajale mittesoovitav, kuna tekitab lisakeerukusi!) siis on hea mõte töö lihtsustamiseks teha ise väikeseid abifunktsioone, näiteks function gid(x) {return document.getElementById(x); } et ei peaks kogu aeg pikalt välja kirjutama.

Debugimiseks on kõige lihtsam panna koodi sisse alert(...), aga mugavam ja parem on kasutada funktsiooni console.log(...) mille võid omakorda panna oma abifunktsiooni a la function debug(x) { console.log(x) }. console.log trükib tulemuse brauseri debugeri konsooli (Firefoxis käivita (ja enne installi!) firebug ja vaata firebugi aknast "console" tabi alt, Chromes otsi developer tools või javascript console).

Täiendavate ideede ja juhatuste jaoks vaata lihtsalt kursuse lehelt viidatud materjale javascripti bloki alt.

Näitekood laevade paigutamiseks

Laevade juhuslikul paigutusel ei ole rangeid nõudeid "juhuslikkuse" osas: lihtsalt paigutus peaks igakord "juhuslikult" muutuma, laevad ei tohi olla kõrvuti ja otsapidi koos, suuremal laual peaks olema rohkem laevu.

Siin all on veidi poolik kood, mis paigutab randomiga laevu tabelisse laiusega size. Sa ei pea seda üldse kasutama, aga ta võib olla abiks.

Ta eeldab, et sul on juba olemas javascripti array table kujul (näitena küljepikkuse 3 jaoks)

[[0,0,0],[0,0,0],[0,0,0]]

ja muudab selle table sisu, täites laevaruudud numbritega 1, näiteks selliseks:

[[1,1,0],[0,0,0],[0,1,1]]

Seejuures pannakse igale reale üks laev, vaadates, et ta ei sattuks eelmise rea laevaga külgepidi kokku.

Kui 20 randomkatsel rea kohta sobivat positsiooni ei leitud (näiteks kolmese küljepikkusega tabelis ei olegi võimalik teist rida täita!) siis jäetakse see rida lihtsalt tühjaks.

Sul on mõistlik seda koodi edasi arendada selliselt, et:

  • ta ei kasutaks alati arrayd nimega table vaid sa saaksid selle array ehk tabeli nime ise ette anda.
  • sa saaksid ette anda soovitud laevade arvu: kui soovitud laevu on hulga vähem, kui ridu, siis võiks lihtsalt mõned read randomiga vahele jätta: muidugi, soovitud laevade arv peaks kokku tulema.

funktsioon gid on lihtsalt enda tehtud abifunktsioon function gid(x) {return document.getElementById(x); }

function fillBoard(size) {
  var r,c,i,foundok,count;
  size=parseInt(size); 
  // loop over all the rows, to place one ship to each (most) rows    
  for(i=0;i<size;i++) { 
    foundok=false;
    count=0;
    // try different random column positions until OK pos found: 
    // if no position OK during 20 tries, give up and 
    // do not put a ship on this line at all
    while(!foundok && count<20) {
      c=Math.floor(Math.random()*(size-1));
      console.log("try ship for row "+i+" at col "+c);
      if (i>0) {
        if (table[i-1][c]==1) { foundok=false; }
        else if (c>0 && table[i-1][c-1]==1) { foundok=false; }
        else if (c<size-1 && table[i-1][c+1]==1) { foundok=false; } 
        else foundok=true;
      } else {
        foundok=true;
      }  
      count++;
    }  
    if (foundok) {
      console.log("got ship for row "+i+" at col "+c);   
      table[i][c]=1;
      table[i][c+1]=1;
      console.log(table); 
    }      
  }     
}

Järgnev on lihtne näide numbritega 0 ja 1 täidetud andmetabeli (parameeter tbl) kuvamiseks html tabelis, kus iga ruut on id-ga divid+reanr+tulbanr a la "mytable21". Arusaadavalt eeldab see kood, et selliste id-dga html tabel on juba loodud.


function showBoard(tbl,divid) {
  var r,c,place;
  console.log(tbl);
  for(r=0;r<tbl.length;r++) {
    for(c=0;c<tbl.length;c++) {
      console.log((divid+r)+c);
      place=gid((divid+r)+c);
      if (tbl[r][c]==1) {
        place.innerHTML="s"
        place.style.backgroundColor="#666666";
      } else {
        place.innerHTML=""
        place.style.backgroundColor="#eeeeee";
      }      
    }
  }  
}

Dijkstra server

Kodutööde tarbeks on kasutusel server nimega dijkstra: kindlasti loe dijkstra kasutusõpetust.

Kõik kodutööd tuleb riputada Dijkstra serverisse, et õppejõud saaks lähtekoode Dijkstra serveris vaadata ja plagiaadituvastus-tarkvara abil kontrollida.

Nõuded kataloogile/failinimedele:

  • Teine kodutöö tuleb panna sinu kodukataloogi alamkataloogi public_html/prax2 mille pead ise looma.
  • Kodutöö html-põhifaili nimi peab olema index.html.
  • Kodutöö sinu tehtud javascripti-fail fail olgu nimega prax2.js ning sinu tehtud css-fail nimega prax2.css
  • Pildifailide ja mujalt võetud javascripti/css teekide osas mingeid nõudeid ei ole.

Enne failide serverisse riputamist on mõistlik teha kogu süsteem valmis lihtsalt oma arvutis/arvutiklassi arvutis.