Tyhmät kysymykset (II/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (II/2009)

Post by skorpioni-cb »

Miten voi tehdä yksinkertaisen sudoku pelin?
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
Taatero
Advanced Member
Posts: 384
Joined: Tue May 27, 2008 6:06 pm

Re: Tyhmät kysymykset (II/2009)

Post by Taatero »

skorpioni-cb wrote:Miten voi tehdä yksinkertaisen sudoku pelin?
Taulukoilla on helpinta. Ainakin tarkistus.
[color=#40BF00][u]koodaaja[/u][/color] wrote:Täyden turvan takaamiseksi avain olisi myös kuljetettava offlinenä suoraan tulevien viestien lähettäjältä niiden vastaanottajalle laitakaupungin hämärissä yöneljältä ja varmistettava, ettei kumpaakaan osapuolta seurata. Popliinitakkia suositellaan.
martti
Newcomer
Posts: 27
Joined: Mon Aug 31, 2009 6:21 pm

Re: Tyhmät kysymykset (II/2009)

Post by martti »

Mites GotoSavedLocationia käytetään?
Kun itse testaan ni ruutu on mustana.
OpenTTD

Projektit:
  • Land of guy's 10.0%
ylimääräistä:
---------------------------- ...kyläkaupunkiin.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Tyhmät kysymykset (II/2009)

Post by kaneli2000 »

martti wrote:Mites GotoSavedLocationia käytetään?
Kun itse testaan ni ruutu on mustana.
CoolBasicin manuaali wrote:Tämä komento siirtää pelin suorituksen täsmälleen samaan paikkaan, mihin se jäi kun peli tallennettiin. Käytä tätä komentoa LoadProgramin jälkeen. Yleensä vielä senkin jälkeen, kun kaikki kuvat sun muut on ladattu uudelleen.

ESIMERKKI

Code: Select all

'Save game 
foo()

Print "Program continues..."

'LoadGame 
LoadProgram "savegame.sav"
GotoSavedLocation

Print "Program ended"

WaitKey

Function foo()
    SaveProgram "savegame.sav"
     'will continue from here after loading...
    Print "Game Saved..."
End Function
I see the rainbow rising
martti
Newcomer
Posts: 27
Joined: Mon Aug 31, 2009 6:21 pm

Re: Tyhmät kysymykset (II/2009)

Post by martti »

kaneli2000 wrote:
martti wrote:Mites GotoSavedLocationia käytetään?
Kun itse testaan ni ruutu on mustana.
CoolBasicin manuaali wrote:Tämä komento siirtää pelin suorituksen täsmälleen samaan paikkaan, mihin se jäi kun peli tallennettiin. Käytä tätä komentoa LoadProgramin jälkeen. Yleensä vielä senkin jälkeen, kun kaikki kuvat sun muut on ladattu uudelleen.

ESIMERKKI

Code: Select all

'Save game 
foo()

Print "Program continues..."

'LoadGame 
LoadProgram "savegame.sav"
GotoSavedLocation

Print "Program ended"

WaitKey

Function foo()
    SaveProgram "savegame.sav"
     'will continue from here after loading...
    Print "Game Saved..."
End Function
Tuon luin oppaasta.
Ongelma siinä miten ne mediat ladataan.
OpenTTD

Projektit:
  • Land of guy's 10.0%
ylimääräistä:
---------------------------- ...kyläkaupunkiin.
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Herra Siili »

Ohjelman suoritus siirtyy tallennuksen jälkeiseen kohtaan, mutta mediat sun muut pitää ladata erikseen. Kuitenkin, oman tallennussysteemin tekoa suositellaan.
a.k.a. Gehock
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by mikeful »

Viestejä siivottu vähän. Tämän on tarkoitus olla vähän vähemmän taitaville CB-käyttäjille suunnattu, joten yrittäkää sietää vaihtelevaa kielioppia.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
11v
Member
Posts: 73
Joined: Wed Jun 10, 2009 10:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by 11v »

Miksi ei toimi, miten voin korjata?

Code: Select all

Type JOKU
       Field _normisijaintiX
       Field _normisijaintiY
       Field _normikokoX
       Field _normikokoX
       Field _normiid
    EndType
    
    
    
    
    
    
    
    Function tee(_x,_y,_kokox,_kokoy,_id)
      _testi.JOKU = New(JOKU)
      _testi\_normisijaintiX = _x
      _testi\_normisijaintiY = _y
      _testi\_normikokoX = _kokox
      _testi\_normikokoY = _kokoy
      _testi\_normiid = _id
    EndFunction
Black city peleistä parhain
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by otto90x »

Ei toimi koska tyyppikokoelmassa on kaksi samannimistä kenttää (field). Muuta toinen _normikokoX _normikokoY:ksi.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
11v
Member
Posts: 73
Joined: Wed Jun 10, 2009 10:13 pm

Re: Tyhmät kysymykset (II/2009)

Post by 11v »

Ouu... kiitti
Black city peleistä parhain
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: Tyhmät kysymykset (II/2009)

Post by rami123 »

Joo moi taas kaikki, mulla jääty jokunen aika sitten projekti tohon tasohyppelyn vihollisen tekoälyyn ja nyt alkaisin taas tekemään.. ku ei ne alkaneet ampua vaikka pakostakaan. :) nii, että mikä ois paras keino saaha tasohyppely vihollinen liikkumaan ja ampumaan?. Omaa väkerrystä en laita, koska ette tosiaankaa tulisi pitämään siitä..

vihollinen on siis kuva..ei fraameja eikä muuta jännää toistaiseksi.
EDIT:

Kiitti paljon! selkeni asiat ;)

