[Ratkaistu] MAV Vasta rakennettaessa EXE

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Satse
Newcomer
Posts: 3
Joined: Thu Jul 03, 2008 1:08 am

[Ratkaistu] MAV Vasta rakennettaessa EXE

Post by Satse »

Hei,

Olen tehnyt erään pisteenlaskenta ohjelman, jota olen näin harrastuksen omaisesti kehittänyt parin vuoden aikana eteenpäin. Pelistä teidän ei tarvitse ymmärtää, kunhan ohjelma saataisiin toimimaan ilman MAVia :)

Aiemmat versiot ovat toimineet ongelmitta, mutta nyt uusimman version kanssa on jotain hämmennystä, jossa itselläni meni sormi suuhun pahemman kerran. Kun ajan CBEditorista koodin, kaikki toimii täysin ilman ongelmia. Saan rakennettua jopa ilman virheitä EXE:n jotta pystyn ohjelmaa kavereille ja tutuille jakamaan. Rakennettu EXE kuitenkin heittää MAVia heti alkuun jo ohjelman käynnistyessä. Yritin etsiä vastausta jo Googlella ja foorumilta, tosin löytämäni vastaukset MAViin liittyen olivat aina ilmeisesti jo ajettaessa koodia CBEditorilla.

Koodarina en ole todellisuudessa erityisen hyvä, joten kaunistahan tuo koodi ei ole. Koodi on kuitenkin toiminut erinomaisesti tähän saakka. Tarvitsetteko näiden lisäksi jotain muita tietoja ongelmasta?

Lyhyesti: CBEditorista ajettuna toimii, EXE tiedostona ei toimi.

Onko vinkkejä mikä tämän tyyppisen mysteeri MAVin voi aiheuttaa? Alla vielä koodin pätkä teille tutkailtavaksi, mikäli siitä löytyy jotain ihmeellistä, mikä oheisen ongelman voi aiheuttaa.

Code: Select all


'Pisteenlaskija 2.0

'Made by Samu Korhonen Ja Aksel Korhonen

SetWindow "Sanghai Pisteenlaskija"

SAFEEXIT OFF

'Tehdään tarvittavista muuttujista Globaaleja
    Global PelaajaMaara
    Global JakajanSijainti
    Global Jakaja
    Global PisteMaara
    Global Valittu
    Global KierrosNumero
    Global ValittuKierros
    Global hiiri
    Global SijaintiX
    Global SijaintiY
    Global Painettu
    Global Virhe
    Global Ohjeet
    Global Syotto
    Global numero
    Global SarakkeenLeveys
    
'Valitaan muistiin tarvittavat muuttujat

    PelaajaMaara = 5
    KierrosMaara = 8
    KierrosNumero = 0
    ValittuKierros = 0
    SijaintiX = 170
    SijaintiY = 45
    JakajanSijainti = 720
    Jakaja = 0
    Syotto = OFF
    SarakkeenLeveys = 291
    
'Luodaan Vakiot
    Const FonttiKoko = 60
    Const FonttiKokoIso = 130
    Const FonttiKokoPieni = 30
    Const IkkunaX = 1920
    Const IkkunaY = 1080
    Const VasenMarginaali = 5
    Const YlaMarginaali = 45
    Const KokoPisteMarginaali = 660
    Const SijaintiXOletus = 170
    Const SijaintiYOletus = 45
    Const Minus = 1
    Const Plus = 3

    
'Asetetaan näyttö oikean kokoiseksi
    SCREEN IkkunaX,IkkunaY,0,2

'Ladataan Fontit
    PerusFontti=LoadFont("cambria",FonttiKoko)
    IsoFontti=LoadFont("cambria",FonttiKokoIso,ON)
    PieniFontti=LoadFont("Cambria",FonttiKokoPieni)

    SetFont PerusFontti //Valitaan oletusfontiksi Fontti

'Luodaan tarvittavat taulukot peliin
    Dim Pelaaja(PelaajaMaara,2) As String 
    Dim Pisteet(PelaajaMaara,KierrosMaara) As Byte
    Dim Kierros(KierrosMaara) As String
    Dim Kokopiste(PelaajaMaara) As Short
    Dim Pelaajatemp(PelaajaMaara,2) As String
    Dim PisteetSyotetty(PelaajaMaara)
    Dim Voittaja(KierrosMaara) As Byte
    Dim Sarake(PelaajaMaara) As Short

'Nimetään kierrokset
    Kierros(0)= "Kirjoita pelaajien nimet"
    Kierros(1)= "Kahdet kolmoset"
    Kierros(2)= "Suora ja kolmoset"
    Kierros(3)= "Kaksi suoraa"
    Kierros(4)= "Kolmet kolmoset"
    Kierros(5)= "Suora ja kahdet kolmoset"
    Kierros(6)= "Kaksi suoraa ja kolmoset"
    Kierros(7)= "Kolme suoraa"
    Kierros(8)= "Neljät kolmoset"
    
