Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Jonkin sortin tekoäly

verho88 [19.10.2005 01:11:29]

#

Tuossa nyt on jonkin näköinen "tekoäly", jossa on kaksi puoluetta punaiset (mukamas haltiat) ja ruskeat (örkit). Ne sitten etsii lähimmän vihulaisen ja menee sen luo ja yrittää poistaa toisiaan.

Koodia pitäisi kehittää järkevämmäksi ja yksinkertaisemmaksi.

Kommentoikaa ja tehkää koko roskalle mitä ikinä haluatte.

'Tekoälyn beta-versio 0.1 =)

elfs = 30 'vaihtele lähes vapaasti näitä.. Jos menee liian isoiks niin tulee out of memory errori!!
orcs = 50 'Esim on toiminut 86 molemmat...(mutta ei enää 87..)

orchealth = 100
elfhealth = 100

kello1 = 500 'kuinka monta siirtoa kolmiot tekevät ennen kuin ne resetoidaan
             'uudelleen

kello2 = 10000 'ihan vain yksinkertainen hidastin, kun en parempaakaan
                'osannut tehdä..

ohit = 3 'Paljonko lyö damagea...
ehit = 5 'Näistä voi tehä jokaisen örkin ja haltian yksityinen arvo

DIM o.life(orcs), e.life(elfs), o.health(orcs), e.health(elfs)'elämät ja enut

FOR i = 1 TO elfs
e.life(i) = 1 'laitetaan ne eläviks
e.health(i) = elfhealth 'Ja kunto täysiin
NEXT i

FOR i = 1 TO orcs
o.life(i) = 1 'Sama juttu
o.health(i) = orchealth
NEXT i

'dimmataan erinäisiä muuttujia...
DIM etarget.x(elfs), etarget.y(elfs), otarget.x(orcs), otarget.y(orcs)
DIM exa!(elfs), exb!(elfs), exc!(elfs), eya!(elfs), eyb!(elfs), eyc!(elfs)
DIM oxa!(orcs), oxb!(orcs), oxc!(orcs), oya!(orcs), oyb!(orcs), oyc!(orcs)


'Sama juttu
DIM epituus(orcs * elfs)
DIM opituus(elfs * orcs)

'Ja tässäkin
DIM eepituus(elfs)
DIM oopituus(orcs)

'tehään kulmat haltioille
DIM kulmae(elfs)
FOR i = 1 TO elfs
kulmae(i) = 0
NEXT i

'ja tässä dimmataan kohde-muuttujat
DIM etarget(orcs * elfs)
DIM otarget(orcs * elfs)

'kulmat örkeille
DIM kulmao(orcs)
FOR i = 1 TO orcs
kulmao(i) = 0
NEXT i

'joitain apumuuttujia
DIM yy(orcs * elfs)
DIM xx(orcs * elfs)

'samma här
DIM xxo(elfs * orcs)
DIM yyo(elfs * orcs)

'Tässä jotain tärkeitä juttuja...
kulma2 = 26.6
rad2! = (kulma2 * 3.14 / 180)

'ja kaikkien koordinaatit...
DIM e.x(elfs + 1), e.y(elfs + 1), o.x(orcs + 1), o.y(orcs + 1)

RANDOMIZE TIMER
FOR ho = 1 TO elfs
e.x(ho) = INT(RND * 300) + 10  'heivataan ne näytölle...
e.y(ho) = INT(RND * 180) + 10
NEXT ho

FOR ho = 1 TO orcs
o.x(ho) = INT(RND * 300) + 10
o.y(ho) = INT(RND * 180) + 10
NEXT ho

CLS 'tyhjennetään ruutu

SCREEN 13 'ja asetetaan se 320x200 ja 256 väriä omaavaan näyttötilaan

a = 6 'kolmion koko...
b = SQR(a * a + (a / 2) * (a / 2)) 'lasketaan tässä kolmion sivua

