Tyhmät kysymykset (I/2010)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
vieras

Re: Tyhmät kysymykset (I/2010)

Post by vieras »

ei se toimi vaikka vaihoin sen
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

vieras wrote:ei se toimi vaikka vaihoin sen
Nopealla vilkaisulla et ainakaan palauta mitään tuolta funktiosta.
vieras

Re: Tyhmät kysymykset (I/2010)

Post by vieras »

eli mitä pitäs tehä?
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

vieras wrote:eli mitä pitäs tehä?
Ks. Return manuaalista.

EDIT: Ohoh, mitä ihmettä. Missasin kokonaan tuon Global-rivin :D
Last edited by Awaclus on Fri Jun 11, 2010 12:54 pm, edited 1 time in total.
vieras

Re: Tyhmät kysymykset (I/2010)

Post by vieras »

mutko en tajua sitä ohjetta
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2010)

Post by Jonez »

Ei sun pidäkään palauttaa mitään, koska olet aivan oikeaoppisesti tehnyt halutuista muuttujista globaaleja.

Olet tainnut käsittää funktioiden parametrien käytön hieman väärin. Parametreillä voi ainoastaan välittää tietoa funktion sisään, mutta tämä linkki ei ole kaksisuuntainen. Tarkoitan sitä, että jos välität muuttujan "muuttuja" funktioon, ja tulostat muuttujan, saat sen arvon. Näin:

Code: Select all

Funkkari( "Hello World!" )
WaitKey

Function Funkkari( parametri As String )
    Print parametri
EndFunction
Mutta jos funktion sisällä muutat parametrin arvoa, alkuperäinen muuttuja ei muutu. Sinä siis näytit yrittävän tätä koodissasi. Jos logiikkasi toimisi, ruudulle tulostuisi seuraavassa esimerkissä 100. Mutta koska muuttujan a ja parametrin välinen "linkki on yksisuuntainen", a ei muutu.

Code: Select all

a = 5

MuutaArvo( a )

Function MuutaArvo( parametri )
    parametri = 100
EndFunction

Print a
WaitKey
Voit aina palauttaa funktiosta arvon käskyllä Return. Tällöin muuttuja myös pitää ottaa talteen. Seuraavassa esimerkissä välitetään annetaan muuttujalle a uusi arvo funktion sisällä. Uusi arvo annetaan parametrinä.

Code: Select all

a = 5

a = MuutaArvo( 100 )

Function MuutaArvo( parametri )
    Return parametri
EndFunction

Print a
WaitKey
Lopulta päästään sinun ongelmaasi, ellet jo tähän mennessä sitä ratkaissut itse. Koska muuttujat joita haluat muuttaa ovat globaaleja, riittää että annat niille uuden arvon funktion sisällä:

Code: Select all

Global a, b

Hae()

Function Hae()
    a = Rand( 1, 10 )
    b = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
Toinen tapa tehdä sama asia ilman globaaleja muuttujia:

Code: Select all

a = Hae()
b = Hae()

Function Hae()
    Return Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
Lisäksi, ei kannata käyttää Print-komentoa silmukan sisällä. Käytä mieluummin vaikka Text-komentoa.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2010)

Post by kaneli2000 »

Jaaha. Eli siis ideana on, että ENTLIST-typessä on kaikki mahdolliset objektit aka. entityt, joita voidaan luoda. Nämä sitten luodaan ENTLITS:tistä konkreettisiksi entityiksi seuraavalla koodilla:

Code: Select all

        If MouseHit(1) And MouseX()>200 Then
            For eList.ENTLIST = Each ENTLIST
                newEnt.ENTITY = New(ENTITY)
                If eList\name$ = "Stonecre" Then
                    newEnt\obj = CloneObject(eList\obj)
                    newEnt\name$ = eList\name$
                    newEnt\x = MouseWX()
                    newEnt\y = MouseWY()
                EndIf
            Next eList
        EndIf
Se ei kuitenkaan toimi, vaan mavittaa. Tosin, jos ENTILIST:issä on vain yhden entityn tiedot, homma toimii. Täh.
I see the rainbow rising
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (I/2010)

Post by JATothrim »

kaneli2000 wrote:Jaaha. Eli siis ideana on, että ENTLIST-typessä on kaikki mahdolliset objektit aka. entityt, joita voidaan luoda. Nämä sitten luodaan ENTLITS:tistä konkreettisiksi entityiksi seuraavalla koodilla:

Code: Select all

        If MouseHit(1) And MouseX()>200 Then
            For eList.ENTLIST = Each ENTLIST
                newEnt.ENTITY = New(ENTITY)
                If eList\name$ = "Stonecre" Then
                    newEnt\obj = CloneObject(eList\obj)
                    newEnt\name$ = eList\name$
                    newEnt\x = MouseWX()
                    newEnt\y = MouseWY()
                EndIf
            Next eList
        EndIf
Se ei kuitenkaan toimi, vaan mavittaa. Tosin, jos ENTILIST:issä on vain yhden entityn tiedot, homma toimii. Täh.
Riittäisikö jos siirtäisit "newEnt.ENTITY = New(ENTITY)" iffien sisään? ;) Jos iffi ei toteudu ENITY listaan tulee tavaraa ilman valideja objekteja.
-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'.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2010)

Post by kaneli2000 »

JATothrim wrote:
kaneli2000 wrote:Jaaha. Eli siis ideana on, että ENTLIST-typessä on kaikki mahdolliset objektit aka. entityt, joita voidaan luoda. Nämä sitten luodaan ENTLITS:tistä konkreettisiksi entityiksi seuraavalla koodilla:

