Level 2Hendelser

Skrevet av: Geir Arne Hjelle

Kurs: Computercraft
Tema: Tekstbasert, Minecraft, Spill
Fag: Programmering
Klassetrinn: 5.-7. klasse, 8.-10. klasse, Videregående skole

Introduksjon

I denne leksjonen skal vi se nærmere på hvordan datamaskinene bruker såkalte hendelser for å reagere på ting som tastetrykk, museklikk og så videre. Etterhvert vil vi bli enda bedre kjent med datamaskinene, og lære hvordan vi flytter filer og programmer rundt omkring på en datamaskin eller mellom forskjellige datamaskiner.

Illustrasjon av et ferdig skattejakt spill

Steg 1: Skattejakt

Datamaskiner bruker noe som kalles hendelser for å registrere tastetrykk, museklikk og så videre. Vi vil først se på hvordan vi kan lage et enkelt spill hvor vi styrer en figur med piltastene.

checkSjekkliste

  • local x = 20
    local y = 10
    
    term.clear()
    term.setCursorPos(x, y)
    print('O')
    

    Lagre og kjør programmet. Skjønner du hva det gjør? Prøv å forandre verdiene av x og y og kjør igjen.

  • For å vente på hendelser bruker vi os.pullEvent(). Vi vil spesielt vente på taste-hendelser. Disse hendelsene kalles key i ComputerCraft. Forandre programmet ditt som under:

    local x = 20
    local y = 10
    
    term.clear()
    term.setCursorPos(x, y)
    print('O')
    
    local hendelse, tast = os.pullEvent('key')    -- ny linje
    print(hendelse)                               -- ny linje
    print(tast)                                   -- ny linje
    

    Når du kjører programmet ditt nå blir programmet stående og vente til du trykker en tast. Deretter skrives teksten key samt et tall til skjermen. Teksten key betyr bare at det var en taste-hendelse som skjedde. Dette er ikke så veldig interessant for oss nå, men kan være nyttig i andre programmet om man lytter på flere forskjellige hendelser.

    Tallet vi fikk er derimot veldig viktig. Hver tast på tastaturet har sin egen tastekode. Prøv å kjøre programmet flere ganger, ser du at om du trykker samme tast får du samme tall tilbake. For eksempel er A alltid 30, mens pil opp alltid er 200.

  • local x = 20
    local y = 10
    
    term.clear()
    term.setCursorPos(x, y)
    print('O')
    
    local hendelse, tast = os.pullEvent('key')
    if tast == keys.q then                        -- ny linje
        print('Du trykket Q')                     -- ny linje
    else                                          -- ny linje
        print('Du trykket ikke Q')                -- ny linje
    end                                           -- ny linje
    
  • local x = 20
    local y = 10
    
    while true do                                 -- ny linje
        term.clear()
        term.setCursorPos(x, y)
        print('O')
    
        local hendelse, tast = os.pullEvent('key')
        if tast == keys.q then
            break                                 -- endret linje
        end
    end                                           -- ny linje
    

    Når du kjører dette programmet vil det tilsynelatende ikke skje noe før du trykker Q, siden det er den eneste hendelsen vi har kode som reagerer på.

  • local x = 20
    local y = 10
    
    while true do
        term.clear()
        term.setCursorPos(x, y)
        print('O')
    
        local hendelse, tast = os.pullEvent('key')
        if tast == keys.q then
            break
        end
    
        if tast == keys.right then                -- ny linje
            x = x + 1                             -- ny linje
        end                                       -- ny linje
    end
    

    Når du kjører dette programmet vil du se at du kan bruke pil høyre til å bevege figuren mot høyre.

Prøv selv

De andre piltastene kan du programmere selv på samme måte. Du trenger da å sammenligne med kodene keys.left, keys.down og keys.up. Hvordan må du endre verdiene av x og y? Prøv deg frem!

