Näin luetaan ja kirjoitetaan koodia

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Näin luetaan ja kirjoitetaan koodia

Post by Viltzu »

Esimerkkien lukijat ja käyttäjät

Jos olet vasta tullut CB:n pariin, mutta olet käynyt manuaalin sekä oppitunnit läpi ja haluat nyt mennä eteenpäin niin esimerkeistä on hyvä opetella lisää, kunhan sen opettelun tekee oikein. Jos olet aloittanut pelin tekemisen ja joku esimerkki sopisi siihen hyvin, älä kopioi sitä suoraan peliisi, vaan mieluummin koodaa itse rivi riviltä. Vaikka täysin samanlaiseksi kuin esimerkki. Näin ainakin varmasti luet sen esimerkin läpi ja jotain voi jäädä päähänkin.

Yleensä esimerkit on kommentoitu, joten jos et tiedä, tai et ole varma, mitä jokin kohta esimerkissä tekee lue sen yläpuolella tai vieressä oleva kommentti! (On myös mahdollista että kommentit löytyvät eri paikasta, mutta nuo kaksi ovat yleisempiä kommentien paikkoja) Jos et tiedä mitä jokin komento tekee, eikä sitä ole kerrottu kommenteissa, voit tuplaklikata komentoa CB:n editorissa jolloin manuaalin aukeaa kyseinen komento. (Jos et löydä vastausta, etsi foorumeilta -> ei löydy -> Tyhmät Kysymykset -aihe!)


Esimerkkien tekijät

Jotta aloittelijatkin pääsisivät jyvälle esimerkistä on kommentointi tärkeää. Lisäksi myös kannattaa aina yrittää tehdä virheetöntä sekä siistiä koodia. Esimerkkiä miltä koodien pitäisi näyttää ja miltä ei.

Code: Select all

ukko = LoadObject("Media\guy.bmp", 72)
Repeat
If LeftKey() Then 
MoveCamera -1
x - 1
EndIf
If RightKey() Then 
MoveCamera 1
x + 1
EndIf
If UpKey() Then MoveCamera 0, 1
If DownKey() Then MoveCamera 0, -1  
DrawScreen
Forever
Ei näin. Alempaan on lisätty sisennykset, kommentointi sekä pieni kohta jossa x:n arvoa muutattaessa käytetäänkin tapaa x = x + 1, tämä siksi että jos aloittelija haluaa lisätä muuttujaan toisen muuttujan arvon, ei x + y tulisi toimimaan.

Code: Select all

//Ladataan objekti muuttujaan ukko
ukko = LoadObject("Media\guy.bmp", 72)
//Aloitetaan silmukka
Repeat
    //Kameran ohjaus, MoveCamera liikuttaa kameraa
    If LeftKey() Then 
        MoveCamera -1
        x = x - 1
    EndIf
    If RightKey() Then 
        MoveCamera 1
        x = x + 1
    EndIf
    If UpKey() Then MoveCamera 0, 1
    If DownKey() Then MoveCamera 0, -1  
    //Piirretää ruutu
    DrawScreen
Forever
On myös hyvä käyttää tyhjiä välejä joissain kohti, nekin helpottavat koodin lukua huomattavasti. Sekä kommentoinnin määrä vähän riippuu kuinka kokeneille ohjelmoijille esimerkki on suunnattu. Pidä mielessä, että kaikkea ei välttämättä tarvitse kommentoida. Komennot voi esimerkin lukija itsekkin selvittää manuaalista tarvittaessa.

Code: Select all

//Ladataan objekti muuttujaan ukko
ukko = LoadObject("Media\guy.bmp", 72)

//Aloitetaan silmukka
Repeat

    //Kameran ohjaus
    If LeftKey() Then 
        MoveCamera -1
        x = x - 1
    EndIf
    If RightKey() Then 
        MoveCamera 1
        x = x + 1
    EndIf
    If UpKey() Then MoveCamera 0, 1
    If DownKey() Then MoveCamera 0, -1  

    DrawScreen
Forever
Selvästi, tyhjät välit saattavat joko hankaloittaa lukemista ja esimerkin ymmärtämistä, mutta oikein tehtynä ne helpottavat sitä. (Eli toisinkuin minun esimerkissä.)

Voit myös koittaa erikokoisia sisennyksiä. 4 merkkiä on CB:ssä oletus ja 8 merkkiä käytetään jonkin verran. Yhden merkin sisennyksiäkin näkee, mutta ne ovat monesti turhan pieniä.

Mutta miten näitä sisennyksiä sitten oikeasti tehdään?