Code: Select all

        If MouseHit(1) And MouseX()>200 Then
            For eList.ENTLIST = Each ENTLIST
                newEnt.ENTITY = New(ENTITY)
                If eList\name$ = "Stonecre" Then
                    newEnt\obj = CloneObject(eList\obj)
                    newEnt\name$ = eList\name$
                    newEnt\x = MouseWX()
                    newEnt\y = MouseWY()
                EndIf
            Next eList
        EndIf
Se ei kuitenkaan toimi, vaan mavittaa. Tosin, jos ENTILIST:issä on vain yhden entityn tiedot, homma toimii. Täh.
Riittäisikö jos siirtäisit "newEnt.ENTITY = New(ENTITY)" iffien sisään? ;) Jos iffi ei toteudu ENITY listaan tulee tavaraa ilman valideja objekteja.
Image
Missähän ajatukset kulki mulla. Thanks man.
I see the rainbow rising
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (I/2010)

Post by JATothrim »

kaneli2000:lle kiitokset illan nauruista, oot 1337pro. :lol:
-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'.
jokunen

Re: Tyhmät kysymykset (I/2010)

Post by jokunen »

Koitin tehdä isoa ristinollapeliä, ruudukko on 30*30. Peli toimii muuten normaalisti, mutta välillä viistoon voi tulla yli viisi merkkiä, viidestä se loppuu.
Ja tekoäly samalla tilee, eli voisiko joku yrittää korjata ongelman, ja tässä koodi:

Code: Select all

    SCREEN 600,600
    
    Dim Ruutu(30,30) As Byte //Unohdin nollat =)
    Dim pois As Byte
    
    Dim x As Integer //väliaikaiset...
    Dim y As Integer
    Dim x2 As Integer //väliaikaiset...
    Dim y2 As Integer
    Dim i As Integer
    
    
    
    ///////////Tekoälyyn////////////
    Dim SuurinSarja(2) As Byte
    Dim Sarja As Byte
    Dim SarjanSijaintiX(2) As Byte
    Dim SarjanSijaintiY(2) As Byte
    Dim SarjanVäliSijaintiX As Byte
    Dim SarjanVäliSijaintiY As Byte
    Dim SarjanMaa As Byte
    /////////////////////////////////
    
    Dim Määrä As Byte 
    Määrä = 4 //+ 1
    
    Repeat
        
        
        
        pois = 0
        
        For x=20 To 600 Step 20
            For y=20 To 600 Step 20
                
                Color cbwhite
                
                Line x,0,x,600 //Ylhäältä alas
                Line 0,y,600,y//Vasemmalta oikealle
                
                If pois = 0 And MouseHit(1) And  MouseX() <= x And MouseY() <= y
                    If Ruutu(x/20,y/20) = 0
                        Ruutu(x/20,y/20) = 1
                        pois = 1
                    Else
                        pois = 2
                    EndIf
                EndIf
                
                If Ruutu(x/20,y/20) = 1
                    Color cbgreen
                    Box x-19,y-19,19,19
                ElseIf Ruutu(x/20,y/20) = 2
                    Color cbred
                    Box x-19,y-19,19,19
                EndIf
            Next y
        Next x
        
        If KeyDown(57)
            If SuurinSarja(1) = 0 And SuurinSarja(2) = 0
                Color cborange
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            ElseIf SuurinSarja(1) > 2 Or SuurinSarja(2) = 0
                Color cborange
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            Else
                Color cborange //Piiretään tekoset =)
                Box SarjanSijaintiX(2)*20-19,SarjanSijaintiY(2)*20-19,19,19
            EndIf
        EndIf
        
        If pois =1
            
            pois = 0
            
            Sarja = 0
            SarjanSijaintiX(1) = 0
            SarjanSijaintiY(1) = 0
            SarjanSijaintiX(2) = 0
            SarjanSijaintiY(2) = 0
            SuurinSarja(1) = 0
            SuurinSarja(2) = 0
            SarjanVäliSijaintiX = 0
            SarjanVäliSijaintiY = 0
            
            //Tarkistus....
            
            Gosub Tarkistus
            
            //....Tarkistus
            
            //Tekoäly.....
            
            If SuurinSarja(1) = 0 And SuurinSarja(2) = 0
                Ruutu(Rand(1,30),Rand(1,30)) = 2
                Color cbred
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            ElseIf (SuurinSarja(1) > 2 Or SuurinSarja(2) = 0) And SuurinSarja(2) >< 4
                Ruutu(SarjanSijaintiX(1),SarjanSijaintiY(1)) = 2
                Color cbred
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            Else
                Ruutu(SarjanSijaintiX(2),SarjanSijaintiY(2)) = 2
                Color cbred //Piiretään tekoset =)
                Box SarjanSijaintiX(2)*20-19,SarjanSijaintiY(2)*20-19,19,19
            EndIf
            
            //....Tekoäly
            
            Sarja = 0
            SarjanSijaintiX(1) = 0
            SarjanSijaintiY(1) = 0
            SarjanSijaintiX(2) = 0
            SarjanSijaintiY(2) = 0
            SuurinSarja(1) = 0
            SuurinSarja(2) = 0
            SarjanVäliSijaintiX = 0
            SarjanVäliSijaintiY = 0
            
            //Tarkistus....
            
            Gosub Tarkistus
            
            //....Tarkistus
            
        EndIf
        
        DrawScreen
        
    Forever
    
    
    Tarkistus:
    
    For x=1 To 30 //Ylhäältä alas
        For y=1 To 30
            SarjanMaa = Ruutu(x,y)
            If Ruutu(x,y) >< 0
                For i=1 To Määrä
                    Sarja + 1

                    If SarjanMaa >< Ruutu(x,y+i)
                        If SarjanMaa >< Ruutu(x,y+i+1) Or Ruutu(x,y+i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x,y+i) = 0 And y+1 <= 30 And Ruutu(x,y-1) = 0 And y-1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x,y+i) = 0 And y+1 <= 30 //Alas
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x,y-1) = 0 And y-1 >= 1 //Ylös
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y-1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y + i
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y + i
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)  
                    EndIf
                    
                Next i
            EndIf
        Next y
    Next x
    
    For y=1 To 30 //Vasemmalta oikealle
        For x=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y)
                        If SarjanMaa >< Ruutu(x+i+1,y) Or Ruutu(x+i,y) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y) = 0 And x+i <= 30 And Ruutu(x-1,y) = 0 And x-1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y
                                ElseIf Ruutu(x+i,y) = 0 And x+i <= 30 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y
                                ElseIf Ruutu(x-1,y) = 0 And x-1 >= 1 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = Y
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            x = x + i
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            x = x + i
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next x
    Next y
    
    For x=1 To 30 //Viistorivi (Ylhäältä vasemmalta)
        For y=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y+i)
                        If SarjanMaa >< Ruutu(x+i+1,y+i+1) Or Ruutu(x+i,y+i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y+i) = 0 And x + i <= 30 And y + i <= 30 And Ruutu(x-1,y-1) = 0 And x - 1 >= 1 And y - 1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x+i,y+i) = 0 And x + i <= 30 And y + i <= 30 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = y+i
                                ElseIf Ruutu(x-1,y-1) = 0 And x - 1 >= 1 And y - 1 >= 1 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = y-1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y + 1
                            x = x + 1
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y + 1
                            x = x + 1
                            i = 0
                            SarjanVäliSijaintiX = x+i //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next y
    Next x
    
    For y=30 To 1 Step -1 //Viistorivi (Alhaalta vasemmalta)
        For x=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y-i)
                        If SarjanMaa >< Ruutu(x+i+1,y-i-1) Or Ruutu(x+i,y-i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y-i) = 0 And x + i <= 30 And y - i >= 1 And Ruutu(x-1,y+1) = 0 And x - 1 >= 1 And y + 1 <= 30 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y-i
                                ElseIf Ruutu(x+i,y-i) = 0 And x + i <= 30 And y - i >= 1 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = y-i
                                ElseIf Ruutu(x-1,y+1) = 0 And x - 1 >= 1 And y + 1 <= 30 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = y+1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y - 1
                            x = x + 1
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y - 1
                            x = x + 1
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y-i
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next x
    Next y
    
    For x=1 To 30  //Tasapeli
        For y=1 To 30
            If Ruutu(x,y) = 0
                Exit
            ElseIf x=30 And y=30
                Voitto(0)
            EndIf
        Next y
    Next x
    
    Return
    
    
    Function Voitto(maa)
        Color cbwhite
        If maa = 0
            Text 10,5, "Tasapeli"
        ElseIf maa = 1
            Text 10,5, "Pelaaja voitti"
        Else
            Text 10,5, "Tekoäly voitti"
        EndIf
        
        DrawScreen
        
        ClearMouse()
        WaitMouse
        ClearMouse()
        
        For x=1 To 30
            For y=1 To 30
                Ruutu(x,y) = 0 //Nollaus
            Next y
        Next x
        
    EndFunction
Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: Tyhmät kysymykset (I/2010)

