esmaspäev, 22. detsember 2014

Smartchess 1.5.3

Lihtsalt väike uuendus

Parandasin vea tulega ning tegelen taas mängu pygame versiooniga.
Lisaks kirjutas klassivend meile väikse koodirea, mis peaks võimaldama meie mängu mängimise ka Linuxil. Ei ole kindel kas see alati töötab, kuna pole Linuxi kasutaja.
Tänud Kristjan Kongasele!



Varsti avaldame ka mängitava graafikaga versiooni.

Alfred

pühapäev, 9. november 2014

Installeerimisvideo

Siin Alfred.

Kuna homme algab avalik hindamine, otsustasin teha elu veidi lihtsamaks meie mängu testijatele. Lõin väikse installeerimisõpetuse: http://youtu.be/oPEVO5w3vys
Videost saate kõik vajaliku info, et meie mäng praegusel kujul tööle saada.
Et asi veel lihtsam oleks, postitame edaspidi oma koodi ka .py failina, mille saab kohe tööle panna.
Praegune fail: http://tinyurl.com/ogaz2f5

Head testimist!

teisipäev, 4. november 2014

SmartChess beta 1.5.2 ja tõlge

(Ma ei tea, kas programm pidi 31. oktoobriks olema HITSAle esitades lõplik. Kui nii on, siis see postitus/versioon on tähtajast üle.)

Otsustasin mängu inglise keelde tõlkida. Selle käigus leidsin kirjavigu ning väikseid koodivigasid. Mäng on nüüd inglise keeles mängitav, kuid paljud funktsioonid küsivad eestikeelsete vastuste järgi sisendit (Saab aru , mis nuppe on vaja oma eesmärgi täitmiseks sisestada, kuid see on ebaintuitiivne [Erandiks on hetkel jah/ei küsimused, mis on J/E kujul]). Samuti pole eestikeelset juhendit.

Laua kuvamiseks ingliskeelsete tähtedega kirjutasin funktsioonid, mis teisendaks kogu boardType ja boardOwner listid (Kus hoitakse vastavalt ruudul oleva nupu liiki ja nupu omanikku) kuvamisfunktsiooni alguses ingliskeelseteks ning kuvamisfunktsiooni lõpus tagasi eestikeelseteks.

Eestikeelse versiooni kood: http://pastebin.com/p7NNd9ee
Ingliskeelse versiooni kood: http://pastebin.com/69hVhS95

reede, 31. oktoober 2014

Tulevikuplaanid

See on arvatavasti viimane kirjutis siin senikaua kuni selgub, kas saame Progetiigri konkurssil edasi.
Seega ma arvasin, et oleks kasulik kirjutada, mis meil plaanis on.

Esiteks kindlasti peaks ülesannete liike suurendama. Me algul arvasime, et jõuame praeguseks mitu tehtud, aga kool võtab palju aega ära ning nii kaugele me ei jõudnud. Lisaks on vaja mängu kindlasti tasakaalustada. Kuigi on meie versioon kindlasti mängitav, on punktide saamine pranglimisel liiga kerge või nuppude ostmine liiga odav. Selleks, et seda tasakaalustada peaks kindlasti paar õhtupoolikut kulutama mängides ja kahjuks hetkel sellist luksust meil pole.
Teine suur asi, mille üritame ette võtta, kui saame konkurssil edasi, on mängu ümbertegemine graafikaga ning hiire inputiga. Ise olen ma seda veidi juba vaadanud pygame abil ning hiire sisestus töötab väga mugavalt. Täielik ümbertegemine nõuab muidugi aega, sest ülesannete vastuste sisestus on täiesti erinev.

Seekord uut koodi versiooni pole :)

Väike eelvaade:

kolmapäev, 29. oktoober 2014

Veaparandus (beta 1.5.1)

Siin Alfred.

Leidsin väga suure vea tulekontrollis (funktsioon checkCheck).
Loodan, et siit lugedes saate aru, miks on väga tähtis koodi ka pärast kirjutamist igat moodi läbi testida, muidu jääb viga kauaks märkamata. See selgitus eeldab, et lugeja teab veidi pythoni keelt.
Peaks ära ütlema, et tekstis kirjeldatakse enda nuppe kui tule all oleva mängija omi.

Kui vaadata Smartchess beta 1.4 koodi, näeb lipul, odal ja vankril kontroll välja midagi sarnast:
  1. while .....:
  2.         if boardOwner[...] == turn:
  3.             break
  4.         elif boardType[...] == ".." or boardType[...] == ".."
  5.             return True