Kerron ensin missä kohti yleensä sisennetään. Kaikilla on oma tyylinsä ja tapansa, mutta tämä on nyt miten minä olen tottunut sisentämään. Idea on että jokaisen uuden koodilohkon alettua sisennettäisiin. (Kuvittele vaikka että kaikki mikä lopetetaan johonkin komentoon (If lopetetaan EndIf komentoon) niin niiden sisällä olevat asiat pitää sisentää)
Sisennetään kaikki loopit; For ... Next, Repeat ... Until, While ... Wend jne. Kaikki rakenteet; If ... EndIf, Select ... Case jne.
Tässä on esimerkkejä mitä kuuluu sisentää ja miten. Tab sisentää (Nappi Caps Lockin yläpuolella) ja Shift+Tab menee yhden sisennyksen taaksepäin. Voit myös valita suuremman alueen kerralla jonka haluat sisentää maalaamalla tekstin.

Code: Select all

//Sisennetään uuden koodilohkon alkaessa
DrawToImage img
    //Sisennetään, Tab
    Dot 0,0
    //Shift+Tab menee yhden sisennyksen taaksepäin
DrawToScreen

If 1 = 1 Then
    //Myös sisäkkäiset koodilohkot sisennetään
    If 1<>1 Then
        Print "Not possible!"
    Else //Edellinen koodilohko loppuu Else komentoon ja tästä alkaa taas uusi. Myös ElseIf:n kanssa näin.
        Print "Hello World!"
    EndIf //Koodilohko loppuu nyt EndIf komentoon
    
ElseIf 1 = 0 Then
    Print "This also isn't possible!"
EndIf

//Eli If -> Uusi koodilohko -> Else, ElseIf, EndIf -> Koodilohko loppuu ja uusi voi alkaa

Repeat //Koodilohko 1
    For i = 0 To 9 //Koodilohko 2
        If i = 5 Then //Koodilohko 3
            Print i
        EndIf //Koodilohko 3 loppuu
    Next i //Koodilohko 2 loppuu
Forever //Koodilohko 1 loppuu

//Ylemmässä esimerkissä voit huomata, että sisennettynä on helpompi nähdä mitkä asiat kuuluvat koodilohkon sisälle. Tämä helpoittaa siis myös virheiden etsintää, varsinkin jos virheenä on että ei löydä rakenteen lopetusta (Endif jne).

Type LOHKO
    Field obj
EndType 

Select 2
    Case 1
        Print "1"
    Case 2
        Print "2"
    Case 3
        Print "3"
    Default
        Print "?"
EndSelect
Projektien tekijät

Jos olet vasta niin alussa projektin tekoa että et ole vielä keksinyt ideaa, niin älä istu siinä koneen ja editorin edessä miettimässä ideaa. Hyvät ideat eivät synny niin, kokemuksesta ja Assembly tapahtumassa olleessa seminaarissa opittu.

Mutta kun hyvä idea on keksitty ja koodia alkaa tulemaan, niin seis. Jos aiot tehdä hyvän pelin niin älä aloita sen koodaamista heti alkuun, suunnittelu on todella tärkeä osa pelien kehittämisessä. Suunnittele hyvin pelisi ennen koodaamisen aloittamista.

Punnitse myös taitojasi: Oletko varma, että taitosi riittävät projektin aloittamiseen sekä valmiiksi saamiseen? Jos mielestäsi et ole, tai et ole varma, niin en kiellä sinua aloittamasta projektia. Aloita se projekti jos innostusta löytyy opetteluun projektin aikanakin, mutta älä kerro foorumeilla, että olet tekemässä projektia mitä et ehkä koskaan saa valmiiksi.

Koodatessasi on hyvä käyttää sisennyksiä sekä pitää koodi muutenkin siistinä, helpottaa huomattavasti virheiden etsinnässä. Kommentointi on myös hyödyksi isommissa projekteissa, koska et välttämättä enää muista mitä tietyssä kohdassa tehtiin ja sinulla kuluu aikaa sen selvittämisessä. Pilko myös todella suuret projektit osiin, komento Include yhdistää koodit sitten yhteen. Tietääkseni CB:n editori ei tykkää lähemmäs 6000:n rivin koodeista. (Ei ole täysin varmaa tietoa!)