Post by Jonhu »

jokunen wrote:Koitin tehdä isoa ristinollapeliä, ruudukko on 30*30. Peli toimii muuten normaalisti, mutta välillä viistoon voi tulla yli viisi merkkiä, viidestä se loppuu.
Ja tekoäly samalla tilee, eli voisiko joku yrittää korjata ongelman, ja tässä koodi:

Code: Select all

    SCREEN 600,600
    
    Dim Ruutu(30,30) As Byte //Unohdin nollat =)
    Dim pois As Byte
    
    Dim x As Integer //väliaikaiset...
    Dim y As Integer
    Dim x2 As Integer //väliaikaiset...
    Dim y2 As Integer
    Dim i As Integer
    
    
    
    ///////////Tekoälyyn////////////
    Dim SuurinSarja(2) As Byte
    Dim Sarja As Byte
    Dim SarjanSijaintiX(2) As Byte
    Dim SarjanSijaintiY(2) As Byte
    Dim SarjanVäliSijaintiX As Byte
    Dim SarjanVäliSijaintiY As Byte
    Dim SarjanMaa As Byte
    /////////////////////////////////
    
    Dim Määrä As Byte 
    Määrä = 4 //+ 1
    
    Repeat
        
        
        
        pois = 0
        
        For x=20 To 600 Step 20
            For y=20 To 600 Step 20
                
                Color cbwhite
                
                Line x,0,x,600 //Ylhäältä alas
                Line 0,y,600,y//Vasemmalta oikealle
                
                If pois = 0 And MouseHit(1) And  MouseX() <= x And MouseY() <= y
                    If Ruutu(x/20,y/20) = 0
                        Ruutu(x/20,y/20) = 1
                        pois = 1
                    Else
                        pois = 2
                    EndIf
                EndIf
                
                If Ruutu(x/20,y/20) = 1
                    Color cbgreen
                    Box x-19,y-19,19,19
                ElseIf Ruutu(x/20,y/20) = 2
                    Color cbred
                    Box x-19,y-19,19,19
                EndIf
            Next y
        Next x
        
        If KeyDown(57)
            If SuurinSarja(1) = 0 And SuurinSarja(2) = 0
                Color cborange
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            ElseIf SuurinSarja(1) > 2 Or SuurinSarja(2) = 0
                Color cborange
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            Else
                Color cborange //Piiretään tekoset =)
                Box SarjanSijaintiX(2)*20-19,SarjanSijaintiY(2)*20-19,19,19
            EndIf
        EndIf
        
        If pois =1
            
            pois = 0
            
            Sarja = 0
            SarjanSijaintiX(1) = 0
            SarjanSijaintiY(1) = 0
            SarjanSijaintiX(2) = 0
            SarjanSijaintiY(2) = 0
            SuurinSarja(1) = 0
            SuurinSarja(2) = 0
            SarjanVäliSijaintiX = 0
            SarjanVäliSijaintiY = 0
            
            //Tarkistus....
            
            Gosub Tarkistus
            
            //....Tarkistus
            
            //Tekoäly.....
            
            If SuurinSarja(1) = 0 And SuurinSarja(2) = 0
                Ruutu(Rand(1,30),Rand(1,30)) = 2
                Color cbred
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            ElseIf (SuurinSarja(1) > 2 Or SuurinSarja(2) = 0) And SuurinSarja(2) >< 4
                Ruutu(SarjanSijaintiX(1),SarjanSijaintiY(1)) = 2
                Color cbred
                Box SarjanSijaintiX(1)*20-19,SarjanSijaintiY(1)*20-19,19,19
            Else
                Ruutu(SarjanSijaintiX(2),SarjanSijaintiY(2)) = 2
                Color cbred //Piiretään tekoset =)
                Box SarjanSijaintiX(2)*20-19,SarjanSijaintiY(2)*20-19,19,19
            EndIf
            
            //....Tekoäly
            
            Sarja = 0
            SarjanSijaintiX(1) = 0
            SarjanSijaintiY(1) = 0
            SarjanSijaintiX(2) = 0
            SarjanSijaintiY(2) = 0
            SuurinSarja(1) = 0
            SuurinSarja(2) = 0
            SarjanVäliSijaintiX = 0
            SarjanVäliSijaintiY = 0
            
            //Tarkistus....
            
            Gosub Tarkistus
            
            //....Tarkistus
            
        EndIf
        
        DrawScreen
        
    Forever
    
    
    Tarkistus:
    
    For x=1 To 30 //Ylhäältä alas
        For y=1 To 30
            SarjanMaa = Ruutu(x,y)
            If Ruutu(x,y) >< 0
                For i=1 To Määrä
                    Sarja + 1

                    If SarjanMaa >< Ruutu(x,y+i)
                        If SarjanMaa >< Ruutu(x,y+i+1) Or Ruutu(x,y+i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x,y+i) = 0 And y+1 <= 30 And Ruutu(x,y-1) = 0 And y-1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x,y+i) = 0 And y+1 <= 30 //Alas
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x,y-1) = 0 And y-1 >= 1 //Ylös
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x
                                    SarjanSijaintiY(SarjanMaa) = Y-1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y + i
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y + i
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)  
                    EndIf
                    
                Next i
            EndIf
        Next y
    Next x
    
    For y=1 To 30 //Vasemmalta oikealle
        For x=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y)
                        If SarjanMaa >< Ruutu(x+i+1,y) Or Ruutu(x+i,y) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y) = 0 And x+i <= 30 And Ruutu(x-1,y) = 0 And x-1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y
                                ElseIf Ruutu(x+i,y) = 0 And x+i <= 30 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y
                                ElseIf Ruutu(x-1,y) = 0 And x-1 >= 1 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = Y
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            x = x + i
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            x = x + i
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next x
    Next y
    
    For x=1 To 30 //Viistorivi (Ylhäältä vasemmalta)
        For y=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y+i)
                        If SarjanMaa >< Ruutu(x+i+1,y+i+1) Or Ruutu(x+i,y+i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y+i) = 0 And x + i <= 30 And y + i <= 30 And Ruutu(x-1,y-1) = 0 And x - 1 >= 1 And y - 1 >= 1 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y+i
                                ElseIf Ruutu(x+i,y+i) = 0 And x + i <= 30 And y + i <= 30 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = y+i
                                ElseIf Ruutu(x-1,y-1) = 0 And x - 1 >= 1 And y - 1 >= 1 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = y-1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y + 1
                            x = x + 1
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y + 1
                            x = x + 1
                            i = 0
                            SarjanVäliSijaintiX = x+i //Väli talteen
                            SarjanVäliSijaintiY = y
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next y
    Next x
    
    For y=30 To 1 Step -1 //Viistorivi (Alhaalta vasemmalta)
        For x=1 To 30
            If Ruutu(x,y) >< 0
                SarjanMaa = Ruutu(x,y)
                For i=1 To Määrä
                    Sarja + 1
                    
                    If SarjanMaa >< Ruutu(x+i,y-i)
                        If SarjanMaa >< Ruutu(x+i+1,y-i-1) Or Ruutu(x+i,y-i) > 0
                        
                            If SuurinSarja(SarjanMaa) < Sarja
                                If SarjanVäliSijaintiX > 0 //Välisijainti
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = SarjanVäliSijaintiX
                                    SarjanSijaintiY(SarjanMaa) = SarjanVäliSijaintiY
                                ElseIf Ruutu(x+i,y-i) = 0 And x + i <= 30 And y - i >= 1 And Ruutu(x-1,y+1) = 0 And x - 1 >= 1 And y + 1 <= 30 And Sarja >= 3 And SarjanMaa = 1 //Pakkovoiton eston
                                    SuurinSarja(SarjanMaa) = Sarja+2
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = Y-i
                                ElseIf Ruutu(x+i,y-i) = 0 And x + i <= 30 And y - i >= 1 //Oikea
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x+i
                                    SarjanSijaintiY(SarjanMaa) = y-i
                                ElseIf Ruutu(x-1,y+1) = 0 And x - 1 >= 1 And y + 1 <= 30 //Vasen
                                    SuurinSarja(SarjanMaa) = Sarja
                                    SarjanSijaintiX(SarjanMaa) = x-1
                                    SarjanSijaintiY(SarjanMaa) = y+1
                                EndIf
                            EndIf
                            
                            Sarja = 0
                            SarjanVäliSijaintiX = 0
                            SarjanVäliSijaintiY = 0
                            y = y - 1
                            x = x + 1
                            i = 0
                            Exit
                            
                        ElseIf i < Määrä //Löydettiin väli! 
                            y = y - 1
                            x = x + 1
                            i = 0
                            SarjanVäliSijaintiX = x //Väli talteen
                            SarjanVäliSijaintiY = y-i
                        EndIf
                    EndIf
                    
                    If i = Määrä
                        Sarja = 0
                        Voitto(SarjanMaa)
                    EndIf
                    
                Next i
            EndIf
        Next x
    Next y
    
    For x=1 To 30  //Tasapeli
        For y=1 To 30
            If Ruutu(x,y) = 0
                Exit
            ElseIf x=30 And y=30
                Voitto(0)
            EndIf
        Next y
    Next x
    
    Return
    
    
    Function Voitto(maa)
        Color cbwhite
        If maa = 0
            Text 10,5, "Tasapeli"
        ElseIf maa = 1
            Text 10,5, "Pelaaja voitti"
        Else
            Text 10,5, "Tekoäly voitti"
        EndIf
        
        DrawScreen
        
        ClearMouse()
        WaitMouse
        ClearMouse()
        
        For x=1 To 30
            For y=1 To 30
                Ruutu(x,y) = 0 //Nollaus
            Next y
        Next x
        
    EndFunction