'Kerrotaan Sarakkeiden leveys

SarakkeenLaskenta()


Pohja:

ClearText
CloseInput
ClearKeys

'Nollataan kaikki tilastot

PelaajaMaara = 5

ReDim Pelaaja(PelaajaMaara,2) As String
ReDim Pisteet(PelaajaMaara,KierrosMaara)As Byte
ReDim KokoPiste(PelaajaMaara) As Short
ReDim Pelaajatemp(PelaajaMaara,2) As String
ReDim PisteetSyotetty(PelaajaMaara)
ReDim Voittaja(KierrosMaara) As Byte

'Käydään kierrokset läpi ja +1, jotta nähdään tulokset vielä viimeisen kierroksen jälkeen.
For ka = 0 To KierrosMaara+1

    Virhe = 0               //Nollataan varmuudeksi Virheilmoitukset

    Repeat
        Repeat
            Gosub Tulostus          //Mikäli tapahtuu mitään muutoksia, niin tulostetaan näyttö uusiksi
            Painettu = 0
            ClearKeys
            Repeat                  //Tarkistetaan kokoajan onko painettu jotain
                Painallus()         //Ja jos on painettu, niin poistutaan silmukasta
                KirjoitusPainallus()
                PiirraNaytto()
            Until Painettu > 0
            'Toimitaan painalluksen mukaisesti
            If Painettu < 100 Then Gosub Kirjoitus
            If Painettu > 109 Then Valinta()
            If Painettu = 103 Then Goto Loppu
            If Painettu = 101 Then Exit                             //Mikäli painetaan Enter, niin yritetään vaihtaa kierrosta
            If Painettu = 106 Then Execute "media\saannot.pdf"
        Forever
        
        Gosub Kierroksenvaihtaminen
    Until Virhe=0                                                   //Vaihdetaan kierrosta vain, jos vaihdossa ei tapahdu virheitä

Next ka

Goto Pohja                                                          //Aloitetaan uusi peli

Tulostus:

'Tässä aliohjelmassa tulostetaan Näyttöön kaikki
If Ohjeet = ON Then

//Tulostetaan pelaajalle ohjeet
    ClearText
    SetFont PerusFontti
        AddText "OHJEET"
    
    SetFont PieniFontti
        AddText ""
        AddText "Voit liikkua ohjelmassa nuolinäppäimillä tai käyttämällä hiirtä.   "
        AddText ""
        AddText "Valitse nuolinäppäimillä pelaajan istumapaikka  "
        AddText "Viimeisen nimen jälkeen siirrytään pisteensyöttöön painamalla 'Enter'.   "
        AddText "Kun kirjoitat pelaajat istumajärjestyksessä, ohjelma pystyy tunnistamaan jakajan "
        AddText ""
        AddText "Voit valita jakajan nuolinäppäimillä ylös ja alas kun kirjoitat nimiä. "
        AddText "Jakajan valitseminen onnistuu tämän jälkeenkin klikkaamalla henkilöä kokonaispisteluettelossa. "
        AddText "Jakaja ilmoitetaan ympyröidyllä J kirjaimella pelaajan nimen vieressä. "
        AddText ""
        AddText "Saat pelin säännöt näkyviin painamalla 'F11'   "
        AddText "Laita pelatun kierroksen pisteet ja siirry seuraavalle kierrokselle painamalla 'Enter' "
        AddText ""
        AddText "Poistu ohjeista painamalla 'F1' "
        AddText "Poistu ohjelmasta painamalla 'ESC'  "
        
        Locate 1750,1030
        AddText "Versio 2.0 Beta"
        
    SetFont PerusFontti
    
    PiirraNaytto()
