 |
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 |
Fiz
Anmeldungsdatum: 10.02.2010 Beiträge: 2 Wohnort: München
|
Verfasst am: 10.02.2010, 00:51 Titel: Evolutionäres Programm für das Programmierspiel Core Wars |
|
|
Hi Leute,
ich bin neu hier und möchte hiermit mein erstes FreeBASIC Programm vorstellen welches ich für das Programmierspiel COREWAR geschrieben und veröffentlicht habe.
"Core War (in deutsch: Krieg der Kerne) ist ein Programmierspiel, bei dem zwei (oder mehr) Programme, die in einer simplen, assemblerartigen Sprache namens Redcode geschrieben sind, im selben Speicherraum gegeneinander antreten. Gewinner ist das Programm, das sein gegnerisches Programm (oder Programme) überlebt."
Mein FreeBASIC Programm Maezumo generiert diese in Redcode geschriebene "Krieger" genannten Programme und lässt sie in einer Arena (dem virtuellen Arbeitspeicher MARS) gegeneinander antreten. Nur die besten Programme überleben in der Liga, dem sogenannten "Hill". Evolution erfolgt u.a. durch Mutation der erfolgreichsten Krieger auf dem Hill.
Das Programm ist wohl zu groß um es hier rein zu posten. Ihr findet eine zip-Daitei mit dem Source-Code inklusive einer für Windows Compilierten exe-Datei hier:
http://www.corewar.info/maezumo/
Maezumo ist nach dem entpacken der zip-Datei praktisch "Ready-to-Use". Ein FAQ ist enthalten.
Eine experimentelle Linux Version gibt es von Terry Newton hier:
http://www.infionline.net/~wtnewton/corewar/evol/index.html#Maezumo
Falls ihr mehr über Corewar wissen wollt schaut euch einfach mal das Corewar Handbuch als pdf von Sascha Zapf an:
http://www.mynetcologne.de/~nc-zapfsa/
oder klickt euch einfach durch meine Homepage:
http://www.corewar.info/
Über Feedback würde ich mich sehr freuen.
Christian |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 10.02.2010, 15:08 Titel: |
|
|
Nur ein Kommentar zum Code bzw. ein paar Tipps wie es an einigen Stellen einfacher zu machen ist.
Code: | IF LEFT(ReadOut,12)="name :" THEN WarriorSeed=Right(ReadOut,Len(ReadOut)-12)
IF LEFT(ReadOut,12)="evo rounds :" THEN BattleEvoRounds=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="hill rounds:" THEN BattleRounds=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="threshold :" THEN BattleThreshold=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="advance :" THEN BattleAdvance=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="spl :" THEN ProbSpl=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="mov :" THEN ProbMov=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="add :" THEN ProbAdd=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="sne :" THEN ProbSne=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="seq :" THEN ProbSeq=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="djn :" THEN ProbDjn=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="jmn :" THEN ProbJmn=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="jmz :" THEN ProbJmz=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="jmp :" THEN ProbJmp=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="hill freeze:" THEN HillFreeze=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="No of koth :" THEN KothNumber=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="Mutation :" THEN EnableMutation=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="MutSelect :" THEN MutationSelect=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="MinChanges :" THEN MinChanges=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="MutRate :" THEN MutationRate=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="InstrRate :" THEN InstrRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
IF LEFT(ReadOut,12)="AddrRate :" THEN AddrRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
IF LEFT(ReadOut,12)="DataRate :" THEN DataRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
IF LEFT(ReadOut,12)="InsertRate :" THEN InsertRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
IF LEFT(ReadOut,12)="DeleteRate :" THEN DeleteRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
IF LEFT(ReadOut,12)="DupLine :" THEN DupLineChance=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="IncDec :" THEN IncDecChance=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="BigNum :" THEN BigNumChance=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="MutByProb :" THEN MutateByProbability=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="dat :" THEN ProbDat=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="SoupIter :" THEN SoupIterations=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="SaveSoup :" THEN SaveSoup=Val(Right(ReadOut,Len(ReadOut)-12))
IF LEFT(ReadOut,12)="ShowExtra :" THEN ShowExtra=Val(Right(ReadOut,Len(ReadOut)-12)) '1.01e1
IF LEFT(ReadOut,12)="SoupRounds :" THEN SoupRounds=Val(Right(ReadOut,Len(ReadOut)-12)) '1.01e1
IF LEFT(ReadOut,12)="EnableSeed :" THEN EnableSeed=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x3
IF LEFT(ReadOut,12)="SoupDisplay:" THEN SoupDisplay=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x3
IF LEFT(ReadOut,12)="SwapRate :" THEN SwapRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate '1.02x3
IF LEFT(ReadOut,12)="SW Display :" THEN EnableSW=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x4
IF LEFT(ReadOut,12)="SDcustom :" THEN SDcustom=Right(ReadOut,Len(ReadOut)-12) '1.03x5
IF LEFT(ReadOut,12)="SoupWins :" THEN SoupWins=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x6
IF LEFT(ReadOut,12)="hint-pur :" THEN HintProb (0)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
IF LEFT(ReadOut,12)="hint-pap :" THEN HintProb (1)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
IF LEFT(ReadOut,12)="hint-sca :" THEN HintProb (2)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
IF LEFT(ReadOut,12)="hint-fra :" THEN HintProb (3)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
IF LEFT(ReadOut,12)="hint-sto :" THEN HintProb (4)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs |
Select Case ... End Select würde hier denke ich den Code spürbar aufräumen. Und ein Makro, dass einen Case-Zweig erzeugt.
Code: | If IniHintMode = 7 Then
CounterA=Int(Rnd*(HintProb (0)+HintProb (1)+HintProb (2)+HintProb (3)+HintProb (4)))
CounterB=HintProb (0)+HintProb (1)+HintProb (2)+HintProb (3)+HintProb (4)
If CounterA<=HintProb (0) Then HintMode =0 'pure
If CounterA>HintProb (0) And CounterA<=(HintProb (0)+HintProb (1)) Then HintMode =1 'paper
If CounterA>(HintProb (0)+HintProb (1)) And CounterA<=(HintProb (0)+HintProb (1)+HintProb (2)) Then HintMode =2 'scanner
If CounterA>(HintProb (0)+HintProb (1)+HintProb (2)) And CounterA<=(CounterB-HintProb (4)) Then HintMode =3 'fragment
If CounterA>(CounterB-HintProb (4)) Then HintMode =4 'stone
EndIf
|
Hier würden Leerzeichen zwischen den Operatoren und den jeweiligen Argument und ein paar Zeilenumbrüche über einen Unterstrich den Code auch besser lesbarer machen.
Code: | Dim WarriorFile (1 to 1000) as string
Dim WarriorName (1 to 1000) as string
Dim WarriorAuthor (1 to 1000) as string
Dim WarriorType (1 to 1000) as string
Dim WarriorResult (1 to 1000) as Integer
Dim WarriorScoring(1 to 1000) As Single |
Eine Liste würde diesen Dienst (denke) ich einfacher machen. Sowas wie einen STL Vector oder eine STL Liste wird es auch sicher für Freebasic geben.
Code: | Dim PathSym As String '1.01e1 - all usages of PathSym and UseWin
PathSym = "/" : If UseWin Then PathSym = "\" |
Einfacher für den Benutzer:
Code: | #ifdef __FB_WIN32__
#define PathSym "\"
#else
#define PathSym "/"
#endif |
Der Code hat auch keine Funktionen oder Makros, alle Variablen sind daher implizit als global deklariert.
Zum Programm kann ich nichts sagen. |
|
Nach oben |
|
 |
Fiz
Anmeldungsdatum: 10.02.2010 Beiträge: 2 Wohnort: München
|
Verfasst am: 12.02.2010, 18:30 Titel: |
|
|
Hey cool!!!
Vielen Dank für die Tipps. Werde die im nächsten Release mit einbauen.
Grüße,
Christian |
|
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.
|
|