Selgitus: muutuja boardOwner oli kahemõõtmeline massiiv, mis kujutab laua igat ruutu kas tühjana (" "), valge ("V") või must ("M"); muutuja turn sisaldab seda, kelle käik on; boardType on sarnane boardOwnerile, sest on kahemõõtmeline massiiv, kuid omaniku asemel annab ta infot, mis tüüpi nupp igal ruudul on; märk != tähendab pythonis mitte võrdumist
Oda, lipu ja vankri jaoks on iga while tsükkel ühe suuna jaoks, kuhu nad liikuda saavad

Esimene if lause peaks jätma tsükli seisma kui sul on oma nupp sellel joonel ees.
Probleem oli selles, et kui ette jäi mõni musta nupp (näiteks lipul on ees ettur), sellega ei arvestatud, kuna tsükli peatav break käsklus töötab vaid siis, kui joonele sattub enda nupp.
Seda probleemi üritasime Smartchess beta 1.5-s parandada järgmiselt, muutes esimese näite 2. rea järgnevaks:
  1. if boardOwner[Y][X[1]] !=  " ":
  2.             break
Esialgu tundus, et see lahendas probleemi, kuna nüüd vahet pole kumma nupp ette jääb.
Teoorias kui satub mõni nupp ette, siis ta lõpetab tsükli.
Kui veidi aga seda vaadata näeb, et ta lõpetab tsükli siis kui satub ette ükskõik mis nupp.
Isegi siis kui see nupp annab tuld. Seega ei loetud ühegi oda, vankri ega lipu tuld
Selle vea ma paar päeva tagasi leidsingi.

Parandasin selle järgnevalt:
  1.     while .....:
  2.         if boardOwner[...] == turn:
  3.             break
  4.         elif boardOwner[...] != " ":
  5.             if boardType[...] == ... or boardType[...] == ...:
  6.                 return True
  7.             else:
  8.                 break
Siin on kõikide võimalustega arvestatud. Esimene if lause lõpetab tsükli (rida 2-3) siis, kui satub ette enda nupp. See on loogiline. Teine if lause (rida 4) on tehtud nii, et kui ruut ei ole tühi peab ta loogiliselt olema vastase oma (sest enda oma juba vaatasime). Kõigepealt kontrollitakse, aga kas see on tuld andev (sõltuvalt sellest millist ründejoont vaatame; rida 5). Kui on, annab tsükkel teada, et tuli on olemas (rida 6). Muidu saame olla kindel, et see vastase nupp ei anna tuld ja paneb selle tulejoone kinni ning tsükkel lõpetatakse break käsuga (rida 7-8).

laupäev, 25. oktoober 2014

SmartChess beta 1.5

Uus kood: http://pastebin.com/AStgS5Fk

Tegin mõned vorminduslikud muudatused ning täiendasin juhendit. Nagu oli videost näha, otsustasime arvutamise teha kolmekohaliste arvudega, kuid see on vist nüüd liiga tugev. Selle kasulikkust (nuppude hinda) saab muuta kui koodi sees muuta konstanti "pawnValue". Males on nuppudel konstantsed punktiväärtuste suhted (ettur 1 punkt, oda ja ratsu 3 punkti, vanker 5, lipp 9), niiet kui etturi väärtust suurendada siis automaatselt suurenevad ka teiste nuppude väärtused (nt lipu väärtus on meie koodis 9*pawnValue). Peaks märkima, et ettureid ise ei saa osta, sest see oleks liiga tugev ja tülikas (Kas ostetud ettur võib käia 2 sammu ette? Mis siis kui ta käib ühe sammu, kas siis ka? Kas ainult need etturid saavad käia 2 sammu kes pole liikunud? Siis peaks iga etturi kohta teadma, kas ta on liikunud või mitte. Samas oleks väga kerge mingi ratsu või odaga liikuda vastase tagumisele reale ja siis see lipuks muuta, põhimõtteliselt säästes 5 punkti).