Tyylikkäästi olet kyllä saanut tekoälyn kasaan if-lauseilla, mutta älykästä tekoälyä on vaikea näin toteuttaa.. Suosittelen perehtymään minmax-algoritmiin, jos järkevämpien tekoälyjen teko kiinnostaa.. Minmaxia voi sitten parannella erilaisilla tunnistuksilla hieman pelikohtaisesti.. Itse en ole vielä löytänyt tekoälyä, joka voittaisi minut aloituksessa, mutta ohjelmointiputkan tekoäly ville pääsi jo lähelle :D (ja ehkä suuremman miettimisajan kanssa voittaisi, pitääkin testata)..

Itse tekemäni ristinollan runko (jonkun vuoden vanha), jos siitä on jotain apua..

Code: Select all

// Ristinolla    

SCREEN 640,480

Const RuutujaX = 25
Const RuutujaY = 22
Const Ruutusize = 18

Merkkeja_voittoon = 5
ristikkoX = 20
ristikkoY = 40
vuoro = 1

Dim ruutu( RuutujaX, RuutujaY )
Ristikko = MakeImage( RuutujaX*Ruutusize+1 , RuutujaY*Ruutusize+1 )
Ristikko = MakeRistikko( ristikko )

oldvuoro = vuoro
ClsColor cbwhite

Repeat'Pääsilmukka

   DrawImage ristikko, ristikkoX,ristikkoY

    If MouseDown(1) And Timer()> tim+300 Then
        If BoxOverlap(MouseX(),MouseY(),1,1,ristikkoX,ristikkoY,RuutujaX*Ruutusize , RuutujaY*Ruutusize) Then
            px = ( MouseX() - ristikkoX ) / (Ruutusize) 
            py = ( MouseY() - ristikkoY ) / (Ruutusize)
            
            If ruutu(px,py) = 0 Then
                DrawToImage ristikko
                    If vuoro=-1 Then Color cbblue Else Color cbred
                    Box px*Ruutusize+1,py*Ruutusize+1,Ruutusize-1,Ruutusize-1
                    ruutu(px,py) = vuoro
                    vuoro=-vuoro
                    tim = Timer()
                DrawToScreen
            EndIf
            
        EndIf
    EndIf

    If oldvuoro=-vuoro Then
        oldvuoro=vuoro     
        For x=0 To ruutujaX-1
            For y=0 To RuutujaY-1
                If ruutu(x,y)=-1 Or ruutu(x,y)=1 Then  
                
                    arvo = ruutu(x,y)
                    luku = 0 : paikka1 = 0 : paikka2 = 0 : paikka3 = 0 : paikka4 = 0 : paikka5 = 0                   

                    For a=1 To Merkkeja_voittoon-1
                    
                        If ruutu(x+a,y+a)=arvo Then paikka1 + 1
                        If ruutu(x+a,y)=arvo Then paikka2 + 1
                        If ruutu(x,y+a)=arvo Then paikka3 + 1

                        If y=>Merkkeja_voittoon Then
                            If ruutu(x+a,y-a)=arvo Then paikka4 + 1
                            
                            If x=>Merkkeja_voittoon Then
                                If ruutu(x-a,y-a)=arvo Then paikka5 + 1
                            EndIf
                        EndIf

                        luku = Max( paikka1, Max( paikka2, Max( paikka3, Max( paikka4, paikka5))))
                        If luku < a Then // ketju jo katkennut..
                            Exit
                        ElseIf luku = Merkkeja_voittoon-1 Then // voitto
                            If arvo = -1 Then s_voitot+1 Else p_voitot+1
                            ClearDim()
                            Ristikko = MakeRistikko( ristikko )
                        EndIf
                        
                    Next a

                EndIf
            Next y
        Next x
    EndIf
  
    Color cbblack
    Text 500,200,"FPS:"+FPS()
    
    Color cbred
    Text 500,100,"Red wins:"+p_voitot
    
    Color cbblue
    Text 500,130,"Blue wins:"+s_voitot
    
    DrawScreen

