Tyhmät kysymykset (I/2015)

Voit pyytää apua ohjelmointiongelmiin täältä.
jusola
Newcomer
Posts: 9
Joined: Sun Apr 19, 2015 10:22 am

Tyhmät kysymykset (I/2015)

Post by jusola »

valscion wrote:Jatketaan perinteikästä linjaa ja pilkotaan jättiketju pienempiin osiin. Sarjan edelliset viestiketjut ovat:
Tyhmät kysymykset (I/2009)
Tyhmät kysymykset (II/2009)
Tyhmät kysymykset (I/2010)
Tyhmät kysymykset (I/2011)
Tyhmät kysymykset (I/2012)

Ylläpito pilkkoo kaikki yli 100-sivuiset aiheet jatkoketjuiksi. Lisäksi aloitetaan uusi ketju vuosittain.

Tyhmät kysymykset - tarkoitus

Törmäsitkö ongelmaan, jonka tiedät olevan oikeasti ihan helppo, mutta ratkaisu ei vain osu silmään? Onko ongelmasi niin vähäpätöinen, ettei sitä varten kannata tehdä uutta ketjua?

Alkuperäisen ketjun johdanto meni näin:
iTKEVAnAKKI wrote:Eli tänne kaikki yksinkertaiset kysymykset johin et ole keksinyt ratkaisua. Mutta muistakaa, että käytätte ensin hakua!
----

Saako ton tekstin (text) jotenkin taustakuvan päälle?
Last edited by valscion on Mon Apr 20, 2015 10:27 am, edited 1 time in total.
Reason: Lisätty linkki edelliseen ketjuun ja eroteltu kysymys lainauksesta selkeämmin.
Jusola
Projektit
City Build
JuOs (tulossa ...)
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2015)

Post by Latexi95 »

Kaikki piirretään siinä järjestyksessä missä niiden Draw* komentoa kutsutaan. Jos piirrät "taustakuvan" DrawImagella, piirrä se ensin ja sen jälkeen piirrä teksti. Jos kyseessä on objekti, kutsu ensin DrawGame jolloin kaikki objektit piirretään ja sen jälkeen piirrä teksti (ja DrawScreen vielä loppuun luonnollisesti).
jusola
Newcomer
Posts: 9
Joined: Sun Apr 19, 2015 10:22 am

Re: Tyhmät kysymykset (I/2015)

Post by jusola »

Kiitos avusta :D
Nyt tuli tänkin vuoden tyhmät kysymykset tehtyä.
Jusola
Projektit
City Build
JuOs (tulossa ...)
Jirppax
Newcomer
Posts: 8
Joined: Fri Oct 24, 2014 10:47 am

Re: Tyhmät kysymykset (I/2015)

Post by Jirppax »

Tein peliini Tilesterillä kartan, muuten sain toimimaan kunnolla, mutta ei piirrä/tunnista törmäyskerrosta. Päällyskerros,taustakerros ja varmaan myös datakerroskin löytyy, mutta törmäyskerrosta ei näy eikä kuulu. Yksinkertaisia ratkaisuja yksinkertaiseen ongelmaan?
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Tyhmät kysymykset (I/2015)

Post by Sly_Jack0 »

HIT-kerroksen tilet tulee piirtää tilesetin ensimmäisellä tilellä (vasen yläkulma).
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2015)

Post by Awaclus »

Jirppax wrote:Tein peliini Tilesterillä kartan, muuten sain toimimaan kunnolla, mutta ei piirrä/tunnista törmäyskerrosta. Päällyskerros,taustakerros ja varmaan myös datakerroskin löytyy, mutta törmäyskerrosta ei näy eikä kuulu. Yksinkertaisia ratkaisuja yksinkertaiseen ongelmaan?
Vastaisuuden varalle kannattaa ladata TileGen ja tehdä kartat ennemmin sillä. Se on superpaljon parempi kuin Tilester.
User avatar
wilizucoder
Member
Posts: 81
Joined: Sat Sep 08, 2007 11:24 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2015)

Post by wilizucoder »

