 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 21.07.2007, 11:06 Titel: Wegfindung (KI) Programmieren |
|
|
Wie kann man eine KI für eine Wegfindung programmieren???
Ich hab schon eienen kleinen Anfangscode
Code: |
const w = 800
const h = 600
const colors = 8
const flag = 0
screenres w,h,colors,,flag
dim as integer mx,my,mb,sr
dim as integer omx,omy
dim as integer px,py
dim as integer timex
timex=10000000
Print
Print " Mauern mit mir der Maus zeichenen"
Print "weiter mit Taste, beenden mit Esc"
sleep
cls
' "Mauern" zeichnen
DO
timex-=1
if timex = 0 then exit do
IF sr > -1 then
omx=mx
omy=my
end if
GETMOUSE mx,my,sr,mb
if mb = 1 then line (mx,my)-(omx,omy),4
sleep 1
loop until inkey=chr(27)
' Start der Wegsuche
dim as integer scancol
mx=0
my=0
do
scancol=point (mx,my+1)
if scancol= 0 then
my+=1
else
my-=10
scancol=point (mx+1,my)
if scancol = 0 then
mx+=1
end if
end if
pset (mx,my),15
loop until inkey=chr(27)
sleep |
Aber dieser ist leider noch Fehlerhaft  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.07.2007, 12:13 Titel: |
|
|
[url=http://de.wikipedia.org/wiki/A*]A*[/url] dürfte der richtige Algorithmus für dein Problem sein.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.07.2007, 07:45 Titel: |
|
|
hi, ich hab da mal vor laengerem was gefunden aber nicht weiter mit beschaeftigt....
Ein Pathfinder in Blitzbasic
Mein versuch das ganze auf die schnelle zu uebersetzen, scheint aber noch ein fehler zu haben.
vielleicht hilft das weiter.... _________________
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 22.07.2007, 11:37 Titel: |
|
|
Nette hinweise wie dass einfacher geht
Ich hab gerade nix zu tun also mach ich da mal ein Spiel draus xD.
Bitte:
Code: |
const w = 800
const h = 600
const colors = 8
const flag = 0
screenres w,h,colors,,flag
dim as integer mx,my,mb,sr
dim as integer omx,omy
dim as integer px,py
dim as string bewegung
Print
Print " Mauern mit mir der Maus zeichenen"
Print "weiter mit Taste, beenden mit Esc"
sleep
cls
' "Mauern" zeichnen
dim as integer scancol
cmx=w/2
cmy=0
DO
'Zeichen Engine
if sr >-1 then
omx=mx
omy=my
end if
getmouse mx, my, sr,mb
IF MB= 1 then LINE(mx,my)-(omx,omy),4
' Entscheidungs Trigger
if point (cmx,cmy+1)=0 then
bewegung = "unten"
else
if point (cmx+1,cmy)=0 then
bewegung = "rechts"
else
if point (cmx-1,cmy)=0 then
bewegung = "links"
else
If point(cmx,cmy-1)=0 then
bewegung = "oben"
end if
end if
end if
end if
' Endscheidungen Ausführen
If Bewegung="unten" then cmy+=1
If Bewegung="oben" then cmy-=1
If Bewegung="links" then cmx-=1
If Bewegung="rechts" then cmx+=1
' Zeichnen
pset (cmx,cmy),15
locate 1,1:print cmx,cmy
sleep 10
if cmy=599 then print "LOSER":exit do
loop until inkey=chr(27)
sleep |
Man muss die weisse Linie solange wie möglich auf den Bildschirm halten.
Sie bewegt sich nach nach unten.
Sobald sie unten angekommen ist, ist das Spiel verloren xD.
Und dann noch eine Modifizierte KI, die dazu in der Lage ist, die Mausspur zu verfolgen:
Code: |
const w = 800
const h = 600
const colors = 8
const flag = 0
screenres w,h,colors,,flag
dim as integer mx,my,mb,sr
dim as integer omx,omy
dim as integer px,py
dim as string bewegung
Print
Print " Mauern mit mir der Maus zeichenen"
Print "weiter mit Taste, beenden mit Esc"
sleep
cls
' "Mauern" zeichnen
dim as integer scancol
cmx=w/2
cmy=0
bewegung="unten"
DO
'Zeichen Engine
if sr >-1 then
omx=mx
omy=my
end if
getmouse mx, my, sr,mb
IF MB= 1 then LINE(mx,my)-(omx,omy),4
' Entscheidungs Trigger
if point (cmx,cmy+1)=4 then
bewegung = "unten"
else
if point (cmx+1,cmy)=4 then
bewegung = "rechts"
else
if point (cmx-1,cmy)=4 then
bewegung = "links"
else
If point(cmx,cmy-1)=4 then
bewegung = "oben"
end if
end if
end if
end if
' Endscheidungen Ausführen
If Bewegung="unten" then cmy+=1
If Bewegung="oben" then cmy-=1
If Bewegung="links" then cmx-=1
If Bewegung="rechts" then cmx+=1
' Zeichnen
pset (cmx,cmy),15
locate 1,1:print cmx,cmy
sleep 10
if cmy=599 then print "LOSER":exit do
loop until inkey=chr(27)
sleep
|
Was könnte man noch besser machen? |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 22.07.2007, 12:04 Titel: |
|
|
Nice, auch wenn diese Kollisionserkennung doch leicht fehlerhaft ist.
ach ja, und es fehlte ein
Code: | Dim as integer cmx, cmy |
im code |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 22.07.2007, 12:45 Titel: |
|
|
Naja..
Das ist indireckt ein Bug.
Wenn die roten Linien etwas dicker sind, ist auch der Bug weg
Also eine 2 Pixel Linie anstelle einer benutzen oder? |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 22.07.2007, 17:09 Titel: |
|
|
A* bzw dijkstra sind zwar zwei tolle algorithmen, aber benötigen ne halbwegs ordentliche graphenimplementierung und ne prioritätswarteschlange, das is dann nicht unbedingt einfach zu realisieren auch wenn mans recht simpel angehen kann wenn etwas unschöner gehalten. Aber ohne vorkenntnisse ziemlich schwer umzusetzen. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 22.07.2007, 17:41 Titel: |
|
|
ich benutze einfach 8 anstelle von 4 Pixel zum Scannen und siehe da... das programm kann "denken" xD.. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|