checkSjekkliste

  • local x = 20
    local y = 10
    local skattX = math.random(1, 50)             -- ny linje
    local skattY = math.random(1, 18)             -- ny linje
    
    while true do
        term.clear()
        term.setCursorPos(skattX, skattY)         -- ny linje
        print('X')                                -- ny linje
        term.setCursorPos(x, y)
        print('O')
    
        if x == skattX and y == skattY then       -- ny linje
            term.setCursorPos(1, 1)               -- ny linje
            print('Du fant skatten!')             -- ny linje
            break                                 -- ny linje
        end                                       -- ny linje
    
        local hendelse, tast = os.pullEvent('key')
        -- resten av programmet er som tidligere
    

    Prøv spillet! Fungerer det som du hadde trodd? Klarer du å kanskje legge til flere skatter?

Prøv selv

Ved hjelp av local maxX, maxY = term.getSize() kan du finne størrelsen på skjermen. Kan du bruke dette til å begrense figuren din slik at den ikke kan gå av skjermen?

En litt utfordrende oppgave: Prøv å skriv et tilsvarende program til en robot, men i stedet for at piltastene bare flytter en figur på skjermen skal piltastene flytte roboten!

Steg 2: Hvordan bevege seg rundt i filsystemet

Datamaskiner organiserer informasjon i filer, og disse filene legges i et filsystem. Dette filsystemet har du kanskje sett på en vanlig datamaskin i programmene Windows Utforsker eller Finder på Mac. I ComputerCraft bruker vi kommandolinjen for å se på filene. Vi skal her se på noen enkle kommandoer for å kopiere og flytte filer.

checkSjekkliste

  • Datamaskinen svarer rom og skattejakt. Den første er en katalog som inneholder alle de innebygde programmene på datamaskinen (rom er en forkortelse for Read Only Memory som betyr kun-lese-minne eller skrivebeskyttet minne). Vi skal se mer på denne katalogen senere.

  • For å gå tilbake en katalog bruker du det spesielle navnet ... Skriv cd ... Du vil nå komme tilbake til utgangspunktet.

Prøv selv

Du har nå sett ganske mange kommandoer: dir, edit, type, mkdir, move og cd. I tillegg finnes også delete som kan brukes til å slette filer og kataloger, og copy som brukes på samme måte som move, men som kopierer filer i stedet for å flytte dem.

Prøv å bruke disse kommandoene til å flytte deg litt rundt i filsystemet, lag nye filer og kataloger, flytt dem rundt og så videre inntil du er ganske komfortabel med hvordan filsystemet fungerer.

Steg 3: Et bedre passord-program

Vi har tidligere laget et passord-program (Se oppgaven Bli kjent med Datamaskinen). Dette passord-programmet har et par svakheter.

  1. Programmet må startes manuelt ved å skrive passord etter at datamaskinen er skrudd på.

  2. I stedet for å skrive passordet kan man bare trykke Ctrl-T for å stoppe programmet, og se inni programmet for å finne det hemmelige passordet.

Vi skal her se på et par triks for å gjøre passord-programmet litt tryggere.

Bilde av en vegg med en dør og en datamaskin

checkSjekkliste

  • local passord = 'kodeklubben'
    
    while true do
        term.clear()
        term.setCursorPos(1, 1)
        print('Hva er passordet?')
        svar = read('*')
    
        if svar == passord then
            redstone.setOutput('left', true)
            sleep(5)
            redstone.setOutput('left', false)
        end
    end
    

    Kjør programmet, og sjekk at det virker som det skal.

  • Skriv move passord startup. Dette endre navnet på passord-programmet vårt. Vi kan nå starte datamaskinen på nytt ved å skrive reboot. Datamaskinen vil nå direkte spørre deg om passordet.

  • Skriv edit startup og legg til en linje øverst i koden din:

    os.pullEvent = os.pullEventRaw                -- ny linje
    local passord = 'kodeklubben'
    
    while true do
        term.clear()
        term.setCursorPos(1, 1)
        print('Hva er passordet?')
        svar = read('*')
    
        if svar == passord then
            redstone.setOutput('left', true)
            sleep(5)
            redstone.setOutput('left', false)
        end
    end
    
  • Vær litt forsiktig med dette siden det ikke er noen enkel måte å få datamaskinen til å gjøre noe annet enn å spørre om passord! Men det du lærer i de to neste stegene kan være nyttig.

