Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
KillBurn
Advanced Member
Posts: 339
Joined: Wed Aug 29, 2007 5:02 pm

Re: Tyhmät kysymykset

Post by KillBurn »

Kuinkia? wrote:Kysymys on, kuinka saan botin pysymään tiettyjen tilejen alueella.

Onnistuisiko näin?

Code: Select all

If GetMap2 (0, x, y) = 7  then moveobject obj,- 2
If GetMap2 (0, x, y) = 8  then moveobject obj,2
if GetMap2 (0, x, y) = 9 then turnobject obj,60
joo onnistuu, jos käyt tilet läpi ja objectit eivät osaa peruuttaa.

Code: Select all

For x=1 To MapWidth()
For y=1 To MapHeight()
If GetMap2 (0, x, y) = 7  then moveobject obj,- 2
If GetMap2 (0, x, y) = 8  then moveobject obj,2
if GetMap2 (0, x, y) = 9 then turnobject obj,60
Next y
Next x
Sumu Games: Sam, Ur eye!
mato1223
Member
Posts: 69
Joined: Sat Aug 16, 2008 12:04 pm
Location: Rääkkylä

Re: Tyhmät kysymykset

Post by mato1223 »

Miten saan tehtyä botin?
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: Tyhmät kysymykset

Post by MAVmaggot »

mato1223 wrote:Miten saan tehtyä botin?
Botti käsittää miljoona eri asiaa, joten voisitko vähän selventää millaista peliä teet?
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post by Koodiapina »

Milläs kaavalla saisin laskettua missä kulmassa toinen piste on toiseen pisteeseen nähden, kun tiedossa on kummankin pisteen sijainti (2D x,y)? GetAnglea en voi käyttää, koska työskentelen toisella kielellä ja kun se kaava on kuitenkin todella yksinkertainen niin turha lisäkirjastoillakaan on pelleillä.

EDIT: Mato1223, tässä esimerkki botista:

Code: Select all

    While True
        If MouseX()<50 Or MouseX()>350 Or MouseY()<50 Or MouseY()>250 Then PositionMouse 200,150
    Wend 
Ozcar
Advanced Member
Posts: 439
Joined: Mon Aug 27, 2007 8:43 pm
Location: Helsinki

Re: Tyhmät kysymykset

Post by Ozcar »

CB-koodilla näin:

Code: Select all

ATAN(y1-y2/x1-x2) 


Tässä siis helppo tapa käyttäen trigonometristä tan-funktiota (tai siis sen käänteisfunkkaria). Joudut tosin hieman kikkailemaan, sillä tulos on aina jotain väliltä -90 - 90 astetta, ja ettei mene liian helpoksi, niin riippuen kummalla puolella x2 on x1:stä tämän negatiivisen arvon toinen pää heittelee. Kuva kertoo nopsasti miten tuloksen arvo on joko positiivinen tai negatiivinen riippuen x2:n sijainnista koordinaatistossa.

x2..........x2
..-...|.....+..
......|........
-----x1--------
......|.........
..+...|......-..
x2............x2

Eli kannattaa tarkistaa kumpi on isompi, x1 vai x2, ja sen mukaan sitten muokkailla tulosta. Kaava myös kertoo vain sen kulman, jonka toinen sivu on x-akselilla, joten jos haluat y-akselin välisen, niin sitten vähentelet 90 asteesta. Sekavaa, mutta yritä ymmärtää ;).
Ratkaisit juuri universaaliongelman! Hienoa, ota keksi.

Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post by Koodiapina »

En kyllä ymmärtänyt O_o Kiitos kuitenkin vastauksesta, ja kysymys ratkesikin jo, kun muistin tämän koodin, jonka toivottavasti saan käännettyä C++:ssaksi.
Mikä tässä on väärin?

Re: Tyhmät kysymykset

Post by Mikä tässä on väärin? »

Kuinka saan 1 type botin ampumaan?
Tällä hetkellä kaikki botit ampuu yhtäaikaa vaikka pelaaja olisi vain 1 botin lähellä.

Mitä teen tässä väärin?

Code: Select all

For u.ob = Each OB 

If ObjectsOverlap(u\obj,objcar) Or ObjectSight(u\obj,objcar) Then ammutaan=1

If ammutaan=1 Then 

     patim.AMMUS = New (AMMUS) 
     patim\obj = CloneObject (pati)
     patim\vahinko = 1 'Säädetään padille vahinko ja nopeus
     patim\nopeus = 4
   
     SetupCollision patim\obj,map, 2, 4, 1 
        
     CloneObjectPosition patim\obj,u\obj 'Asetetaaan luoti oikein
     CloneObjectOrientation patim\obj,u\obj
     ResetObjectCollision patim\obj
Else
      ammutaan=0
    EndIf
Next u 