Else
    ClearText
    
    PisteenSijainti = SijaintiXOletus
    KokoPisteSijainti = 720
    
    If Virhe > 0 Then Gosub Virheentulostus     //Kirjoitetaan tarvittaessa virhe
    
    For kb = 0 To PelaajaMaara                  //Kirjoitetaan Pelaaja kerrallaan pisteet ja nimet
    
                Pituus = (TextWidth(Str(Pelaaja(kb,0))))/2                 //Kun pisteet tulostetaan, keskitetään
                PisteenSijaintiTemp = (PisteenSijainti + ((SarakkeenLeveys/2)-Pituus))

        Locate PisteenSijaintiTemp, YlaMarginaali   //Siirretään oikean pelaajan kohdalle
        AddText Pelaaja(kb,0)                       //Tulostetaan pelaajan nimi
        
        For kc = 1 To (KierrosNumero)                                       //Tulostetaan pelattujen kierrosten pisteet
            If kb = Valittu And kc=ValittuKierros And Syotto = ON Then      //Ei tulosteta pisteitä, jos ollaan kirjoittamassa
                AddText ""
            ElseIf PisteetSyotetty(kb) = OFF And Kc = KierrosNumero Then    //Jos pisteitä ei ole kirjoitettu, ei tulosteta turhaan
                AddText ""                                                  //turhaan numeroa 0
            Else
                Pituus = (TextWidth(Str(Pisteet(kb,kc))))/2                 //Kun pisteet tulostetaan, keskitetään
                PisteenSijaintiTemp = (PisteenSijainti + ((SarakkeenLeveys/2)-Pituus))
                YSijaintiTemp = YlaMarginaali + kc*FonttiKoko

                Locate PisteenSijaintiTemp, YSijaintiTemp
                AddText "" + Pisteet(kb,kc)
                
                    
            EndIf
        Next kc
        
        PisteenSijainti = Pisteensijainti + SarakkeenLeveys                 //Siirretään kohdistus seuraavan pelaajan kohdalle
    Next kb
    
    'Piirretään ">" osoittamaan mikä sarake on valittu
    'Box SijaintiX,SijaintiY,SarakkeenLeveys,FonttiKoko,0
    
    'Tulostetaan kierrosten nimet
    Locate VasenMarginaali,YlaMarginaali
    AddText ""
    AddText "2xK"
    AddText "S&K"
    AddText "2xS"
    AddText "3xK"
    AddText "S&2xK"
    AddText "2xS&K"
    AddText "3xS"
    AddText "4xK"
    AddText ""
    
    Locate VasenMarginaali, KokoPisteMarginaali
    AddText "Kokonaispisteet:"
    
    'Tulostetaan pelaajien nimet, mikäli ollaan Nimen kirjoitusvaiheessa
    If KierrosNumero = 0 Then
        For kb = 0 To PelaajaMaara
            AddText "       " +Pelaaja(kb,0)
        Next kb
    EndIf
    
    'Tulostetaan pelaajien nimet ja pisteet oikeassa järjestyksessä, mikäli ollaan jo pelaamassa kierroksia
    If KierrosNumero > 0 Then
        For kb=0 To PelaajaMaara                                            //Tarkistetaan pelaaja kerrallaan
            For kc=0 To PelaajaMaara                                        //Onko pelaaja kyseisellä sijoituksella
                If Pelaaja(kc,2)=kb Then                                    //Kun oikea pelaaja löytyy, kirjoitetaan nimi ja pisteet
                    Locate 5,KokoPisteSijainti
                    AddText "       " +Pelaaja(kc,0)
                    Locate 420,KokoPisteSijainti
                    AddText "" +Kokopiste(kc)
                    KokoPistesijainti = KokoPisteSijainti+FonttiKoko
                EndIf
            Next kc
        Next kb
    EndIf
    
        'Kirjoitetaan ohje tekstit pelaajalle
        Locate 600,900
        AddText "OHJEET painamalla 'F1'"
        
        If KierrosNumero < 9 Then                                   //Jos peli on käynnissä kerrotaan kierroksen nimi
            Locate 600,670
            SetFont IsoFontti
            AddText Kierros(KierrosNumero)
        Else                                                        //Jos peli on loppu, onnitellaan voittajaa
            Locate 600,600
            AddText "Peli Loppu!"
            AddText "Voittajalle onnittelut"
            AddText "ja häviäjille parempaa onnea ensikertaan"
            AddText "Aloita uusi peli painamalla 'Enter'"
        EndIf
        SetFont PieniFontti                                         //Kirjoitetaan aina versionumero ja jakajan merkki
            Locate 25,(JakajanSijainti+10)
            AddText "J"
            Locate 1750,1030
            AddText "Versio 2.0 Beta"
        SetFont PerusFontti
    
    // Jos painat 'F11' niin avaat netti sivun jossa on säännöt
    
    PiirraNaytto()
EndIf
    
Return

Virheentulostus:

'Tässä aliohjelmassa tulostetaan virheilmoitusnäytölle, mikäli pisteiden syötössä tai muualla on sattunut virhetilanne

Color cbRed
Locate 800, 970
If virhe = 1 Then AddText "Et ole syöttänyt kaikille pisteitä"
If virhe = 2 Then AddText "Tarkista Pisteet"
If virhe = 3 Then AddText "Tarkista Nimet"
Color cbWhite

Return

Kirjoitus:

'Tässä aliohjelmassa kirjoitetaan joko nimi tai pistemäärä

Syotto = ON                                 //Muistetaan, että nyt ollaan kirjoittamassa nimeä tai pisteitä

If ValittuKierros = 0 Then                  //Mikäli on valittu nimi-sarake, käytetään tekstin kirjoitus inputtia
    Pelaaja(Valittu,0) = ""
    
    
    Gosub Tulostus
        
    Repeat
        Locate SijaintiX,YlaMarginaali

        Pelaaja(Valittu,0) = Input("")
        Painallus()
        If Painettu > 100 Then Exit
    PiirraNaytto()
    Forever
    LyhennaNimet(12)                        //Lyhennetään nimet 12:sta merkkiin
    Valinta()
    
    CloseInput
EndIf
    