Noniin pitkän coolbasic tauon jälkeen aloitin taas uudelleen, aika nopeasti muistui perusteet mieleen. :D Teen ylhäältä kuvattua räiskintää, ja tähän mennessä toimii ukon liikkuminen, hiirellä tähtääminen, ampuminen, aseen vaihto näppäimistöltä, panosten ja lippaiden laskeminen. Lisäksi sain toimimaan vihollisten miinojen räjähtämisen ja random sijainnin, sekä kökön tekoälyn. Ongelmani on se, että luodin osuessa vihuun tulee heti MAV. Olen yrittänyt muuttaa koodia, vaikka miten, mutta ei onnistu. :?

Tässä on melkein 300 riviä koodia, muutin kaiken grafiikan coolbasicin alkuperäistiedostoiksi, jotta toimisi kaikilla. Kiitos niille, jotka voisivat auttaa! :roll:

Code: Select all

Type VIHUT
    Field obj
    Field healtti
    Field dmg
End Type 

Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
    Field obj 'yksi kenttä nimeltään 'obj'
    Field nopeus 'kenttä luodin nopeudelle
    Field dmg
End Type 

Type MIINAT
    Field obj
    Field dmg 
End Type 

Type VIHUMIINAT
    Field obj
    Field dmg
End Type 

Type Räjähdykset
    Field partikkeli
End Type

FrameLimit 40
SCREEN 800, 600

imgPoks=LoadAnimImage("Media\bang.bmp",32,32,0,8)

apuobj=LoadObject("Media\particle.bmp")
ShowObject apuobj, OFF 

ukko=LoadObject("Media\soldier.bmp",90)
vihu=LoadObject("Media\soldier.bmp",90)
ShowObject vihu, OFF 

pistolman=LoadObject("Media\soldier.bmp",90)
ShowObject pistolman, OFF 
rifleman=LoadObject("Media\soldier.bmp",90)
ShowObject rifleman, OFF 
shotgunman=LoadObject("Media\soldier.bmp",90)
ShowObject shotgunman, OFF 

pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
mine=LoadObject("Media\fireball.bmp")
ShowObject mine, OFF
mine_vihu=LoadObject("Media\cursor.bmp")
ShowObject mine_vihu, OFF

tähtäin=LoadObject("Media\target.bmp")

pistolpam=LoadSound("Media\Gun 1.wav")
riflepam=LoadSound("Media\Gun 7.wav")
reloadsound=LoadSound("Media\Pistol reload.wav")
noMoreAmmo=LoadSound("Media\Button 1.wav")
minepam=LoadSound("Media\Boom 1.wav")
landmine=LoadSound("Media\Whip.wav")

elkku=100

pistooliammukset=100
pistoolilipas=7

konekivääriammukset=60
konekiväärilipas=20

haulikkoammukset=30

miinoja=3

ase=1


    For i = 0 To 3
        pahis.VIHUT = New(VIHUT)
        pahis\obj = CloneObject(vihu)
        SetupCollision pahis\obj, ukko, 2, 2, 2
        PositionObject pahis\obj,Rand(-400, 400), Rand(-300, 300) //Sijoitetaan viholliset satunnaisiin kohtiin ruudulla.
    Next i
    
    For pahis.VIHUT = Each VIHUT
        For pahis2.VIHUT = Each VIHUT
            If pahis <> pahis2 Then SetupCollision pahis\obj, pahis2\obj, 2,2,2
        Next pahis2
    Next pahis
    
    
    For i = 0 To 4
        miina2.VIHUMIINAT = New(VIHUMIINAT)
        miina2\obj=CloneObject(mine_vihu)
        PositionObject miina2\obj, Rand(-400,400), Rand(-300,300)
        miina2\dmg = 40
    Next i