Forever

Function ClearDim()
      For x=0 To ruutujaX-1
            For y=0 To RuutujaY-1
                ruutu(x,y) = 0
            Next y
      Next x
EndFunction

Function MakeRistikko( img )
    MaskImage img, cbwhite
    DrawToImage img
        Color cbwhite
        Box 0,0,ImageWidth(img),ImageHeight(img)
        
        Color cbblack
        For x=0 To  RuutujaX-1
             For y=0 To  RuutujaY-1
                Box x * Ruutusize, y* Ruutusize, Ruutusize+1, Ruutusize+1, 0
             Next y
        Next x
       
    DrawToScreen
    Return img
EndFunction
Tekeillä pikkupelejä ja ohjelmia :)
jokunen

Re: Tyhmät kysymykset (I/2010)

Post by jokunen »

Koitin soveltaa MinMax-algorytmiä, onnistuin jotenkin siinä, voitte yrittää pelata, mutta vaikka kuinka yritän tehdä voiton viidestä kohdasta (noin rivi 123), se ei onnisu? Voisiko joku nyt auttaa taas minua :oops:
Ja se ei sitten johdu siitä että olen laittanut riville => määrä (määrä = 5), jos koitan vaihtaa määrää, niin silti voitto tulee kuudesta.

Code: Select all

    SCREEN 600,600
    
    Dim Ruutu(30,30) As Byte //Unohdin nollat =)
    Dim pois As Byte //Milloin löydettiin oikea kohta
    
    Dim x As Integer //väliaikaiset...
    Dim y As Integer
    Dim i As Integer
    
    
    
    ///////////Tekoälyyn////////////
    
    Dim Arvo As Byte//Suurin väliaikainen arvo
    Dim Arvo1 As Byte //Polun arvo, Vaaka
    Dim Arvo2 As Byte //Pysty
    Dim Arvo3 As Byte //Viisto(Ylhäältä oikealta)
    Dim Arvo4 As Byte //Viisto(alhaalta oikealta)
    
    Dim Maa1 As Byte //Polun Maa, Vaaka
    Dim Maa2 As Byte //Pysty
    Dim Maa3 As Byte //Viisto(Ylhäältä oikealta)
    Dim Maa4 As Byte //Viisto(alhaalta oikealta)
    
    //Suurimmat
    Dim RuudunArvot As Byte //Arvot
    Dim RuudunArvotX As Byte //Sijainti
    Dim RuudunArvotY As Byte
    Dim RuudunArvo As Byte  //Suurin (ratkaiseva)
    
    //Pisteytys
    Const Tyhjä = 3
    Const Pelaaja = 7
    Const Tietokone = 8
    /////////////////////////////////
    
    Dim Määrä As Byte 
    Määrä = 5
    
    Puhdista()
    
    Repeat
        pois = 0
        
        For x=20 To 600 Step 20
            For y=20 To 600 Step 20
                Color cbwhite
                Line x,0,x,600 //Ylhäältä alas
                Line 0,y,600,y//Vasemmalta oikealle
                If pois = 0 And MouseHit(1) And  MouseX() <= x And MouseY() <= y
                    If Ruutu(x/20,y/20) = Tyhjä
                        Ruutu(x/20,y/20) = Pelaaja
                        pois = 1
                    Else
                        pois = 2
                    EndIf
                EndIf
                If Ruutu(x/20,y/20) = Pelaaja
                    Color cbgreen
                    Box x-19,y-19,19,19
                ElseIf Ruutu(x/20,y/20) = Tietokone
                    Color cbred
                    Box x-19,y-19,19,19
                EndIf
            Next y
        Next x
        
        If pois =1
            
            Gosub Tarkistus
            
            Gosub Tietokone
            
            Ruutu(RuudunArvotX, RuudunArvotY) = Tietokone
            Color cbred
            Box RuudunArvotX*20-19,RuudunArvotY*20-19,19,19
            
            RuudunArvot = 0
            RuudunArvo = 0
            RuudunArvotX = 0 
            RuudunArvotY = 0
            
            Gosub Tarkistus
            
        EndIf
        
        DrawScreen
        
    Forever
    
    
    Tarkistus:
    
    For x=1 To 30
        For y=1 To 30
        
            If Ruutu(x,y) > Tyhjä
            
                For i=-Määrä To Määrä
                    pois = 1
                    If Ruutu(x,y) = Ruutu(x+i,y)
                        Arvo1 = Arvo1 + 1
                        pois = 0
                    EndIf
                    If Ruutu(x,y) = Ruutu(x,y+i)
                        Arvo2 = Arvo2 + 1
                        pois = 0
                    EndIf
                    If Ruutu(x,y) = Ruutu(x+i,y+i)
                        Arvo3 = Arvo3 + 1
                        pois = 0
                    EndIf
                    If Ruutu(x,y) = Ruutu(x+i,y-i)
                        Arvo4 = Arvo4 + 1
                        pois = 0
                    EndIf
                    If pois = 1
                        Exit
                    EndIf
                Next i
                
                
                If Max(Arvo1,Max(Arvo2,Max(Arvo3,Arvo4))) >= Määrä
                    Voitto(Ruutu(x,y))
                EndIf
                
                Arvo = 0
                Arvo1 = 0
                Arvo2 = 0
                Arvo3 = 0
                Arvo4 = 0
            EndIf
            
        Next y
    Next x                 
                    
    Return
    
    Tietokone:
    
    ClearText
        
    For x=1 To 30
        For y=1 To 30
            If Ruutu(x,y) = Tyhjä
                For i=-Määrä+2 To Määrä-3
                    If x+i >= 1 And x+i <= 30
                        If Maa1 = Ruutu(x+i,y) Or Ruutu(x+i,y) = Tyhjä
                            Arvo1 = Arvo1 + Ruutu(x+i,y)
                        ElseIf Maa1 = 0
                            Arvo1 = Arvo1 + Ruutu(x+i,y)
                            Maa1 = Ruutu(x+i,y)
                        Else
                            Arvo1 = 0
                            Maa1 = Ruutu(x+i,y)
                            Arvo1 = Arvo1 + Ruutu(x+i,y)
                        EndIf
                    EndIf
                    If y+i >= 1 And y+i <= 30
                        If Maa2 = Ruutu(x,y+i) Or Ruutu(x,y+i) = Tyhjä
                            Arvo2 = Arvo2 + Ruutu(x,y+i)
                        ElseIf Maa2 = 0
                            Arvo2 = Arvo2 + Ruutu(x,y+i)
                            Maa2 = Ruutu(x,y+i)
                        Else
                            Arvo2 = 0
                            Maa2 = Ruutu(x,y+i)
                            Arvo2 = Arvo2 + Ruutu(x,y+i)
                        EndIf
                    EndIf
                    If x+i >= 1 And x+i <= 30 And y+i >= 1 And y+i <= 30
                        If Maa3 = Ruutu(x+i,y+i) Or Ruutu(x+i,y+i) = Tyhjä
                            Arvo3 = Arvo3 + Ruutu(x+i,y+i)
                        ElseIf Maa3 = 0
                            Arvo3 = Arvo3 + Ruutu(x+i,y+i)
                            Maa3 = Ruutu(x+i,y+i)
                        Else
                            Arvo3 = 0
                            Maa3 = Ruutu(x+i,y+i)
                            Arvo3 = Arvo3 + Ruutu(x+i,y+i)
                        EndIf
                    EndIf
                    If x+i >= 1 And x+i <= 30 And y-i >= 1 And y-i <= 30
                        If Maa4 = Ruutu(x+i,y-i) Or Ruutu(x+i,y-i) = Tyhjä
                            Arvo4 = Arvo4 + Ruutu(x+i,y-i)
                        ElseIf Maa4 = 0
                            Arvo4 = Arvo4 + Ruutu(x+i,y-i)
                            Maa4 = Ruutu(x+i,y-i)
                        Else
                            Arvo4 = 0
                            Maa4 = Ruutu(x+i,y-i)
                            Arvo4 = Arvo4 + Ruutu(x+i,y-i)
                        EndIf
                    EndIf
                Next i
                
                Arvo = Max(Arvo1,Max(Arvo2,Max(Arvo3,Arvo4)))   
                Locate  (x-1)*20, (y-1)*20
                AddText arvo +""
                
                If RuudunArvo < Arvo//Jos oli tähän mennessä paras niin muistiin vaan!
                    RuudunArvot = Arvo1 + Arvo2 + Arvo3 + Arvo4
                    RuudunArvotX = x
                    RuudunArvotY = y
                    RuudunArvo = Arvo
                ElseIf RuudunArvot < Arvo1 + Arvo2 + Arvo3 + Arvo4  And RuudunArvo = Arvo
                    RuudunArvot = Arvo1 + Arvo2 + Arvo3 + Arvo4
                    RuudunArvotX = x
                    RuudunArvotY = y
                    RuudunArvo = Arvo
                EndIf
                
            EndIf
            
            Arvo = 0
            Arvo1 = 0
            Arvo2 = 0
            Arvo3 = 0
            Arvo4 = 0
            Maa1 = 0
            Maa2 = 0
            Maa3 = 0
            Maa4 = 0
            
        Next y
    Next x
    
    Return
    
    
    Function Voitto(maa)
        Color cbwhite
        If maa = Tyhjä
            Text 10,5, "Tasapeli"
        ElseIf maa = Pelaaja
            Text 10,5, "Pelaaja voitti"
        Else
            Text 10,5, "Tekoäly voitti"
        EndIf
        
        DrawScreen
        
        ClearMouse()
        WaitMouse
        ClearMouse()
        
        Puhdista()
        
    EndFunction
    
    Function Puhdista()
        For x=1 To 30
            For y=1 To 30
                Ruutu(x,y) = Tyhjä
            Next y
         Next x
    EndFunction
vieras

Re: Tyhmät kysymykset (I/2010)

Post by vieras »

Jonez wrote: ...Lopulta päästään sinun ongelmaasi, ellet jo tähän mennessä sitä ratkaissut itse. Koska muuttujat joita haluat muuttaa ovat globaaleja, riittää että annat niille uuden arvon funktion sisällä:

Code: Select all

Global a, b

Hae()

Function Hae()
    a = Rand( 1, 10 )
    b = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
...
joo siis miten saan sen toimimaan näin:

Code: Select all

Global a, b

Hae(a)
Hae(b)

Function Hae(randaus)
    randaus = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Tyhmät kysymykset (I/2010)

Post by Wingman »

vieras wrote:
Jonez wrote: ...Lopulta päästään sinun ongelmaasi, ellet jo tähän mennessä sitä ratkaissut itse. Koska muuttujat joita haluat muuttaa ovat globaaleja, riittää että annat niille uuden arvon funktion sisällä:

Code: Select all

Global a, b

Hae()

Function Hae()
    a = Rand( 1, 10 )
    b = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
...
joo siis miten saan sen toimimaan näin:

Code: Select all

Global a, b

Hae(a)
Hae(b)

Function Hae(randaus)
    randaus = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever


miksi sinun pitäisi? samalla tavalla varmaan haluat sen toimivan (tulostaa näytölle kaksi lukua 1-10 välillä)
- - - -
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (I/2010)