Last edited by rami123 on Tue Sep 29, 2009 9:25 pm, edited 1 time in total.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (II/2009)

Post by Jonez »

Hyvään tekoälyyn ei mitään "parasta" tai vakituista tapaa ole. Jokainen peli tarvitsee omanlaisensa tekoälyn. Tämä on erittäin hankala ohjelmoinnin osa-alue. Parhaiten opit yrittämällä itse.

Tässä yksi tapa toteuttaa strategiapelin tekoäly (teoriaa):

Yhden framen aikana voisi tapahtua seuraavaa:
1. Katsotaan kaikki mahdolliset toiminnot.
2a. Annetaan jokaiselle toiminnolle pisteitä sen mukaan, kuinka järkevä se on.
2b. Toistetaan kohta 1 ja 2a niin monta kertaa kuin halutaan: mitä useammin toistamme, sitä tarkemman kuvan saamme siitä mikä ensimmäisistä vaihtoehdoista on paras.
Esim: meillä on vaihtoehdot X1 ja Y1. X1 antaa pisteitä 2 ja Y1 4p. X1 johtaa vaihtoehtoihin X2 ja Y2. X2 = 6 pist. Y2 = 1p. Y1 johtaa tilanteisiin X3 ja Y3: X3 = 2p. Y3 = 2p. Paras vaihtoehto ei siis ole Y1, vaikka siitä saa enemmän pisteitä kuin X1:stä, vaan X1, koska se johtaa parempaan lopputulokseen, X2:een: X1 + X2 = 2 + 6 = 8 pistettä <- suurin mahdollinen pistemäärä.
3. Toteutetaan vaihtoehto joka johtaa (todennäköisesti) parhaaseen lopputulokseen.

Esim. shakki-tekoälyt noudattavat tämäntyylistä tapaa. Suosittelen etsimään ja lukemaan netistä tekoäly-teoriaa.

Tässä kuitenkin vähän erilainen tekoäly vanhaan kunnon toimintaan. Botit juoksentelevat ympäri mappia seuraavan kaavan mukaan:
1: Jos seinä -> vaihda suuntaa.
2: Jos este -> hyppää päälle.
3: Jos mahdollista hypätä toiselle tasolle -> tee se.
4: Jos näet vihollisen -> ammu.

Tein koodin cb:n painovoimaesimerkin päälle. Se ei ole todellakaan täydellinen, ja asiat on hoidettu aika suorasukaisesti. Kunnon tekoälylle kannattaa tehdä paljon selkeämpi rakenne. Tämä on enemmänkin vain joukko ehtolausekkeita. Jos tekoälyä jatkaisi pitkään samaan tyyliin, rupeaisivat ehtolausekkeet käymään hiljalleen ristiriitaisiksi ja sekaviksi. Esimerkkinä sen pitäisi olla riittävä, joskin aika niukasti kommentoitu.

Code: Select all

'Asetetaan ruutu hieman zoomattuun tilaan
SCREEN 1024, 768
SetWindow "Painovoimaesimerkki" 'suurenna ruudulle

FrameLimit 40 

Const PAINOVOIMA = -0.1'painoviman voimakkuus