For u.ob = Each ob
   For ipati.AMMUS = Each AMMUS
       MoveObject ipati\obj,ipati\nopeus

 If ObjectsOverlap (objcar,ipati\obj) Then 

               hp - ipati\vahinko                
               DeleteObject ipati\obj
               Delete ipati 
         Exit
 EndIf 
        
        For i = 1 To CountCollisions (ipati\obj)
        If Distance2(ipati\obj,u\obj) => 2500 Or GetCollision (ipati\obj,i) =map Then 
      
                DeleteObject ipati\obj
                Delete ipati
                ammutaan=0           
                 Exit
              EndIf
          Next i
      Next ipati 
    Exit 
Next u
EDIT:

User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez »

Johtuu tosta ammutaan-muuttujasta: Jos vihu näkee sut, se muutetaan ykköseksi ja jätetään tähän tilaan. Kun käydään loput vihut läpi, ammutaan on edelleen yksi ja näin ollen muutkin viholliset ampuvat. Nollaa se ammutaan-muuttuja ihan silmukan alussa.

Toi: Else ammutaan = 0 on ihan turha, koska tämä muuttaa ammutaan-muuttujan nollaan vain aina kun muuttuja on eri kuin 1, eli esim. 2 tai jo valmiiksi 0.

Lisäks on turha tehdä kaks kertaa For u.ob ... next u - silmukkaa. Tää vaan hidastaa peliä turhaan. Voit heittää ton kaiken koodin vain yhden silmukan sisään.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tyhmät kysymykset

Post by DatsuniG »

Osaako kukaan sanoa minkä takia teksti ei tule näkyviin? Kyllä sitä tekstiä tulee, kun kerran laatikko siirtyy oikealle kirjoitettaessa. Olen melko varma että tähän on melko simppeli vastaus, mutta olen juuri aloittanut funktioiden käytön harjoittelemisen. (Huonot sisennykset)

Code: Select all

Global blinker, currentuser$, blink, cmd$

ClsColor 0,0,128

Repeat

Color cbwhite 

cmdinput()


DrawScreen

Forever 



Function cmdinput()
Color cbwhite 
  Text 3,3,currentuser$+"//"+cmd$
    
    Locate -20,-20
        Cmd$=Input("")

            If TIMER()>blinker+400 Then 
                blink=Not blink
                blinker=TIMER()
           EndIf
    
            If blink Then 
        Color cbwhite 
      Box TextWidth(currentuser$+"//"+cmd$)+4,3,7,14
    
   EndIf 
   
   
EndFunction 

Hengität nyt manuaalisesti.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post by Koodiapina »

Korjattu koodi on tässä. Muuttuja kuuluu määritellä vain kerran halutun tyyppiseksi.

Code: Select all

Global blinker, currentuser$, blink, cmd$

ClsColor 0,0,128

Repeat
    cmdinput()
    DrawScreen
Forever



Function cmdinput()
    Color cbwhite
    Text 3,3,currentuser$+"//"+cmd
    
    Locate -20,-20
    Cmd=Input("")
    
    If Timer()>blinker+400 Then
        blink=Not blink
        blinker=Timer()
    EndIf
    
    If blink Then Box TextWidth(currentuser$+"//"+cmd)+4,3,7,14
EndFunction 
Samalla parantelin sisennystä.
Last edited by Koodiapina on Fri Aug 22, 2008 2:41 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

Post by Jonez »

Osaako kukaan sanoa minkä takia teksti ei tule näkyviin?
Grandi jo auttoi, mutta selvennyksenä vielä että kyseessä lienee cb:n bugi joka mahdollistaa kahden eri muuttujan nimeämisen samannimisiksi:

Code: Select all

Global tekstiä As String

tekstiä = "Globaali"
tekstiä$ = "lokaali"
Print tekstiä + " " + tekstiä$
WaitKey
Tossa sun koodissa oli vain se ongelmana, että globaali muuttuja oli cmd ilman dollarimerkkiä, ja sinä käytit cmd-muuttujaa dollarimerkin kanssa. Bugin vika siis.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Smuliii
Newcomer
Posts: 11
Joined: Wed Jul 30, 2008 4:39 pm

Re: Tyhmät kysymykset

Post by Smuliii »

Taas jatkuu pelinteko ja ongelma syntyi. Ideana on saada hahmo liikkumaan tiettyyn suuntaan (likuhihnan tavoin), jos on tietyllä datanumerossa. Ja tämähän toimii siihen saakka kunnes tulee seuraava tile. Nimittäin silloin se jää siihen tilen reunalle mutta kun painaa kerran menosuuntaan taas likutaan yksi tile ja töks..

On yritetty MoveObjectia ja TranslateObjectia ja vaikka mitä muuta mutta kun ei niin ei. Alla koodinpätkä:

Code: Select all

                For hihna.LHIHNAT = Each LHIHNAT
                If ObjectsOverlap(hihna\obj,pelihahmo) Then
                MoveObject pelihahmo, 2 // TranslateObject  pelihahmo, 2,0
            EndIf
        Next hihna 