PI! = 3.1416 'piin keskiarvo(jota tuli käytettyä vähän tässä ohjelmassa...)

waiting = 0

DO '************************* PŽŽ LOOPPI ****************************
gou = gou + 1 'tässä joku kellon muuttuja

e = 0
o = 0

FOR i = 1 TO elfs
IF e.life(i) = 1 THEN e = 1
NEXT
FOR i = 1 TO orcs
IF o.life(i) = 1 THEN o = 1
NEXT i

IF waiting = 0 THEN
IF e = 0 OR o = 0 THEN
  kello1 = gou + 30
  waiting = 1
END IF
END IF

IF gou >= kello1 THEN  'ja lasketaa onko kello liian paljon
  CLS
  FOR ho = 1 TO elfs
  e.x(ho) = INT(RND * 300) + 10 'heivataan kaikki uusille paikoille
  e.y(ho) = INT(RND * 180) + 10
  NEXT ho

  FOR ho = 1 TO orcs
  o.x(ho) = INT(RND * 300) + 10
  o.y(ho) = INT(RND * 180) + 10
  NEXT ho

  FOR i = 1 TO elfs
  e.life(i) = 1 'laitetaan ne eläviks
  e.health(i) = elfhealth 'Ja kunto täysiin
  NEXT i

  FOR i = 1 TO orcs
  o.life(i) = 1 'ja tässäkin samat
  o.health(i) = orchealth
  NEXT i

  kello1 = 500

  e = 0
  o = 0

  waiting = 0

  gou = 0 'ja kellon apumuuttuja nollaan!
END IF



FOR i = 1 TO elfs 'Nyt haltiat havaitsee örkkejä..!!

FOR o = 1 TO orcs 'lasketaan pituudet jokaiseen örkkiin

xx(o) = (e.x(i) - o.x(o)) 'x-suuntainen ero

yy(o) = (e.y(i) - o.y(o)) 'y-suuntainen ero

epituus(o) = SQR((xx(o) * xx(o)) + (yy(o) * yy(o))) 'ja sitten pituus

NEXT o

FOR g = 1 TO orcs 'etitään ensimmäinen elävä örkki ja laitetaan se kohteeksi
  IF o.life(g) <> 0 THEN
    etarget(i) = g
    EXIT FOR
  END IF
NEXT g

FOR g = 1 TO orcs 'ja tässä etitään lähin elävä örkki
IF epituus(g) < epituus(etarget(i)) THEN
  IF o.life(g) <> 0 THEN
  etarget(i) = g
  END IF
END IF
NEXT g

'Nyt määritellään kohde:
etarget.x(i) = o.x(etarget(i))
etarget.y(i) = o.y(etarget(i))

o = etarget(i)
'lasketaan kulmaa siihen targettiin

IF epituus(o) <> 0 THEN

tama = yy(o) / epituus(o)

IF tama <> 1 AND tama <> -1 AND tama <> 0 THEN 'nämä siksi että cotangentilla(ATN) käy huonosti 90 ja 270 asteen kulmat...
  radeja = ATN(tama / SQR(1 - (tama * tama)))
ELSE
  SELECT CASE tama
    CASE IS = -1: radeja = -3.1416 / 2 'ja jos se on jotain kiellettyä niin
    CASE IS = 1: radeja = 3.141 / 2
    CASE IS = 0
      IF xx(o) > 0 THEN
        radeja = 3.1416
      ELSE
        radeja = 0
      END IF
  END SELECT
END IF


kulmae(i) = (radeja * 180 / 3.1416) - 180 'väännetään kulma asteiks että mäki ymmärtäisin jotain

IF xx(o) < 0 AND yy(o) > 0 THEN 'ensimmäinen neljännes korjataan
kulmae(i) = 90 - kulmae(i)
kulmae(i) = 90 + kulmae(i)
END IF

IF xx(o) > 0 AND yy(o) > 0 THEN 'toinen neljännes..
END IF