Repeat

    CloneObjectPosition ukko, apuobj
    PositionObject tähtäin,MouseWX(),MouseWY()
    ShowMouse OFF
    PointObject ukko,tähtäin

    If KeyDown(17) Then MoveObject apuobj,0, -5
    If KeyDown(31) Then MoveObject apuobj,0, 5
    If KeyDown(32) Then MoveObject apuobj,5 
    If KeyDown(30) Then MoveObject apuobj,-5

    If KeyHit(2) Then ase=1: PaintObject ukko, pistolman: reload=10 
    If KeyHit(3) Then ase=2: PaintObject ukko, rifleman: reload=10
    If KeyHit(4) Then ase=3: PaintObject ukko, shotgunman: reload=10
    If KeyHit(5) Then ase=4: PaintObject ukko, pistolman: reload=10 


    If MouseDown(1) And reload=0 Then
      Select ase
        Case 1 'pistooli
          If pistooliammukset>0 Then  
                luoti.AMMUS = New(AMMUS) 'luo uusi ammus
                luoti\obj=CloneObject(pati) 'tee klooni
                luoti\nopeus=15
                luoti\dmg=25
                CloneObjectPosition luoti\obj,ukko                
                CloneObjectOrientation luoti\obj,ukko
                MoveObject luoti\obj, 5
                TurnObject luoti\obj, Rand(-3,3)
                reload=15 
                pistooliammukset = pistooliammukset-1
                pistoolilipas = pistoolilipas-1
                PlaySound pistolpam
                If pistoolilipas = 0 And pistooliammukset>0 Then 
                    PlaySound reloadsound
                    pistoolilipas = 7
                    reload = 60
                EndIf 
          Else 
            PlaySound noMoreAmmo, 10
          EndIf 
        Case 2 'konekivääri
          If konekivääriammukset>0 Then
                luoti.AMMUS = New(AMMUS) 'luo uusi ammus
                luoti\obj=CloneObject(pati) 'tee klooni
                CloneObjectPosition luoti\obj,ukko                
                CloneObjectOrientation luoti\obj,ukko
                MoveObject luoti\obj, 10
                TurnObject luoti\obj, Rand(-3,3)
                luoti\nopeus=17
                luoti\dmg=20
                reload=5 
                konekivääriammukset = konekivääriammukset-1
                konekiväärilipas = konekiväärilipas-1
                PlaySound riflepam
                If konekiväärilipas = 0 And konekivääriammukset>0 Then
                    PlaySound reloadsound
                    konekiväärilipas = 20
                    reload = 80
                EndIf
          Else 
            PlaySound noMoreAmmo, 10
          EndIf 
        Case 3 'haulikko
          If haulikkoammukset>0 Then 
            haulikkoammukset = haulikkoammukset-1
            For i = 0 To 4
                luoti.AMMUS = New(AMMUS) 'luo uusi ammus
                luoti\obj=CloneObject(pati) 'tee klooni
                CloneObjectPosition luoti\obj,ukko                
                CloneObjectOrientation luoti\obj,ukko
                MoveObject luoti\obj, 10
                TurnObject luoti\obj,Rand(-7,7)
                luoti\nopeus=10
                luoti\dmg=10
                reload=17 
                PlaySound pistolpam, 20
            Next i
          ElseIf haulikkoammukset=0 Then 
            haulikkoammukset = 0 
            PlaySound noMoreAmmo, 10
          EndIf
        Case 4 'miinat
          If miinoja>0 Then 
                miinoja = miinoja-1
                miina.MIINAT = New(MIINAT)
                miina\obj=CloneObject(mine)
                miina\dmg=100
                CloneObjectPosition miina\obj,ukko
                CloneObjectOrientation miina\obj,ukko
                ObjectOrder miina\obj,-1
                MoveObject miina\obj,50,-2               
                reload=100
                PlaySound landmine
          Else 
            PlaySound noMoreAmmo, 10
          EndIf
      EndSelect 
    EndIf

    If reload>0 Then reload=reload-1
    
    
    
    For pahis.VIHUT = Each VIHUT
        PointObject pahis\obj, ukko
        MoveObject pahis\obj, 1
        pahis\healtti = 100
        For luoti.AMMUS = Each AMMUS 
            MoveObject luoti\obj, luoti\nopeus
            If ObjectsOverlap(luoti\obj, pahis\obj, 2) Then 
                DeleteObject luoti\obj
                DeleteObject pahis\obj
                Delete luoti
                Delete pahis
            EndIf 
        Next luoti
    Next Pahis
   
   
    For miina2.VIHUMIINAT = Each VIHUMIINAT
        If ObjectsOverlap(ukko, miina2\obj, 2) Then
            poks.RÄJÄHDYKSET = New(RÄJÄHDYKSET)
            poks\partikkeli = MakeEmitter(imgPoks, 10)
            PlaySound minepam
            CloneObjectPosition poks\partikkeli,miina2\obj
            ObjectLife poks\partikkeli,11
            'aseta partikkelilähteen ominaisuudet    
            ParticleMovement poks\partikkeli,0,0
            ParticleEmission poks\partikkeli,2,1,1
            '8 animaatio-framea        
            ParticleAnimation poks\partikkeli,7
            DeleteObject miina2\obj 'poista objekti
            Delete miina2 'poista luoti kokonaan
            elkku = elkku-miina2\dmg
        EndIf 
    Next miina2
    
    
    If elkku<=0 Then MakeError "Kuolit!"