If ValittuKierros > 0 Then               //Mikäli ollaan pisteiden syotto vaiheessa avataan numeroiden kirjoitus inputti
    Gosub Tulostus
    InputX(SijaintiX,SijaintiY,4) // Valitulle inputin avaaminen

    Pisteet(Valittu,ValittuKierros) = PisteMaara
    
    'Jos pisteet on syötetty aiemmille kierroksille, korjataan pisteet suoraan oikeiksi
    If ValittuKierros < KierrosNumero And ValittuKierros > 0 Then PisteenLaskenta()
    
    'Tarkistetaan näppäimen toiminto, vasta kun input on suljettu
    HiirenValinta()
    Valinta()
EndIf

ClearKeys
Syotto = OFF                //Muistetaan, että nyt ei enää syötetä pisteitä
Return

Kierroksenvaihtaminen:

'Tässä aliohjelmassa yrietään vaihtaa kierrosta ja mikäli huomataan jokin virhe, niin luodaan virhekoodi
'Mikäli virhekoodi on luotu, niin kierroksen vaihtaminen estetään pääsilmukassa
Virhe = 0
If KierrosNumero = 0 Then                       //Pelaajien määrä tarkistetaan vain, kun siirrytään nimiensyötöstä eteenpäin
    Gosub PelaajienLaskenta                     //koska myöhemmin pelissä, ei ole mahdollista muuttaa pelaajien määrää
    PelaajaMaaraVirhe()
EndIf

If KierrosNumero > 0 Then VirheenTarkistus()    //Pelin ollessa käynnissä tarkistetaan, ettei mukana ole virheellisiä pistemääriä

If Virhe = 0 Then                               //Tehdään kierroksenvaihtamistoimenpiteet, mikäli virheitä ei ilmaannu

    If KierrosNumero = 0 Then
        If Valittu > PelaajaMaara Then Valittu = 0
    EndIf
    If KierrosNumero > 0 And KierrosNumero < 9 Then
        Jakaja = Jakaja+1
            If Jakaja > PelaajaMaara Then Jakaja = 0
    EndIf
    If KierrosNumero < 8 Then ValittuKierros = KierrosNumero+1
    ValittuKierros_SijaintiY()
    Valittu_SijaintiX()
    KierrosNumero = KierrosNumero+1
    PisteenLaskenta()
    ReDim PisteetSyotetty(PelaajaMaara)
EndIf
    

Return

PelaajienLaskenta:

'Lasketaan pelaajien määrä, jotta tiedetään paljonko pelaajia on pelissä
    
        For kb = 0 To PelaajaMaara
            Pelaajatemp(kb,1) = OFF
        Next kb
        
            For kb = 0 To PelaajaMaara
                Pelaajatemp(kb,0) = Pelaaja(kb,0)
            Next kb

        kx = 0
        For kb = 0 To 5
            If Pelaajatemp(kb,0) = "" Then                  //Tyhjästä nimipaikasta tiedetään, ettei tällä pelipaikalla ole pelaajaa
                PelaajaMaara = PelaajaMaara-1
            Else
                If Jakaja = kb Then Jakaja = kx             //Mikäli pelipaikalla on pelaaja, tiivistetään pelajat ensimmäisiin peli
                Pelaaja(kx,0) = Pelaajatemp(kb,0)           //pelipaikkoihin, jotta väliin ei jää tyhjiä pelipaikkoja
                kx = kx +1
            EndIf
        Next kb
        PelaajienJarjestaminen()                            //järjestetään lopuksi pelaajat pistemäärän mukaisesti
        SarakkeenLaskenta()                                 //Muutetaan sarakkeen leveys vastaamaan pelaajamäärää
        
        
Return

Loppu:

'Mikäli suljetaan ohjelma, niin hyvästellään pelaajat

DrawScreen
ClearText
CloseInput

keskitysX = IkkunaX/2   //Luodaan keskitys ikkunan leveyden mukaan

'Keskiteteen tekstit keskelle
CenterText KeskitysX,450,"Kiitokset pelaamisesta!"
CenterText KeskitysX,510,"Ohjelman tehnyt:"
CenterText KeskitysX,570,"Samu Korhonen"
CenterText KeskitysX,630,"Ja"
CenterText KeskitysX,690,"Aksel Korhonen"
DrawScreen
Wait 3000

End

Function InputX(x_position=0,y_position=0,tab=4)
    
