Blowfish-Algorithmus

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jamagin

Betreff: Blowfish-Algorithmus

BeitragDo, Aug 04, 2016 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer hat schon Erfahrung mit dem Blowfish-Algorithmus gemacht bzw. damit experimentiert?
Da ich ein Slotgame programmiere findet dieser darin Anwendung wegen des RNG (Random Number Generator) und ich weiß aber nicht wie man diesen einsetzt bzw. wie man aus diesem Algo die Symbole berechnet!

Vielleicht kann mir dabei jemand behilflich sein. Mein Slotgame hat 5 Walzen zu 3 Reihen, also wie folgt:

x x x x x
x x x x x
x x x x x

Tja, nun steck ich fest, denn die Symbole rechne ich mit RAND(von, bis) aber in wirklicher Casino-Technology wird das sicher anders gehandhabt!

Kann mir da wer Tipps geben, bitte!


lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

SpionAtom

Betreff: Slot Machine

BeitragDo, Aug 04, 2016 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz ehrlich, ich versteh dein Problem nicht Laughing

Ich hatte Bock und ich habe Urlaub, also hab ich ein Grundgerüst geschrieben für eine Slotmachine - und das ganz ohne Blowfish.
Für eine richtige Slotmachine fehlt natürlich noch die Auswertung der Reihen und der ganze Kram mit Einsatz und Gewinn. Abgesehen davon und von der grafischen Aufmachung, die man z.B. mit weicher Rotationsanimation verschönern könnte, ist das schon als Basis zu gebrauchen.

BlitzBasic: [AUSKLAPPEN]

Const ANZAHLWALZEN = 5 ;Anzahl der Walzen
Const WALZENGROESSE = 6 ;Anzahl der Symbole pro Walze
Const ANZAHLREIHEN = 3 ;Anzahl der dargestellten Reihen (muss kleiner sein als Walzengroesse)


Graphics 640, 480, 0, 2
AppTitle "$lot Machine"
Global MG_w = GraphicsWidth() ;Dimension der Machine
Global MG_h = ANZAHLREIHEN * 100
Global MG_x = (GraphicsWidth() - MG_w) / 2 ;Top-Left-Position der Machine
Global MG_y = (GraphicsHeight() - MG_h) / 2
Global WGS_w = MG_w / ANZAHLWALZEN ;Dimension eines Walzensymbols
Global WGS_h = MG_h / ANZAHLREIHEN


SeedRnd MilliSecs() ;Zufallsgenerator initialisieren
Global fpsTimer = CreateTimer(60)


;In machine wird die Walzenkonfiguration festgehalten.
;Hier besteht jede Walze einfach auf aufeinanderfolgenden Zahlen
Dim machine(ANZAHLWALZEN - 1, WALZENGROESSE - 1)
For w = 1 To ANZAHLWALZEN
For i = 1 To WALZENGROESSE
machine(w - 1, i - 1) = i
Next
Next

;Das zweidimensionale Array kann man in einer Tabelle darstellen.
;
; 1 1 1 1 1
; 2 2 2 2 2
; 3 3 3 3 3
; 4 4 4 4 4
; 5 5 5 5 5
; 6 6 6 6 6
;
;Hier werden die ersten ANZAHLREIHEN Reihen angezeigt

;Welches Symbol gerade oben ist, wird im folgenen Array festgehalten.
;Dieses wird zu Beginn und bei jedem neuen Rotierstarten zufällig festgelegt.
;Beachte, dass die Walzenposition von 0 bis WALZENGROESSE - 1 geht.
Dim walzenposition(ANZAHLWALZEN - 1)
For w = 1 To ANZAHLWALZEN
walzenposition(w) = Rand(0, WALZENGROESSE - 1)
Next

;Hier ein mögliches Beispiel nachdem gespielt wurde.
;
; 3 0 1 4 2 <- Walzenposition
;
; 4 1 2 5 3
; 5 2 3 6 4
; 6 3 4 1 5
; 1 4 5 2 6
; 2 5 6 3 1
; 3 6 1 4 2

;Die Walzen-Grafiken sind Bilder, die untereinander alle Symbole beinhalten.
;Um später Rechnerei zu ersparen werden unterhalb der Symbole nochmal die oberen ANZAHLREIHEN Symbole angehängt.
;Eine Walzen-Grafik sieht dann so aus:
;
; 1
; 2
; 3
; 4
; 5
; 6
; 1
; 2
; 3
;
;Das hat den Vorteil, dass wenn man das fünfte oder sechste Symbol anzeigt, die nächsten drei Symbole gleich mit dargestellt werden.
;Denn es handelt sich ja um eine Walze, also muss nach dem letzten wieder das erste Symbol folgen.
;Angezeigt wird immer nur ein Ausschnitt des Bildes, und zwar von Walzenposition bis Walzenposition + ANZAHLREIHEN.

Dim walzengrafik(ANZAHLWALZEN - 1)

SetFont LoadFont("Courier", 32, 1)
For w = 0 To ANZAHLWALZEN - 1