Kun peli on siinä vaiheessa, että voit mielestäsi julkaista sen, niin mieti vielä kerran. Tarkista suunnitelmasi läpi ja testaa peliäsi, onko se sellainen kuin piti? Bugejakin voi esiintyä ja ne pitäisi korjata ennen julkaisua. Mutta jos pelisi näyttää ihan hyvältä, lukuunottamat bugeja ja ne ovat mielestäsi korjattavissa niin voinet huoletta kertoa foorumeilla projektistasi tässä vaiheessa. Mutta, vähintään pelistä screenshot (Eli kuva pelistä toiminnassa).
Voit myös laittaa peliäsi jakoon ns. "beta" tai "alpha" versiona, jos näin teet niin painota asiaa, jottei peliäsi testaajat luule sitä "valmiiksi" versioksi. Tässä myös varmasti tulet saamaan monenmoista palautetta, positiivista sekä negatiivista. Negatiivisen palautteen myötä kehitä peliäsi niiltä osin mistä annettiin sitä palautetta.

Kun pelisi on täysin valmis julkaise se foorumeilla, screenshot mukaan jottei ihmisten tarvitse ladata sikaa säkissä ja jos olet tehnyt pelisi beta tai alpha versiolle topikin niin julkaise se valmiskin siellä, ihmiset eivät välttämättä pidä useista topikeista samalle pelille.
Kerro myös ihmisille, että oletko vielä silti aikomassa jatkaa peliä vai et. Niin ihmisten ei tarvitse alkaa kyselemään jatkoversionkaan perään turhaan.

Tietääkseni yleensä alpha versio on alkeellisempi versio kuin beta, puhuin järjestyksessä beta ja alpha syystä, että CB-pelien keskuudessa kutsutaan keskeneräisiä pelejänsä enemmän betoiksi.

Minne laitan projektini?
"Tässä uusimman projektini osoite: C:\Program Files\CoolBasic\ProjectX\" Ei näin. Sinun täytyy lähettää projektisi nettiin jotta muut käyttäjät voivat ladata sen. CoolBasicin foorumeilla on mahdollista laittaa viesteihin liitetiedostoja, se onnistuu kirjoittaessasi viestiä alhaalta. Huomaa, että exejä ei ole sallittu, joten pakkaa tiedostosi ZIP tai RAR arkistoon.

Koko liian suuri?
Palvelimella ei ole rajattomasti tilaa, joten et voi välttämättä lähettää liitetiedostona 1337 megatavun kokoista peliäsi CoolBasicin palvelimelle, tällöin käytä jotain uppipalvelua. Suosin suomalaista dropbox palvelua, sielläkin on tosin 30MiB:n kokorajoitus (Vähän alle 30Mt). Ja vielä Jaren perustama K-Pelit johon voit luoda uuden topikin pelillesi ja omaan kategoriaansa. Jos upit pelisi sivuston kautta niin kokorajoitus on 128mt, jos pelisi on suurempi kuin 128mt voit lähettää tiedoston suoraan Jarelle, joka lisännee pelisi palvelimelle.
Last edited by Viltzu on Sun Oct 07, 2012 2:04 pm, edited 10 times in total.
User avatar
buke44
Active Member
Posts: 169
Joined: Sat May 23, 2009 8:10 pm
Location: Tampere

Re: Näin luetaan ja kirjoitetaan koodia

Post by buke44 »

Hieno tutoriaali, vaikka uskon että suurin osa esimerkkien tekijöistä tietää nämä. Mielestäni paras tapa ohjelmoinnin opettelemiseen ei todellakaan ole esimerkkien katsominen, vaan oman pienen projektin tekeminen.
atomimalli
Moderator
Moderator
Posts: 227
Joined: Wed Aug 29, 2007 3:55 pm

Re: Näin luetaan ja kirjoitetaan koodia

Post by atomimalli »

Hienoa työtä! Ainot mikä tästä jää aloittelijalle epäselväksi on sisentämisen logiikka. Sen oivaltaminen on tuntunut monilla kestävän aikansa. Siitä voisi ehkä joku tehdä tälle jatkoa? Yksinkertainen asiahan se on mutta se voi hämmentääkin vasta-alkajaa että pitääkö itsekin ruveta sisentämään ja miten ja miksi. Tässä voitaisiin mainita koodinlukuossa että sisennys ei vaikuta suoritukseen vaan selkeyteen ja että se ei ole pakollista.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Näin luetaan ja kirjoitetaan koodia

Post by Viltzu »

Lisäsin sisennyksestä asiaa "Mutta miten näitä sisennyksiä sitten oikeasti tehdään?" otsikon alle. Esimerkkejä katsomalla nekin oppii, lähinnähän se ongelma taitaa vain olla että ei tiedä mitä kuuluisi sisentää ja mitä ei.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Näin luetaan ja kirjoitetaan koodia

Post by legend »

