ich habe für die Slot Machine eine Class FROM Thread entwickelt. Damit stelle ich die "Walzen" dar.
Das funktioniert auch im Prinzip, aber leider gibt es (ab und zu) mit der 1st Walze ein Problem bei "Restart" ... nicht mit der 2nd oder 3th oder ...
so, so ... der Array Index soll also 0 sein ...------------------------------------------------------------------------------
FEHLERPROTOKOLL von "D:\ALASKA\SLOT\SLOT.EXE" Datum: 08.06.10 18:23:01
Xbase++ Version : Xbase++ (R) Version 1.90.355
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: A VALUE: {10, 8, 5, 6, 9, 1, 4, 11, 2, 7, 3}
-> VALTYPE: N VALUE: 0
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Fehler bei der Arrayindizierung
oError:filename :
oError:genCode : 4
oError:operation : <A of 11>[<0>]
oError:osCode : 0
oError:severity : 2
oError:subCode : 1012
oError:subSystem : BASE
oError:thread : 3
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von SLOTROLL:SCHIEBER(402)
Aufgerufen von SLOTROLL:BROROLL(317)
Aufgerufen von SLOTROLL:EXECUTE(280)
Code: Alles auswählen
METHOD SlotRoll:Schieber()
LOCAL xxx
* ARemove(::aSchieber,1)
// statt ARemove(), hier in Einzelschritten
::aSchieber[1] := ::aSchieber[2]
::aSchieber[2] := ::aSchieber[3]
// das ist der Array Index <> 0
::nZahlLast++
IF ::nZahlLast > MAXICON
::nZahlLast := 1
ENDIF
// statt AADD() direkte Zuweisung
* AADD(::aSchieber, ::nZahlLast )
::aSchieber[3] := ::nZahlLast
xxx := ::aZahl[::aSchieber[1]] // kann nicht 0 werden ?
::oFeld11:SetCaption(::aArray[xxx]) // knallt hier mit 0 bei restart
xxx := ::aZahl[::aSchieber[2]]
::oFeld12:SetCaption(::aArray[xxx])
xxx := ::aZahl[::aSchieber[3]]
::oFeld13:SetCaption(::aArray[xxx])
RETURN self
meine Restart sieht so aus
Code: Alles auswählen
CASE nEvent = xbeE_Start
IF oLever:lallow
IF nDeposit > 0
// Hintergrund wechseln
ChangeBack(aBackground,oDlg,.T.)
// ist noch Money vorhanden ?
HaveMoney(oCoin,nDeposit)
nCoin := oCoin:getData()
nDeposit := nDeposit-nCoin
oCoin:disable()
oDeposit:Setcaption( LTRIM(STR(nDeposit)) )
// weiter Action vermeiden
lDoOnce := .T.
// Anzeige zurück setzten
IF nGewin > 0
aGewin[nGewin]:setPresParam(aSayPres)
aGewin[nGewin]:setPresParam(aPbPres)
nGewin := 0
ENDIF
// Hebel ( Level) des "einarmigen Bandit "
oLever:Animate(mp1)
// Kontroll Anzeige
aWin[1] := aWin[2] := aWin[3] := 0
bWin[1] := bWin[2] := bWin[3] := 0
cWin[1] := cWin[2] := cWin[3] := 0
SayLine(oLine1,oLine2,oLine3,aWin,bWin,cWin)
// Walzen Restarten
i := 1
FOR i := 1 TO LEN(aWalzen)
aWalzen[i]:Restart()
SLEEP( RandomInt( 1,100 ) )
NEXT
ELSE
MSGBOX("no Deposit")
QUIT
ENDIF
ENDIF
Code: Alles auswählen
METHOD SlotRoll:ReStart()
IF ::lTakeOff
::lStopNow := .F.
::terminated := .F.
::workCounter := 0
* ::nZahlLast := 1
* ::aSchieber := {1,1,1}
::setInterval( ::BroZufall() )
::start()
ENDIF
hier noch die :execute Methode
Code: Alles auswählen
METHOD SlotRoll:execute
LOCAL iMax := RandomInt( 50, 60 )
IF ::lTakeOff
::lTakeOff := .F.
DO WHILE ::workCounter < iMax
// Programmcode für den Thread
::workCounter++
IF ::terminated
EXIT
ELSE
SLEEP( ::BroZufall() )
::BroRoll() // hier geht es zum "Schieber"
ENDIF
IF ((::workCounter) % 20 ) == 0
::setInterval( NIL )
SLEEP(0)
::setInterval( ::BroZufall() )
::oPbStop:Setcaption( ::aRes[2] )
::lStopNow := .T.
ENDIF
ENDDO
::oPbStop:Setcaption( ::aRes[1] )
::terminated := .F.
::lStopNow := .F.
IF ::MyEvent <> NIL
PostAppEvent(::MyEvent ,;
::aSchieber ,;
::RetArray() ,;
HX_LastDialog(::MyHome) )
ENDIF
::setInterval( NIL )
::quit()
ENDIF
RETURN self
jemand eine Idee was ich "falsch" mache ? warum immer nur die 1st Walze und nicht die 2nd oder 3th ?