walzengrafik(w) = CreateImage(WGS_w, WGS_h * (WALZENGROESSE + ANZAHLREIHEN))
SetBuffer ImageBuffer(walzengrafik(w))

For s = 0 To WALZENGROESSE - 1

;Statt Text kann man natürlich auch Bilder in die Walzen zeichnen
t$ = "NULL"
Select machine(w, s)
Case 1: t$ = "EINS"
Case 2: t$ = "ZWEI"
Case 3: t$ = "DREI"
Case 4: t$ = "VIER"
Case 5: t$ = "FÜNF"
Case 6: t$ = "SECHS"
End Select

Rect 1, s * WGS_h + 1, WGS_w - 2, WGS_h - 2, 0
Text (WGS_w - StringWidth(t$)) / 2, s * WGS_h + (WGS_h - StringHeight(t$)) / 2, t$

If s < ANZAHLREIHEN Then
CopyRect 0, s * WGS_h, WGS_w, WGS_h, 0, (WALZENGROESSE + s) * WGS_h
End If
Next

Next

Local modus$ = "STOPPED"
Local verzoegerung = 300

SetBuffer BackBuffer()
Repeat

If KeyHit(57) Then ;Leertaste gedrückt
FlushKeys()
Select Upper(modus$)
Case "STOPPED"
rotatingStartTime = MilliSecs()
modus$ = "STARTROTATING"
Case "ROTATING"
rotatingStartTime = MilliSecs()
modus$ = "STOPROTATING"
End Select
End If

Select Upper(modus$)
Case "STOPPED"
anleitung$ = "Drücke Leertaste zum Starten"
Case "STARTROTATING"
anleitung$ = ""
;Nacheinander allen Walzen eine neue Startposition geben
For w = 0 To ANZAHLWALZEN - 1
If MilliSecs() - rotatingStartTime > (w + 1) * verzoegerung Then
walzenposition(w) = Rand(0, WALZENGROESSE - 1) ;Walzenposition neu erwürfeln
End If
Next
If MilliSecs() - rotatingStartTime > (ANZAHLWALZEN + 1) * verzoegerung Then modus$ = "ROTATING"
Case "ROTATING"
anleitung$ = "Drücke Leertaste zum Stoppen"
;Rotiere die Walzen
For w = 0 To ANZAHLWALZEN - 1
walzenposition(w) = (walzenposition(w) + 1) Mod WALZENGROESSE
Next
Case "STOPROTATING"
anleitung$ = ""
;Nacheinander alle Walzen stoppen
For w = 0 To ANZAHLWALZEN - 1
If MilliSecs() - rotatingStartTime < (w + 1) * verzoegerung Then
walzenposition(w) = (walzenposition(w) + 1) Mod WALZENGROESSE
End If
Next
If MilliSecs() - rotatingStartTime > (ANZAHLWALZEN + 1) * verzoegerung Then modus$ = "STOPPED"
End Select


Cls
Text 0, 0, anleitung$

zeigeMachine()

Flip(0)
WaitTimer fpsTimer

Until KeyDown(1)
End


Function zeigeMachine()

;Walzen zeigen
For w = 0 To ANZAHLWALZEN - 1
DrawImageRect walzengrafik(w), MG_x + w * WGS_w, MG_y, 0, walzenposition(w) * WGS_h, WGS_w, ANZAHLREIHEN * WGS_h
Next


End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Tennisball

BeitragDo, Aug 04, 2016 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Äh, Blowfish ist meiner Erinnerung nach aber eine Blockchiffre, wie kommst du darauf den in einem Slotgame zu implementieren? Klär mich auf wenn ich falsch liege.

Xeres

Moderator

BeitragDo, Aug 04, 2016 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Was möchtest du denn eigentlich erreichen?
Möglichst keine Wiederholungen in aufeinander folgenden Spielen?
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)

SpionAtom

Betreff: Nächster Versuch

BeitragDo, Aug 04, 2016 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit etwas mehr Animation, noch nicht perfekt.
Und diesmal ohne klassische Walzen. Es fallen jetzt einfach von oben zufällige Symbole nach.

BlitzBasic: [AUSKLAPPEN]
Const xr = 640, yr = 480, fps = 50
Graphics xr, yr, 0, 2
AppTitle "$lot Machine II"
Global fpsTimer = CreateTimer(fps)

Const ANZAHLSPALTEN = 5
Const ANZAHLREIHEN = 3
Const ANZAHLSYMBOLE = 6

Global MG_w = xr, MG_h = ANZAHLREIHEN * 100 ;Dimension der gesamten Slot Machine
Global SG_w = MG_w / ANZAHLSPALTEN, SG_h = MG_h / ANZAHLREIHEN ;Dimension eines Symbols
Global MG_x = (xr - MG_w) / 2, MG_Y = (yr - MG_h) / 2 ;Zentriere Slot Machine im Fenster

;Erstelle Symbole - klar, man könnte sie auch laden...
Global SymbolBild[ANZAHLSYMBOLE - 1]
Local sfonts = 5, sfont[5]
SetFont LoadFont("Courier New", SG_h, 1)

For i = 0 To ANZAHLSYMBOLE - 1
SymbolBild[i] = CreateImage(SG_w, SG_h)
SetBuffer ImageBuffer(SymbolBild[i])
Color 255, 255, 255: Rect 1, 1, SG_w - 2, SG_h - 2
Color 55, 55, 55: Rect 1, 1, SG_w - 2, SG_h - 2, 0

Select i ;verrückte Symbole nehmen
Case 0: t$ = Chr$(167): Color 55, 155, 255
Case 1: t$ = Chr$(162): Color 155, 55, 255
Case 2: t$ = Chr$(163): Color 255, 155, 55
Case 3: t$ = Chr$(165): Color 255, 55, 155
Case 4: t$ = Chr$(036): Color 55, 255, 155
Case 5: t$ = Chr$(128): Color 155, 255, 55
Default: t$ = i + "": Color 155, 155, 155
End Select
Text (SG_w - StringWidth(t$)) / 2, (SG_h - StringHeight(t$)) / 2, t$

Next

Dim machine(ANZAHLSPALTEN - 1, ANZAHLREIHEN) ;die nullte Reihe ist für das neue Symbol
Global machineAni#[ANZAHLSPALTEN], machineAniVel#[ANZAHLSPALTEN], machineState = 0

;Fülle Machine mit random Symbolen
For s = 0 To ANZAHLSPALTEN - 1
For r = 0 To ANZAHLREIHEN
machine(s, r) = Rand(0, ANZAHLSYMBOLE - 1)
Next
Next

resetMachine
SetBuffer BackBuffer()
SetFont LoadFont("Courier New", 32)

Repeat

spaceHit = KeyHit(57)

updateMachine spaceHit

Cls

Text 0, 0, "Press Space to start / stop"
drawMachine

Flip(0)
WaitTimer fpsTimer


Until KeyDown(1)
End


Function updateMachine(spaceHit)

If machineState = 0 ;stopped
resetMachine
If spaceHit Then machineState = 1
End If

If machineState = 2 ;all rotating with max speed
If spaceHit Then machineState = 3
End If

If machineState = 4 Then ;all stopped rotating
machineState = 0 ; eigentlich müsste hier die Auswertung rein
End If

allRotatingFullspeed = 0
If machineState = 1 Or machineState = 2 Then
For s = 0 To ANZAHLSPALTEN - 1

machineAni[s] = machineAni[s] + machineAniVel[s]
machineAniVel[s] = machineAniVel[s] + 0.1
If machineAniVel[s] > 10 Then
machineAniVel[s] = SG_h / 4
allRotatingFullspeed = allRotatingFullspeed + 1
End If

If machineAni[s] > SG_h Then
;Symbole aufrücken
For i = ANZAHLREIHEN To 1 Step -1
machine(s, i) = machine(s, i - 1)
Next

;neues Symbol nachrücken
machine(s, 0) = Rand(0, ANZAHLSYMBOLE - 1)

;ani zurücksetzen
machineAni[s] = machineAni[s] Mod SG_h
End If
Next
If allRotatingFullspeed = ANZAHLSPALTEN Then
machineState = 2
End If

Else If machineState = 3 Then
allStopped = 0
For s = 0 To ANZAHLSPALTEN - 1

machineAni[s] = machineAni[s] + machineAniVel[s]
If machineAniVel[s] > 3 Then machineAniVel[s] = machineAniVel[s] * 0.9

If machineAni[s] < 5 And machineAniVel[s] < 3 Then
machineAni[s] = 0
allStopped = allStopped + 1
End If

If machineAni[s] > SG_h Then
;Symbole aufrücken
For i = ANZAHLREIHEN To 1 Step -1
machine(s, i) = machine(s, i - 1)
Next

;neues Symbol nachrücken
machine(s, 0) = Rand(0, ANZAHLSYMBOLE - 1)

;ani zurücksetzen
machineAni[s] = machineAni[s] Mod SG_h
End If
Next
If allStopped = ANZAHLSPALTEN Then
machineState = 4
End If

End If


End Function

Function resetMachine()

;Setze die Animationszeiger auf 0
For s = 0 To ANZAHLSPALTEN - 1
machineAni[s] = 0
machineAniVel[s] = ANZAHLSPALTEN - s
Next

;machine state auf 0 setzen
machineState = 0

End Function

Function drawMachine()


Viewport MG_x, MG_Y, MG_w, MG_h
Color 155, 155, 155
Rect MG_x, MG_Y, MG_w, MG_h, 0

For s = 0 To ANZAHLSPALTEN - 1

For r = 0 To ANZAHLREIHEN
symbol = machine(s, r)
DrawImage MG_x + SymbolBild[symbol], s * SG_w, MG_Y + (r - 1) * SG_h + machineAni[s]

Next
Next



;reset viewport
Viewport 0, 0, xr, yr

End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Jamagin

Betreff: Blowfish-Algorithmus

BeitragFr, Aug 05, 2016 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke SpionAtom!

Ich schaue mir deine 2 Beispiele ganz genau an! Finde das echt klasse von dir und das mit sowenig Code!
* Hutab *

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group