Ja niille joilla on projekteja, joita ei ole supistettu. Niin tässä on heidän haave AutoSisentäjä3000, siis se supistaa koodin autamaattisesti. Se ymmärtää yhden rivin if lauseet, drawtoscreen/image, kommentit, Select rakenteen, ja tietenkin ne perus/loput jutut.

Code: Select all

    Const file$ = "Nykyinen Tiedosto" // Huomaa, tiedoston pitää olla samassa kansiossa!
    Const file2$ = "Sisennetty tiedosto" // Huomaa, tiedosto ei voi olla saman niminen!
    
    If Not Sisentäjä(file,file2) Then
        Print "Tiedosto puuttui"
    Else
        Print "Tiedosto on sisennetty =)"
        Print file + " -> " + file2
    EndIf
    
    WaitKey
    
    
    '' by legend
    'Siventää tekstiä
    'palauttaa 1, jos onnistui
    Function Sisentäjä(file$,file2$)
        
        If FileExists(file)
            
            Dim Väli$,Txt$,Rivi$
            Väli = "    " 'alku väli
            
            R = OpenToRead(file) 'avataan tiedostot
            W = OpenToWrite(file2)
            
            While EOF(R) = 0
                Rivi = Trim(ReadLine(R))'luetaan rivi
                
                txt = GetWord(Trim(Rivi),1," ") 'otetaan sana
                
                'käydään yksi rivinen if lause läpi
                If txt = "If" And InStr(rivi,"Then") > 0 And InStr(rivi, Chr(34)+ "Then" +Chr(34)) = 0
                    If GetWord(Mid(Rivi,InStr(Rivi,"Then")),2) = "" Or Left(GetWord(Mid(Rivi,InStr(Rivi,"Then")),2),1) = "'" Or Left(GetWord(Mid(Rivi,InStr(Rivi,"Then")),2),2) = "//"
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                    Else
                        WriteLine W, Väli + Rivi
                    EndIf
                    'käydään rivin jälkeen lavennettavat
                ElseIf txt = "Repeat" Or txt = "For" Or txt = "While" Or txt = "Type" Or txt = "Lock"  Or txt = "Function" Or txt = "If"
                    WriteLine W, Väli + Rivi
                    väli = väli + "    "
                    'käydään heti sisentävät kohdat
                ElseIf txt = "Until" Or txt = "Wend" Or txt = "EndIf" Or txt = "EndFunction"  Or txt = "Forever" Or txt = "Unlock" Or txt = "Next" Or Lower(txt) = "endtype" Or (txt = "End" And GetWord(rivi,2) = "Function")Or (txt = "End" And GetWord(rivi,2) = "If") Or (txt = "End" And GetWord(rivi,2) = "Type")
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    'käydään heti sisennettävät kohdat, jotka myös laventavat rivin jälkeen
                ElseIf txt = "ElseIf" Or txt = "Case" Or txt = "Else" Or txt = "Default"  Or (txt = "Else" And GetWord(rivi,2) = "If")
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    väli = väli + "    "
                    'käydään 8 väliä laventavat kohdat
                ElseIf txt = "Select"
                    WriteLine W, Väli + Rivi
                    väli = väli + "        "
                    'käydään 8 väliä supistavat kohdat
                ElseIf txt = "EndSelect" Or (txt = "End" And GetWord(rivi,2) = "Select")
                    Väli = Left(väli,Len(väli)-8)
                    WriteLine W, Väli + Rivi
                    'käydään ei loogiset kohdat
                ElseIf txt = "DrawToImage"
                    If i = 0 //Lavennettavat
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                        i = 1
                    Else 'käydään heti sisennettävät kohdat, jotka myös laventavat rivin jälkeen
                        väli = Left(väli,Len(väli)-4)
                        WriteLine W, Väli + Rivi
                        väli = väli + "    "
                    EndIf
                ElseIf txt = "DrawToScreen" 
                    väli = Left(väli,Len(väli)-4)
                    WriteLine W, Väli + Rivi
                    i = 0
                    'kirjoitettaan muut ylös
                Else
                    WriteLine W, Väli + Rivi
                EndIf
                
            Wend
            
            CloseFile(R)
            CloseFile(W)
            
            Return 1 'palauettaan yksi jos se onnistui
            
        Else
            
            Return 0 'jos epäonnistui
        EndIf
        
    EndFunction
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: Näin luetaan ja kirjoitetaan koodia

Post by KilledWhale »

legendin koodipätkän innostamana askartelin itsekin automaagisen sisentäjän, tosin toteutin sen pythonilla. Perustuu pitkälti säännöllisiin lausekkeisiin :)
Tukee myös lähdetiedostoon kirjoittamista.

Käyttö: python cbIndent.py -i lähde -o kohde