Post by JATothrim »

vieras wrote:
Jonez wrote: ...Lopulta päästään sinun ongelmaasi, ellet jo tähän mennessä sitä ratkaissut itse. Koska muuttujat joita haluat muuttaa ovat globaaleja, riittää että annat niille uuden arvon funktion sisällä:

Code: Select all

Global a, b

Hae()

Function Hae()
    a = Rand( 1, 10 )
    b = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
...
joo siis miten saan sen toimimaan näin:

Code: Select all

Global a, b

Hae(a)
Hae(b)

Function Hae(randaus)
    randaus = Rand( 1, 10 )
EndFunction

Repeat
    Text 20, 20, a
    Text 20, 40, b
    DrawScreen
Forever
Yhä hakoteillä. (Suosittelen rekisteröitymistä foorumeille, alkaa olla jo paljon juttua. ;) ) Kun kutsut funktiota parametrit kopioidaan funktioon eli funktiolle annetun parametrin (luku arvo tai muuttuja) ja funktion sisällä oleva muuttuja ovat aivan eri asia. Havainnolistan asiaa GoSub kutsulla:

Code: Select all

Goto start

// "kuvitteellinen funktio"
funktio1:
Dim parametri_a
Dim parametri_b
Dim palautus_arvo
// vaikka miten yrittäisit muuttaa muuttujaa "muuttuja" parametri_a:n kautta täällä, ei sen arvo vaihdu.
palautus_arvo = parametri_a + parametri_b
Return

// Oikea funktio.
Function funktio2(parametri_a, parametri_b)
	Return parametri_a + parametri_b
EndFunction

start:	//ohjelman käynnistys kohta..
Dim muuttuja
muuttuja = 13

//Kutsutan kuvitteellista funktiota
//>>>>>funktio kutsu alkaa>>>>>>>
parametri_b = 25			// arvot KOPIOIDAAN
parametri_a = muuttuja		// arvot KOPIOIDAAN
Gosub funktio1			// hypätään "funktioon"
muuttuja = palautus_arvo	// funktion palauttama arvo KOPIOIDAAN
//<<<<<funktio kutsu päättyy<<<<<
Print muuttuja

//kutsutaan oikeaa funktiota
muuttuja = 13
muuttuja = funktio2(muuttuja, 25)
Print muuttuja
WaitKey
-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'.
jaahas
Advanced Member
Posts: 307
Joined: Fri Feb 05, 2010 11:36 pm
Location: Tornio

Re: Tyhmät kysymykset (I/2010)

Post by jaahas »

miten teen IF-lauseeseen sopivan funktion?
esim.

Code: Select all

Repeat

If iffi() Then i=100

Text 10,10,i

DrawScreen

Forever

Function iffi()

End Function
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2010)

Post by Latexi95 »

jaahas wrote:miten teen IF-lauseeseen sopivan funktion?
esim.

Code: Select all

Repeat

If iffi() Then i=100

Text 10,10,i

DrawScreen

Forever

Function iffi()

End Function
Ei siinä ole mitään ihmeellistä. If lauseke toteutuu jos ehdon vastaus on eri kuin nolla.
Joten laita funktio palauttaamaan vaikka 1, niin ehto toteutuu.
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Re: Tyhmät kysymykset (I/2010)

Post by Nassi_Setä »

Laiskuus iski enkä jaksanut etsi tai käyttää hakua: kuinka saan kuvan ja objektin päällekkäin liikkuessa kun koordinaatit luetaan objektilta eli maailman koordinaateissa,
kuten jokainen tietää kuvat piirretään näytön koordinaateissa. Tässä on ongelman ydin: saan kuvan ja objektin päällekkäin kun ne eivät ole liikkeessä, mutta kun objektia liikuttaa
kuva liikkuu noin 2x nopeudella, miten ne saa liikkumaan samalla nopeudella?
\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2010)

Post by Latexi95 »

Nassi_Setä wrote:Laiskuus iski enkä jaksanut etsi tai käyttää hakua: kuinka saan kuvan ja objektin päällekkäin liikkuessa kun koordinaatit luetaan objektilta eli maailman koordinaateissa,
kuten jokainen tietää kuvat piirretään näytön koordinaateissa. Tässä on ongelman ydin: saan kuvan ja objektin päällekkäin kun ne eivät ole liikkeessä, mutta kun objektia liikuttaa
kuva liikkuu noin 2x nopeudella, miten ne saa liikkumaan samalla nopeudella?
En ihan ymmärtänyt, mutta eikö kannattaisi piirtään kuvat maailmakoordinaatteihin DrawToWorld:llä.
Locked