DrawGame 'Näytetään tietoja ruudulla 
    
    
    Color cbwhite
    If ase = 1 Then 
        Text 10,10, "Ase: Pistooli"
        Text 10,30, "Ammuksia: " + pistooliammukset
        Text 10,50, "lipas: " + pistoolilipas
    ElseIf ase = 2 Then 
        Text 10,10, "Ase: Konekivääri"
        Text 10,30, "Ammuksia: " + konekivääriammukset
        Text 10,50, "Lipas: " + konekiväärilipas
    ElseIf ase = 3 Then
        Text 10,10, "Ase: Haulikko"
        Text 10,30, "Ammuksia: " + haulikkoammukset
    ElseIf ase = 4 Then 
        Text 10,10, "Ase: Miina"
        Text 10,30, "Ammuksia: " + miinoja
    EndIf 
    
    Color cbred
    Text 700,580, "Energia: " + elkku
    
  
        DrawScreen
Until EscapeKey() 
EDIT:

Muutin ja sisensin hieman koodia. Sain toimimaan niin, että pahis katoaa kyllä yhdestä luodin osumasta, mutta en saa toimimaan siten, että pahis kuolisi vasta sitten, kun sen healtti on nolla. Lisäksi haulikolla ampuessa tulee MAV heti, ja viimeisen pahiksen kuoltua luoti jää leijumaan ilmaan eikä lähde piipusta niin kuin pitäisi? :cry:

User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Tyhmät kysymykset (I/2015)

Post by CCE »

Haulikkobugi: Ongelma on luotien ja pahisten törmäystarkistusluupissa. Lisäsin koodiin kommentteja jotka selittävät virheen.

Code: Select all

For pahis.VIHUT = Each VIHUT
        PointObject pahis\obj, ukko
        MoveObject pahis\obj, 1
        pahis\healtti = 100
        For luoti.AMMUS = Each AMMUS 
            MoveObject luoti\obj, luoti\nopeus
            ' Alla oleva ObjectsOverlap-kutsu aiheuttaa virheen jos pahis on jo poistettu Delete-komennolla,
            ' koska siinä yritetään lukea tyyppi-instanssiin tallennettu objekti pahis\obj (jossa objektikin on poistettu, mutta sillä ei ole nyt väliä)
            If ObjectsOverlap(luoti\obj, pahis\obj, 2) Then 
                DeleteObject luoti\obj
                DeleteObject pahis\obj
                Delete luoti
                Delete pahis ' ja tässähän se pahis poistetaan, jonka jälkeen aloitetaan seuraavan luodin tutkailu, pahis on kuitenkin jo hävitetty!		
            EndIf 
        next luoti
    Next Pahis
Ratkaisu tässä tapauksessa on lisätä Exit-käsky Delete pahis rivin alle, tällöin suoritus hyppää suoraan seuraavaan pahikseen, ja loput luodit jätetään käsittelemättä tämän vihulaisen kohdalla.
Koodissa on kuitenkin jäljellä toinen mainitsemasi virhe: ammukset eivät liiku jos vihollisia ei ole kentällä. Tämän voi korjata esim. liikuttamalla niitä erikseen omassa For Each loopissaan ennen törmäystarkistusta.
User avatar
wilizucoder
Member
Posts: 81
Joined: Sat Sep 08, 2007 11:24 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2015)