-w parametrilla voi halutessaan pakottaa tabisisennyksen välilyönneiksi, jolloin annettu arvo määrää välilyöntien määrän.

Koodi löytyy väritettynä osoitteesta: http://killedwhale.kapsi.fi/code/cbIndent.py

Code: Select all

#!/usr/bin/python
 
# cbIndent.py - an automagic indenter for CoolBasic code
# 03.08.2010
# by KilledWhale
 
import sys, getopt, re
 
output = []
 
def main(argv):
        infile = ''
        outfile = ''
        width = 0
 
        try:
                opts, args = getopt.getopt(argv, "hi:o:w:", ["help", "input=", "output=", "width="])
        except getopt.GetoptError:
                print 'cbIndent.py -i <input> -o <output>'
                sys.exit(2)
        for opt, arg in opts:
                if opt in ('-h', '--help'):
                        print 'cbIndent.py -i <input> -o <output>'
                        sys.exit()
                elif opt in ('-i', '--input'):
                        infile = arg
                elif opt in ('-o', '--output'):
                        outfile = arg
                elif opt in ('-w', '--width'):
                        width = int(arg)
        if not infile:
                print 'You must give at least an input file!'
                sys.exit(2)
 
        inadd = re.compile('^(if.*then$|for |repeat|while|function|lock|startsearch|type)', re.I)
        indec = re.compile('^(end *if|next|until|for *ever|wend|end *function|unlock|endsearch|end *type)', re.I)
 
        doubleadd = re.compile('^select', re.I)
        doubledec = re.compile('^end *select', re.I)
 
        ined = re.compile('^(else *(if)?|case|default)', re.I)
 
        indent = ''
        file = open(infile)
        for line in file:
                line = line.strip()
                
                m = inadd.match(line)
                if m:
                        output.append('%s%s' % (indent, line))
                        indent = '%s%s' % (indent, chr(9))
                        continue
 
                m = indec.match(line)
                if m:
                        indent = indent[:len(indent) - 1]
                        output.append('%s%s' % (indent, line))
                        continue
 
                m = doubleadd.match(line)
                if m:
                        output.append('%s%s' % (indent, line))
                        indent = '%s%s%s' % (indent, chr(9), chr(9))
                        continue
 
                m = doubledec.match(line)
                if m:
                        indent = indent[:len(indent) - 2]
                        output.append('%s%s' % (indent, line))
                        continue
                
                m = ined.match(line)
                if m:
                        output.append('%s%s' % (indent[:len(indent) - 1], line))
                        continue
                        
                output.append('%s%s' % (indent, line))
 
        file.close()
 
        if outfile:
                file = open(outfile, 'w')
 
        for line in output:
                if (width):
                        line = line.expandtabs(width)
                if outfile:
                        file.write('%s\n' % line)
                else:
                        print line
 
        if outfile:
                file.close()
        
if __name__ == "__main__":
        main(sys.argv[1:])
 
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Näin luetaan ja kirjoitetaan koodia

Post by esa94 »

KilledWhale wrote: Käyttö: python cbIndent.py -i lähde -o kohde
Meinasit sitten että täällä osataan yleisesti käyttää komentoriviä?
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: Näin luetaan ja kirjoitetaan koodia

Post by DJ-Filbe »

esa94 wrote:
KilledWhale wrote: Käyttö: python cbIndent.py -i lähde -o kohde
Meinasit sitten että täällä osataan yleisesti käyttää komentoriviä?
(sori kun sekaannun, mutta:)
on ihme aika harvinaista jos joku nörtihkö ihminen ei osaa...
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Näin luetaan ja kirjoitetaan koodia

Post by esa94 »

DJ-Nerd wrote:
esa94 wrote:
KilledWhale wrote: Käyttö: python cbIndent.py -i lähde -o kohde
Meinasit sitten että täällä osataan yleisesti käyttää komentoriviä?
(sori kun sekaannun, mutta:)
on ihme aika harvinaista jos joku nörtihkö ihminen ei osaa...
Pleeeeeeeease. Automaattista indentaatiota tarvitsevat lähinnä aloittelevat CB-koodaajat, jotka eivät varmaan ihan ensimmäisenä tajua että pitää mennä asentamaan python, sitten avata cmd.exe, navigoida oikeaan kansioon ja ajaa skripti.

Lisäksi, Python2x vai Python3x?
User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: Näin luetaan ja kirjoitetaan koodia

Post by Dibalo »

Hyvä tuto! Toivottavasti ihmiset lukisivat tämän. :)
Muutan stickyksi.
The darkest spells can be found from
http://tunkkaus.blogspot.fi
Post Reply