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
Jos 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.