'pisteiden syotto funktiossa tarkistetaan näppäinpainallukset ja kirjoitetaan pisteet sen mukaisesti

    Repeat
    
    If KeyDown(pressed_button) Then 
        speed = 200 
    Else 
        speed =1
    EndIf
    
    If Timer()>pressed+speed        //Kirjoitetaan kirjain vain, mikäli näppäintä on painettu riittävän pitkään
    
    'Tarkistetaan näppäin kerrallaan, onko näppäin alhaalla
        For kb = 2 To 10
            If KeyDown(kb)
                user_input$ = kb-1 : key_pressed = True
                pressed = Timer() : pressed_button = kb
            EndIf
        Next kb
        If KeyDown(11)
            user_input$ = "0" : key_pressed = True
            pressed = Timer() : pressed_button = 11
        ElseIf KeyDown(12)
            user_input$ = "-" : key_pressed = True
            pressed = Timer() : pressed_button = 12
        EndIf
        For kb = 71 To 73
            If KeyDown(kb)
                user_input$ = kb-64 : key_pressed = True
                pressed = Timer() : pressed_button = kb
            EndIf
        Next kb
        If KeyDown(74)
            user_input$ = "-" : key_pressed = True
            pressed = Timer() : pressed_button = 74
        EndIf
        For kb = 75 To 82
            kz = 71
            If KeyDown(kb) Then
                user_input$ = kb-kz : key_pressed = True
                pressed = Timer() : pressed_button = kb
            EndIf
            If kb = 78 Then kz = 78
            If kb = 81 Then kz = 82
        Next kb
        If KeyDown(14)
            user_input$ = "" : key_pressed = True
            pressed = Timer() : pressed_button = 14
        EndIf
    
    'Jos näppäintä on painettu, kirjoitetaan oikea numero tai poistetaan yksi numero lopusta
        If key_pressed = True
            If KeyDown(14) And Len(X_String$)>0 Then
                X_String$ = StrRemove(X_String$,Len(X_String$),1) : key_pressed = False
            ElseIf Len(X_String$)<3         //Sallitaan korkeintaan 3 merkkiä pitkä luku
                X_String$ = StrInsert(X_String$,Len(X_String$),user_input$) : key_pressed = False
            EndIf
        EndIf
    
    EndIf
    
    Pituus = (TextWidth(X_String$))/2                 //Kun pisteet tulostetaan, keskitetään
    SijaintiXTemp = (x_position + ((SarakkeenLeveys/2)-Pituus))
    
    Color 255,255,255
    Text SijaintiXTemp,y_position,X_String$        //Tulostetaan teksti
    
        Painallus()
        PiirraNaytto()
   Until Painettu > 100

If ValittuKierros=KierrosNumero Then PisteetSyotetty(Valittu) = 1 //Merkataan, että pisteet on syötetty
Color 255,255,255
PisteMaara = X_String                                             //Otetaan muistiin, mikä pistemäärä on

EndFunction 

Function Painallus()

'Tarkistetaan, onko painettu jotain näppäintä, jolla käytetään ohjelmaa

    If KeyHit(cbkeyright) Or KeyHit(15) Then Painettu = 110     //Painallus oikealle tai TABilla
    If KeyHit(cbkeyleft) Then Painettu = 111                    //Painallus vasemmalle
    If KeyHit(cbkeyup) Then Painettu = 112                      //Painallus ylös
    If KeyHit(cbkeydown) Then Painettu = 113                    //Painallus alas
    If KeyHit(87) Then Painettu = 106                           //Painallus 'F11'
    If KeyHit(1) Then Painettu = 103                            //Painallus 'ESC'
    If KeyHit(28) Or KeyHit(156) Then Painettu = 101            //Painallus 'Enter'
    
    If KeyHit(59)                                               //Painallus 'F1'
        If Ohjeet = OFF
            Ohjeet = ON
        Else
            Ohjeet = OFF
        EndIf
        Painettu = 102
    EndIf
    
    If MouseHit(1) Then HiirenTarkistus()                       //Painallus hiirellä

EndFunction


Function KirjoitusPainallus()       //Tarkistetaan onko alettu kirjoittamaan näppäimistöllä jotain

    If ValittuKierros = 0 Then //Kirjaimet tarksitetaan vain, mikäli valittuna on nimi-sarake
        For ki = 16 To 27
            If KeyHit(ki) Then Painettu = 1
        Next ki
        For ki = 30 To 54
            If KeyHit(ki) Then Painettu = 1
        Next ki        
    EndIf
    
    'Tarkistetaan numeronäppäimet, onko niitä painettu
    For ki = 2 To 12
        If KeyHit(ki) Then Painettu = 1
    Next ki
    For ki = 71 To 82
        If KeyHit(ki) Then Painettu = 1
        If KeyHit(ki) = 78 Then Painettu = 0
    Next Ki

EndFunction

Function Ympyra()

    Circle 10,(JakajanSijainti+12),35,0     //Piirretään ympyrä J:n ympärille
    
    Box SijaintiX,SijaintiY,SarakkeenLeveys,FonttiKoko,0
    
EndFunction

Function PiirraNaytto()

    DrawScreen
    If Ohjeet = OFF Then Ympyra()           //Piirretään ympyrä vain silloin jos ei katsota ohjeita

EndFunction

Function Valinta()