Steg 4: Bruk av diskettstasjoner

Vi skal nå se hvordan vi kan bruke disketter og diskettstasjoner til å flytte filer mellom forskjellige datamaskiner.

Bilde av en datamaskin og en diskettstasjon

checkSjekkliste

  • print('Hva heter du?')
    navn = read()
    print('Hei, ' .. navn)
    

    Test at programmet virker ved å skrive navn.

  • 1: Steng datamaskinen.

    2: Åpne diskettstasjonen, og flytt disketten til inventory'et ditt.

    3: Lag en ny datamaskin, også denne med en diskettstasjon inntil seg.

    4: Sett disketten inn i den nye diskettstasjonen.

    5: Åpne den nye datamaskinen. Skriv dir og dir disk slik at du ser at programmet ditt er flyttet til den nye datamaskinen ved hjelp av disketten.

Hva er en diskett?

Disketter var en vanlig måte å lagre programmer og filer på fra de ble introdusert på 1970-tallet og fram til tidlig 2000-tall. Disketter var også den vanligste måten å overføre filer mellom forskjellige datamaskiner på. I nyere tid har internett, samt USB minnepenner og eksterne harddisker overtatt for diskettenes bruksområder.

Morsomt nok, lever likevel diskettene videre som det mest vanlige symbolet for å lagre filer i forskjellige programmer.

Steg 5: Skrive kode utenfor ComputerCraft

Vi kan også se på og endre programmene våre utenfor Minecraft og ComputerCraft. Dette kan være nyttig på flere måter.

1: Om vi ved et uhell ødelegger en datamaskin kan vi hente tilbake programmene på den datamaskinen, og kopiere de til en annen datamaskin.

2: Vi kan raskere kopiere filer mellom datamaskiner enn om vi bruker disketter som vi lærte i forrige steg.

3: Programmet edit som vi bruker til å skrive programmer er ikke så lett å skrive i. Det er enklere å bruke for eksempel Notepad eller andre tekstprogrammer vi har installert.

Som du kanskje vet blir omtrent alle data i Minecraft lagret i en Minecraft-katalog på datamaskinen din. For å finne denne kan du gjøre følgende (utenfor Minecraft):

Windows: Under Windows finner du Minecraft-katalogen under %appdata%\.minecraft. Søk etter %appdata% i en utforsker eller i kjør-feltet etter å ha klikket start-knappen.

Mac OS X: Under Mac ligger Minecraft-katalogen i Library/Application Support/minecraft/ under hjemmekatalogen din. På norsk heter Library Bibliotek.

Linux: På Linux finner du Minecraft-katalogen som en skjult katalog .minecraft rett under hjemmekatalogen din.

Finn Minecraft-katalogen din i en filutforsker. Gå videre til katalogen saves, deretter velger du navnet på den verden du spiller nå, og til slutt katalogen computer. Denne katalogen inneholder flere kataloger som bare har et tall som navn. Disse katalogene representerer de forskjellige datamaskinene i spillet ditt. Du vil også se en katalog som heter disk, som også har nummererte kataloger inne i seg. Disse representerer diskettene i spillet ditt.

Bilde av hvordan skrive kode utenfor minecraft

checkSjekkliste

Flytt en datamaskin

Om du oppdager at du må flytte en datamaskin må du være litt forsiktig, siden om du bare ødelegger en datamaskin og setter ut en ny er alle programmene borte. Du kan da bruke metoden i denne seksjonen for å kopiere programmene tilbake, men det finnes en bedre måte.

Med kommandoen label kan vi gi en datamaskin navn. Prøv for eksempel å skriv label set snakker. Dette gir denne datamaskinen navnet snakker, du kan gi maskinen akkurat det navnet du vil. Om du nå ødelegger maskinen vil du se at du kan plukke den opp igjen, og at den da legger seg i inventory'et ditt med navnet snakker. Om du nå setter ut maskinen igjen vil du se at alle programmene du har skrevet fortsatt finnes på maskinen.

Steg 6: De innebygde programmene