IF xx(o) > 0 AND yy(o) < 0 THEN 'kolmas neljännes..
END IF

IF xx(o) < 0 AND yy(o) < 0 THEN 'neljäs neljännes..
kulmae(i) = 180 - kulmae(i)
END IF

END IF

NEXT i 'havainnointi loppuu elffeiltä




'*******************************************************************



FOR i = 1 TO orcs 'No nyt on örkkien vuoro nähä jotain


FOR o = 1 TO elfs

xxo(o) = (e.x(o) - o.x(i))

yyo(o) = (e.y(o) - o.y(i))

opituus(o) = SQR((xxo(o) * xxo(o)) + (yyo(o) * yyo(o)))

NEXT o

FOR g = 1 TO elfs
  IF e.life(g) <> 0 THEN
    otarget(i) = g
    EXIT FOR
  END IF
NEXT g

FOR g = 1 TO elfs
IF opituus(g) < opituus(otarget(i)) THEN
  IF e.life(g) <> 0 THEN
  otarget(i) = g
  END IF
END IF
NEXT g


'Nyt määritellään kohde:
otarget.x(i) = e.x(otarget(i))
otarget.y(i) = e.y(otarget(i))

o = otarget(i)

'lasketaan kulmaa siihen targettiin
IF opituus(o) <> 0 THEN

tamao = yyo(o) / opituus(o)

IF tamao <> 1 AND tamao <> -1 AND tamao <> 0 THEN
radejao = ATN(tamao / SQR(1 - (tamao * tamao)))
ELSE
SELECT CASE tamao
  CASE IS = -1: radejao = -3.1416 / 2
  CASE IS = 1: radejao = 3.1416 / 2
  CASE IS = 0
    IF xxo(o) > 0 THEN
      radejao = 0
    ELSE
      radejao = 3.1416
    END IF
END SELECT
END IF

kulmao(i) = (radejao * 180 / 3.1416) 'väännetään kulma asteiks että mäki ymmärtäisin jotain

IF xxo(o) < 0 AND yyo(o) > 0 THEN 'eka
kulmao(i) = 90 - kulmao(i)
kulmao(i) = 90 + kulmao(i)
END IF

IF xxo(o) > 0 AND yyo(o) > 0 THEN 'toka
END IF

IF xxo(o) > 0 AND yyo(o) < 0 THEN 'kolmas
END IF

IF xxo(o) < 0 AND yyo(o) < 0 THEN 'neljäs
kulmao(i) = -kulmao(i)
kulmao(i) = kulmao(i) - 180
END IF

END IF

NEXT i 'havainnointi loppuu örkeiltä


'******************* Tässä nyt sitten liikutaan... *******************


FOR aika = 1 TO kello2
NEXT aika

'nyt tässä on hyvä olla jälkien tyhjäys..  :D
GOSUB tyhjaa

FOR i = 1 TO elfs 'haltiat liikkuu ensin


IF e.life(i) <> 0 THEN 'onko se haltia edes elävä..!!
  IF o.life(etarget(i)) <> 0 THEN 'ja onko sen kohde elävä?

  xx(etarget(i)) = (e.x(i) - o.x(etarget(i))) 'no huhhuh!!
  yy(etarget(i)) = (e.y(i) - o.y(etarget(i)))
  eepituus(i) = SQR((xx(etarget(i)) * xx(etarget(i))) + (yy(etarget(i)) * yy(etarget(i))))

  IF eepituus(i) >= (a * 2) THEN 'jos ollaan liian kaukana mennään lähemmäks

  rad3! = (kulmae(i) * 3.14 / 180) 'ja kulmaa radiaaneiks

  e.x(i) = e.x(i) + COS(rad3!) 'ja lasketaan x:n ja y:n muutokset
  e.y(i) = e.y(i) + SIN(rad3!)

  'Jos ne menee ulos ruudulta vejetään ne takas.
  IF e.x(i) > (320 - a) THEN e.x(i) = (320 - a)
  IF e.x(i) < a THEN e.x(i) = a
  IF e.y(i) > (200 - a) THEN e.y(i) = (200 - a)
  IF e.y(i) < a THEN e.y(i) = a

  ELSE 'Jos ollaan tarpeeks lähellä niin lyyään sitä

  IF o.life(etarget(i)) <> 0 THEN 'Jos se on elossa niin lyödään

  o.health(etarget(i)) = o.health(etarget(i)) - ehit 'lyödään

  IF o.health(etarget(i)) <= 0 THEN o.life(etarget(i)) = 0 'Jos enut meni tasan
                                                         'tai alle 0 nii se kuoli
  END IF
  END IF
  END IF