'Mikäli jotain näppäintä on painettu, tässä funktiossa tarkistetaan, mitä tehdään seuraavaksi
    If Painettu = 110
        Valittu = Valittu+1
        If Valittu = (PelaajaMaara+1) Then Valittu = 0
        Valittu_SijaintiX()
        Painettu = 0
    EndIf
    
    If Painettu = 111
        Valittu = Valittu-1
        If Valittu < 0 Then Valittu = PelaajaMaara
        Valittu_SijaintiX()
        Painettu = 0
    EndIf

    If Painettu = 113 Then
        If KierrosNumero = 0 Then
            Jakaja = Jakaja+1
            If Jakaja = (PelaajaMaara+1) Then Jakaja =0
            Jakaja_JakajanSijainti()
        Else
            ValittuKierros = ValittuKierros+1
            If ValittuKierros > KierrosNumero Then ValittuKierros = 1
            If ValittuKierros > 8 Then ValittuKierros = 1
            ValittuKierros_SijaintiY()
        EndIf
        Painettu = 0
    EndIf
    
    If Painettu = 112 Then
        If KierrosNumero = 0 Then
            Jakaja = Jakaja-1
            If Jakaja = -1 Then Jakaja = PelaajaMaara
            Jakaja_JakajanSijainti()
        Else
            ValittuKierros = ValittuKierros-1
            If ValittuKierros < 1 Then ValittuKierros = KierrosNumero
            If ValittuKierros > 8 Then ValittuKierros = 8
            ValittuKierros_SijaintiY()
        EndIf
        Painettu = 0
    EndIf    

EndFunction

Function Valittu_SijaintiX()

'Muutetaan SijaintiX sen mukaan, kuka on valittu
    SijaintiX = ((Valittu*Sarakkeenleveys)+SijaintiXOletus)

EndFunction

Function ValittuKierros_SijaintiY()

'Muutetaan SijaintiY Valitun kierroksen mukaisesti
    SijaintiY = ((ValittuKierros*FonttiKoko)+SijaintiYOletus)
    
EndFunction

Function Jakaja_JakajanSijainti()
    
'Muutetaan JakajanSijainti sen mukaan, kuka on jakajana
    JakajanSijainti = ((Jakaja*FonttiKoko)+(KokoPisteMarginaali+FonttiKoko))

EndFunction

Function PelaajaMaaraVirhe()

'Varmistetaan, että pelaajia on vähintään 3
    If PelaajaMaara < 2 Then
        Virhe = 3
        PelaajaMaara = 5
    EndIf
EndFunction

Function VirheenTarkistus()

'Varmistetaan, että syötetyissä pisteissä ei ole virheitä
    ReDim Voittaja(KierrosMaara)

    //Tarkistetaan, että jokaiselta kierrokselta löytyy voittaja, eikä voittajia ole useampia
    
    For kb =1 To KierrosNumero  //Tarkistetaan jokainen kierros erikseen
        For kc=0 To PelaajaMaara //Tarkistetaan kuka on voittaja
            If Pisteet(kc,kb)= 0 Then
                Voittaja(kb) = 1
                For kd=0 To PelaajaMaara //Kun voittaja löytyy taristetaan, ettei voittajia ole useampia
                    If kc = kd Then
                        temppi=kd 'Ei tehdä mitään
                    Else
                        If pisteet(kd,kb)=0 Then 
                            Virhe = 1
                        EndIf
                    EndIf
                Next kd
                Exit
            Else
                Voittaja(kb)= 0
            EndIf
        Next kc
    Next kb
    
    //Jos voittajaa ei löydy, merkataan virhe
ReDim Voittaja(KierrosMaara)

    For kb = 1 To KierrosNumero
        For kc=0 To PelaajaMaara
            If Pisteet(kc,kb) = 0 Then Voittaja(kb) = 1
        Next kc
        If Voittaja(kb) = 0 Then Virhe = 2
    Next kb
    
    //Unohdetaan voittajan löytyminen
ReDim Voittaja(KierrosMaara)
    
    //Tarkistetaan kaikki pisteet, ettei joukossa ole mahdottomia pisteitä
    For kb =1 To KierrosNumero       
        For kc=0 To PelaajaMaara
            If Pisteet(kc,kb)=1 Or Pisteet(kc,kb)>199 Then virhe = 2
        Next kc
    Next kb

EndFunction

Function PisteenLaskenta()
    
    //Nollataan kokonaispisteet, ja lasketaan ne myöhemmin uudelleen
    ReDim KokoPiste(PelaajaMaara) As Short
    
    For kb=0 To PelaajaMaara
        If ValittuKierros < KierrosNumero And ValittuKierros > 0 Then        //Mikäli aiempien kierrosten pisteisiin tehdään muutoksia, viimeisimmän kierroksen pisteitä ei lasketa
            For kc=1 To (KierrosNumero-1)
                Kokopiste(kb)=Kokopiste(kb)+Pisteet(kb,kc)
            Next kc

        Else
            For kc=1 To 8                                                   //Lasketaan jokaisen pelatun kierroksen pisteet yhteen
                Kokopiste(kb)=Kokopiste(kb)+Pisteet(kb,kc)
            Next kc

        EndIf
    Next kb
    
    PelaajienJarjestaminen()                                                //Järjestetään pelaajat pistejärjestykseen aina laskennan
                                                                            //yhteydessä