Post by wilizucoder »

CCE wrote:Haulikkobugi: Ongelma on luotien ja pahisten törmäystarkistusluupissa. Lisäsin koodiin kommentteja jotka selittävät virheen.

Code: Select all

For pahis.VIHUT = Each VIHUT
        PointObject pahis\obj, ukko
        MoveObject pahis\obj, 1
        pahis\healtti = 100
        For luoti.AMMUS = Each AMMUS 
            MoveObject luoti\obj, luoti\nopeus
            ' Alla oleva ObjectsOverlap-kutsu aiheuttaa virheen jos pahis on jo poistettu Delete-komennolla,
            ' koska siinä yritetään lukea tyyppi-instanssiin tallennettu objekti pahis\obj (jossa objektikin on poistettu, mutta sillä ei ole nyt väliä)
            If ObjectsOverlap(luoti\obj, pahis\obj, 2) Then 
                DeleteObject luoti\obj
                DeleteObject pahis\obj
                Delete luoti
                Delete pahis ' ja tässähän se pahis poistetaan, jonka jälkeen aloitetaan seuraavan luodin tutkailu, pahis on kuitenkin jo hävitetty!		
            EndIf 
        next luoti
    Next Pahis
Ratkaisu tässä tapauksessa on lisätä Exit-käsky Delete pahis rivin alle, tällöin suoritus hyppää suoraan seuraavaan pahikseen, ja loput luodit jätetään käsittelemättä tämän vihulaisen kohdalla.
Koodissa on kuitenkin jäljellä toinen mainitsemasi virhe: ammukset eivät liiku jos vihollisia ei ole kentällä. Tämän voi korjata esim. liikuttamalla niitä erikseen omassa For Each loopissaan ennen törmäystarkistusta.

Kiitoksia, nyt toimii! :lol:
User avatar
wilizucoder
Member
Posts: 81
Joined: Sat Sep 08, 2007 11:24 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2015)

Post by wilizucoder »

Tuli vastaan seuraava ongelma, koskee timerin käyttöä, eli tarkoitus olisi, että pommi räjähtäisi kolmen sekunnin kuluttua heittämisen jälkeen niin kuin esimerkiksi kranaatti.

Tässä on tämä oma kyhäelmä:

Code: Select all

Case 5 'kranaatti 
          If pommeja>0 Then
                pommeja = pommeja-1
                bomb.POMMI = New(POMMI)
                bomb\obj = CloneObject(kranaatti)
                CloneObjectPosition bomb\obj,ukko
                CloneObjectOrientation bomb\obj,ukko
                ObjectOrder bomb\obj,-1
                bomb\dmg=50
                reload=50
                PlaySound landmine
          Else 
            PlaySound noMoreAmmo, 10
          EndIf

Code: Select all

For bomb.POMMI = Each POMMI
        MoveObject bomb\obj, 2
         If Timer()>pamausaika+3000 Then
                PlaySound minepam
                Delete bomb
                DeleteObject bomb\obj
                pamausaika=Timer()
         EndIf 
    Next bomb
Eli luulisin, että ongelma sijaitsee tuossa jälkimmäisessä for-silmukassa, jossa bomb poistetaan, kokeilin tuota timeria ilman delete-komentoja, ja toimi, mutta lakkasi toimimasta, kun lisäsin pommien poistamisen, mikäs mättää? :shock:
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2015)

Post by Latexi95 »

Poistat tyypin jäsenen Deletellä ja sen jälkeen käytät jo poistettua jäsentä objektin poistamiseen. Vaihda Delete ja DeleteObject rivien paikkoja. Sitten pamausaika on syytä tallentaa POMMI tyyppiin että useampi kranaatti toimisi oikein. Tyypin pamausaika fieldiin kannattaa tallentaa timer() pommin luontihetkellä + haluttu räjähdysaika niin sitä voidaan helposti verrata Timer()iin päivitys loopissa.
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Tyhmät kysymykset (I/2015)