Type ukot
    Field obj
    Field maassa As Byte
    Field vauhti
    Field yPlus As Float
    Field oldY
    Field reload
EndType

Type ammukset
    Field obj
    Field id
EndType

'-------------------------------------------------
'lataa kartta, siirrä sitä ylöspäin ja animoi se.
kenttä=LoadMap("Media\testmap.til","Media\tileset.bmp")
PositionObject kenttä,0,50
PlayObject kenttä,0,0,0.5

'lataa animaatiosarja oikealle, maskaa ja piilota se
oikea=LoadAnimObject("Media\zerorun1.bmp",47,51,0,13)
MaskObject oikea,cbMagenta
ShowObject oikea,OFF
ObjectRange oikea,30,51 'tämä pitää asettaa kaikkiin

'sama vasemmalle
vasen=LoadAnimObject("Media\zerorun2.bmp",47,51,0,13)
MaskObject vasen,cbMagenta
ShowObject vasen,OFF
ObjectRange vasen,30,51 'tämä pitää asettaa kaikkiin

Global gBullet
gBullet = LoadObject( "media\bullet.bmp" )
ShowObject gBullet, OFF

For i = 1 To 5
    UusiUkko( oikea, kenttä )
Next i

Function UusiUkko( _obj, _map )
    nu.ukot = New( ukot )
    nu\obj = CloneObject( _obj )
    SetupCollision nu\obj, _map, 1, 4, 2
    ObjectRange nu\obj, 30, 51
    
    While nu\vauhti = 0
        nu\vauhti = Rand( -1, 1 )
    Wend

    While True
        _x = Rand( 1, MapWidth() )
        _y = Rand( 1, MapHeight() )
        
        If GetMap2( 2, _x, _y ) = 0 And GetMap2( 0, _x, _y ) <> 0 Then
            PositionObject nu\obj, ( -ObjectSizeX( _map ) - 32 ) / 2 + _x * 32, ( -ObjectSizeY( _map ) + 16 ) / 2 + _y * 32 - 5
            Exit
        EndIf
    Wend
    ResetObjectCollision nu\obj
    nu\oldY = ObjectY( nu\obj )
EndFunction

Repeat

    For iu.ukot = Each ukot
        'iu\vauhti=0 'oletuksena ei liikettä

     '   If RightKey() Then 
        If iu\vauhti > 0
            'juokse oikealle
            PaintObject iu\obj,oikea 'vaihda kuvaa...
            If iu\maassa Then PlayObject iu\obj,2,11,0.25
        ElseIf iu\vauhti < 0 Then
            'juokse vasemmalle
            PaintObject iu\obj,vasen 'vaihda kuvaa...
            If iu\maassa Then PlayObject iu\obj,2,11,0.25        
        Else 
            'pysäytä animaatio, jos ei liikuta
            PlayObject iu\obj,0
        EndIf

        Tekoäly( ConvertToInteger( iu ), kenttä )
    
        'liikuta pelihahmoa
        TranslateObject iu\obj,iu\vauhti * 2, iu\yPlus
        
        iu\yPlus = iu\yPlus + PAINOVOIMA 'päivitä painovoima    
        
        'UpdateGame 'päivitä törmäys
        'CloneCameraPosition pelihahmo 'liimaa kamera

       jump = 0
        If KeyDown(cbKeyZ) And iu\maassa Then 
            iu\yPlus=4.5 'voimaa ylös päin
            jump = 1
        EndIf
        
        iu\maassa = 0 'ilmassa jollei toisin käy ilmi
        törmäykset=CountCollisions(iu\obj)
        'katsotaan tärmätäänkö kattoon tai lattiaan
        For i=1 To törmäykset
            If GetCollision(iu\obj,i)=kenttä
                'lattia
                If CollisionAngle(iu\obj,i)=90 And ( Not jump ) Then 
                    iu\yPlus = -1
                    iu\maassa=1 'jalat on maassa
                EndIf
                'katto
                If CollisionAngle(iu\obj,i)=270 Then 
                    iu\yPlus=-1
                EndIf
            EndIf
        Next i 

        'jos ollaan ilmassa, näytä toisenlainen kuva
        If törmäykset=0 Then PlayObject iu\obj,12,0

        bTuhoaUkko = False
        For ia.ammukset = Each ammukset
            bTuhoaAmmus = False
            If iu = First( ukot ) Then
                MoveObject ia\obj, 10
            EndIf
            
            If ObjectsOverlap( ia\obj, iu\obj ) Then
                If ia\id <> ConvertToInteger( iu ) Then
                    bTuhoaAmmus = True
                    bTuhoaUkko = True
                   ' Exit
                EndIf
            ElseIf Distance2( ia\obj, kenttä ) > 1000 Then
                bTuhoaAmmus = True
            EndIf
            
            If bTuhoaAmmus Then
                DeleteObject ia\obj
                Delete ia
            EndIf
        Next ia

        If bTuhoaUkko Then 
            'DeleteObject iu\obj
            'Delete iu
        EndIf
    Next iu
    

    DrawScreen 'piirrä näyttö

