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
RETURNJos nuo nuolet "taistelevat" keskenään, niin oranssit voittavat aina :O.
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.
Hieno ja toimiva. Ite otin vapaat kädet asetusten muunteluun ja tein yhen punasen, joka hävitti ruudun täydeltä oransseja.
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.
Aika hyvin meni voitot ja häviöt ku pisti elfs=33.
Aihe on jo aika vanha, joten et voi enää vastata siihen.