EndFunction

Function PelaajienJarjestaminen()
    
'Varmistetaan pelaajien sijoitus toisiinsa nähden
    For kb=0 To PelaajaMaara
        Pelaaja(kb,1)=0
            For kc=0 To PelaajaMaara
                
                //jos on suurempi
                If Kokopiste(kb) > Kokopiste(kc) Then
                    Pelaaja(kb,1)=Int(Pelaaja(kb,1))+1
    //Pelaajan sijoitus pakotettava kokonaisluvuksi, koska muotoa String
                EndIf
                
            Next kc
    Next kb
    
    KokoPisteSijainti = 720
    Indeksi = 0

'Muutetaan sijoitus niin, että kahdella henkilöllä ei voi olla samaa sijalukua    
    For kb = 0 To PelaajaMaara
        For kc = 0 To PelaajaMaara
            If Pelaaja(kc,1) = kb Then
                If Jakaja = kc And KierrosNumero < 9 Then
                    JakajanSijainti = KokoPisteSijainti
                EndIf
                Pelaaja(kc,2) = Indeksi
                KokoPisteSijainti = KokoPisteSijainti+FonttiKoko
                Indeksi = Indeksi + 1
            EndIf
        Next kc
    Next kb

EndFunction

Function HiirenTarkistus()

'Tarkistetaan, missä kohtaa hiiri on ollut kilkkauksen aikana
    hx = MouseX()
    hy = MouseY()
    
    hiiri = 0
    hiiritemp = 0
    
    
    
'Tarkistetaan ensin pelaaja kerrallaan, ja sitten kierroskerrallaan, onko hiiri kyseisen sarakkeen kohdalla. Tarkistus katsotaan pikselikerrallaan
'kb = Pelaaja
'kc = Kierrosnumero
'Ensiksi tarkistetaan pistetaulukko  
    If hx > SijaintiXOletus And hy > SijaintiYOletus Then
        If hy < KokoPisteMarginaali Then            
            For kb = 0 To PelaajaMaara
                hiiritemp = (kb*10)                                                                             //muutetaan indeksi luku oikeaan pelaajaan
                For kc = SijaintiYOletus To (KierrosNumero*FonttiKoko+(SijaintiYOletus+FonttiKoko)) Step FonttiKoko
                    If hx < Sarake(kb) And hy < kc Then
                        If hx > Sarake(kb)-SarakkeenLeveys And hy > kc-FonttiKoko Then hiiri = hiiritemp        //Jos hiiri oli kohdalla otetaan
                    EndIf                                                                                       //hiirenpaikka muistiin.
                    hiiritemp = hiiritemp+1                                                                     //Mikäli hiiri ei ollut kohdalla
                Next kc                                                                                         //lisätään indeksi lukuun yksi
            Next kb                                                                                             //Pelaajan kohdalle
        EndIf
    EndIf
    
    'Luodaan muuttuja funktiota varten, jotta kaavat yksinkertaistuvat
    JakajanSijaintiOletus = KokoPisteMarginaali+FonttiKoko
    
    'Mikäli hiiri on kokonaispistetaulukossa, niin muutetaan jakajaa
    If hx > VasenMarginaali And hy > JakajanSijaintiOletus Then
        If hx < 400 Then
            hiiritemp = 61
            For kb = (JakajanSijaintiOletus+FonttiKoko) To (PelaajaMaara*FonttiKoko+(JakajanSijaintiOletus+FonttiKoko)) Step FonttiKoko
                If hy < kb And hy > kb-FonttiKoko Then
                    hiiri = hiiritemp                       //Jos hiiri on pelaajan kohdalla, merkataan hiiren paikka muistiin
                EndIf
                hiiritemp = hiiritemp+1
            Next kb
        EndIf
    EndIf
    
    hiiritemp = 0
    
    If hiiri > 0 And Syotto = OFF Then HiirenValinta()      //Mikäli pisteitä ei olla kirjoittamassa, tarkistetaan heti, mitä tehdään
    If hiiri > 0 And Syotto = ON Then Painettu = 105        //Mikäli syöttö on päällä niin tarkistetaan manuaalisesti syötön sulkeuduttua
        
EndFunction

Function HiirenValinta()

'Tarkistetaan aiemmassa funktiossa selvitetyn hiiren paikan mukaan, mitä tehdään
    For kc = 1 To 9                         //Tarkisteaan kierros kerrallaan  (kierroksen indeksi on ykköset)
        For kb = kc To (50+kc) Step 10      //Tarkistetaan pelaaja kerrallaan (pelaajan indeksi on kymmenet)
            If hiiri = kb Then              //Kun oikea pelaaja löytyy, niin muutetaan valitun sijainti tämän mukaisesti
                Valittu = (kb - kc)/10
                Valittu_SijaintiX()
                ValittuKierros = kc-1
                ValittuKierros_SijaintiY()
                Painettu = 105
            EndIf
        Next kb
    Next kc
    