Räägin lähemalt vormindusest, sest see osutus päris keeruliseks. Guugeldamise abil leidsin mooduli textwrap, koodis nägi esimene versioon niimoodi välja:

    for x in range(len(tutorialText)//70+2):
        print(textwrap.wrap(tutorialText)[x])

Kusjuures enne pidi importima textwrapi ja tutorialText on string juhendi tekstist. Ma ei saanud esialgu aru, kuidas see moodul töötab. Siis ma mõtlesin, et tegelikult see ju lihtsalt splittib stringi osadeks ja võttab sellest uuest tekkinud massiivist mingi kindla stringi. Niiet ma kirjutasin selle ümber:

    for x in range(len(textwrap.wrap(tutorialText))):
        print(textwrap.wrap(tutorialText)[x])

Tegelikult vist saaks isegi kirjutada see niimoodi:

    for x in textwrap.wrap(tutorialText):
        print(x)

Igatahes, on probleem praeguse koodiga see, et tutorialText on üks hästi suur string. See tähendab, et kui keegi tahaks midagi juhendis muuta, on väga raske leida Pythonis õiget kohta üles (sest kogu see jutt on ühes reas). Ma oleks võinud tekitada tekstifaili kuhu saaks kirjutada, aga see tähendaks, et peab saatma ühe faili asemel kaks (kui saata mäng inimestele, kes pole varem seda mänginud ja tahavad juhendit lugeda) ja see oli mulle vastumeelne. Kui on väga vaja, võin kirjutada funktsiooni, mis lihtsustaks juhendi muutmist, kuid hetkel pole see vajalik.

neljapäev, 9. oktoober 2014

SmartChess beta 1.4

Kuna me pole vahepeal oma progressi kohta postitanud saate kaks postitust ühe hinnaga!

Oleme jälle paar päeva tööd teinud (koodi pikkus on kasvanud 600 rea pealt ligi 1000ni).

Mina(Alfred) olen töötanud vangerduse kallal. Esialgu arvasin, et see tuleb lihtne, kuid siis tulid meelde vangerduse reeglid. Näiteks ei tohi vangerdada läbi ruudu, mis on tule all. Seega olin kohustatud lisama funktsiooni, mis kontrollib kas ruut on tule all. Tänu sellele lisandus võimalus mängida mängu ka tulega (muidu mõtlesin, et ilma selleta on pingelisem) ning seda on võimalik valikutemenüüst sisse lülitada. Jaagup on aga töötanud küsimustevooru kallal.


Edit:
Jaagup siin, olen lisanud aja mõõtmise, küsimuste vooru ja ühte tüüpi küsimuse (liitmistehte). Uuendasin ka veidi juhendit. Järgmisena on planeeritud vormindada juhendit ja lisada uusi küsimusi. Enne tahaksin veidi õppida, kuidas Pythonis funktsioonidevälised muutujad töötavad funktsioonis (tundub, et funktsioonile pole mõnikord muutuja väärtust vaja anda). Uus kood: http://pastebin.com/QVtGFRY2

tldr: lisasime vangerduse, tule ja küsimuste esitamise

esmaspäev, 6. oktoober 2014

SmartChess beta 1.3 ja tasakaaluprobleemid

Uus koodiversioon: http://pastebin.com/4VqSTpeA
Lisasime nuppude ostmise ja muutsime veidi valikute menüüd.

Viimased paar päeva olen mõelnud selle üle, kuidas luua punktide andmissüsteemi. Vähekese Google'i abiga on mul mõeldud välja, kuidas seda programmeerida. Aga kuidas anda punkte erinevate annete ülesannete vahel? Räägime peast arvutamisest: kui kasutame väikseid arve, siis võib muutuda küsimustevoor refleksidele toetuvaks. Mulle isiklikult meeldib harjutada kuni kuskil sadade ringis peast liita-lahutada - sellised võiksid olla ka küsitavad tehted. Aga milline siis võiks olla sellele sarnaselt punkte andev tehe korrutamisel?

Tegin Miksikese lahti, proovisin veidi pranglimist. Minu tulemuste põhjal tundub, et kui võeta korrutistehteks x*y, kus x on arv 1-10 ja y 10-100, on see umbes 2 kuni 3 korda raskem kui liitmistehe neljakohaliste arvudega. Miksikese edetabelis see ei kajastu (tasub mainida, et ma ei olnud korrutamises väga hea), kuid selle puhul on küllap tegemist üleüldiselt treenivate arvutajatega ja paremaks analüüsiks peaksin kauem pranglima. Siiski ma arvan, et kuni programmi lõpunikirjutamiseni selline jaotus sobib. Sarnaselt ma mõtlen, et eesti keele grammatikaharjutustes võiks olla ühe koma panemine umbes poole kergem kui 4-kohalisi arve liita.

Räägiks siis eesti keelest. Mõtlesin esialgu teha umbes nii, et arvuti prindib välja lause ja käsib sisendada sõnad, mille järel koma käib. See võib muutuda keeruliseks siis, kui on ilma komata (või täpsemalt, kui komade arv lausetes on erinev) laused. Kui üks koma annab 1 punkti, siis on ebasünnis panna lauseid, kus peab sama kaua mõtlema komade paiknemise peale, aga saadakse vähem kasu kui teistes lausetes. Samas kui komasid on sama palju, võivad laused muutuda etteaimatavaks ja kergeks (kui mängija märkab, et igas lauses on kolm koma, on edasi suhteliselt kerge välistamismeetodiga komasid kirjutada).

Teine idee, mis mul täna tekkis, on et me võime faili panna lause, kusjuures lause ees on mingi number, millega saab nt lausete raskusastet määrata (või kui palju punkte see annab). Selle lause saaks splittida ja panna listi (numbri eest ära võttes). Teises failis oleksid samad laused ilma kirjavahemärkideta, mida mängijale printida. Saaks küsida mängijalt lause õigesti välja kirjutada, ja pärast lause splittimist listi, saab võrrelda sõnu ja kui mingit sõna, mis kasutaja andis, ei ole esimeses listis, võib lahutada sellest numbrist ühe. Ja lõppnumbri saab punktideks anda mängijale. See viis lubab keerulisemaid kirjavahemärke kasutada, kuid tekib probleem, kui on tegemist teistsuguse klaviatuuriga kui on harjutud kasutama.

reede, 3. oktoober 2014

SmartChess beta 1.2

3. Päev

Lisasime koodi paar uuendust. Esiteks lõime startmenüü, kust saab vaadata juhendit, alustada mängu või vaadata uut valikute menüüd.
Valikute menüüst saab muuta laua suurust ja nuppude ostmise omapärasid. Näiteks kas on võimalik osta lippe või kas ostetud nuppe saab ainult laual olevate nuppude vastu vahetada.

Edasiseks tegevuseks on plaanid järgmised:
Valikute menüüsse kavatseme lisada veel valikud selle kohta, milliseid ülesandeid lahendatakse.
Lisaks peame looma siis tekstifailid, kust saab erinevat tüüpi küsimusi hoiustada.

Mõtlesime, et jagame veel natuke taustainfot meie ettevõtmise kohta. Esialgu oli plaanis mäng luua Pygame'is ning lasta mängijatel mängu ajal lahendada Känguru tüüpi ülesandeid. Takistuseks tuli aga see, et me polnud varem mängu programmeerinud ega graafikat teinud (Pygame'i õppimine, mängu programmeerimine ja graafika loomine oli ühekuuse ajalimiidi tõttu liiga riskantne). Seega pidime jääma ainult tavalise Python 3 peale.
Sellega tulid kaasa ka muudatused meie idees. Kuna Pythoni konsool võimaldab ainult ühte inputi korraga (ja mäng jääb seisma inputti oodates), ei saa 2 mängijat ülesandeid lahendada samal ajal. Seega pidime leidma sellised ülesanded, mida on võimalik kiiresti lahendada, et vastasel poleks vaja liiga kaua oodata.