END IF

NEXT i



FOR i = 1 TO orcs 'ja sitten örkit

IF o.life(i) <> 0 THEN

  IF e.life(otarget(i)) <> 0 THEN

  xxo(otarget(i)) = (e.x(otarget(i)) - o.x(i))
  yyo(otarget(i)) = (e.y(otarget(i)) - o.y(i))
  oopituus(i) = SQR((xxo(otarget(i)) * xxo(otarget(i))) + (yyo(otarget(i)) * yyo(otarget(i))))

  IF oopituus(i) >= (a * 2) THEN

  rad3! = (kulmao(i) * 3.14 / 180)

  o.x(i) = o.x(i) + COS(rad3!)
  o.y(i) = o.y(i) + SIN(rad3!)

  'Jos ne menee ulos ruudulta vejetään ne takas.
  IF o.x(i) > (320 - a) THEN o.x(i) = (320 - a)
  IF o.x(i) < a THEN o.x(i) = a
  IF o.y(i) > (200 - a) THEN o.y(i) = (200 - a)
  IF o.y(i) < a THEN o.y(i) = a


  ELSE 'Jos ollaan tarpeeks lähellä niin lyyään sitä

  IF e.life(otarget(i)) <> 0 THEN 'Jos se on elossa niin lyödään

  e.health(otarget(i)) = e.health(otarget(i)) - ohit 'lyödään

  IF e.health(otarget(i)) <= 0 THEN e.life(otarget(i)) = 0 'Jos enut meni tasan
                                                           'tai alle 0 nii se kuoli
  END IF
  END IF
  END IF
END IF

NEXT i


GOSUB laskejapiirra 'ja sitten piirretään kaikki muutokset

a$ = INKEY$ 'haetaan nappia
LOOP WHILE a$ <> CHR$(27) 'jos se on eski niin suljetaan tää sekoäly
END


'**************************************** PŽŽLOOPPI LOPPUI!! *************


tyhjaa: 'tyhjätään eli mustaks kaikki jäljet

FOR i = 1 TO elfs
IF e.life(i) <> 0 THEN
LINE (e.x(i) + exa!(i), e.y(i) + eya!(i))-(e.x(i) + exb!(i), e.y(i) + eyb!(i)), 0
LINE (e.x(i) + exb!(i), e.y(i) + eyb!(i))-(e.x(i) + exc!(i), e.y(i) + eyc!(i)), 0
LINE (e.x(i) + exc!(i), e.y(i) + eyc!(i))-(e.x(i) + exa!(i), e.y(i) + eya!(i)), 0
END IF

NEXT i


FOR i = 1 TO orcs

IF o.life(i) <> 0 THEN

LINE (o.x(i) + oxa!(i), o.y(i) + oya!(i))-(o.x(i) + oxb!(i), o.y(i) + oyb!(i)), 0
LINE (o.x(i) + oxb!(i), o.y(i) + oyb!(i))-(o.x(i) + oxc!(i), o.y(i) + oyc!(i)), 0
LINE (o.x(i) + oxc!(i), o.y(i) + oyc!(i))-(o.x(i) + oxa!(i), o.y(i) + oya!(i)), 0

END IF

NEXT i


RETURN



