Tyhmät kysymykset (II/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (II/2009)

Post by Awaclus »

phons wrote: Ei! Syy: jos pistät Gosub:in nextmappiin etkä ikinä lähde pois se tietää sitä että tuo zombie_amount plussaantuu koko ajan.
Mitääh?

1. Noviisin esimerkissä sieltä poistutaan. Returnilla.
2. Jos ei lähdettäisi ikinä pois, niin se ei kyllä plussaantuisi vaan ohjelma loppuisi, koska siellähän ei ole looppia.
3. Omakaan esimerkkisi ei toimi, koska killed_zombies -muuttujaa ei nollata missään vaiheessa.
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Re: Tyhmät kysymykset (II/2009)

Post by Nassi_Setä »

En ota kantaa teidän zompie-juttuihinne, vaan kyselisin mikä olisi paras ruudun koko parallax scrollerille?
\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Feuer »

Lue ruudun koko ulkoisesta tiedostosta ( width=Int(Readline(f): height=Int(Readline(f)): SCREEN width,height)? Siitä on joka pelaajan helppo muuttaa ruudun koko haluamakseen.

Ei taas aivot oikeen toimi... Manuskassa seisoo selvällä suomella että Readline palauttaa epäonnistuessaan nollan. Mistä tällöin on lähtöisin tulkin ReadLine Failed - virheilmoitus?
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Tyhmät kysymykset (II/2009)

Post by phons »

ReadLine failed tuli kerran minulla silloin kun typotin luetun filun muutuja-nimen. Eli siis silloin tulee kun muutuja ei ole tiedosto josta luettaisiin. En sitten tiedä tuosta epäonnistumisesta.. :P Ehkä se tarkoittaa sitä että sieltä tulee dataa jota ei osaa lukea tjs.
Image
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (II/2009)

Post by JATothrim »

tiedosto Readxxxx komennot heittävät fail kun yritetään lukea tiedoston yli. Jos readline ei ikinä törmää rivinvaihdos ("\n" merkki Java/C/C++ kielet) merkkiin niin se lukee tiedostoa ikuisesti eteenpäin.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
Hene
Active Member
Posts: 122
Joined: Wed Apr 22, 2009 8:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by Hene »

Miten tehdä tehokkaasti (ja mahdollisimma helposti) jonkinlainen "Mikä on Alaskan pääkaupunki?" -järjestelmä, jossa voisi laittaa koodiin vastauksen tulostaen tämän jälkeen oliko oikein vai ei?
"Baby," I said. "I'm a genius but nobody knows it but me."
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (II/2009)

Post by Awaclus »

phons wrote:miksi se muutuja pitäisi muka nollata? sitähä haluttiin nostaa.. ja jos se nolataan se ei koskaan varsinaisesti muutu..
Et saanut pointtiani, koska luulit, että mielestäni muuttuja zombie_amount täytyy nollata. Mutta minäpä sanoinkin, että nollata täytyy zombies_killed, jotta levelin 2 alussa ei spawnaa kymmentä valmiiksi kuollutta zombia ja levelin 3 alussa kahtakymmentä, etc, missä tapauksessa jokainen kenttä olisi täysin samanlainen kuin ensimmäinenkin.

Sen lisäksi, muuttuja zombie_amount voidaan hyvin korvata kirjoittamalla level*10 sen sijaan, että joka kentän jälkeen täytyy erikseen lisätä jotain erillistä muuttujaa. Itse olen btw suosinut Int(level^level/2) -kaavaa kentän vaikeustasossa.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Tyhmät kysymykset (II/2009)

Post by kaneli2000 »

Hene wrote:Miten tehdä tehokkaasti (ja mahdollisimma helposti) jonkinlainen "Mikä on Alaskan pääkaupunki?" -järjestelmä, jossa voisi laittaa koodiin vastauksen tulostaen tämän jälkeen oliko oikein vai ei?
Itse tein kokeisiin herjoitellakseni pienen ohjelman, joka kyselee minulta lintuja. Koodi (huom nopeasti tehty):

Code: Select all

SCREEN 800,600

Type BIRDS
    Field number
    Field pic
    Field name$
EndType

f = OpenToRead("hur många.txt")
    howmany = ReadLine(f)
CloseFile f

For i = 1 To howmany
    newBird.BIRDS = New(BIRDS)
    f = OpenToRead("images\"+i+"\info.txt")
        newBird\name$ = ReadLine(f)
    CloseFile f
    newBird\pic = LoadImage("images\"+i+"\image.jpg")
    newBird\number = i
Next i

start:

birdnum = Rand(1,howmany)

Repeat
    
    For iBird.BIRDS = Each BIRDS
        If iBird\number = birdnum Then DrawImage iBird\pic,0,0
    Next iBird
    
    Locate 10,ScreenHeight()-20
    mikalintu$ = Input("Wut is tis börd: ")
    
    DrawScreen
Until KeyHit(cbKeyReturn)
CloseInput
ClearKeys

For iBird.BIRDS = Each BIRDS
    If iBird\number = birdnum Then
        If Upper(mikalintu$) = Upper(iBird\name$) Then Text 0,0,"OIKEIN!!!!" Else Text 0,0,"Väärin, se oli "+iBird\name$
    EndIf
Next iBird

DrawScreen

Wait 3000

Goto start
Voinet soveltaa tuota. Se ei vastaa kysymääsi, mutta sisältää asioita, jotka viittaavat sinnepäin.
I see the rainbow rising
cce_unlog

Re: Tyhmät kysymykset (II/2009)

Post by cce_unlog »

En ota kantaa teidän zompie-juttuihinne, vaan kyselisin mikä olisi paras ruudun koko parallax scrollerille?
Itse sanoisin 640x480, se toimii varmasti jokaisessa koneessa mutta ei ole niin valtava että grafiikkojen piirtelystä muodostuisi ongelma.
Hene
Active Member
Posts: 122
Joined: Wed Apr 22, 2009 8:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by Hene »

kaneli2000 wrote:
Hene wrote:Miten tehdä tehokkaasti (ja mahdollisimma helposti) jonkinlainen "Mikä on Alaskan pääkaupunki?" -järjestelmä, jossa voisi laittaa koodiin vastauksen tulostaen tämän jälkeen oliko oikein vai ei?
Itse tein kokeisiin herjoitellakseni pienen ohjelman, joka kyselee minulta lintuja. Koodi (huom nopeasti tehty):

Code: Select all

SCREEN 800,600

Type BIRDS
    Field number
    Field pic
    Field name$
EndType

f = OpenToRead("hur många.txt")
    howmany = ReadLine(f)
CloseFile f

For i = 1 To howmany
    newBird.BIRDS = New(BIRDS)
    f = OpenToRead("images\"+i+"\info.txt")
        newBird\name$ = ReadLine(f)
    CloseFile f
    newBird\pic = LoadImage("images\"+i+"\image.jpg")
    newBird\number = i
Next i

start:

birdnum = Rand(1,howmany)

Repeat
    
    For iBird.BIRDS = Each BIRDS
        If iBird\number = birdnum Then DrawImage iBird\pic,0,0
    Next iBird
    
    Locate 10,ScreenHeight()-20
    mikalintu$ = Input("Wut is tis börd: ")
    
    DrawScreen
Until KeyHit(cbKeyReturn)
CloseInput
ClearKeys

For iBird.BIRDS = Each BIRDS
    If iBird\number = birdnum Then
        If Upper(mikalintu$) = Upper(iBird\name$) Then Text 0,0,"OIKEIN!!!!" Else Text 0,0,"Väärin, se oli "+iBird\name$
    EndIf
Next iBird

DrawScreen

Wait 3000

Goto start
Voinet soveltaa tuota. Se ei vastaa kysymääsi, mutta sisältää asioita, jotka viittaavat sinnepäin.
Miten olisi lyhyt teoria tuon käytöstä? Itse pitäisi harjoitella ruotsia tuolla samalla systeemillä enkä näin ollen yksinkertaisesti jaksa arvuutella koko sisältöä :D

E: Enimmäkseen siis tuon "hur många.txt" tiedoston sisältöä utelisin ; )
"Baby," I said. "I'm a genius but nobody knows it but me."
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Viltzu »

Noviisi wrote:Tämäkin kai kuuluu sarjaan "tyhmät kysymykset", mutta eikös tuo phonsin Zombie-esimerkki toimisi myös kutakuinkin näin:

Code: Select all

zombie_amount = 10
    
    Repeat
        If killed_zombies = zombie_amount Then Gosub nextmap
        DrawScreen
    Until Escapekey()
    End
    
nextmap:
    zombie_amount + 10
Return
Kyllä noinkin se toimii, ja vielä yksinkertaisemmanhan siitä saa näin, sekä kuolleiden zombien nollaus myös muistaa:

Code: Select all

zombie_amount = 10
Repeat
    If killed_zombies = zombie_amount Then 
        killed_zombies = 0
        zombie_amount = zombie_amount + 10
    Endif
    DrawScreen
Until EscapeKey()
Tosin, Gotolla ja Gosubilla onnistuu käymään latamaassa uusi kenttä helposti. Tai tokihan se onnistuu ihan If-ehtolauseella.

Code: Select all

zombie_amount = 10
Repeat
    If killed_zombies = zombie_amount Then 
        map = LoadMap(...)
        //Sekä muita. Esim. Ase...
        //Aseiden panokset:
        Bullets = 20
        killed_zombies = 0
        zombie_amount = zombie_amount + 10
    DrawScreen
Until EscapeKey()
EDIT:

Jahas, täällä oli jo seuraavaa sivuakin menossa, noh.

otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by otto90x »

Hene wrote:Miten tehdä tehokkaasti (ja mahdollisimma helposti) jonkinlainen "Mikä on Alaskan pääkaupunki?" -järjestelmä, jossa voisi laittaa koodiin vastauksen tulostaen tämän jälkeen oliko oikein vai ei?
Miksi laittaa ne kysymykset koodiin? Voit kirjoittaa kysymykset ja vastaukset esimerkiksi tekstitiedostoon ja sieltä rivi kerrallaan lukea ja parsia ne getword -funktiolla. Tekstitiedosto voisi näyttää esimerkiksi tältä:

Code: Select all

Mikä on Suomen pääkaupunki?Helsinki
Kuinka monta on tusinassa?12|Kaksitoista
Eli kysymys ja vastaukset erotellaan esimerkiksi kysymysmerkillä ja useammat vastaukset | -merkillä. Luet tekstitiedoston sisällön rivi kerrallaan ohjelman muistiin ja otat taulukkoon tai tyyppikokoelmaan kysymykset ja vastaukset merkkijonoina.

Sitten kysyt käyttäjältä satunnaisen kysymyksen ja vertaat käyttäjä syötettä oikeisiin vastauksiin. Vertailussa kannattaa käyttää lower funktiota jottei suuret ja pienet kirjaimet aiheuta turhaa päänvaivaa.

Ja alkuun palatakseni, tottakai nuo tekstit voi myös suoraan koodiin laittaa, mutta näkisin että kysymysten ja vastausten muokkaus itse ohjelmaa muokkaamatta lienee hyvä ominaisuus.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Hene
Active Member
Posts: 122
Joined: Wed Apr 22, 2009 8:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by Hene »

otto90x wrote:
Hene wrote:Miten tehdä tehokkaasti (ja mahdollisimma helposti) jonkinlainen "Mikä on Alaskan pääkaupunki?" -järjestelmä, jossa voisi laittaa koodiin vastauksen tulostaen tämän jälkeen oliko oikein vai ei?
Miksi laittaa ne kysymykset koodiin? Voit kirjoittaa kysymykset ja vastaukset esimerkiksi tekstitiedostoon ja sieltä rivi kerrallaan lukea ja parsia ne getword -funktiolla. Tekstitiedosto voisi näyttää esimerkiksi tältä:

Code: Select all

Mikä on Suomen pääkaupunki?Helsinki
Kuinka monta on tusinassa?12|Kaksitoista
Eli kysymys ja vastaukset erotellaan esimerkiksi kysymysmerkillä ja useammat vastaukset | -merkillä. Luet tekstitiedoston sisällön rivi kerrallaan ohjelman muistiin ja otat taulukkoon tai tyyppikokoelmaan kysymykset ja vastaukset merkkijonoina.

Sitten kysyt käyttäjältä satunnaisen kysymyksen ja vertaat käyttäjä syötettä oikeisiin vastauksiin. Vertailussa kannattaa käyttää lower funktiota jottei suuret ja pienet kirjaimet aiheuta turhaa päänvaivaa.

Ja alkuun palatakseni, tottakai nuo tekstit voi myös suoraan koodiin laittaa, mutta näkisin että kysymysten ja vastausten muokkaus itse ohjelmaa muokkaamatta lienee hyvä ominaisuus.
Just näitä asioita jotka eivät koskaan ole kuuluneet meikäläisen CB-opintojen piiriin :D Ei joku mitenkään viitsisi säätää nopeeta pohjaa tuohon? Tiedän kyllä että koodin copypastetus on täysin oppikirjan vastaista, mutta tulee joka tapauksessa omaan käytöön...
"Baby," I said. "I'm a genius but nobody knows it but me."
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by otto90x »

Hene wrote:Just näitä asioita jotka eivät koskaan ole kuuluneet meikäläisen CB-opintojen piiriin :D Ei joku mitenkään viitsisi säätää nopeeta pohjaa tuohon? Tiedän kyllä että koodin copypastetus on täysin oppikirjan vastaista, mutta tulee joka tapauksessa omaan käytöön...
No tässäpä esimerkki, jossa olen kommentoinut muutamaa poikkeusta lukuunottamatta jokaista koodiriviä. Hyvää materiaalia opiskeluun.

Code: Select all

//isommalle ruudulle mahtuu enemmän tekstiä
SCREEN 1024,768


//käytetään muuttujaa tiedostopolulle
//helpottaa sen muuttamista jos sitä on käytetty useassa paikassa
//eikä aiheuta virheitä kun johonkin on jäänyt väärä polku
tiedostonnimi$ = "Kisa.txt"


//Luodaan tekstitiedosto - Vain testimielessä tässä, luo oma tekstitiedostosi ja poista tämä
f = OpenToWrite(tiedostonnimi$)
    WriteLine f,"Mikä on Suomen pääkaupunki?Helsinki"
    WriteLine f,"Kuinka monta senttimetriä on yksi metri?100|sata|100 senttimetriä|sata senttimetriä"
    WriteLine f,"Kuinka monta bittiä on tavussa?8|kahdeksan"
CloseFile f



//Tyyppikokoelma kysymysten säilyttämiseen
Type kysymykset

    // tähän merkkijonoon tallennetaan kysymys
    Field kysymys$
    
    // tähän merkkijonoon tallennetaan vastaukset
    Field vastaukset$
    
    // tämä kertoo onko kysymykseen vastattu jo oikein
    Field vastattuoikein
    
    // tämä kertoo kuinka monta kertaa kysymykseen on vastattu
    Field vastattu
    
    //tämä kertoo ollaanko kysymykseen juuri vastaamassa
    Field valittu
EndType 

//avataan tiedosto lukemista varten
f = OpenToRead(tiedostonnimi$)

    //luetaan tiedostoa ..
    Repeat 
    
        //luetaan rivi ja tallennetaan se muuttujaan
        //näin ei vahingossa lueta kahta riviä kerralla
        rivi$ = ReadLine (f)
        
        //tarkistetaan vielä ettei rivi ole tyhjä
        If rivi$<>"" Then 
            //luodaan uusi kysymys
            k.kysymykset = New(kysymykset)
            //haetaan riviltä kaikki ennen ? merkkiä ja lisätään vielä ? merkki jotta kysymys säilyy kysymyksenä
            k\kysymys$ = GetWord(rivi$,1,"?")+"?"
            //haetaan riviltä kaikki ? merkin jälkeen
            k\vastaukset$ = GetWord(rivi$,2,"?")
        EndIf
        
    //..kunnes se loppuu
    Until EOF(f)

//suljetaan tiedosto käytön jälkeen
CloseFile f

//annetaan tilaviesti joka näkyy kysymyksen edellä
tila$ = "Tervetuloa kyselyyn! "


//tästä kohdasta alkaa kysymyksen arvonta
arvokysymys:

//nollataan arvot ettei vanhat arvot ole tallella
kysymysvalittu = 0
kysymyksiäkäytyläpi = 0
kysymyksiäoikein = 0

//käydään niin kauan että joku kysymys on arvottu
Repeat 
    //käydään kaikki kysymykset läpi
    For k.kysymykset=Each kysymykset
    
        //lasketaan kaikki kysymykset
        kysymyksiäkäytyläpi = kysymyksiäkäytyläpi + 1
        
        //arvotaan väärinvastatuista tai vastaamattomista kysymyksistä 
        If k\vastattuoikein = 0 Then 
            If Rand(1) Then 
                
                
                //valitaan kysymys
                k\valittu=1
                
                //tämä lopettaa arvonnan
                kysymysvalittu=1
                
                // jos kysymykseen on jo vastattu, lisätään tilaviestiin tieto vastausyritysten määrästä
                If k\vastattu Then tila$ = tila$+" Olet vastannut tähän kysymykseen jo "+k\vastattu+" kertaa."
                
                //poistutaan for each silmukasta
                Exit
            EndIf
        Else   
            //lasketaan oikein vastatut
            kysymyksiäoikein = kysymyksiäoikein +1
        EndIf
        
    Next k
    
    // jos kaikkiin kysymyksiin vastattu oikein lopetetaan arvonta ja lopetetaan ohjelma ilmoitukseen
    If kysymyksiäoikein=kysymyksiäkäytyläpi Then MakeError "Vastasit oikein kaikkiin kysymyksiin."
    
Until kysymysvalittu

//nollataan vastaus ettei vanha jää ruudulle
vastaus$ = ""

//putsataan näppäimistö jottei vanha enterinpainallus jumiuta ohjelmaa ikuiseen arvontojen sarjaan
ClearKeys


//Siirrytään itse kyselyyn
Repeat

    //valitaan paikka inputille
    Locate 20,40
    
    //otetaan inputista merkkijono muuttujaan
    vastaus$ = Input("") 
    
    //kirjoitetaan tilaviesti
    Text 20,0,tila$
    
    //käydään kaikki kysymykset läpi
    For k.kysymykset=Each kysymykset
        
        //jos kysymys on valittu 
        If k\valittu=1 Then 
            
            //kirjoitetaan kysymys ruudulle
            Text 20,20,k\kysymys
            
            //kun enteriä painetaan
            If KeyHit(cbkeyreturn) Then 
            
                //lasketaan kysymykseen vastaamiskertoja
                k\vastattu = k\vastattu + 1
            
                //käydään kaikki oikeat vastaukset läpi
                // vastauksia oletetaan olevan ainakin yksi
                // ja korkeintaan niin monta kuinka moneen osaan | merkillä oli vastaukset jaettu
                For i=1 To CountWords(k\vastaukset,"|")
                
                    // muutetaan molemmat kirjaimet pieniksi ja verrataan ovatko samat
                    // getword siis lukee i:nen vastauksen vastausten listasta
                    If Lower(vastaus$) = Lower(GetWord(k\vastaukset,i,"|")) Then 
                        //mikäli täsmäävät merkitään vastaus oikeaksi
                        k\vastattuoikein = 1 
                        //poistetaan valinta 
                        k\valittu = 0
                        //suljetetaan input jotta se tyhjenee
                        CloseInput 
                        // annetaan palautetta 
                        
                        tila$ = "Vastasit oikein."
                        //hypätään takaisin arvontaan
                        Goto arvokysymys
                    EndIf
                    
                    
                Next i
                
                // jos tänne tullaan on vastaus mennyt väärin
                
                //annetaan palautetta
                tila$ = "Vastasit väärin."
                
                //poistetaan valinta
                k\valittu = 0 
                
                 //suljetetaan input jotta se tyhjenee
                CloseInput 
                
                //hypätään takaisin arvontaan
                Goto arvokysymys
                
            EndIf
        EndIf
    
    Next k

    //muista piirtää ruutu
    DrawScreen

Forever
Muutaman asian olisin itse tehnyt toisin, mutta helpommin ymmärrettävissä (ja selitettävissä) näin.

Haasteita:
- mahdollisuus jättää kysymykseen vastaamatta jos on vastannut kysymykseen jo 5 kertaa (väärin).
- talleta pelaajan antamat vastaukset ja näytä väärinmenneiden kysymysten kohdalla entiset vastaukset
- näytä pelin lopuksi tilasto annetuista vastauksista, oikeista ja vääristä.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Feuer »

Olenpa muuten miettinyt... Editorissahan on tuolla oikealla tuo palkki joka listaa typet, funktiot, kirjanmerkit, globaalit ja muuttujat... Ja sitten on tuo "Classes" - kohta. Mitä se listaa? :D
Last edited by Feuer on Wed Dec 16, 2009 5:32 pm, edited 1 time in total.
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
Hene
Active Member
Posts: 122
Joined: Wed Apr 22, 2009 8:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by Hene »

otto90x wrote:
Hene wrote:Just näitä asioita jotka eivät koskaan ole kuuluneet meikäläisen CB-opintojen piiriin :D Ei joku mitenkään viitsisi säätää nopeeta pohjaa tuohon? Tiedän kyllä että koodin copypastetus on täysin oppikirjan vastaista, mutta tulee joka tapauksessa omaan käytöön...
No tässäpä esimerkki, jossa olen kommentoinut muutamaa poikkeusta lukuunottamatta jokaista koodiriviä. Hyvää materiaalia opiskeluun.

Code: Select all

//isommalle ruudulle mahtuu enemmän tekstiä
SCREEN 1024,768


//käytetään muuttujaa tiedostopolulle
//helpottaa sen muuttamista jos sitä on käytetty useassa paikassa
//eikä aiheuta virheitä kun johonkin on jäänyt väärä polku
tiedostonnimi$ = "Kisa.txt"


//Luodaan tekstitiedosto - Vain testimielessä tässä, luo oma tekstitiedostosi ja poista tämä
f = OpenToWrite(tiedostonnimi$)
    WriteLine f,"Mikä on Suomen pääkaupunki?Helsinki"
    WriteLine f,"Kuinka monta senttimetriä on yksi metri?100|sata|100 senttimetriä|sata senttimetriä"
    WriteLine f,"Kuinka monta bittiä on tavussa?8|kahdeksan"
CloseFile f



//Tyyppikokoelma kysymysten säilyttämiseen
Type kysymykset

    // tähän merkkijonoon tallennetaan kysymys
    Field kysymys$
    
    // tähän merkkijonoon tallennetaan vastaukset
    Field vastaukset$
    
    // tämä kertoo onko kysymykseen vastattu jo oikein
    Field vastattuoikein
    
    // tämä kertoo kuinka monta kertaa kysymykseen on vastattu
    Field vastattu
    
    //tämä kertoo ollaanko kysymykseen juuri vastaamassa
    Field valittu
EndType 

//avataan tiedosto lukemista varten
f = OpenToRead(tiedostonnimi$)

    //luetaan tiedostoa ..
    Repeat 
    
        //luetaan rivi ja tallennetaan se muuttujaan
        //näin ei vahingossa lueta kahta riviä kerralla
        rivi$ = ReadLine (f)
        
        //tarkistetaan vielä ettei rivi ole tyhjä
        If rivi$<>"" Then 
            //luodaan uusi kysymys
            k.kysymykset = New(kysymykset)
            //haetaan riviltä kaikki ennen ? merkkiä ja lisätään vielä ? merkki jotta kysymys säilyy kysymyksenä
            k\kysymys$ = GetWord(rivi$,1,"?")+"?"
            //haetaan riviltä kaikki ? merkin jälkeen
            k\vastaukset$ = GetWord(rivi$,2,"?")
        EndIf
        
    //..kunnes se loppuu
    Until EOF(f)

//suljetaan tiedosto käytön jälkeen
CloseFile f

//annetaan tilaviesti joka näkyy kysymyksen edellä
tila$ = "Tervetuloa kyselyyn! "


//tästä kohdasta alkaa kysymyksen arvonta
arvokysymys:

//nollataan arvot ettei vanhat arvot ole tallella
kysymysvalittu = 0
kysymyksiäkäytyläpi = 0
kysymyksiäoikein = 0

//käydään niin kauan että joku kysymys on arvottu
Repeat 
    //käydään kaikki kysymykset läpi
    For k.kysymykset=Each kysymykset
    
        //lasketaan kaikki kysymykset
        kysymyksiäkäytyläpi = kysymyksiäkäytyläpi + 1
        
        //arvotaan väärinvastatuista tai vastaamattomista kysymyksistä 
        If k\vastattuoikein = 0 Then 
            If Rand(1) Then 
                
                
                //valitaan kysymys
                k\valittu=1
                
                //tämä lopettaa arvonnan
                kysymysvalittu=1
                
                // jos kysymykseen on jo vastattu, lisätään tilaviestiin tieto vastausyritysten määrästä
                If k\vastattu Then tila$ = tila$+" Olet vastannut tähän kysymykseen jo "+k\vastattu+" kertaa."
                
                //poistutaan for each silmukasta
                Exit
            EndIf
        Else   
            //lasketaan oikein vastatut
            kysymyksiäoikein = kysymyksiäoikein +1
        EndIf
        
    Next k
    
    // jos kaikkiin kysymyksiin vastattu oikein lopetetaan arvonta ja lopetetaan ohjelma ilmoitukseen
    If kysymyksiäoikein=kysymyksiäkäytyläpi Then MakeError "Vastasit oikein kaikkiin kysymyksiin."
    
Until kysymysvalittu

//nollataan vastaus ettei vanha jää ruudulle
vastaus$ = ""

//putsataan näppäimistö jottei vanha enterinpainallus jumiuta ohjelmaa ikuiseen arvontojen sarjaan
ClearKeys


//Siirrytään itse kyselyyn
Repeat

    //valitaan paikka inputille
    Locate 20,40
    
    //otetaan inputista merkkijono muuttujaan
    vastaus$ = Input("") 
    
    //kirjoitetaan tilaviesti
    Text 20,0,tila$
    
    //käydään kaikki kysymykset läpi
    For k.kysymykset=Each kysymykset
        
        //jos kysymys on valittu 
        If k\valittu=1 Then 
            
            //kirjoitetaan kysymys ruudulle
            Text 20,20,k\kysymys
            
            //kun enteriä painetaan
            If KeyHit(cbkeyreturn) Then 
            
                //lasketaan kysymykseen vastaamiskertoja
                k\vastattu = k\vastattu + 1
            
                //käydään kaikki oikeat vastaukset läpi
                // vastauksia oletetaan olevan ainakin yksi
                // ja korkeintaan niin monta kuinka moneen osaan | merkillä oli vastaukset jaettu
                For i=1 To CountWords(k\vastaukset,"|")
                
                    // muutetaan molemmat kirjaimet pieniksi ja verrataan ovatko samat
                    // getword siis lukee i:nen vastauksen vastausten listasta
                    If Lower(vastaus$) = Lower(GetWord(k\vastaukset,i,"|")) Then 
                        //mikäli täsmäävät merkitään vastaus oikeaksi
                        k\vastattuoikein = 1 
                        //poistetaan valinta 
                        k\valittu = 0
                        //suljetetaan input jotta se tyhjenee
                        CloseInput 
                        // annetaan palautetta 
                        
                        tila$ = "Vastasit oikein."
                        //hypätään takaisin arvontaan
                        Goto arvokysymys
                    EndIf
                    
                    
                Next i
                
                // jos tänne tullaan on vastaus mennyt väärin
                
                //annetaan palautetta
                tila$ = "Vastasit väärin."
                
                //poistetaan valinta
                k\valittu = 0 
                
                 //suljetetaan input jotta se tyhjenee
                CloseInput 
                
                //hypätään takaisin arvontaan
                Goto arvokysymys
                
            EndIf
        EndIf
    
    Next k

    //muista piirtää ruutu
    DrawScreen

Forever
Muutaman asian olisin itse tehnyt toisin, mutta helpommin ymmärrettävissä (ja selitettävissä) näin.

Haasteita:
- mahdollisuus jättää kysymykseen vastaamatta jos on vastannut kysymykseen jo 5 kertaa (väärin).
- talleta pelaajan antamat vastaukset ja näytä väärinmenneiden kysymysten kohdalla entiset vastaukset
- näytä pelin lopuksi tilasto annetuista vastauksista, oikeista ja vääristä.
Kiitokset. Auttaa paljon opiskelussa :)

E: Vielä vähän suuremmat kiitokset; Ruotsista ½ numeroa vuoden parasta tulostani paremmaksi : )

EE: Mikä vikana kun ei ymmärrä jos ensimmäinen/viimeinen merkki Ä/Ö/Å? Tällä hetkellä heitän noissa sanoissa kauttamerkit alkuun ja loppuun niin onnistuu...
"Baby," I said. "I'm a genius but nobody knows it but me."
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (II/2009)

Post by skorpioni-cb »

mikä mavaa:

Code: Select all

FrameLimit 40

Type RAKETIT
   Field obj
EndType 
Type ASTEROIDIT
   Field obj
   Field hp
EndType
Type VIHUT
   Field obj
   Field hp#
EndType 
 
 Const TUTKA_X=225
 Const TUTKA_Y=100
 Const TUTKA_KOKO=50
 
     maksimi=2
 
kamera=MakeImage(200,150) 

space=MakeImage(400,300)

DrawToImage space

 For i=1 To 100 

   Dot Rand(0,399),Rand(0,299)

 Next i
 
DrawToScreen 

world=MakeObjectFloor()

PaintObject world,space

sina=LoadObject("media\sinä.bmp",72)

hp#=100.0

energia=LoadObject("media\energia.bmp")

hiiri=LoadObject("media\hiiri.bmp")

ObjectOrder hiiri,1 

meteori=LoadObject("media\meteori.bmp")
 ShowObject meteori,OFF 
pu=LoadObject("media\power-up.bmp")

ma=LoadObject("media\musta-aukko.bmp",72)

raketti=LoadObject("media\raketti.bmp")
  ShowObject raketti,OFF 
vihu=LoadObject("media\vihu.bmp",72)
   ShowObject vihu,OFF 
pää=LoadObject("media\päävihu.bmp")
n=2
Repeat 

ClsColor 56,62,184 
 
  PositionObject hiiri,MouseWX(),MouseWY()

If MouseX()>=0 And MouseX()=< 0+200 And MouseY()>=0 And MouseY()=< 0+150 Then 

ShowMouse OFF 

Else 

ShowMouse ON 

EndIf 

Gosub tarkista

Color 255,255,255

Text 251,9,"hp: "+hp
  For iVihu.VIHUT= Each VIHUT
       MoveObject iVihu\obj,Rand(-6,6)
       TurnObject iVihu\obj,Rand(-5,5)
  Next iVihu

    PositionObject pää,Int(750.1994),Int(-17.1)

    If LeftKey() Then TurnObject sina,5
    If RightKey() Then TurnObject sina, -5
    If UpKey() Then MoveObject sina,n
    If DownKey() Then MoveObject sina,-n

  If KeyDown(42) Or KeyDown(54) Then n=8 Else n=2

   If KeyDown(cbkeyspace) And reload=0 Then 
   
      newRaketti.RAKETIT= New(RAKETIT)
      newRaketti\obj=CloneObject(raketti)
      CloneObjectPosition newRaketti\obj,sina
      CloneObjectOrientation newRaketti\obj,sina
      
      MoveObject newRaketti\obj,24
      
      reload=4
   EndIf 
   
   i=0
   
  For lVihu.VIHUT= Each VIHUT 
   For iRaketti.RAKETIT= Each RAKETIT
   
       MoveObject iRaketti\obj,6

     If ObjectsOverlap(iRaketti\obj,lVihu\obj,3) Then 
         
       DeleteObject iRaketti\obj
         Delete iRaketti
       EndIf 
       
       lVihu\hp-0.1
       
      If lVihu\hp=0.0 Then 
      
        DeleteObject lVihu\obj
        Delete lVihu
      EndIf 
      If Nykyinen_maara=1 Then 
        Gosub tarkista
      EndIf 

   i=i+1       
       
   Next iRaketti
  Next lVihu
   
   If reload>0 Then reload=reload-1
   
   Text 248,60,"Ladatut ammukset: "+i
         
  camera(kamera,ObjectX(sina),ObjectY(sina))

  DrawImage kamera,0,0
  
  Gosub tutka

 DrawScreen

Forever 

Function nappi(Teksti$,x,y,leveys=0,korkeus=0)

  leveys1=leveys
  korkeus1=korkeus
  
  If leveys1=0 Then leveys2=TextWidth(Teksti)
  If korkeus1=0 Then korkeus2=TextHeight(Teksti)
  
   'Napin pohjaväri. EI TEKSTIN VÄRI!
   
   r=getRGB(RED)
   g=getRGB(GREEN)
   b=getRGB(BLUE)
   
   Color r,g,b
   
   If r=0 And g=0 And b=0 Then 
   
   r1=255
   
   g1=255
   
   b1=255
   
   Else
      
   r1=0
   
   g1=0
   
   b1=0
   
   EndIf
   
   Box x,y,leveys2,korkeus2
   
   Color r1,r1,r1
   
   Text x,y,Teksti

     If MouseX() >=x And MouseX()<= x+leveys2 And MouseY() >= y And MouseY() <= y+korkeus2 Then 
     
       in=True 
       
     Else 
     
       in=False 
       
     EndIf 
     
   If in=True And MouseHit(1) Then 
   
     painettu=True
   
   Else 
   
     painettu=False
     
   EndIf 
   
  Return painettu
  
EndFunction 

Function camera(img,x,y)

l=ImageWidth(img)
k=ImageHeight(img)

UpdateGame

DrawToImage img
ClsColor cbblack
Cls
PositionCamera x,y
PositionCamera CameraX()+((ScreenWidth()-l)/2),CameraY()-((ScreenHeight()-k)/2)
DrawGame
DrawToScreen
EndFunction 
Luo:
 newVihu.VIHUT= New(VIHUT)
 newVihu\obj=CloneObject(vihu)
 newVihu\hp=4.0
Return 
tutka:
       For vas.VIHUT = Each VIHUT
          If Distance2(vas\obj, sina) < 1000 Then
              distanceX = ObjectX(vas\obj) - ObjectX(sina)
              distanceY = ObjectY(vas\obj) - ObjectY(sina)
              Color 255,0,0
              Box TUTKA_X + TUTKA_KOKO / 2 + distanceX * 0.1, TUTKA_Y + TUTKA_KOKO / 2 + distanceY * -0.1, 2, 2
          EndIf
       Next vas
Return 
tarkista:
    Nykyinen_maara = 0
    For vihumää.VIHUT = Each VIHUT
        Nykyinen_maara + 1
    Next vihumää
    
    If Nykyinen_maara < Maksimi Then Gosub luo
Return 
Tuo tutka on kopioitu täältä. Anteeksi jos se rikkoo tekiänoikeuksia. Teen uuden itse jos se loukkaa tekiänoikeutta :?:
Toivottavasti ei loukkaa!
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by valscion »

skorpioni-cb wrote:mikä mavaa:

Code: Select all

...koodia...
Opettele sisentämään niin olisi mukavampi auttaa ja helpompi löytää virheitä. Itse testasin koodia käyttämällä oletusmedioita eikä minulla se ainakaan MAVannut. Taitaa olla konekohtainen mavi, mutta voit tarkistaa että missä se sijaitsee sijoittelemalla SetWindow "kohta X" eri kohtiin koodia. Voit myös kokeilla cbDebuggeria: viewtopic.php?f=11&t=1596&p=26607
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (II/2009)

Post by skorpioni-cb »

VesQ wrote:
skorpioni-cb wrote:mikä mavaa:

Code: Select all

...koodia...
Opettele sisentämään niin olisi mukavampi auttaa ja helpompi löytää virheitä. Itse testasin koodia käyttämällä oletusmedioita eikä minulla se ainakaan MAVannut. Taitaa olla konekohtainen mavi, mutta voit tarkistaa että missä se sijaitsee sijoittelemalla SetWindow "kohta X" eri kohtiin koodia. Voit myös kokeilla cbDebuggeria: viewtopic.php?f=11&t=1596&p=26607
Kun ammun toisen vihollisen, niin tulee Memory Access Violation. Ei kiva.
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (II/2009)

Post by JATothrim »

skorpioni-cb: Tämä virheen korjauksesta pitäisi tehdä pinnedin arvoinen ketju, koska se ilmestyy n. joka kolmas viikko.

rivillä 126: poistat lVihu instanssin VIHUT kokoelmasta.
kun looppi "For iRaketti.RAKETIT= Each RAKETIT" kierretään tämän jälkeen uudestaan käy näin:
yrität lukea Null-instanssin läpi rivillä: 115. "If ObjectsOverlap(iRaketti\obj,lVihu\obj,3)" eli "lVihu\obj" bugaa.
Vinkki: vaihda raketti ja vihu looppien paikkaa niin, että yhdelle ammuksella käydään läpi kaikki vihut (vihu looppi on sisempänä). Eikä niin kuin nyt. Kun poistat vihun JA ammuksen, poistu sisemmästä vihuloopista ja jatka ammuksien läpi käyntiä. Näitä asioita saa aina pähkäillä.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
Locked