Until EscapeKey()

Function Tekoäly( _id, _map )
    cu.ukot = ConvertToType( _id )
    
    _objX = ObjectX( cu\obj )
    _objY = ObjectY( cu\obj )
    
    If cu\maassa Then
        If cu\vauhti = 0 Then
            cu\vauhti = Rand( -1, 1 )
        EndIf 
        
        If GetMap( 2, _objX + cu\vauhti * 64, _objY ) <> 0  Then
            If GetMap( 2, _objX + cu\vauhti * 64, _objY + 96 ) = 0 Then
                hyppää = True
            EndIf
        EndIf
        
        If GetMap( 2, _objX + cu\vauhti * 96, _objY + 64 ) = 1 Then
            hyppää = True
        EndIf
    
    EndIf

    If GetMap( 2, _objX + cu\vauhti * 16, _objY ) <> 0 Then
        cu\vauhti = cu\vauhti * -1
    EndIf

    If Not cu\maassa Then
        checkY = _objY
        While True
            checkY - 32
            
            If GetMap( 2, _objX, checkY ) = 1 And checkY > cu\oldY Then
                cu\vauhti = 0
                Exit
            EndIf
            
            If checkY < cu\oldY Then Exit
        Wend
    EndIf
    
    If hyppää Then 
        cu\oldY = _objY
        cu\yPlus = 4.5
    EndIf
    
    If cu\reload = 0 Then
        For iu.ukot = Each ukot
            If iu <> cu Then
                If ObjectSight( cu\obj, iu\obj ) Then
                    Ammu( _id, GetAngle( _objX, -_objY, ObjectX( iu\obj ), -ObjectY( iu\obj ) ) )
                    cu\reload = 10
                    Exit
                EndIf
            EndIf
        Next iu
    Else
        cu\reload = cu\reload - 1
    EndIf
EndFunction

Function Ammu( _id, _angle As Float )

    cu.ukot = ConvertToType( _id )
    
    na.ammukset = New( ammukset )
    na\obj = CloneObject( gBullet )
    na\id = _id
    CloneObjectPosition na\obj, cu\obj
    RotateObject na\obj, _angle
EndFunction
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Kuvatus

Re: Tyhmät kysymykset (II/2009)

Post by Kuvatus »

Onko mahdollista tehdä ohjelmaa, joka avaa kuvan, kun klikkaa sitä kuvaa pic.jpg kakkospainikkeella ja valitsee "Avaa sovelluksessa... -> cbohjelma.exe"?
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: Tyhmät kysymykset (II/2009)

Post by MAVmaggot »

Kuvatus wrote:Onko mahdollista tehdä ohjelmaa,
Älä aloita ikinä kysymystä noin.
Kuvatus wrote:joka avaa kuvan, kun klikkaa sitä kuvaa pic.jpg kakkospainikkeella ja valitsee "Avaa sovelluksessa... -> cbohjelma.exe"?
Tee yksinkertainen ehtolauseke:

Code: Select all

if mousex()>imagex and mousex()<imagex+imagewidth(image) and mousey()>imagey and mousey()<imagey+imageheight(image)
Ja tuon avaa sovelluksessa -ikkunan saat cbApi-nimisellä kirjastolla. (löytyy cbSDK:sta)
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (II/2009)

Post by axu »

Kuvatus wrote:Onko mahdollista tehdä ohjelmaa, joka avaa kuvan, kun klikkaa sitä kuvaa pic.jpg kakkospainikkeella ja valitsee "Avaa sovelluksessa... -> cbohjelma.exe"?
Tai jos tarkoitit, että kun selaat resurssienhallinnassa, niin siihen tulee em. valinta? Se tulee automaattisesti kun klikkaat sitä kuvaa => Avaa sovelluksessa => Valitse ohjelma... => Selaa => (haet ohjelmasi ja valitset sen) OK.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
kuvatus