laskejapiirra: ' ja tässä piirretään niiden tilalle uudet
FOR i = 1 TO elfs
IF e.life(i) <> 0 THEN

rad! = (kulmae(i) * 3.1416 / 180)

exa!(i) = (a * COS(rad!))
eya!(i) = (a * SIN(rad!))

exb!(i) = (b * COS(rad! + (PI! / 2) + ((PI! / 2) - rad2!)))
eyb!(i) = (b * SIN(rad! + (PI! / 2) + ((PI! / 2) - rad2!)))

exc!(i) = (b * COS(rad! + PI! + rad2!))
eyc!(i) = (b * SIN(rad! + PI! + rad2!))

'nyt kun on pisteiden koordinaatit selvitetty voidaan piirtää

LINE (e.x(i) + exa!(i), e.y(i) + eya!(i))-(e.x(i) + exb!(i), e.y(i) + eyb!(i)), 4
LINE (e.x(i) + exb!(i), e.y(i) + eyb!(i))-(e.x(i) + exc!(i), e.y(i) + eyc!(i)), 4
LINE (e.x(i) + exc!(i), e.y(i) + eyc!(i))-(e.x(i) + exa!(i), e.y(i) + eya!(i)), 4

END IF
NEXT i

FOR i = 1 TO orcs

IF o.life(i) <> 0 THEN

rad! = (kulmao(i) * 3.1416 / 180)

oxa!(i) = (a * COS(rad!))
oya!(i) = (a * SIN(rad!))

oxb!(i) = (b * COS(rad! + (PI! / 2) + ((PI! / 2) - rad2!)))
oyb!(i) = (b * SIN(rad! + (PI! / 2) + ((PI! / 2) - rad2!)))

oxc!(i) = (b * COS(rad! + PI! + rad2!))
oyc!(i) = (b * SIN(rad! + PI! + rad2!))

'nyt kun on pisteiden koordinaatit selvitetty voidaan piirtää

LINE (o.x(i) + oxa!(i), o.y(i) + oya!(i))-(o.x(i) + oxb!(i), o.y(i) + oyb!(i)), 6
LINE (o.x(i) + oxb!(i), o.y(i) + oyb!(i))-(o.x(i) + oxc!(i), o.y(i) + oyc!(i)), 6
LINE (o.x(i) + oxc!(i), o.y(i) + oyc!(i))-(o.x(i) + oxa!(i), o.y(i) + oya!(i)), 6

END IF

NEXT i

RETURN

tgunner [24.10.2005 18:05:21]

#

Jos nuo nuolet "taistelevat" keskenään, niin oranssit voittavat aina :O.

verho88 [24.10.2005 19:54:30]

#

Se riippuu vähän... Oranssit on vähän "parempia", mutta punaisia on tarkoituskin olla enemmän. Mutta se kyllä vaihtelee, ketkä voittaa. Oranssit ehkä useammin, mutta vaihtele niiden määriä. =) Ja voi ne vaihtaa ne damagelyönnit yhtäsuuriks ja sitten niiden kolmioiden määrät samoiks. Eli ehit ja ohit olis samat. Ja myös elfs ja orcs on samat.

siansaksamies [03.11.2005 17:54:25]

#

Hieno ja toimiva. Ite otin vapaat kädet asetusten muunteluun ja tein yhen punasen, joka hävitti ruudun täydeltä oransseja.

verho88 [28.11.2005 13:51:21]

#

Olen muuten kehittämässä tästä sellaista versiota, joka osaa väistellä janoja. Koodiakin olen siihen versioon kehittänyt ja poistanut turhia juttuja ja muuttujia. Siinä on vielä pari bugia ja yks juttu puuttuu vielä, paitsi että se ei ole niin tärkeä. Ja muutenkin on tarkoitus viedä tätä älyä niin pitkälle kuin mahdollista.

Dude [19.08.2007 20:43:31]

#

Aika hyvin meni voitot ja häviöt ku pisti elfs=33.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta