Wireworld Simulator

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

F

Betreff: Wireworld Simulator

BeitragDo, Okt 04, 2007 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal einen Wireworld Simulator programmiert.

Wer nicht weiß was das ist : http://de.wikipedia.org/wiki/Wireworld



Die Steuerung ist leider erwas verkorkst aber nur mit Maus war es zu ungenau und mit nur Tastatur zu Langsam :

Mausklick = Grünes Kreuz Plazieren
Pfeiltasten = Grünes Kreuz bewegen

1 = Leitung
2 = Elektronenende
3 = Elektronenkopf
4 = Diode1
5 = Diode2
6 = Zwei Leitungen übereinander

F = Plazieren
D = Löschen

C = Alles leeren

P = Abspielen (Gedrückt)

ESC = Beenden



Code :

Code: [AUSKLAPPEN]


Const SIZEX = 320
Const SIZEY = 240

Graphics SIZEX ,SIZEY
SetBuffer BackBuffer()

Dim B%(SIZEX + 1,SIZEY + 1)
Dim B2%(SIZEX  + 1,SIZEY + 1)

XX# = SIZEX / 2
YY# = SIZEY / 2

AC = 1

ClearCells()

Repeat
Cls

If KeyDown(25) Then UpdateCells()

If KeyDown(46) Then ClearCells()

Color 0,255,0

If KeyHit(2) Then AC = 1
If KeyHit(3) Then AC = 2
If KeyHit(4) Then AC = 3
If KeyHit(5) Then AC = 4
If KeyHit(6) Then AC = 5
If KeyHit(7) Then AC = 6

If KeyDown(200) Then YY = YY - 0.05
If KeyDown(208) Then YY = YY + 0.05
If KeyDown(203) Then XX = XX - 0.05
If KeyDown(205) Then XX = XX + 0.05

Line XX - 1,YY ,XX + 1,YY
Line XX,YY - 1,XX,YY + 1

Color 0,0,255

Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1

If MouseDown(1) Then
 
   XX = MouseX()
   YY = MouseY()

End If

If KeyDown(33) Then
   
   If AC < 4 Then B2%(XX,YY) = AC
   
   If AC = 4 Then
   
   B2%(XX,YY) = 1
   B2%(XX,YY - 1) = 1
   B2%(XX,YY + 1) = 1
   B2%(XX + 1,YY + 1) = 1
   B2%(XX + 1,YY - 1) = 1
   
   End If
   
   If AC = 5 Then
   
   B2%(XX + 1,YY) = 1
   B2%(XX,YY - 1) = 1
   B2%(XX,YY + 1) = 1
   B2%(XX + 1,YY + 1) = 1
   B2%(XX + 1,YY - 1) = 1
   
   End If
   
   If AC = 6 Then
   
   B2%(XX,YY + 1) = 1
   B2%(XX,YY - 1) = 1
   
   End If

End If

If KeyDown(32) Then B2%(XX,YY) = 0

DrawCells()

Flip
Until KeyHit(1)
End

Function DrawCells()

For NX% = 1 To SIZEX

   For NY% = 1 To SIZEY      
            
      If B2%(NX%,NY%) = 1 Then
      
         Color 255,255,0
         Plot NX%,NY%
      
      End If
      
      If B2%(NX%,NY%) = 2 Then
      
         Color 255,0,0
         Plot NX%,NY%
      
      End If
      
      If B2%(NX%,NY%) = 3 Then
      
         Color 0,0,255
         Plot NX%,NY%
      
      End If

   Next

Next

End Function

Function ClearCells()

For NX% = 1 To SIZEX

   For NY% = 1 To SIZEY

      B2%(NX%,NY%) = 0

   Next

Next

End Function

Function UpdateCells()

For NX% = 1 To SIZEX

   For NY% = 1 To SIZEY

      B%(NX%,NY%) = B2%(NX%,NY%)
      B2%(NX%,NY%) = 0

   Next

Next

For NX% = 1 To SIZEX

   For NY% = 1 To SIZEY

      NZ% = 0
      NZZ% = 0
      NZZZ% = 0
            
      If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1
      If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1
      If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1
      If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1
            
      If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1
      If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1
      If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1
      If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1
      
      If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
      If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
            
      If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      
      If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
      If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
            
      If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1

      Select B%(NX%,NY%)
      
         Case 1
            
            If NZZZ% = 1 Or NZZZ% = 2 Then
            B2%(NX%,NY%) = 3
            Else
            B2%(NX%,NY%) = 1
            End If
            
         Case 2
            
            B2%(NX%,NY%) = 1
            
         Case 3
            
            B2%(NX%,NY%) = 2
         
      End Select
      
      

   Next

Next

End Function



Verbesserungsvorschläge erwünscht
 

BlackTermi

BeitragDo, Okt 04, 2007 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Unbedingt grösser machen. Oder - für alle - Debugger aus bzw. Vollbild rein, damit man keinen Augenkrebs bekommt.


Ist ganz nett geworden, aber so wie jetzt ist das einfach zu ungenau was die Steuerung angeht und mir geht dadurch jede Langzeitmotivation flöten.

Xeres

Moderator

BeitragFr, Okt 05, 2007 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum lässt sich mit der Maus nicht direkt das ausgewählte "Leitungsteil" setzen?
Ich würde eine Start/Stop Taste und eine Einzelschritt-Taste auch einem einzigen Keydown vorziehen, da man damit weder das eine noch das andere hat.

Es funktioniert zwar gut und regel konform, aber mit den Variablennamen würde ich mir doch ausreichend Kommentierung wünschen, sonst ist's für das Codearchiv eher ungeeignet, weil schwer nach zu vollziehen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

F

Betreff: Bessere Steuerung

BeitragSa, Okt 06, 2007 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab die Steuerung stark verbessert. Man setzt mit der Maus Linien.

Linksklick = Linienstartpunkt setzen / linie Zeichnen
Rechtsklick = Linienstartpunkt setzen / linie Zeichnen (Löschend)

S = Start\Stop
1-6 = Zeichenmodi auswählen (Leiterbahn,Elektronenende...)
C = Alles Löschen
P = Einen Einzelschritt
ESC = Beenden

Es ist Ziemlich nerfend wenn man mit der Maus immer über den Pixel fährt den mann anklicken möchte. Deshalb kann man mit den Pfeiltasten die Maus ZUSÄTZLICH Bewegen.

Ich hoffe Steuerungsmäßig ist jetzt alles im lot.

Code: [AUSKLAPPEN]


Const SIZEX = 320 ; Fensterbreite
Const SIZEY = 240 ; Fensterhöhe

Graphics SIZEX ,SIZEY,32 ; Fenster öffnen
SetBuffer BackBuffer()    ; Buffer setzen

Dim B%(SIZEX + 1,SIZEY + 1)    ;Grundfeld Definiren
Dim B2%(SIZEX  + 1,SIZEY + 1)   ;Hauptfeld Definiren

LA% = 0 ; Linie nicht aktiv

AC = 1 ; Zeichenmodus auf 1 setzen

P = 0 ; Nicht Abspielen

ClearCells() ; Zellen Löschen

;HAUPTPROGRAMM

Repeat ; Wiederhole
Cls      ; Buffer löschen

If KeyHit(2) Then AC = 1 ; Zeichenmodus auf 1 Setzen
If KeyHit(3) Then AC = 2 ; Zeichenmodus auf 2 Setzen
If KeyHit(4) Then AC = 3 ; Zeichenmodus auf 3 Setzen
If KeyHit(5) Then AC = 4 ; Zeichenmodus auf 4 Setzen
If KeyHit(6) Then AC = 5 ; Zeichenmodus auf 5 Setzen

If KeyHit(200) Then MoveMouse MouseX(), MouseY() - 1  ; Zeichenmodus auf 1 Setzen
If KeyHit(208) Then MoveMouse MouseX(), MouseY() + 1 ; Zeichenmodus auf 2 Setzen
If KeyHit(203) Then MoveMouse MouseX() - 1, MouseY() ; Zeichenmodus auf 3 Setzen
If KeyHit(205) Then MoveMouse MouseX() + 1, MouseY() ; Zeichenmodus auf 4 Setzen

If MouseHit(1) Then ; Wenn Maus gedrückt

   If AC < 4 Then ; Wenn Zeichenmodus kleiner als 4

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = AC ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = AC ; Punkt auf Hauptfeld setzen
      
      Next
   
   End If
   
   ElseIf AC = 4 Then ; Wenn Zeichenmodus gleich 4
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      
   ElseIf AC = 5 Then ; Wenn Zeichenmodus gleich 4
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
   
   End If

End If

If MouseHit(2) Then ; Wenn Maus wurde gedrückt

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = 0 ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = 0 ; Punkt auf Hauptfeld löschen
      
      Next
   
   End If

End If

If LA% = 1 Then ; Wenn Linie aktiv

   Color 125,125,125 ; Setze Farbe auf Grau
   Line XX,YY,MouseX(),MouseY() ; Zeichne Linie

End If   

If P = 1 Then UpdateCells() ; Wenn Abspielen Aktiv Dann Aktualisiere die Felder

If KeyHit(25) Then UpdateCells() ; Wenn P Gedrückt Aktualisiere die Felder

If KeyHit(46) Then ClearCells() ; Wenn C Gedrückt Lösche die Felder

If KeyHit(31) Then ; Wenn S Gedrückt
 
If P = 0 Then ; Wenn Abspielen nicht Aktiv

   P = 1 ; Abspielen Aktiv

ElseIf P = 1 Then ; Wenn Abspielen Aktiv

   P = 0 ;Abspielen nicht Aktiv

End If

End If

DrawCells() ; Zeichne Zellen

Color 255,255,255 ; Farbe aus Weiß setzen

;Kreuz Zeichnen :

Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1

Flip ; Wechsle den Buffer
Until KeyHit(1) ; slange ESC nicht gedrückt
End ; Programm Beenden

Function DrawCells() ; Zellen Zeichnen

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
            
      If B2%(NX%,NY%) = 1 Then ; Wenn Feld an Position NX und NY gleich 1
      
         Color 255,255,0 ; Setze Farbe
         Plot NX%,NY% ; Setze Punkt an Position NX und NY
      
      End If
      
      If B2%(NX%,NY%) = 2 Then ; Wenn Feld an Position NX und NY gleich 2
      
         Color 255,0,0 ; Setze Farbe
         Plot NX%,NY% ; Setze Punkt an Position NX und NY
      
      End If
      
      If B2%(NX%,NY%) = 3 Then ; Wenn Feld an Position NX und NY gleich 3
      
         Color 0,0,255 ; Setze Farbe
         Plot NX%,NY% ; Setze Punkt an Position NX und NY
      
      End If

   Next

Next

End Function

Function ClearCells() ; Lösche Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu FensterHöhe

      B2%(NX%,NY%) = 0 ; Feld an Position NX und NY gleich 0

   Next

Next

End Function

Function UpdateCells() ; Aktuallisiere Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      B%(NX%,NY%) = B2%(NX%,NY%) ; Grundfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
      B2%(NX%,NY%) = 0 ; Hauptfeld an Position NX und NY gleich 0

   Next

Next

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      NZ% = 0 ; Benachbarte Leiterbahnen
      NZZ% = 0 ; Benachbarte Elektronenenden
      NZZZ% = 0 ; Benachbarte Elektronenköpfe
            
      If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1 ; Wenn Feld Oben = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Oben Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links Unten = 1 Dann Ben. Leit. + 1
            
      If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts Oben = 1 Dann Ben. Leit. + 1
      
      If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
      If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
            
      If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      
      If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
      If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
            
      If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1

      Select B%(NX%,NY%)
      
         Case 1 ; Wenn Feld an Position NX und NY = 1
            
            If NZZZ% = 1 Or NZZZ% = 2 Then ; Wenn Benachbarte Elektronenköpfe gleich 1 oder 2
            
               B2%(NX%,NY%) = 3 ; Feld an Position NX und NY = 3
            
            Else ; Ansonsten
            
               B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
            End If
            
         Case 2 ; Wenn Feld an Position NX und NY = 2
            
            B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
         Case 3 ; Wenn Feld an Position NX und NY = 3
            
            B2%(NX%,NY%) = 2 ; Feld an Position NX und NY = 2
         
      End Select
      
      

   Next

Next

End Function

[/b]

Xeres

Moderator

BeitragSa, Okt 06, 2007 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist schon sehr vorzeigbar, schön Razz
Was man jetzt noch machen könnte:
Eine Anzeige welcher Zeichenmodus drin ist bzw. "ingame" Statistik zum an/abschalten...
(und Speichern/Laden-funktionen Wink )
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

F

BeitragSa, Okt 06, 2007 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Anzeige ist Eingebaut nur die Laden und Speichern Funktion zickt rum.

Wenn ich etwas mit s speichere das ist die Datei 75 kb Groß. Ich habe aber ausgerechnet das die Datei 600kb Groß sein Müsste. Wenn ich sie Lade kommt das Gespeicherte 4 mal kleiner und drei mal untereinander.

Ich habe keine idee woran das liegen könnte und hoffe das mir irgendjemand erklären kann wie ich die Laden\Speichern Funktion Hinkriege.

Die Steuerung bleibt weitgehend normal. Anderungen :

Enter = Start\Stop
Neuer Zeichenmodus 7
S = Speichern
L = Laden

Die neue Anzeige zeigt auch das Aussehen der Bauteile an die man setzen kann.

Eigentlich müsste es jetzt schneller Laufen da ich Plot durch WritePixel ersetzt habe.

Code: [AUSKLAPPEN]


Const SIZEX = 320 ; Fensterbreite
Const SIZEY = 240 ; Fensterhöhe

Graphics SIZEX ,SIZEY,32 ; Fenster öffnen
SetBuffer BackBuffer()    ; Buffer setzen

Dim B%(SIZEX + 1,SIZEY + 1)    ;Grundfeld Definiren
Dim B2%(SIZEX  + 1,SIZEY + 1)   ;Hauptfeld Definiren

LA% = 0 ; Linie nicht aktiv

AC = 1 ; Zeichenmodus auf 1 setzen

P = 0 ; Nicht Abspielen

Const GELB = 1*$1000000 + 255*$10000 + 255*$100 + 0 ; Gelbwert ausrechnen
Const ROT = 1*$1000000 + 255*$10000 + 0*$100 + 0 ; Rotwert ausrechnen
Const BLAU = 1*$1000000 + 0*$10000 + 0*$100 + 255 ; Blauwert ausrechnen

ClearCells() ; Zellen Löschen

;HAUPTPROGRAMM

Repeat ; Wiederhole
Cls      ; Buffer löschen

If KeyHit(2) Then AC = 1 ; Zeichenmodus auf 1 Setzen
If KeyHit(3) Then AC = 2 ; Zeichenmodus auf 2 Setzen
If KeyHit(4) Then AC = 3 ; Zeichenmodus auf 3 Setzen
If KeyHit(5) Then AC = 4 ; Zeichenmodus auf 4 Setzen
If KeyHit(6) Then AC = 5 ; Zeichenmodus auf 5 Setzen
If KeyHit(7) Then AC = 6 ; Zeichenmodus auf 6 Setzen

If KeyHit(200) Then MoveMouse MouseX(), MouseY() - 1  ; Zeichenmodus auf 1 Setzen
If KeyHit(208) Then MoveMouse MouseX(), MouseY() + 1 ; Zeichenmodus auf 2 Setzen
If KeyHit(203) Then MoveMouse MouseX() - 1, MouseY() ; Zeichenmodus auf 3 Setzen
If KeyHit(205) Then MoveMouse MouseX() + 1, MouseY() ; Zeichenmodus auf 4 Setzen

If MouseHit(1) Then ; Wenn Maus gedrückt

   If AC < 4 Then ; Wenn Zeichenmodus kleiner als 4

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = AC ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = AC ; Punkt auf Hauptfeld setzen
      
      Next
   
   End If
   
   ElseIf AC = 4 Then ; Wenn Zeichenmodus gleich 4
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      
   ElseIf AC = 5 Then ; Wenn Zeichenmodus gleich 5
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      
   ElseIf AC = 6 Then ; Wenn Zeichenmodus gleich 6
   
      B2%(MouseX() ,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
      
   End If

End If

If MouseHit(2) Then ; Wenn Maus wurde gedrückt

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = 0 ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = 0 ; Punkt auf Hauptfeld löschen
      
      Next
   
   End If

End If

If LA% = 1 Then ; Wenn Linie aktiv

   Color 125,125,125 ; Setze Farbe auf Grau
   Line XX,YY,MouseX(),MouseY() ; Zeichne Linie

End If   

If P = 1 Then UpdateCells() ; Wenn Abspielen Aktiv Dann Aktualisiere die Felder

If KeyHit(25) Then UpdateCells() ; Wenn P Gedrückt Aktualisiere die Felder

If KeyHit(46) Then ClearCells() ; Wenn C Gedrückt Lösche die Felder

If KeyHit(28) Then ; Wenn Enter Gedrückt
 
If P = 0 Then ; Wenn Abspielen nicht Aktiv

   P = 1 ; Abspielen Aktiv

ElseIf P = 1 Then ; Wenn Abspielen Aktiv

   P = 0 ;Abspielen nicht Aktiv

End If

End If

If KeyHit(31) Then

   SF = WriteFile("ww.wws")

   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         If B2%(NX%,NY%) = 0 Then WriteByte SF, 0
         If B2%(NX%,NY%) = 1 Then WriteByte SF, 1
         If B2%(NX%,NY%) = 2 Then WriteByte SF, 2
         If B2%(NX%,NY%) = 3 Then WriteByte SF, 3
      
      Next

   Next
   
   CloseFile SF
   
End If

If KeyHit(38) Then

   LF = ReadFile("ww.wws")

   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         
         If ReadByte(LF) = 0 Then B2%(NX%,NY%) = 0
         If ReadByte(LF) = 1 Then B2%(NX%,NY%) = 1
         If ReadByte(LF) = 2 Then B2%(NX%,NY%) = 2
         If ReadByte(LF) = 3 Then B2%(NX%,NY%) = 3
      
      Next

   Next
   
   CloseFile LF

End If

DrawCells() ; Zeichne Zellen

Color 255,255,255 ; Farbe aus Weiß setzen

;Kreuz Zeichnen :

Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1

Rect 1,1,10,10,0 ; Viereck Zeichnen

Select AC

   Case 1 ; Wenn Zeichenmodus gleich 1
      
      Color 255,255,0 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
      
   Case 2 ; Wenn Zeichenmodus gleich 2
      
      Color 255,0,0 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
   
   Case 3 ; Wenn Zeichenmodus gleich 3
      
      Color 0,0,255 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
      
   Case 4 ; Wenn Zeichenmodus gleich 4
      
      Color 255,255,0 ; Farbe wechseln
      
      Plot 3,3 ; Punkt zeichnen
      Plot 4,3 ; Punkt zeichnen
      Plot 4,4 ; Punkt zeichnen
      Plot 4,5 ; Punkt zeichnen
      Plot 3,5 ; Punkt zeichnen
      
   Case 5 ; Wenn Zeichenmodus gleich 5
      
      Color 255,255,0 ; Farbe wechseln

      Plot 3,3 ; Punkt zeichnen
      Plot 4,3 ; Punkt zeichnen
      Plot 3,4 ; Punkt zeichnen
      Plot 4,5 ; Punkt zeichnen
      Plot 3,5 ; Punkt zeichnen
      
   Case 6 ; Wenn Zeichenmodus gleich 6
      
      Color 255,255,0 ; Farbe wechseln
      
      Line 3,3,5,3 ; Linie zeichnen
      Line 3,4,5,4 ; Linie zeichnen
      Line 3,5,5,5 ; Linie zeichnen
      Line 3,6,4,6 ; Linie zeichnen

End Select

Flip ; Wechsle den Buffer
Until KeyHit(1) ; slange ESC nicht gedrückt
End ; Programm Beenden

Function DrawCells() ; Zellen Zeichnen

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
            
      If B2%(NX%,NY%) = 1 Then WritePixel NX%,NY%,GELB ; Wenn Feld an Position NX und NY gleich 1 dann Setze Punkt an Position NX und NY
      
      If B2%(NX%,NY%) = 2 Then WritePixel NX%,NY%,ROT ; Wenn Feld an Position NX und NY gleich 2 dann Setze Punkt an Position NX und NY
      
      If B2%(NX%,NY%) = 3 Then WritePixel NX%,NY%,BLAU ; Wenn Feld an Position NX und NY gleich 3 dann setze Punkt an Position NX und NY

   Next

Next

End Function

Function ClearCells() ; Lösche Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu FensterHöhe

      B2%(NX%,NY%) = 0 ; Feld an Position NX und NY gleich 0

   Next

Next

End Function

Function UpdateCells() ; Aktuallisiere Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      B%(NX%,NY%) = B2%(NX%,NY%) ; Grundfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
      B2%(NX%,NY%) = 0 ; Hauptfeld an Position NX und NY gleich 0

   Next

Next

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      NZ% = 0 ; Benachbarte Leiterbahnen
      NZZ% = 0 ; Benachbarte Elektronenenden
      NZZZ% = 0 ; Benachbarte Elektronenköpfe
            
      If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1 ; Wenn Feld Oben = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Oben Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links Unten = 1 Dann Ben. Leit. + 1
            
      If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts Oben = 1 Dann Ben. Leit. + 1
      
      If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
      If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
            
      If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      
      If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
      If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
            
      If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1

      Select B%(NX%,NY%)
      
         Case 1 ; Wenn Feld an Position NX und NY = 1
            
            If NZZZ% = 1 Or NZZZ% = 2 Then ; Wenn Benachbarte Elektronenköpfe gleich 1 oder 2
            
               B2%(NX%,NY%) = 3 ; Feld an Position NX und NY = 3
            
            Else ; Ansonsten
            
               B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
            End If
            
         Case 2 ; Wenn Feld an Position NX und NY = 2
            
            B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
         Case 3 ; Wenn Feld an Position NX und NY = 3
            
            B2%(NX%,NY%) = 2 ; Feld an Position NX und NY = 2
         
      End Select
      
      

   Next

Next

End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Okt 06, 2007 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum das speichern/laden nicht richtig geht, liegt an folgendem:

Speichern:
Code: [AUSKLAPPEN]
If KeyHit(31) Then
 SF = WriteFile("ww.wws")
  For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
    If B2%(NX%,NY%) = 0 Then WriteByte SF, 0
    If B2%(NX%,NY%) = 1 Then WriteByte SF, 1
    If B2%(NX%,NY%) = 2 Then WriteByte SF, 2
    If B2%(NX%,NY%) = 3 Then WriteByte SF, 3
   Next
  Next
 CloseFile SF
End If


Laden:
Code: [AUSKLAPPEN]
If KeyHit(38) Then
 LF = ReadFile("ww.wws")
  For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
    If ReadByte(LF) = 0 Then B2%(NX%,NY%) = 0
    If ReadByte(LF) = 1 Then B2%(NX%,NY%) = 1
    If ReadByte(LF) = 2 Then B2%(NX%,NY%) = 2
    If ReadByte(LF) = 3 Then B2%(NX%,NY%) = 3
   Next
  Next
 CloseFile LF
End If


Nach jeden ql:ReadByte wird die Leseposition der Daten um ein Byte verschoben, somit kommst du nicht mehr an weitere Informationen an.

Mach stattdessen für beide folgendes:

Code: [AUSKLAPPEN]
If KeyHit(31) Then
 SF = WriteFile("ww.wws")
  For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
    WriteByte SF,B2%(NX%,NY%)
   Next
  Next
 CloseFile SF
End If

If KeyHit(38) Then
 LF = ReadFile("ww.wws")
  For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
    B2%(NX%,NY%)=ReadByte(LF)
   Next
  Next
 CloseFile LF
End If


Ansonsten gefällt mir dein Programm gut. Ich würde aber solche Programme lieber als Fenster ablaufen lassen. Damit man es dann noch steuern kann, würde ich es manuell vergrößern.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragSa, Okt 06, 2007 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal versuchsweise den Code beim Laden so umgeschrieben:
Code: [AUSKLAPPEN]
ReBy = ReadByte(LF)

If ReBy = 0 Then B2%(NX%,NY%) = 0
If ReBy = 1 Then B2%(NX%,NY%) = 1
If ReBy = 2 Then B2%(NX%,NY%) = 2
If ReBy = 3 Then B2%(NX%,NY%) = 3
Wahrscheinlich ist "If ReadByte(LF) = 0 ..." so direkt nicht einsetzbar, jedenfalls gehts wie oben beschrieben ausgezeichnet.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Okt 06, 2007 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Jede Ausführung von ReadByte, versetzt die Leseposition um eine Stelle. Dadurch kann man nicht darauf hoffen, mehrmals mit ReadByte den richtigen zu erwischen. Blitz kann nicht wissen, wann es dann die Position versetzen soll oder nicht? Wenn man es mit If-Abfragen machen möchte/muß, so muß der Wert halt zwischengespeichert werden oder die Fileposition immer jeweils mit SeekFile gesetzt werden. Beide ''Lösungen'' kommen aber ohne einer weiteren Variable nicht umrum. Auch sind bei dieser Ausführung Probleme schon vorprogrammiert. Ich kann nur empfehlen Werte einfach direkt da rein zu schreiben, und so auch wieder auszulesen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

F

BeitragSo, Okt 07, 2007 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke. Hätt ich eigentlich selber draufkommen müssen ^^' .

Hier der Code mit Funktionierender Laden\Speichern Funktion :

Code: [AUSKLAPPEN]


Const SIZEX = 320 ; Fensterbreite
Const SIZEY = 240 ; Fensterhöhe

Graphics SIZEX ,SIZEY,32 ; Fenster öffnen
SetBuffer BackBuffer()    ; Buffer setzen

Dim B%(SIZEX + 1,SIZEY + 1)    ;Grundfeld Definiren
Dim B2%(SIZEX  + 1,SIZEY + 1)   ;Hauptfeld Definiren

LA% = 0 ; Linie nicht aktiv

AC = 1 ; Zeichenmodus auf 1 setzen

P = 0 ; Nicht Abspielen

Const GELB = 1*$1000000 + 255*$10000 + 255*$100 + 0 ; Gelbwert ausrechnen
Const ROT = 1*$1000000 + 255*$10000 + 0*$100 + 0 ; Rotwert ausrechnen
Const BLAU = 1*$1000000 + 0*$10000 + 0*$100 + 255 ; Blauwert ausrechnen

ClearCells() ; Zellen Löschen

;HAUPTPROGRAMM

Repeat ; Wiederhole
Cls      ; Buffer löschen

If KeyHit(2) Then AC = 1 ; Zeichenmodus auf 1 Setzen
If KeyHit(3) Then AC = 2 ; Zeichenmodus auf 2 Setzen
If KeyHit(4) Then AC = 3 ; Zeichenmodus auf 3 Setzen
If KeyHit(5) Then AC = 4 ; Zeichenmodus auf 4 Setzen
If KeyHit(6) Then AC = 5 ; Zeichenmodus auf 5 Setzen
If KeyHit(7) Then AC = 6 ; Zeichenmodus auf 6 Setzen

If KeyHit(200) Then MoveMouse MouseX(), MouseY() - 1  ; Zeichenmodus auf 1 Setzen
If KeyHit(208) Then MoveMouse MouseX(), MouseY() + 1 ; Zeichenmodus auf 2 Setzen
If KeyHit(203) Then MoveMouse MouseX() - 1, MouseY() ; Zeichenmodus auf 3 Setzen
If KeyHit(205) Then MoveMouse MouseX() + 1, MouseY() ; Zeichenmodus auf 4 Setzen

If MouseHit(1) Then ; Wenn Maus gedrückt

   If AC < 4 Then ; Wenn Zeichenmodus kleiner als 4

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = AC ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = AC ; Punkt auf Hauptfeld setzen
      
      Next
   
   End If
   
   ElseIf AC = 4 Then ; Wenn Zeichenmodus gleich 4
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      
   ElseIf AC = 5 Then ; Wenn Zeichenmodus gleich 5
   
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
      
   ElseIf AC = 6 Then ; Wenn Zeichenmodus gleich 6
   
      B2%(MouseX() ,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 2,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
      
      B2%(MouseX() ,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
      B2%(MouseX() + 1,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
      
   End If

End If

If MouseHit(2) Then ; Wenn Maus wurde gedrückt

   If LA% = 0 Then ; Wenn Maus noch nicht gedrückt

      LA% = 1 ; Maus wurde gedrückt

      ; Linien Startpunkt setzen

      XX = MouseX()
      YY = MouseY()
   
   ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt

      LA% = 0 ; Maus wurde nicht gedrückt
      
      Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
      
      hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
      
      X# = XX
      Y# = YY
      
      B2%(Int(X),Int(Y)) = 0 ; Punkt setzen
      
      For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
         
         ; Punktkoordinaten Bewegen :
         
         X = X - Cos(Winkel#)
         Y = Y - Sin(Winkel#)
         
         B2%(Int(X),Int(Y)) = 0 ; Punkt auf Hauptfeld löschen
      
      Next
   
   End If

End If

If LA% = 1 Then ; Wenn Linie aktiv

   Color 125,125,125 ; Setze Farbe auf Grau
   Line XX,YY,MouseX(),MouseY() ; Zeichne Linie

End If   

If P = 1 Then UpdateCells() ; Wenn Abspielen Aktiv Dann Aktualisiere die Felder

If KeyHit(25) Then UpdateCells() ; Wenn P Gedrückt Aktualisiere die Felder

If KeyHit(46) Then ClearCells() ; Wenn C Gedrückt Lösche die Felder

If KeyHit(28) Then ; Wenn Enter Gedrückt
 
If P = 0 Then ; Wenn Abspielen nicht Aktiv

   P = 1 ; Abspielen Aktiv

ElseIf P = 1 Then ; Wenn Abspielen Aktiv

   P = 0 ;Abspielen nicht Aktiv

End If

End If

If KeyHit(31) Then

   SF = WriteFile("ww.wws") ; Datei zum Schreiben Öffnen

   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
      
         If B2%(NX%,NY%) = 0 Then WriteByte SF, 0 ; Wenn Hauptfeld an der Position NX und NY gleich 0 schreibe 0
         If B2%(NX%,NY%) = 1 Then WriteByte SF, 1 ; Wenn Hauptfeld an der Position NX und NY gleich 1 schreibe 1
         If B2%(NX%,NY%) = 2 Then WriteByte SF, 2 ; Wenn Hauptfeld an der Position NX und NY gleich 2 schreibe 2
         If B2%(NX%,NY%) = 3 Then WriteByte SF, 3 ; Wenn Hauptfeld an der Position NX und NY gleich 3 schreibe 3
      
      Next

   Next
   
   CloseFile SF ; Datei steam schließen
   
End If

If KeyHit(38) Then

   LF = ReadFile("ww.wws") ; Datei zum Lesen Öffnen

   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         RebY = ReadByte(LF) ; Byte auslesen
         
         If ReBy = 0 Then B2%(NX%,NY%) = 0 ; Wenn gelesenes Byte = 0 Hauptfeld an der Position NX und NY gleich 0
         If ReBy = 1 Then B2%(NX%,NY%) = 1 ; Wenn gelesenes Byte = 1 Hauptfeld an der Position NX und NY gleich 1
         If ReBy = 2 Then B2%(NX%,NY%) = 2 ; Wenn gelesenes Byte = 2 Hauptfeld an der Position NX und NY gleich 2
         If ReBy = 3 Then B2%(NX%,NY%) = 3 ; Wenn gelesenes Byte = 3 Hauptfeld an der Position NX und NY gleich 3
      
      Next

   Next
   
   CloseFile LF ; Datei steam schließen

End If

DrawCells() ; Zeichne Zellen

Color 255,255,255 ; Farbe aus Weiß setzen

;Kreuz Zeichnen :

Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1

Rect 1,1,10,10,0 ; Viereck Zeichnen

Select AC

   Case 1 ; Wenn Zeichenmodus gleich 1
      
      Color 255,255,0 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
      
   Case 2 ; Wenn Zeichenmodus gleich 2
      
      Color 255,0,0 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
   
   Case 3 ; Wenn Zeichenmodus gleich 3
      
      Color 0,0,255 ; Farbe wechseln
      
      Rect 3,3,6,6,1 ; Viereck Zeichnen
      
   Case 4 ; Wenn Zeichenmodus gleich 4
      
      Color 255,255,0 ; Farbe wechseln
      
      Plot 3,3 ; Punkt zeichnen
      Plot 4,3 ; Punkt zeichnen
      Plot 4,4 ; Punkt zeichnen
      Plot 4,5 ; Punkt zeichnen
      Plot 3,5 ; Punkt zeichnen
      
   Case 5 ; Wenn Zeichenmodus gleich 5
      
      Color 255,255,0 ; Farbe wechseln

      Plot 3,3 ; Punkt zeichnen
      Plot 4,3 ; Punkt zeichnen
      Plot 3,4 ; Punkt zeichnen
      Plot 4,5 ; Punkt zeichnen
      Plot 3,5 ; Punkt zeichnen
      
   Case 6 ; Wenn Zeichenmodus gleich 6
      
      Color 255,255,0 ; Farbe wechseln
      
      Line 3,3,5,3 ; Linie zeichnen
      Line 3,4,5,4 ; Linie zeichnen
      Line 3,5,5,5 ; Linie zeichnen
      Line 3,6,4,6 ; Linie zeichnen

End Select

Flip ; Wechsle den Buffer
Until KeyHit(1) ; slange ESC nicht gedrückt
End ; Programm Beenden

Function DrawCells() ; Zellen Zeichnen

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
            
      If B2%(NX%,NY%) = 1 Then WritePixel NX%,NY%,GELB ; Wenn Feld an Position NX und NY gleich 1 dann Setze Punkt an Position NX und NY
      
      If B2%(NX%,NY%) = 2 Then WritePixel NX%,NY%,ROT ; Wenn Feld an Position NX und NY gleich 2 dann Setze Punkt an Position NX und NY
      
      If B2%(NX%,NY%) = 3 Then WritePixel NX%,NY%,BLAU ; Wenn Feld an Position NX und NY gleich 3 dann setze Punkt an Position NX und NY

   Next

Next

End Function

Function ClearCells() ; Lösche Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu FensterHöhe

      B2%(NX%,NY%) = 0 ; Feld an Position NX und NY gleich 0

   Next

Next

End Function

Function UpdateCells() ; Aktuallisiere Felder

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      B%(NX%,NY%) = B2%(NX%,NY%) ; Grundfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
      B2%(NX%,NY%) = 0 ; Hauptfeld an Position NX und NY gleich 0

   Next

Next

For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite

   For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe

      NZ% = 0 ; Benachbarte Leiterbahnen
      NZZ% = 0 ; Benachbarte Elektronenenden
      NZZZ% = 0 ; Benachbarte Elektronenköpfe
            
      If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1 ; Wenn Feld Oben = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Oben Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links = 1 Dann Ben. Leit. + 1
      If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links Unten = 1 Dann Ben. Leit. + 1
            
      If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts = 1 Dann Ben. Leit. + 1
      If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts Oben = 1 Dann Ben. Leit. + 1
      
      If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
      If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
            
      If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
      If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
      
      If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
      If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
            
      If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
      If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1

      Select B%(NX%,NY%)
      
         Case 1 ; Wenn Feld an Position NX und NY = 1
            
            If NZZZ% = 1 Or NZZZ% = 2 Then ; Wenn Benachbarte Elektronenköpfe gleich 1 oder 2
            
               B2%(NX%,NY%) = 3 ; Feld an Position NX und NY = 3
            
            Else ; Ansonsten
            
               B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
            End If
            
         Case 2 ; Wenn Feld an Position NX und NY = 2
            
            B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
            
         Case 3 ; Wenn Feld an Position NX und NY = 3
            
            B2%(NX%,NY%) = 2 ; Feld an Position NX und NY = 2
         
      End Select
      
      

   Next

Next

End Function

StepTiger

BeitragSo, Okt 07, 2007 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast mich jetzt verführt, soetwas auch zu programmieren =)

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

size=128

Dim feld(size,size)
Dim feld2(size,size)
Dim feld3(size,size)

;0 frei
;1 Leiter
;2 Elektronenanfang
;3 Elektronenende

posx=0
posy=0

wid=20

selected=1

.start

While Not KeyHit(1)
   
   Cls
   
   For x=2 To 5
      
      If KeyHit(x)
         
         selected=x-2
         
      EndIf
      
   Next
   
   posx=posx+KeyHit(205)-KeyHit(203)
   posy=posy+KeyHit(208)-KeyHit(200)
   
   smin=posx
   smax=GraphicsWidth()/wid+smin
   
   sminy=posy
   smaxy=GraphicsHeight()/wid+sminy
   
   For x=smin To smax
      
      For y=sminy To smaxy
         
         f=feld(x,y)
         
         sx=x*wid-posx*wid
         sy=y*wid-posy*wid
         
         If sx>=-wid And sx<GraphicsWidth() And sy>=-wid And sy<GraphicsHeight()
            
            Select f
               Case 0
                  Color 0,0,0
               Case 1
                  Color 255,255,0
               Case 2
                  Color 0,0,255
               Case 3
                  Color 255,0,0
            End Select
            
            If f Then Rect sx,sy,wid-1,wid-1
            
         EndIf
         
      Next
      
   Next
   
   If MouseDown(1)
      
      px=(MouseX())/wid+posx
      py=(MouseY())/wid+posy
      
      feld(px,py)=selected
      
   EndIf
   
   If KeyHit(28)
      
      For x=0 To size
         
         For y=0 To size
            
            feld3(x,y)=feld(x,y)
            
         Next
         
      Next
      
      FlushMouse
      
      FlushKeys
      
      Goto emulate
      
   EndIf
   
   Flip 0
   
   If KeyHit(57) Then RuntimeError "STOP!"
   
   Delay 10
   
Wend

End

.emulate

While Not KeyHit(1)
   
   Cls
   
   For x=0 To size
      
      For y=0 To size
         If feld(x,y)=0
            
            feld2(x,y)=0
            
         ElseIf feld(x,y)=1
            
            count=0
            
            For x2=x-1 To x+1
               
               For y2=y-1 To y+1
                  
                  If Not(x2=x And y2=y) And x2>=0 And y2>=0 And x2<size And y2<size
                     
                     If feld(x2,y2)=2 Then count=count+1
                     
                  EndIf
                  
               Next
               
            Next
            
            If count>0 And count<3
               
               feld2(x,y)=2
               
            Else
               
               feld2(x,y)=1
               
            EndIf
            
         ElseIf feld(x,y)=2
            
            feld2(x,y)=3
            
         ElseIf feld(x,y)=3
            
            feld2(x,y)=1
            
         EndIf
         
      Next
      
   Next
   
   For x=0 To size
      
      For y=0 To size
         
         feld(x,y)=feld2(x,y)
         
      Next
      
   Next
   
   smin=posx
   smax=GraphicsWidth()/wid+smin
   
   sminy=posy
   smaxy=GraphicsHeight()/wid+sminy
   
   For x=smin To smax
      
      For y=sminy To smaxy
         
         f=feld(x,y)
         
         sx=x*wid-posx*wid
         sy=y*wid-posy*wid
         
         If sx>=-wid And sx<GraphicsWidth() And sy>=-wid And sy<GraphicsHeight()
            
            Select f
               Case 0
                  Color 0,0,0
               Case 1
                  Color 255,255,0
               Case 2
                  Color 0,0,255
               Case 3
                  Color 255,0,0
            End Select
            
            If f Then Rect sx,sy,wid-1,wid-1
            
         EndIf
         
      Next
      
   Next
   
   Flip 0
   
   If MouseHit(1)
      
      For x=0 To size
         
         For y=0 To size
            
            feld(x,y)=feld3(x,y)
            
         Next
         
      Next
      
      FlushKeys
      
      Goto start
      
   EndIf
   
   Delay 250
   
Wend

end


1=keine Leitung
2=Leitung
3=Elektron
4=Elektronenende

Enter=Abspielen
Esc=Beenden

Im Abspielmodus:
Mausklick=Zurück zum Aufbaumodus
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Marek

BeitragMo, Okt 08, 2007 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab da auf der Seite http://www.quinapalus.com/wi-index.html diesen Wireworld Computer-Simulator gefunden (soll angeblich Primzahlen berechnen^^) und da es ihn nur für MacOS oder Linux gab, hab ich F's Programm etwas modifiziert und den Screenshot, den es auf der Seite zu downloaden gab, in ein Savegame verwandelt Laughing

Einfach bb-Programm + Savegame in einen Ordner tuen, Programm ausführen, L drücken, Enter drücken und Spaß haben Wink

Hier das Savegame:https://www.blitzforum.de/upload/file.php?id=2142

Und hier das etwas modifizierte Programm:
Code: [AUSKLAPPEN]
Const SIZEX = 800 ; Fensterbreite
Const SIZEY = 600 ; Fensterhöhe

Graphics SIZEX ,SIZEY,32,2 ; Fenster öffnen
SetBuffer BackBuffer()    ; Buffer setzen

Dim B%(SIZEX + 1,SIZEY + 1)    ;Grundfeld Definiren
Dim B2%(SIZEX  + 1,SIZEY + 1)   ;Hauptfeld Definiren

LA% = 0 ; Linie nicht aktiv

AC = 1 ; Zeichenmodus auf 1 setzen

P = 0 ; Nicht Abspielen

Const GELB = 1*$1000000 + 255*$10000 + 255*$100 + 0 ; Gelbwert ausrechnen
Const ROT = 1*$1000000 + 255*$10000 + 0*$100 + 0 ; Rotwert ausrechnen
Const BLAU = 1*$1000000 + 0*$10000 + 0*$100 + 255 ; Blauwert ausrechnen

ClearCells() ; Zellen Löschen

;HAUPTPROGRAMM
timer=CreateTimer(60)

Repeat ; Wiederhole
   Cls      ; Buffer löschen
   LockBuffer(BackBuffer())
   
   If KeyHit(2) Then AC = 1 ; Zeichenmodus auf 1 Setzen
   If KeyHit(3) Then AC = 2 ; Zeichenmodus auf 2 Setzen
   If KeyHit(4) Then AC = 3 ; Zeichenmodus auf 3 Setzen
   If KeyHit(5) Then AC = 4 ; Zeichenmodus auf 4 Setzen
   If KeyHit(6) Then AC = 5 ; Zeichenmodus auf 5 Setzen
   If KeyHit(7) Then AC = 6 ; Zeichenmodus auf 6 Setzen
   
   If KeyHit(200) Then MoveMouse MouseX(), MouseY() - 1  ; Zeichenmodus auf 1 Setzen
   If KeyHit(208) Then MoveMouse MouseX(), MouseY() + 1 ; Zeichenmodus auf 2 Setzen
   If KeyHit(203) Then MoveMouse MouseX() - 1, MouseY() ; Zeichenmodus auf 3 Setzen
   If KeyHit(205) Then MoveMouse MouseX() + 1, MouseY() ; Zeichenmodus auf 4 Setzen
   
   If MouseHit(1) Then ; Wenn Maus gedrückt
      
      If AC < 4 Then ; Wenn Zeichenmodus kleiner als 4
         
         If LA% = 0 Then ; Wenn Maus noch nicht gedrückt
            
            LA% = 1 ; Maus wurde gedrückt
            
      ; Linien Startpunkt setzen
            
            XX = MouseX()
            YY = MouseY()
            
         ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt
            
            LA% = 0 ; Maus wurde nicht gedrückt
            
            Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
            
            hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
            
            X# = XX
            Y# = YY
            
            B2%(Int(X),Int(Y)) = AC ; Punkt setzen
            
            For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
               
         ; Punktkoordinaten Bewegen :
               
               X = X - Cos(Winkel#)
               Y = Y - Sin(Winkel#)
               
               B2%(Int(X),Int(Y)) = AC ; Punkt auf Hauptfeld setzen
               
            Next
            
         End If
         
      ElseIf AC = 4 Then ; Wenn Zeichenmodus gleich 4
         
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         
      ElseIf AC = 5 Then ; Wenn Zeichenmodus gleich 5
         
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         
      ElseIf AC = 6 Then ; Wenn Zeichenmodus gleich 6
         
         B2%(MouseX() ,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
         
      End If
      
   End If
   
   If MouseHit(2) Then ; Wenn Maus wurde gedrückt
      
      If LA% = 0 Then ; Wenn Maus noch nicht gedrückt
         
         LA% = 1 ; Maus wurde gedrückt
         
      ; Linien Startpunkt setzen
         
         XX = MouseX()
         YY = MouseY()
         
      ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt
         
         LA% = 0 ; Maus wurde nicht gedrückt
         
         Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
         
         hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
         
         X# = XX
         Y# = YY
         
         B2%(Int(X),Int(Y)) = 0 ; Punkt setzen
         
         For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
            
         ; Punktkoordinaten Bewegen :
            
            X = X - Cos(Winkel#)
            Y = Y - Sin(Winkel#)
            
            B2%(Int(X),Int(Y)) = 0 ; Punkt auf Hauptfeld löschen
            
         Next
         
      End If
      
   End If
   
   If LA% = 1 Then ; Wenn Linie aktiv
      
      Color 125,125,125 ; Setze Farbe auf Grau
      Line XX,YY,MouseX(),MouseY() ; Zeichne Linie
      
   End If   
   
   If P = 1 Then UpdateCells() ; Wenn Abspielen Aktiv Dann Aktualisiere die Felder
   
   If KeyHit(25) Then UpdateCells() ; Wenn P Gedrückt Aktualisiere die Felder
   
   If KeyHit(46) Then ClearCells() ; Wenn C Gedrückt Lösche die Felder
   
   If KeyHit(28) Then ; Wenn Enter Gedrückt
      
      If P = 0 Then ; Wenn Abspielen nicht Aktiv
         
         P = 1 ; Abspielen Aktiv
         
      ElseIf P = 1 Then ; Wenn Abspielen Aktiv
         
         P = 0 ;Abspielen nicht Aktiv
         
      End If
      
   End If
   
   If KeyHit(31) Then
      
      SF = WriteFile("ww.wws") ; Datei zum Schreiben Öffnen
      
      For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
         
         For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
            
            If B2%(NX%,NY%) = 0 Then WriteByte SF, 0 ; Wenn Hauptfeld an der Position NX und NY gleich 0 schreibe 0
            If B2%(NX%,NY%) = 1 Then WriteByte SF, 1 ; Wenn Hauptfeld an der Position NX und NY gleich 1 schreibe 1
            If B2%(NX%,NY%) = 2 Then WriteByte SF, 2 ; Wenn Hauptfeld an der Position NX und NY gleich 2 schreibe 2
            If B2%(NX%,NY%) = 3 Then WriteByte SF, 3 ; Wenn Hauptfeld an der Position NX und NY gleich 3 schreibe 3
            
         Next
         
      Next
      
      CloseFile SF ; Datei steam schließen
      
   End If
   
   If KeyHit(38) Then
      
      LF = ReadFile("ww.wws") ; Datei zum Lesen Öffnen
      
      For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
         
         For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
            
            RebY = ReadByte(LF) ; Byte auslesen
            
            If ReBy = 0 Then B2%(NX%,NY%) = 0 ; Wenn gelesenes Byte = 0 Hauptfeld an der Position NX und NY gleich 0
            If ReBy = 1 Then B2%(NX%,NY%) = 1 ; Wenn gelesenes Byte = 1 Hauptfeld an der Position NX und NY gleich 1
            If ReBy = 2 Then B2%(NX%,NY%) = 2 ; Wenn gelesenes Byte = 2 Hauptfeld an der Position NX und NY gleich 2
            If ReBy = 3 Then B2%(NX%,NY%) = 3 ; Wenn gelesenes Byte = 3 Hauptfeld an der Position NX und NY gleich 3
            
         Next
         
      Next
      
      CloseFile LF ; Datei steam schließen
      
   End If
   
   DrawCells() ; Zeichne Zellen
   
   Color 255,255,255 ; Farbe aus Weiß setzen
   
;Kreuz Zeichnen :
   
   Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
   Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1
   
   Rect 1,1,10,10,0 ; Viereck Zeichnen
   
   Select AC
         
      Case 1 ; Wenn Zeichenmodus gleich 1
         
         Color 255,255,0 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 2 ; Wenn Zeichenmodus gleich 2
         
         Color 255,0,0 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 3 ; Wenn Zeichenmodus gleich 3
         
         Color 0,0,255 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 4 ; Wenn Zeichenmodus gleich 4
         
         Color 255,255,0 ; Farbe wechseln
         
         Plot 3,3 ; Punkt zeichnen
         Plot 4,3 ; Punkt zeichnen
         Plot 4,4 ; Punkt zeichnen
         Plot 4,5 ; Punkt zeichnen
         Plot 3,5 ; Punkt zeichnen
         
      Case 5 ; Wenn Zeichenmodus gleich 5
         
         Color 255,255,0 ; Farbe wechseln
         
         Plot 3,3 ; Punkt zeichnen
         Plot 4,3 ; Punkt zeichnen
         Plot 3,4 ; Punkt zeichnen
         Plot 4,5 ; Punkt zeichnen
         Plot 3,5 ; Punkt zeichnen
         
      Case 6 ; Wenn Zeichenmodus gleich 6
         
         Color 255,255,0 ; Farbe wechseln
         
         Line 3,3,5,3 ; Linie zeichnen
         Line 3,4,5,4 ; Linie zeichnen
         Line 3,5,5,5 ; Linie zeichnen
         Line 3,6,4,6 ; Linie zeichnen
         
   End Select
   UnlockBuffer(BackBuffer())
   
   Flip 0; Wechsle den Buffer
   WaitTimer(timer)
Until KeyHit(1) ; slange ESC nicht gedrückt
End ; Programm Beenden

Function DrawCells() ; Zellen Zeichnen
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
      
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         If B2%(NX%,NY%) = 1 Then WritePixel NX%,NY%,GELB ; Wenn Feld an Position NX und NY gleich 1 dann Setze Punkt an Position NX und NY
         
         If B2%(NX%,NY%) = 2 Then WritePixel NX%,NY%,ROT ; Wenn Feld an Position NX und NY gleich 2 dann Setze Punkt an Position NX und NY
         
         If B2%(NX%,NY%) = 3 Then WritePixel NX%,NY%,BLAU ; Wenn Feld an Position NX und NY gleich 3 dann setze Punkt an Position NX und NY
         
      Next
      
   Next
   
End Function

Function ClearCells() ; Lösche Felder
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
      
      For NY% = 1 To SIZEY ; Von 1 zu FensterHöhe
         
         B2%(NX%,NY%) = 0 ; Feld an Position NX und NY gleich 0
         
      Next
      
   Next
   
End Function

Function UpdateCells() ; Aktuallisiere Felder
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
      
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         B%(NX%,NY%) = B2%(NX%,NY%) ; Grundfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
         B2%(NX%,NY%) = 0 ; Hauptfeld an Position NX und NY gleich 0
         
      Next
      
   Next
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
      
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         NZ% = 0 ; Benachbarte Leiterbahnen
         NZZ% = 0 ; Benachbarte Elektronenenden
         NZZZ% = 0 ; Benachbarte Elektronenköpfe
         
         If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1 ; Wenn Feld Oben = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Oben Links = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links Unten = 1 Dann Ben. Leit. + 1
         
         If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten Rechts = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts Oben = 1 Dann Ben. Leit. + 1
         
         If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
         If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         
         If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
         
         If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
         If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         
         If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
         
         Select B%(NX%,NY%)
               
            Case 1 ; Wenn Feld an Position NX und NY = 1
               
               If NZZZ% = 1 Or NZZZ% = 2 Then ; Wenn Benachbarte Elektronenköpfe gleich 1 oder 2
                  
                  B2%(NX%,NY%) = 3 ; Feld an Position NX und NY = 3
                  
               Else ; Ansonsten
                  
                  B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
                  
               End If
               
            Case 2 ; Wenn Feld an Position NX und NY = 2
               
               B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
               
            Case 3 ; Wenn Feld an Position NX und NY = 3
               
               B2%(NX%,NY%) = 2 ; Feld an Position NX und NY = 2
               
         End Select
         
         
         
      Next
      
   Next
   
End Function
Wer lesen kann ist klar im Vorteil...

F

BeitragMo, Okt 08, 2007 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit ich weiß hast du die Größenvariablen am anfang verändert, oder? Wink

Ich habe 2 neue Funktionen eingebaut :

Der Simulator springt jetzt wieder in der Ausganszustand zurück wenn man die Simulation beendet. Das kann man übrigens mit (U)nterbinden.

Wenn man T drückt rechnet der Simulator 50 schritte weiter, bei dem Primzahlenrechner sehr nützlich. Wink

Code: [AUSKLAPPEN]


Const SIZEX = 320 ; Fensterbreite
Const SIZEY = 240 ; Fensterhöhe

Graphics SIZEX ,SIZEY,32 ; Fenster öffnen
SetBuffer BackBuffer()    ; Buffer setzen

Dim B%(SIZEX + 1,SIZEY + 1)    ;Grundfeld Definiren
Dim B2%(SIZEX  + 1,SIZEY + 1)   ;Hauptfeld Definiren
Dim B3%(SIZEX  + 1,SIZEY + 1)   ;Nebenfeld Definiren

LA% = 0 ; Linie nicht aktiv

AC = 1 ; Zeichenmodus auf 1 setzen

P = 0 ; Nicht Abspielen

Const GELB = 1*$1000000 + 255*$10000 + 255*$100 + 0 ; Gelbwert ausrechnen
Const ROT = 1*$1000000 + 255*$10000 + 0*$100 + 0 ; Rotwert ausrechnen
Const BLAU = 1*$1000000 + 0*$10000 + 0*$100 + 255 ; Blauwert ausrechnen

ClearCells() ; Zellen Löschen

;HAUPTPROGRAMM
timer=CreateTimer(60)

Repeat ; Wiederhole
   Cls      ; Buffer löschen
   LockBuffer(BackBuffer())
   
   If KeyHit(2) Then AC = 1 ; Zeichenmodus auf 1 Setzen
   If KeyHit(3) Then AC = 2 ; Zeichenmodus auf 2 Setzen
   If KeyHit(4) Then AC = 3 ; Zeichenmodus auf 3 Setzen
   If KeyHit(5) Then AC = 4 ; Zeichenmodus auf 4 Setzen
   If KeyHit(6) Then AC = 5 ; Zeichenmodus auf 5 Setzen
   If KeyHit(7) Then AC = 6 ; Zeichenmodus auf 6 Setzen
   
   If KeyHit(200) Then MoveMouse MouseX(), MouseY() - 1  ; Zeichenmodus auf 1 Setzen
   If KeyHit(208) Then MoveMouse MouseX(), MouseY() + 1 ; Zeichenmodus auf 2 Setzen
   If KeyHit(203) Then MoveMouse MouseX() - 1, MouseY() ; Zeichenmodus auf 3 Setzen
   If KeyHit(205) Then MoveMouse MouseX() + 1, MouseY() ; Zeichenmodus auf 4 Setzen
   
   If MouseHit(1) Then ; Wenn Maus gedrückt
     
      If AC < 4 Then ; Wenn Zeichenmodus kleiner als 4
         
         If LA% = 0 Then ; Wenn Maus noch nicht gedrückt
           
            LA% = 1 ; Maus wurde gedrückt
           
      ; Linien Startpunkt setzen
           
            XX = MouseX()
            YY = MouseY()
           
         ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt
           
            LA% = 0 ; Maus wurde nicht gedrückt
           
            Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
           
            hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
           
            X# = XX
            Y# = YY
           
            B2%(Int(X),Int(Y)) = AC ; Punkt setzen
           
            For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
               
         ; Punktkoordinaten Bewegen :
               
               X = X - Cos(Winkel#)
               Y = Y - Sin(Winkel#)
               
               B2%(Int(X),Int(Y)) = AC ; Punkt auf Hauptfeld setzen
               
            Next
           
         End If
         
      ElseIf AC = 4 Then ; Wenn Zeichenmodus gleich 4
         
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         
      ElseIf AC = 5 Then ; Wenn Zeichenmodus gleich 5
         
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX(),MouseY() - 1) = 1 ; Punkt auf Hauptfeld setzen
         
      ElseIf AC = 6 Then ; Wenn Zeichenmodus gleich 6
         
         B2%(MouseX() ,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY()) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY() + 1) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 2,MouseY() + 2) = 1 ; Punkt auf Hauptfeld setzen
         
         B2%(MouseX() ,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
         B2%(MouseX() + 1,MouseY() + 3) = 1 ; Punkt auf Hauptfeld setzen
         
      End If
     
   End If
   
   If MouseHit(2) Then ; Wenn Maus wurde gedrückt
     
      If LA% = 0 Then ; Wenn Maus noch nicht gedrückt
         
         LA% = 1 ; Maus wurde gedrückt
         
      ; Linien Startpunkt setzen
         
         XX = MouseX()
         YY = MouseY()
         
      ElseIf LA% = 1 Then ; Wenn Maus wurde gedrückt
         
         LA% = 0 ; Maus wurde nicht gedrückt
         
         Winkel#=(ATan2(YY - MouseY(),XX - MouseX())) Mod 360 ; Linien Winkel berechnen
         
         hyp# = Sqr((XX - MouseX())^2 + (YY - MouseY())^2) ; Länge der Linie( Hypothenuse )
         
         X# = XX
         Y# = YY
         
         B2%(Int(X),Int(Y)) = 0 ; Punkt setzen
         
         For N = 1 To hyp# ; Von 1 zur Länge der Linie ( Hypothenuse )
           
         ; Punktkoordinaten Bewegen :
           
            X = X - Cos(Winkel#)
            Y = Y - Sin(Winkel#)
           
            B2%(Int(X),Int(Y)) = 0 ; Punkt auf Hauptfeld löschen
           
         Next
         
      End If
     
   End If
   
   If LA% = 1 Then ; Wenn Linie aktiv
     
      Color 125,125,125 ; Setze Farbe auf Grau
      Line XX,YY,MouseX(),MouseY() ; Zeichne Linie
     
   End If   
   
   If P = 1 Then UpdateCells() ; Wenn Abspielen Aktiv Dann Aktualisiere die Felder
   
   If KeyHit(25) Then UpdateCells() ; Wenn P Gedrückt Aktualisiere die Felder
   
   If KeyHit(46) Then ClearCells() ; Wenn C Gedrückt Lösche die Felder
   
   If KeyHit(28) Then ; Wenn Enter Gedrückt
     
      If P = 0 Then ; Wenn Abspielen nicht Aktiv
         
         P = 1 ; Abspielen Aktiv

       For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
             For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
               B3%(NX%,NY%) = B2%(NX%,NY%) ; Nebenfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
         
            Next
     
         Next
         
      ElseIf P = 1 Then ; Wenn Abspielen Aktiv
         
         P = 0 ;Abspielen nicht Aktiv

       For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
             For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
               B2%(NX%,NY%) = B3%(NX%,NY%) ; Hauptfeld an Position NX und NY gleich Nebenfeld an Position NX und NY
            B3%(NX%,NY%) = 0 ; Nebenfeld an Position NX und NY gleich 0

            Next
     
         Next
         
      End If

   If KeyHit(22) Then P = 0
        
   End If
   
   If KeyHit(31) Then
     
      SF = WriteFile("ww.wws") ; Datei zum Schreiben Öffnen
     
      For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
         
         For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
           
            If B2%(NX%,NY%) = 0 Then WriteByte SF, 0 ; Wenn Hauptfeld an der Position NX und NY gleich 0 schreibe 0
            If B2%(NX%,NY%) = 1 Then WriteByte SF, 1 ; Wenn Hauptfeld an der Position NX und NY gleich 1 schreibe 1
            If B2%(NX%,NY%) = 2 Then WriteByte SF, 2 ; Wenn Hauptfeld an der Position NX und NY gleich 2 schreibe 2
            If B2%(NX%,NY%) = 3 Then WriteByte SF, 3 ; Wenn Hauptfeld an der Position NX und NY gleich 3 schreibe 3
           
         Next
         
      Next
     
      CloseFile SF ; Datei steam schließen
     
   End If
   
   If KeyHit(38) Then
     
      LF = ReadFile("ww.wws") ; Datei zum Lesen Öffnen
     
      For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
         
         For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
           
            RebY = ReadByte(LF) ; Byte auslesen
           
            If ReBy = 0 Then B2%(NX%,NY%) = 0 ; Wenn gelesenes Byte = 0 Hauptfeld an der Position NX und NY gleich 0
            If ReBy = 1 Then B2%(NX%,NY%) = 1 ; Wenn gelesenes Byte = 1 Hauptfeld an der Position NX und NY gleich 1
            If ReBy = 2 Then B2%(NX%,NY%) = 2 ; Wenn gelesenes Byte = 2 Hauptfeld an der Position NX und NY gleich 2
            If ReBy = 3 Then B2%(NX%,NY%) = 3 ; Wenn gelesenes Byte = 3 Hauptfeld an der Position NX und NY gleich 3
           
         Next
         
      Next
     
      CloseFile LF ; Datei steam schließen
     
   End If
   
   If KeyHit(20) Then ; Wenn T Gedrückt
      
      For N = 1 To 50 ; von 1 zu 50
   
         UpdateCells() ; Aktualisiere Zellen
   
      Next
      
      FlushKeys ; Lösche Tastendrücke
   
   End If

   DrawCells() ; Zeichne Zellen
   
   Color 255,255,255 ; Farbe aus Weiß setzen
   
;Kreuz Zeichnen :
   
   Line MouseX() - 1,MouseY(),MouseX() + 1,MouseY()
   Line MouseX(),MouseY() - 1,MouseX(),MouseY() + 1
   
   Rect 1,1,10,10,0 ; Viereck Zeichnen
   
   Select AC
         
      Case 1 ; Wenn Zeichenmodus gleich 1
         
         Color 255,255,0 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 2 ; Wenn Zeichenmodus gleich 2
         
         Color 255,0,0 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 3 ; Wenn Zeichenmodus gleich 3
         
         Color 0,0,255 ; Farbe wechseln
         
         Rect 3,3,6,6,1 ; Viereck Zeichnen
         
      Case 4 ; Wenn Zeichenmodus gleich 4
         
         Color 255,255,0 ; Farbe wechseln
         
         Plot 3,3 ; Punkt zeichnen
         Plot 4,3 ; Punkt zeichnen
         Plot 4,4 ; Punkt zeichnen
         Plot 4,5 ; Punkt zeichnen
         Plot 3,5 ; Punkt zeichnen
         
      Case 5 ; Wenn Zeichenmodus gleich 5
         
         Color 255,255,0 ; Farbe wechseln
         
         Plot 3,3 ; Punkt zeichnen
         Plot 4,3 ; Punkt zeichnen
         Plot 3,4 ; Punkt zeichnen
         Plot 4,5 ; Punkt zeichnen
         Plot 3,5 ; Punkt zeichnen
         
      Case 6 ; Wenn Zeichenmodus gleich 6
         
         Color 255,255,0 ; Farbe wechseln
         
         Line 3,3,5,3 ; Linie zeichnen
         Line 3,4,5,4 ; Linie zeichnen
         Line 3,5,5,5 ; Linie zeichnen
         Line 3,6,4,6 ; Linie zeichnen
         
   End Select
   UnlockBuffer(BackBuffer())
   
   Flip 0; Wechsle den Buffer
   WaitTimer(timer)
Until KeyHit(1) ; slange ESC nicht gedrückt
End ; Programm Beenden

Function DrawCells() ; Zellen Zeichnen
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         If B2%(NX%,NY%) = 1 Then WritePixel NX%,NY%,GELB ; Wenn Feld an Position NX und NY gleich 1 dann Setze Punkt an Position NX und NY
         
         If B2%(NX%,NY%) = 2 Then WritePixel NX%,NY%,ROT ; Wenn Feld an Position NX und NY gleich 2 dann Setze Punkt an Position NX und NY
         
         If B2%(NX%,NY%) = 3 Then WritePixel NX%,NY%,BLAU ; Wenn Feld an Position NX und NY gleich 3 dann setze Punkt an Position NX und NY
         
      Next
     
   Next
   
End Function

Function ClearCells() ; Lösche Felder
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
      For NY% = 1 To SIZEY ; Von 1 zu FensterHöhe
         
         B2%(NX%,NY%) = 0 ; Feld an Position NX und NY gleich 0
         
      Next
     
   Next
   
End Function

Function UpdateCells() ; Aktuallisiere Felder
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         B%(NX%,NY%) = B2%(NX%,NY%) ; Grundfeld an Position NX und NY gleich Hauptfeld an Position NX und NY
         B2%(NX%,NY%) = 0 ; Hauptfeld an Position NX und NY gleich 0
         
      Next
     
   Next
   
   For NX% = 1 To SIZEX ; Von 1 zu Fensterbreite
     
      For NY% = 1 To SIZEY ; Von 1 zu Fensterhöhe
         
         NZ% = 0 ; Benachbarte Leiterbahnen
         NZZ% = 0 ; Benachbarte Elektronenenden
         NZZZ% = 0 ; Benachbarte Elektronenköpfe
         
         If B%(NX%,NY% - 1) = 1 Then NZ% = NZ% +  1 ; Wenn Feld Oben = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Oben Links = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links = 1 Dann Ben. Leit. + 1
         If B%(NX% - 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Links Unten = 1 Dann Ben. Leit. + 1
         
         If B%(NX%,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY% + 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Unten Rechts = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY%) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts = 1 Dann Ben. Leit. + 1
         If B%(NX% + 1,NY% - 1) = 1 Then NZ% = NZ% + 1 ; Wenn Feld Rechts Oben = 1 Dann Ben. Leit. + 1
         
         If B%(NX%,NY% - 1) = 2 Then NZZ% = NZZ% +  1
         If B%(NX% - 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% - 1,NY%) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% - 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         
         If B%(NX%,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY% + 1) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY%) = 2 Then NZZ% = NZZ% + 1
         If B%(NX% + 1,NY% - 1) = 2 Then NZZ% = NZZ% + 1
         
         If B%(NX%,NY% - 1) = 3 Then NZZZ% = NZZZ% +  1
         If B%(NX% - 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% - 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% - 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         
         If B%(NX%,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY% + 1) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY%) = 3 Then NZZZ% = NZZZ% + 1
         If B%(NX% + 1,NY% - 1) = 3 Then NZZZ% = NZZZ% + 1
         
         Select B%(NX%,NY%)
               
            Case 1 ; Wenn Feld an Position NX und NY = 1
               
               If NZZZ% = 1 Or NZZZ% = 2 Then ; Wenn Benachbarte Elektronenköpfe gleich 1 oder 2
                 
                  B2%(NX%,NY%) = 3 ; Feld an Position NX und NY = 3
                 
               Else ; Ansonsten
                 
                  B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
                 
               End If
               
            Case 2 ; Wenn Feld an Position NX und NY = 2
               
               B2%(NX%,NY%) = 1 ; Feld an Position NX und NY = 1
               
            Case 3 ; Wenn Feld an Position NX und NY = 3
               
               B2%(NX%,NY%) = 2 ; Feld an Position NX und NY = 2
               
         End Select
         
         
         
      Next
     
   Next
   
End Function

 

Marek

BeitragMo, Okt 08, 2007 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Zuerst hatte ich nur das gemacht, ja. Allerdings war das Programm dann soooo langsam, dass ich zusätzlich nuch etwas Speed-Optimierung vornehmen musste^^ Sonst wäre es einfach unvorzeigbar gewesen(wegen der Größe) Wink

Achja, mal so nebenbei: Hab das Programm über Nacht laufen lassen um herauszufinden, ob das Programm überhaupt irgendwas macht. Nun ja, funktionieren tut es wohl... leider hat es aber nur 2 Primzahlen während der Nacht berechnet... die 21 und die 23^^
Wer lesen kann ist klar im Vorteil...

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group