Re: Tyhmät kysymykset (II/2009)

Post by kuvatus »

axu wrote:
Kuvatus wrote:Onko mahdollista tehdä ohjelmaa, joka avaa kuvan, kun klikkaa sitä kuvaa pic.jpg kakkospainikkeella ja valitsee "Avaa sovelluksessa... -> cbohjelma.exe"?
Tai jos tarkoitit, että kun selaat resurssienhallinnassa, niin siihen tulee em. valinta? Se tulee automaattisesti kun klikkaat sitä kuvaa => Avaa sovelluksessa => Valitse ohjelma... => Selaa => (haet ohjelmasi ja valitset sen) OK.
Tätähän minä hain, eli kun explorerissa selaa kuvatiedostoja ja valitsee sieltä kuvan jota klikkaa ja ottaa tuon "Avaa sovelluksessa... ja sieltä oma ohjelma, mutta millä saan sen haluamani kuvan avautumaan siihen ohjelmaan?
kuvatus

Re: Tyhmät kysymykset (II/2009)

Post by kuvatus »

Tai itse asiassa löysin hetkisen selailulla tuon CommandLine() komennon, mutta en saa oikein toimimaan.

Kun tämän kääntää ohjelma.exeksi ja sitten valitsee kuvasta avaa sovelluksessa -> ohjelma.exe niin ainakin se saa haettua kuvan polun muttei osaa ladata sitä (erroria vilkuttelloo)..

Code: Select all

tiedosto$=CommandLine()
kuva=LoadImage (""+tiedosto)
Repeat
DrawImage kuva,0,0
DrawScreen
Until EscapeKey()
Trim

Re: Tyhmät kysymykset (II/2009)

Post by Trim »

kuvatus wrote:Tai itse asiassa löysin hetkisen selailulla tuon CommandLine() komennon, mutta en saa oikein toimimaan.

Kun tämän kääntää ohjelma.exeksi ja sitten valitsee kuvasta avaa sovelluksessa -> ohjelma.exe niin ainakin se saa haettua kuvan polun muttei osaa ladata sitä (erroria vilkuttelloo)..

Code: Select all

tiedosto$=CommandLine()
kuva=LoadImage (""+tiedosto)
Repeat
DrawImage kuva,0,0
DrawScreen
Until EscapeKey()
Näin toimii:

Code: Select all

tiedosto$=Trim(CommandLine())
kuva=LoadImage (""+tiedosto)
Repeat
DrawImage kuva,0,0
DrawScreen
Until EscapeKey()
Taatero
Advanced Member
Posts: 384
Joined: Tue May 27, 2008 6:06 pm

Re: Tyhmät kysymykset (II/2009)

Post by Taatero »

Onko mitään valmista funktiota joka palautaa taulukon jonkun ulottuvuuden koon, vai joudunko tekemään sen itse muuttujilla ja tuhlaamaan 54 sekuntia kalliista elämästäni?
[color=#40BF00][u]koodaaja[/u][/color] wrote:Täyden turvan takaamiseksi avain olisi myös kuljetettava offlinenä suoraan tulevien viestien lähettäjältä niiden vastaanottajalle laitakaupungin hämärissä yöneljältä ja varmistettava, ettei kumpaakaan osapuolta seurata. Popliinitakkia suositellaan.
kuvatus

Re: Tyhmät kysymykset (II/2009)

Post by kuvatus »

Trim wrote:
kuvatus wrote:Tai itse asiassa löysin hetkisen selailulla tuon CommandLine() komennon, mutta en saa oikein toimimaan.

Kun tämän kääntää ohjelma.exeksi ja sitten valitsee kuvasta avaa sovelluksessa -> ohjelma.exe niin ainakin se saa haettua kuvan polun muttei osaa ladata sitä (erroria vilkuttelloo)..

Code: Select all

tiedosto$=CommandLine()
kuva=LoadImage (""+tiedosto)
Repeat
DrawImage kuva,0,0
DrawScreen
Until EscapeKey()
Näin toimii:

Code: Select all

tiedosto$=Trim(CommandLine())
kuva=LoadImage (""+tiedosto)
Repeat
DrawImage kuva,0,0
DrawScreen
Until EscapeKey()
Itse asiassa ei näytä toimivan.
Locked