'Mikäli ollaan valitsemassa jakajaa, tarkistetaan, kuka valitaan jakajaksi tällä algoritmillä
    For kb = 61 To 66
        If hiiri = kb Then
            numero = kb-61                                      //Luodaan 'numero' indeksi, jonka avulla muutetaan hiirenpaikka
            Painettu = 105                                      //pelaajan paikaksi
            If KierrosNumero = 0 Then                           //Nimiern kirjoitusvaiheessa tiedetään ennalta pelaajan sijainti
                Jakaja = numero
                Jakaja_JakajanSijainti()
            Else
                For kc = 0 To PelaajaMaara                      //Tarkistetaan kuka pelaajista on tällä kohtaa
                    If Int(Pelaaja(kc,2)) = numero Then         //Varmistetaan pelaajan sijoituksen mukaan, onko pelaaja kohdalla
                        Jakaja = kc                             //Löytyessä kerrotaan, että tämä pelaaja on jakaja
                        PelaajienJarjestaminen()
                    EndIf
                Next kc
            EndIf
        EndIf
    Next kb
    
    'Lopuksi unohdetaan, mitä kohtaa hiirellä on painettu
    hiiri = 0

EndFunction

Function LyhennaNimet(maara)

'Lyhennetään nimet functiossa koodissa ilmoitettuun mittaan ottamalla ylimääräiset pois lopusta
    For kb=0 To PelaajaMaara
        Pelaaja(kb,0) = Left(Pelaaja(kb,0),maara)
    Next kb

EndFunction


Function SarakkeenLaskenta()

'Lasketaan sarakkeen leveys pelaajamäärän mukaisesti
        SarakkeenLeveys = (IkkunaX - SijaintiXOletus) / (PelaajaMaara+1)
        
        ReDim Sarake(PelaajaMaara) As Short
        
        'Lasketaan taulukkoon sarakkeen reunojen paikat, jotta tiedetään, onko hiiri tuolla kohdalla.
        For kb = 0 To PelaajaMaara
            Sarake(kb) = (SijaintiXOletus+SarakkeenLeveys) + (SarakkeenLeveys*kb)
        Next kb

EndFunction

Last edited by Satse on Mon Feb 09, 2015 8:47 pm, edited 1 time in total.
Satse
Newcomer
Posts: 3
Joined: Thu Jul 03, 2008 1:08 am

Re: MAV Vasta rakennettaessa EXE

Post by Satse »

Selvästi olen liian hätäisesti pyytämässä apua. Jokin CB:n sisäinen bugi taisi olla. Ongelma korjaantui muuttamalla yksi functio aliohjelmaksi. Edelleen hämmentää kuitenkin, kun homma toimi oikein hyvin koodissa ja exenä ei.
Szanne
Member
Posts: 50
Joined: Thu Aug 30, 2007 5:12 pm
Location: Suomi

Re: [Ratkaistu] MAV Vasta rakennettaessa EXE

Post by Szanne »

Itselleni tuli ensiksi mieleen, että voiko vika olla siinä, että lataat jotain mediaa koodissasi, joka löytyy oletuskansiosta CoolBasicissa, mutta valmis EXE on taas eri paikassa oletussijaintiin, jolloin MAV syntyisi, koska EXE ei silloin löytäisi medioitasi. En kuitenkaan ymmärrä, miksi silloin funktion aliohjelmaksi muuttaminen parantaisi asian. : /
2X - in English viewtopic.php?f=18&t=3057
2X - suomeksi viewtopic.php?f=11&t=3058

Olen Jop Studio vanhalta foorumilta.
Satse
Newcomer
Posts: 3
Joined: Thu Jul 03, 2008 1:08 am

Re: [Ratkaistu] MAV Vasta rakennettaessa EXE

Post by Satse »

Szanne wrote:Itselleni tuli ensiksi mieleen, että voiko vika olla siinä, että lataat jotain mediaa koodissasi, joka löytyy oletuskansiosta CoolBasicissa, mutta valmis EXE on taas eri paikassa oletussijaintiin, jolloin MAV syntyisi, koska EXE ei silloin löytäisi medioitasi. En kuitenkaan ymmärrä, miksi silloin funktion aliohjelmaksi muuttaminen parantaisi asian. : /
Hyvä ajatus, jota itsekin ensiksi mietin. Lähdekoodi ja EXE on tallennettu samaan kansioon. Lisäksi en lataa ohjelmaan mitään muuta kuin fontin koodin ulkopuolelta. Sekin tulee Windowsin kirjastosta. Jätin ihmetykseni tänne pällisteltäväksi, jos jollain muulla tulee samanlainen ongelma, niin voi saada apua tekemällä koodiinsa samantyyppisen muutoksen. Asiasta vielä lisätietoa: Kaverin koneella, jossa editori oli asennettuna kyseinen koodi aukesi mavittamalla samalla tavalla kuin itselläni vian EXE muodossa.
Post Reply