Meie tööprotsess on senikaua välja näinud selline. Koolis vahetundides theorycraftime mängu balance'i ja mechanicute üle. Lisaks küsime ideid klassikaaslastelt, millest mõned jõuavad arvatavasti mängu. Õhtul teeme Skype'i kaudu koostööd koodi kirjutamisel, testimisel ja vigade leidmisel.

Uus kood: http://pastebin.com/EefBX8mj

neljapäev, 2. oktoober 2014

SmartChess beta 1.1

1 päev pärast blogi loomist, lõpetasime tavalise male programmeerimise. Plaan on malemäng siduda kooliteemaliste ülesannete lahendamisega (näiteks pranglimine). Praeguse koodi saab leida siit: http://pastebin.com/wgVGGzZL

Ja nüüd vaade minevikku. 1 nädal BC (Before Chess): Olime maandunud male idee peal ja hakkasime planeerima mängu ülesehitust. Esialgu oli plaan kasutada Känguru-laadseid ülesandeid. Hiljem nõustusime, et see ei sobi meie mõttega luua malemäng, mis on väga kiire. Mõned pildid sellest ajast:


Sissejuhatus

Tere tulemast!

Siin blogis kirjeldame mina ja minu sõber Jaagup oma ProgeTiiger õpilaskonkurss „Tuleviku õpperuum 2050“ konkurssi ülesande loomise protsessi.

Kõigepealt meist.
Me oleme Tallinna Reaalkooli 11. klassi õpilased.
Mina olen Alfred ja minu kaasautor on Jaagup.
Suunaks on meil programmeerimine ning sellepärast loomegi sellist programmi.
Siia blogisse postitame kõik oma programmi source code'i versioonid.
Lisaks kirjeldame tehtud muudatusi ja edasisi plaane.

Loodan, et teil on huvitav seda blogi jälgida ja meie mängu playtestida!