Frage zur funktion zum Quellcode im forum

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Krumu1201

Betreff: Frage zur funktion zum Quellcode im forum

BeitragFr, Okt 07, 2016 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe folgenden code hier im forum gefunden:
BlitzBasic: [AUSKLAPPEN]


Const SIZE = 5
Const TILESIZE = 50
Dim dat(SIZE, SIZE)

game()
End

Function init()
For i = 0 To SIZE -1
For j = 0 To SIZE -1
dat(i, j) = j * SIZE + i + 1
Next
Next

dat(SIZE -1, SIZE -1) = 0
End Function

Function shuffle()
Local x0, y0

For k = 0 To (SIZE * SIZE) ^2
For i = 0 To SIZE -1
For j = 0 To SIZE -1
If dat(i, j) = 0
x0 = i
y0 = j
EndIf
Next
Next

If Rand(0, 1) = 0
x = Rand(0, SIZE -1)
y = y0

play(x, y)
Else
x = Rand(0, SIZE -1)
y = x0

play(x, y)
EndIf
Next
End Function

Function draw()
For i = 0 To SIZE -1
For j = 0 To SIZE -1
If dat(i, j) <> 0
Color 200, 200, 200
Rect i * TILESIZE, j * TILESIZE, TILESIZE, TILESIZE

Color 0, 0, 0
Rect i * TILESIZE, j * TILESIZE, TILESIZE, TILESIZE, 0
Text i * TILESIZE + TILESIZE /2, j * TILESIZE + TILESIZE /2, dat(i, j)
EndIf
Next
Next
End Function

Function play(x, y)
Local x0, y0

For i = 0 To SIZE -1
For j = 0 To SIZE -1
If dat(i, j) = 0
x0 = i
y0 = j
EndIf
Next
Next

If x = x0
If y < y0
For i = y0 To y +1 Step -1
dat(x, i) = dat(x, i -1)
Next

dat(x, y) = 0
ElseIf y > y0
For i = y0 To y -1
dat(x, i) = dat(x, i +1)
Next

dat(x, y) = 0
Else
DebugLog "wrong!"
EndIf
ElseIf y = y0
If x < x0
For i = x0 To x +1 Step -1
dat(i, y) = dat(i -1, y)
Next

dat(x, y) = 0
ElseIf x > x0
For i = x0 To x -1
dat(i, y) = dat(i +1, y)
Next

dat(x, y) = 0
Else
DebugLog "wrong!"
EndIf
Else
DebugLog "wrong!"
EndIf
End Function

Function game()
Graphics SIZE * TILESIZE, SIZE * TILESIZE, 0, 2
SetBuffer BackBuffer()

Local timer = CreateTimer(60)

init()
shuffle()

While Not KeyHit(1)
draw()

If MouseHit(1)
xTile = MouseX() /TILESIZE
yTile = MouseY() /TILESIZE

play(xTile, yTile)
EndIf

Flip 0
WaitTimer(timer)
Cls
Wend

Return
End Function


verstehe allerdings die shuffle funktion nicht so ganz. Wieso muss die äußere for schleife 626 mal durchlaufen, damit die tiles unsortiert sind? Schreibe hier noch mal die funktion hin um die es geht:

BlitzBasic: [AUSKLAPPEN]

Function shuffle()
Local x0, y0

For k = 0 To (SIZE * SIZE) ^2
For i = 0 To SIZE -1
For j = 0 To SIZE -1
If dat(i, j) = 0
x0 = i
y0 = j
EndIf
Next
Next

If Rand(0, 1) = 0
x = Rand(0, SIZE -1)
y = y0

play(x, y)
Else
x = Rand(0, SIZE -1)
y = x0

play(x, y)
EndIf
Next
End Function

BladeRunner

Moderator

BeitragFr, Okt 07, 2016 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schätze mal dass dieser Wert einfach so gesetzt wurde um ein ausreichend häufiges Tauschen der Karten vorzunehmen. Du könntest sicher auch andere Werte einsetzen.
Bei &25 Shuffles wurde halt jede Karte 25mal bewegt, das sollte doch einiges an durcheinander bringen. Du kannst ja testweise einfach mal andere Werte einsetzen.
Ich finde es auch gut dass es an die Anzahl an Feldern angepasst ist, ein fixer Wert würde bei verschieden großen Arrays verschieden stark durchmischen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Krumu1201

Betreff: Danke für die antwort

BeitragMo, Okt 10, 2016 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ist es immer am besten so viele karten es gibt hoch 2 oft zu mischen?

BladeRunner

Moderator

BeitragMo, Okt 10, 2016 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt hier kein am besten in dem Sinne.
Es ist ein abwägen zwischen gut gemischt und zeitlichem Aufwand.
Du kannst auch blind eine Million mal mischen, nur ob das hellt nötig ist...
Ich finde das Quadrat zur Anzahl einfach recht gut im Ansatz, da jede Karte mehrfach verschoben wird.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragDi, Okt 11, 2016 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt auch andere Varianten, wie du schneller und besser mischen kannst.

Eine Variante wäre:
Beginne mit zwei Listen, eine Liste ist leer, die Andere hat alle Karten drin.
Solange es noch Karten in der zweiten Liste gibt, nimm eine zufällige Karte aus der 2. Liste und hänge sie hinten an die erste Liste an.
Dann hast du eine gut gemischte Liste und brauchst jede Karte nur genau ein Mal angreifen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group