Vi skal nå kikke raskt på katalogen rom. Dette er som nevnt katalogen som inneholder de innebygde programmene på datamaskinen. Ved hjelp av kommandoene vi har lært kan vi nå se hvordan disse programmene er programmert, og til og med lage våre egne versjoner av dem.

checkSjekkliste

  • Prøv først å kjøre programmet ved å skrive hello. Teksten Hello World! skrives til skjermen, ett tegn om gangen.

  • if term.isColour() then
        term.setTextColour( 2^math.random(0,15) )
    end
    textutils.slowPrint( "Hello World!" )
    term.setTextColour( colours.white )
    

    Ser du hvilken kodelinje det er som har ansvaret for å skrive teksten til skjermen?

Resten av programmet

Vi har så langt bare brydd oss om linje 4 i hello-programmet. Skjønner du hva de andre linjene gjør?

Ut fra kommandoene term.isColour() og term.setTextColour() kan vi kanskje gjette på at de har noe med tekstfargen å gjøre? Faktisk sier de første tre linjene at dersom programmet kjøres på datamaskin som har farger så skal tekstfargen settes til en tilfeldig farge. Den siste linjen setter tekstfargen tilbake til hvit.

Om du vil se hvordan dette virker kan du prøve å lage en Advanced Computer, og kjøre programmet hello på den.

Prøv selv

Prøv å se på noen av de andre programmene du kjenner til, som for eksempel cd, go eller refuel. Du må kanskje lete litt i katalogstrukturen for å finne dem. Disse programmene er litt mer kompliserte enn de vi har laget så langt. Prøv likevel å se om du skjønner hva deler av koden gjør. Finner du for eksempel kodelinjen som bytter katalog i cd eller linjen som rapporterer fuelnivået i refuel?

Steg 7: Andre typer datamaskiner

Vi har så langt stort sett bare brukt vanlige datamaskiner, Computer. Men om du ser i inventory'et ditt ser du at det finnes flere andre typer datamaskiner, inkludert Advanced Computer og Pocket Computer. Disse virker typisk ganske likt en vanlig datamaskin, men har noen ekstra muligheter.

checkSjekkliste

  • term.clear()
    
    while true do
        local hendelse, knapp, x, y = os.pullEvent('mouse_click')
        print('Du klikket ' .. knapp)
        print('Posisjon: x = ' .. x .. ', y = ' .. y)
    end
    

    Kjør programmet og prøv å klikk litt rundt omkring på skjermen. Bruk både venstre og høyre museknapp. Skjønner du hvordan museklikk-hendelser fungerer? Bruk Ctrl-T for å avslutte programmet.

  • term.clear()
    
    while true do
        local hendelse, knapp, x, y = os.pullEvent('mouse_click')
        term.setCursorPos(x, y)                   -- ny linje
    
        if knapp == 1 then                        -- ny linje
            print('#')                            -- ny linje
        end                                       -- ny linje
    
        if knapp == 2 then                        -- ny linje
            print(' ')                            -- ny linje
        end                                       -- ny linje
    end
    

Prøv selv

Kan du legge til farger i tegneprogrammet? Se tilbake på hello-programmet hvordan du kan bruke term.setTextColour() til å endre farge. Kanskje du kan bruke talltastene til å endre farge?

Når du vil sjekke forskjellige typer hendelser, for eksempel både museklikk og tastetrykk, er det best å bruke os.pullEvent() uten navnet på en hendelse i parantes. Deretter kan du sjekke variabelen hendelse for hvilken hendelse som faktisk skjedde.

Etterhvert som du tegner merker du at du må klikke hver gang du vil tegne et punkt. Det ville vært bedre om man kunne bare klikket en gang, og deretter dra musen rundt. Se på hendelsen mouse_drag og prøv å forbedre programmet ditt.

Lisens: CC BY-SA 4.0

Forbedre denne siden

Funnet en feil? Kunne noe vært bedre?
Hvis ja, vennligst gi oss tilbakemelding ved å lage en sak på Github eller fiks feilen selv om du kan. Vi er takknemlige for enhver tilbakemelding!