Post by CCE »

Mikäli ymmärsin kysymyksen oikein, ratkaisu on asettaa pamausaika heittohetkellä osoittamaan tulevaisuuteen, ja tallentaa se tyyppi-instanssiin. Silmukassa sitten luetaan jokaisen pommin oma ajastin, ja räjäytetään se jos aikaa on kulunut tarpeeksi.

Koodina siis jotakuinkin seuraava.

Code: Select all

Type POMMI
    Field obj
    Field pamausaika
End Type 

Code: Select all

Case 5 'kranaatti 
          If pommeja>0 Then
                pommeja = pommeja-1
                bomb.POMMI = New(POMMI)
                bomb\obj = CloneObject(kranaatti)
                bomb\pamausaika = Timer() + 3000 ' kolme sekuntia tulevaisuuteen
                CloneObjectPosition bomb\obj,ukko
                CloneObjectOrientation bomb\obj,ukko
                ObjectOrder bomb\obj,-1
                bomb\dmg=50
                reload=50
                PlaySound landmine           
          Else 
            PlaySound noMoreAmmo, 10
          EndIf

Code: Select all

For bomb.POMMI = Each POMMI
        MoveObject bomb\obj, 2
         If Timer() > bomb\pamausaika Then
                PlaySound minepam
                DeleteObject bomb\obj
                Delete bomb
         EndIf 
    Next bomb
Edit: Joo eli juuri kuten Latexi95 kirjoitti.
BlueDeath
Newcomer
Posts: 18
Joined: Tue Feb 02, 2010 2:02 pm

Re: Tyhmät kysymykset (I/2015)

Post by BlueDeath »

Olen rakentelemassa korttipeliä, ja nyt pää lyö ihan tyhjää, kun pitäisi saada korttien arvot sisältävä lista randomisoitua, että "pakka" ei ole aina samassa järjestyksessä. CB:stä en vastaavaa funktiota löytänyt enkä omaakaan funktiota onnistu kehittelemään. Sellaista kehitelmää olen yrittänyt, että arvotaan Rand-funktiolla indeksi ja laitetaan vastaava arvo uuteen listaan. Tässä tulee kuitenkin se ongelma, että pitää aina tarkistaa, että ei tule arvottua samaa indexiä ja tämä taas tuottaa paljon sisäisiä looppeja ja hidastaa tätä aika lailla. Ideoita? :?
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Tyhmät kysymykset (I/2015)

Post by Wingman »

BlueDeath wrote:Olen rakentelemassa korttipeliä, ja nyt pää lyö ihan tyhjää, kun pitäisi saada korttien arvot sisältävä lista randomisoitua, että "pakka" ei ole aina samassa järjestyksessä. CB:stä en vastaavaa funktiota löytänyt enkä omaakaan funktiota onnistu kehittelemään. Sellaista kehitelmää olen yrittänyt, että arvotaan Rand-funktiolla indeksi ja laitetaan vastaava arvo uuteen listaan. Tässä tulee kuitenkin se ongelma, että pitää aina tarkistaa, että ei tule arvottua samaa indexiä ja tämä taas tuottaa paljon sisäisiä looppeja ja hidastaa tätä aika lailla. Ideoita? :?
Kun arvot indeksiä ja listaat arvoa, laita johonkin muistiin mitkä indeksit ovat jo käytetty, ja tarkista aina arvottaessa ettei tule jo arvottua indeksiä? En saa itse muuta tästä irti nyt tähän hätään, pitäisi päästä kokeilemaan jotenkin..
- - - -
BlueDeath
Newcomer
Posts: 18
Joined: Tue Feb 02, 2010 2:02 pm

Re: Tyhmät kysymykset (I/2015)

Post by BlueDeath »

