| 
				
					|  | 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: 09.02.2010
 Beiträge: 2
 Wohnort: München
 
 | 
			
				|  Verfasst am: 09.02.2010, 23: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, 14: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: 09.02.2010
 Beiträge: 2
 Wohnort: München
 
 | 
			
				|  Verfasst am: 12.02.2010, 17: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.
 
 |  |