Tässä esimerkissä 2 sekoälyä ottaa mittaa toisistaan yrittämällä päästä kentän oikeaan alareunaan. Tästä voi, saa ja pitää tehdä parempi, jos joku haluaa tuhlata aikansa siihen...
Edit: Pistin sisennykset.
RANDOMIZE TIMER DIM s(1 TO 4) DIM s2(1 TO 4) WIDTH 80, 50 CLS PRINT STRING$(80, 219) LOCATE 48, 1 PRINT STRING$(80, 219) FOR a = 1 TO 48 LOCATE a, 1 PRINT CHR$(219) NEXT FOR a = 1 TO 48 LOCATE a, 80 PRINT CHR$(219) NEXT FOR a = 1 TO 1000 LOCATE INT(RND * 47) + 1, INT(RND * 79) + 1: PRINT CHR$(219) NEXT COLOR 14 LOCATE 47, 79: PRINT CHR$(4) COLOR 7 x = 2 y = 2 xx = 2 yy = 2 x2 = 2 y2 = 2 xx2 = 2 yy2 = 2 1 FOR toot = 1 TO 3 DO: LOOP UNTIL (INP(&H3DA) AND &H8) = 0 DO: LOOP UNTIL (INP(&H3DA) AND &H8) <> 0 NEXT FOR a = 1 TO 90 - x IF SCREEN(y, x + a) = 219 THEN s(1) = a - 1: EXIT FOR NEXT FOR a = 1 TO 48 - y IF SCREEN(y + a, x) = 219 THEN s(2) = a - 1: EXIT FOR NEXT FOR a = 1 TO x - 1 IF SCREEN(y, x - a) = 219 THEN s(3) = a - 1: EXIT FOR NEXT FOR a = 1 TO y - 1 IF SCREEN(y - a, x) = 219 THEN s(4) = a - 1: EXIT FOR NEXT REDIM temp(1 TO 4) REDIM top(1 TO 4) FOR a = 1 TO 4 temp(a) = s(a) NEXT a FOR kierros = 1 TO 4 big = 0 FOR haku = 1 TO 4 IF temp(haku) >= big THEN kuka = haku: big = temp(haku) NEXT haku top(kierros) = kuka temp(kuka) = -1 NEXT kierros IF s(top(1)) = 0 THEN r = 0 r = top(1) IF CINT(RND * 1) = 0 AND s(2) > 0 AND y < 47 THEN r = 2 IF CINT(RND * 1) = 0 AND s(1) > 0 AND x < 79 THEN r = 1 IF INT(RND * 10) = 5 AND s(top(2)) > 0 THEN r = top(2) IF rr = 1 AND r = 3 AND s(top(3)) > 0 THEN r = top(CINT(RND) + 2) IF rr = 2 AND r = 4 AND s(top(3)) > 0 THEN r = top(CINT(RND) + 2) IF rr = 3 AND r = 1 AND s(top(3)) > 0 THEN r = top(CINT(RND) + 2) IF rr = 4 AND r = 2 AND s(top(3)) > 0 THEN r = top(CINT(RND) + 2) IF r = 1 THEN x = x + 1 IF r = 2 THEN y = y + 1 IF r = 3 THEN x = x - 1 IF r = 4 THEN y = y - 1 IF y = 47 AND x = 79 THEN BEEP: END LOCATE yy, xx: PRINT " " LOCATE y, x: PRINT CHR$(1) xx = x yy = y rr = r GOSUB tekoaly2 GOTO 1 tekoaly2: FOR a = 1 TO 90 - x2 IF SCREEN(y2, x2 + a) = 219 THEN s2(1) = a - 1: EXIT FOR NEXT FOR a = 1 TO 48 - y2 IF SCREEN(y2 + a, x2) = 219 THEN s2(2) = a - 1: EXIT FOR NEXT FOR a = 1 TO x2 - 1 IF SCREEN(y2, x2 - a) = 219 THEN s2(3) = a - 1: EXIT FOR NEXT FOR a = 1 TO y2 - 1 IF SCREEN(y2 - a, x2) = 219 THEN s2(4) = a - 1: EXIT FOR NEXT REDIM temp(1 TO 4) REDIM top(1 TO 4) FOR a = 1 TO 4 temp(a) = s2(a) NEXT a FOR kierros = 1 TO 4 big = 0 FOR haku = 1 TO 4 IF temp(haku) >= big THEN kuka = haku: big = temp(haku) NEXT haku top(kierros) = kuka temp(kuka) = -1 NEXT kierros IF s2(top(1)) = 0 THEN r2 = 0 r2 = top(1) IF CINT(RND * 1) = 1 AND s2(2) > 0 AND y2 < 47 THEN r2 = 2 IF CINT(RND * 1) = 1 AND s2(1) > 0 AND x2 < 79 THEN r2 = 1 IF INT(RND * 1) = 5 AND s2(top(2)) > 0 THEN r2 = top(2) IF rr2 = 1 AND r2 = 3 AND s2(top(3)) > 0 THEN r2 = top(CINT(RND) + 2) IF rr2 = 2 AND r2 = 4 AND s2(top(3)) > 0 THEN r2 = top(CINT(RND) + 2) IF rr2 = 3 AND r2 = 1 AND s2(top(3)) > 0 THEN r2 = top(CINT(RND) + 2) IF rr2 = 4 AND r2 = 2 AND s2(top(3)) > 0 THEN r2 = top(CINT(RND) + 2) IF r2 = 1 THEN x2 = x2 + 1 IF r2 = 2 THEN y2 = y2 + 1 IF r2 = 3 THEN x2 = x2 - 1 IF r2 = 4 THEN y2 = y2 - 1 IF y2 = 47 AND x2 = 79 THEN BEEP: END LOCATE yy2, xx2: PRINT " " LOCATE y2, x2: PRINT CHR$(2) xx2 = x2 yy2 = y2 rr2 = r2 RETURN
Hyvä koodi!
Mielenkiintoinen ohjelma, kestää useamman katselukerran.
on kyllä hiano!
Hyvä koodi, mutta ne pisteet liikkuu liian nopeasti. Niiden seikkailuja siellä sokkeloissa ei oikein ehdi seuraamaan. Myös semmoinen aliohjelma (jos se nyt semmoinen on :))olisi hyvä, joka arpoisi joka kerta uuden sokkelon. Taitaisi kuitenkin olla aika hankala tehdä :)
Hidastusta voi säätää muuttamalla tämän for silmukan arvoa (joka on nyt 3):
FOR toot = 1 TO 3
DO: LOOP UNTIL (INP(&H3DA) AND &H8) = 0
DO: LOOP UNTIL (INP(&H3DA) AND &H8) <> 0
NEXT
Sen kyllä pitäisi ainakin arpoa joka kerta uusi sokkelo (sotku). Kai kopioit myös sen RANDOMIZE TIMERin?
Hups, kyllähän se arpookin :) Katsoin sen vain kaksi kertaa, enkä katsonut, että se arpoo ne :)
Todella hieno itseasiassa jopa! =)
Sisennyksiä jäin jälleen kaipaamaan.. ;)
Hidastus hoituu myös näin:
hidastus = TIMER
DO
LOOP UNTIL TIMER => hidastus + .15
tietenkään se ei toimi joka koneella jos eri koneissa on eri timer nopeus. En kyllä tiedä onko. Ja antti, luo mailisi...
Timerin nopeus on joka koneessa sama. Tiedän kyllä tuon timer hidastuksen, mutta se ei aina ole paras mahdollinen tapa tehdä hidastus...
Hyvä ohjelma, ainoastaan joskus molemmat juuttuvat heti alkuun, mutta se ei haittaa! :-)
Teinkin korjauksen siihen, mutta olinkin unohtanut tallentaa :P
Todella hyvä ohjelma. Kiva vaikka näytönsäästäjänä
Hieno koodi tosin jos ne äijät juuttuu nii ei ole lopetusnappia.
paina ctrl + pausee niin eiköhän toimi...
Luin jostain 95- Mikrobitistä pelistä nimeltä Ned's World. Siinä ohjattiin pientä pistettä, Nediä, joka meni tommoisia sokkeloita ja sitä piti opettaa, mitä pitää tehdä aina tietyssä tilanteessa. Eräänlainen neuroverkko-peli siis. Kävi vain mielesssä...
Tekoälyä tosiaankin. Ensimmäisellä kokeilukerrallani musta voitti ja toisella molemmat juutuivat kiinni. Mahtava ohjelma!
Tosi hieno esimerkki!
Toimiihan toi
vänkä
Ihan hyvä ohjelma, värejä olisi kiva kun olisi vielä...ja kun en kerran laiskuuttani jaksanut tarkistaa koodia, niin onko tossa ohjelmassa vielä jonkinlainen tarkistus, että maaliin tosiaan on jokin reitti, josta pääsee (tuli vain mieleen kysyä...)
-The PC-Master-
Ton:
FOR toot = 1 TO 3
DO: LOOP UNTIL (INP(&H3DA) AND &H8) = 0
DO: LOOP UNTIL (INP(&H3DA) AND &H8) <> 0
NEXT
olisi voinut korvata lyhyemmällä:
FOR toot = 1 TO 3
WAIT &H3DA, 8
NEXT
mutta mitä väliä :)
FOR toot = 1 TO 3
DO: LOOP WHILE INP(&H3DA) AND &H8
DO: LOOP UNTIL INP(&H3DA) AND &H8
NEXT
vaikuttaa hyvältä
Todella hyvä tekoäly.
on hyvä vaikka katoin nyt...... :))
kahdesti katsoin niin ensin se luola oli sellainen että maali oli umpikujassa niin ettei ollut mahdollisuuttakaan päästä sinne...
Toisella kerralla (heti perään) niillä sekoälyillä ei ollut kuin kaksi neliötä liikkuma varaa :D
Onhan toi ihan hyvä, mut noi äijät jää vähän liian helppoihin paikkoihin jumiin.
pushpabon kirjoitti:
hidastus = TIMER<br>DO<br>LOOP UNTIL TIMER => hidastus + .15<br>
Mä oon laittanu ton koodivinkkeihin erikseen.<br>
SUB XWAIT A = TIMER DO: LOOP UNTIL TIMER > A + .1 END SUB
Aihe on jo aika vanha, joten et voi enää vastata siihen.