Wingman wrote:
BlueDeath wrote:Olen rakentelemassa korttipeliä, ja nyt pää lyö ihan tyhjää, kun pitäisi saada korttien arvot sisältävä lista randomisoitua, että "pakka" ei ole aina samassa järjestyksessä. CB:stä en vastaavaa funktiota löytänyt enkä omaakaan funktiota onnistu kehittelemään. Sellaista kehitelmää olen yrittänyt, että arvotaan Rand-funktiolla indeksi ja laitetaan vastaava arvo uuteen listaan. Tässä tulee kuitenkin se ongelma, että pitää aina tarkistaa, että ei tule arvottua samaa indexiä ja tämä taas tuottaa paljon sisäisiä looppeja ja hidastaa tätä aika lailla. Ideoita? :?
Kun arvot indeksiä ja listaat arvoa, laita johonkin muistiin mitkä indeksit ovat jo käytetty, ja tarkista aina arvottaessa ettei tule jo arvottua indeksiä? En saa itse muuta tästä irti nyt tähän hätään, pitäisi päästä kokeilemaan jotenkin..
Noin sitä oikeastaan lähdinkin rakentamaan, selitin hieman huonosti. Ongelmana on vain se, että funktiosta tulee aika monimutkainen ja paljon sisäkkäisiä looppeja ja lisäksi pitäisi olla vielä while-looppi, joka generoi randomia, kunnes sitä ei löydy jo käytetyistä indekseistä ja tästä tulisi varmaan aika hidasta. Tällaisen algoritmin onnistuin löytämään, kokeilen portata CB:lle ja postaan tuloksen, jos tulos on toivottu :D
EDIT:

Otinkin sitten täältä PhiLho:n algoritmin ja porttasin sen. Jos listassa oli vain kaksi (eli pituus = 1), niin ei toiminut muistaakseni oikein, joten siihen lisäsin poikkeuksen, sillä en jaksanut tarkemmin selvitellä tuon algoritmin toimintaa.

Code: Select all

  Dim ar(3)
    ar(0) = "12"
    ar(1) = "22"
    ar(2) = "18"
    ar(3) = "67"
  
   pituus = 3
 
   Randomize Timer()
   
   If pituus = 1 Then
        satunnainen = Rand(0, 1)
            a = ar(0)
            b = ar(1)
            
        ar(satunnainen) = a
        ar( 1-satunnainen ) = b
   Else 
        For i=pituus-1 To 1 Step -1
            indeksi = Rand(0, (i+1))
        
            a = ar(indeksi)
            ar(indeksi) = ar(i)
            ar(i) = a
        Next i
   EndIf
   
   For j=0 To pituus
        AddText Str(ar(j))
   Next j
   
   DrawScreen
   WaitKey
   
   
  
Kiitos avusta kuitenkin Wingmanille! Niin ja kommentteja saa heittää tuosta porttauksestani jos siellä on jokin pahasti pielessä, nyt tosin pitää alkaa pakata rippileirille :)[/edit]
jusola
Newcomer
Posts: 9
Joined: Sun Apr 19, 2015 10:22 am

Re: Tyhmät kysymykset (I/2015)

Post by jusola »

Mulla on ongelma includen kanssa.
Varsinainen koodi:

Code: Select all

 'Launcher for MCITY
    SCREEN 768,572
    
    'Setting current directory
    lsnumber=Len (GetEXEName ())-Len ("launcher.exe")
    ls$=Left (GetEXEName(), lsnumber)
    ChDir ls$
    'Fonts
    impact50ONON=LoadFont ("impact", 50, ON, ON)'Font loading impact with size 100
    impact25=LoadFont ("impact", 25)'Loading font impact with size 50
    impact17=LoadFont ("impact", 17)'Loading font impact with size 17
    SetFont impact100ONON ' setting font impact to current font
    
    'Setting window title    
    SetWindow "Launcher"
    'including functions
    Include "Files\includes\functions.cb"
    
    
    
    
    
    
    
    Repeat 'starting repeat
        SetFont impact50ONON 'setting font for Title
        CenterText 768/2,572/8,"MCITY"' Printing title
        SetFont impact25 'setting font to lower size
        CenterText 768/2,572/5,"Please select language" 'asking to select language
      
        If button(768/3,572/2,"English") Then 'Button for selecting english language 
            Execute "Files/main/mainen.exe"
            Wait 1000
            End
        
        EndIf
        If button(768/3*2,572/2,"Suomi") Then 'Button for selecting finnish language
            Execute "Files/main/mainfi.exe"
            Wait 1000
            End
        EndIf
        
       DrawScreen 
    Forever 'Repeating until selecting language
            