Eli apuja kaivataan.
Ozcar
Advanced Member
Posts: 439
Joined: Mon Aug 27, 2007 8:43 pm
Location: Helsinki

Re: Tyhmät kysymykset

Post by Ozcar »

Smuliii wrote:Ideana on saada hahmo liikkumaan tiettyyn suuntaan (likuhihnan tavoin), jos on tietyllä datanumerossa. Ja tämähän toimii siihen saakka kunnes tulee seuraava tile. Nimittäin silloin se jää siihen tilen reunalle mutta kun painaa kerran menosuuntaan taas likutaan yksi tile ja töks..
Kokeileppa muuttaa tarkistus Getmapiksi, eli jos ukon alla on datakerroksen tietty numero, liikutaan vähän eteenpäin. ObjectsOverlap tuskin on paras tapa toteuttaa tätä ;).
Ratkaisit juuri universaaliongelman! Hienoa, ota keksi.

Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Tyhmät kysymykset

Post by cheeshelmet.jr »

keksisikö joku minua nopeamman tavan laskea laatikko joka on pyöritetty tiettyyn kulmaan??
Smuliii
Newcomer
Posts: 11
Joined: Wed Jul 30, 2008 4:39 pm

Re: Tyhmät kysymykset

Post by Smuliii »

@Ozcar

En tiedä millaista tapaa tarkoitit mutta enpä itse ainakaan onnistunut.

Code: Select all

            If GetMap2(3,x,y)=4 Then
                    hihna.LHIHNAT = New(LHIHNAT)
                    hihna\obj=LoadObject("media/piste2.png")
                    PositionObject2(hihna\obj,kenttä,x,y)
                EndIf        
^^ Näin olen siis tehnyt hihnan datapisteisiin ja edellisessä postauksessani näkyy miten olen osumisen toteuttanut.
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: Tyhmät kysymykset

Post by Dande »

Smuliii wrote:@Ozcar

En tiedä millaista tapaa tarkoitit mutta enpä itse ainakaan onnistunut.

Code: Select all

            If GetMap2(3,x,y)=4 Then
                    hihna.LHIHNAT = New(LHIHNAT)
                    hihna\obj=LoadObject("media/piste2.png")
                    PositionObject2(hihna\obj,kenttä,x,y)
                EndIf        
^^ Näin olen siis tehnyt hihnan datapisteisiin ja edellisessä postauksessani näkyy miten olen osumisen toteuttanut.
Jos unohtaisit tuon vaiheen kokonaan, ja korvaat tuon aiemman tarkistuksen tällä: (tätä Ozcar oletettavasti tarkoittikin)

Code: Select all

If GetMap(3,ObjectX(pelihahmo),ObjectY(pelihahmo)) Then
    MoveObject pelihahmo, 2
EndIf
Tai (itse suosittelen ylempää) voisit myös vaihtoehtoisesti käyttää objectrangea hihna\obj-objektin törmäysalueen säätämiseksi (oletan nyt että "media/piste2.png" on aika pieni kuva jonka on tarkoitus olla käytännössä näkymätön, tai ainakaan sen koko ei taida olla sama kuin tilenkoko) Tämä siis hihnan luonnissa "hihna\obj = loadobject(...)" tilalle

Code: Select all

hihna\obj=MakeObject()
ObjectRange hihna\obj, tilenLeveys, tilenKorkeus
Olwi
Devoted Member
Posts: 557
Joined: Sun Dec 30, 2007 4:15 pm
Location: Muhos

Re: Tyhmät kysymykset

Post by Olwi »

cheeshelmet.jr wrote:keksisikö joku minua nopeamman tavan laskea laatikko joka on pyöritetty tiettyyn kulmaan??
Mitä tarkoitat laatikon laskemisella? Kulman laskemista?
Huuda mun ip:tä!
Smuliii
Newcomer
Posts: 11
Joined: Wed Jul 30, 2008 4:39 pm

Re: Tyhmät kysymykset

Post by Smuliii »

@Galgoneer

Homma toimii ja lisäoppiakin sain siitä.
koodari299
Newcomer
Posts: 9
Joined: Mon Aug 25, 2008 2:39 pm

ammuksen osuma vihuun

Post by koodari299 »

elikkä mulla olis sellainen tosi tyhmä kysymys, eli kun otan vaikka learning centeristä ton ammukset 2 ja lisään sinne vihollisen, niin mikä koodi pätkä siihen pitää pistää ,että ammus ei mene vaan läpi vaan esim. vihun hp vähenee.
ei ole toiminut countsollisiont ja objectsoverlapit. :?: :shock:
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Tyhmät kysymykset

Post by Koodiapina »

Yleinen käytäntö on pistää koodi tänne, että voidaan korjailla.
Locked