Includattu tiedosto/koodi(includes.cb)

Code: Select all

Function button(x,y,txt$="")
        width      = TextWidth(txt)+6
        height      = TextHeight(txt)+6
        result      = False
        mouse_over   = False
        Color cbWhite
        Box x,y, width,height, OFF
        If MouseX()>=x And MouseX()<=x+width-3 Then
            If MouseY()>=y And MouseY()<=y+height-3 Then
                mouse_over = True
                If MouseHit(1) Then buttonfunctionresult = True
            EndIf
        EndIf
        If mouse_over=True Then
            c = 128+mouse_over*50
            Color c,c,c
            Box x,y, width,height, ON
            Color 255,255,255
        EndIf
        CenterText x+width/2,y+height/2, txt, 2
        Return buttonfunctionresult
    EndFunction 
Includaaminen toimii kuitenkin jos teen näin

Code: Select all

lsnumber=Len (GetEXEName())-Len ("test.exe")
    ls$=Left (GetEXEName(), lsnumber)
    ChDir ls$
    Include "Files\includes\functions.cb"
    Repeat
    If button(5,5,"Testi") Then Exit
    DrawScreen 
    Forever 
    End 
Jusola
Projektit
City Build
JuOs (tulossa ...)
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Tyhmät kysymykset (I/2015)

Post by CCE »

En oikein ymmärtänyt kysymystäsi, millä tavalla Include-ongelma ilmenee? Mitä odotit, mikä oli lopputulos, mitä olet jo koettanut?
Muista, että Include-komento on vain käännöksenaikainen operaatio. Koodia käännettäessä kääntäjä avaa käskemäsi tiedoston, ja kopioi sen sisällön Include-rivin tilalle. Voisit tehdä itse käsin saman leikkaamalla ja liimaamalla includetun tiedoston sisällön kooditiedostoon.

Tämä tarkoittaa sitä, että kun ohjelma on käännetty .exeksi, se ei enää lue .CB-tiedostoja, sillä luku on tehty jo kääntämisen yhteydessä.
jusola
Newcomer
Posts: 9
Joined: Sun Apr 19, 2015 10:22 am

Re: Tyhmät kysymykset (I/2015)

Post by jusola »

Tarkoitan että compiler ei löydä tiedostoa (functions.cb) ekassa koodissa kun yritän tehä siitä exen. Toimii hyvin kolmannessa koodissa, vaikka Include rivi on ihan sama.
Jusola
Projektit
City Build
JuOs (tulossa ...)
Pettis
The Evil Admin
The Evil Admin
Posts: 1044
Joined: Sun Aug 26, 2007 5:08 pm
Location: Rovaniemi
Contact:

Re: Tyhmät kysymykset (I/2015)

Post by Pettis »

Tarkista että tiedosto on oikealla paikalla suhteessa sen sisällyttävään koodiin ja että tiedoston pääte on oikea. Windows kun tuppaa piilottamaan päätteitä ellei sitä nimenomaan kiellä sitä tekemästä. Sinulla voi olla esimerkiksi tiedosto.cb.cb ja windows näyttää tiedoston nimeksi tiedosto.cb
CB Repository .com - Sinne ne kaikki koodit menneet on!
MunVerkko - Ilmaisia foorumeita ja blogeja
jusola
Newcomer
Posts: 9
Joined: Sun Apr 19, 2015 10:22 am

Re: Tyhmät kysymykset (I/2015)

Post by jusola »

Ongelma ei ole siinä sillä se toimii kolmannessa koodissa(erillinen ohjelma) ihan hyvin.
Jusola
Projektit
City Build
JuOs (tulossa ...)
Post Reply