C'est un jeu télé qui circule un peu partout dans les pays. Vous le reconnaîtrez immédiatement. Cependant, l'adaptation n'est pas fidèle à 100%. De toute façon, je ne connais pas les règles exactes, et puis on s'en fiche du moment qu'on n'a pas l'impression de faire un jeu de l'oie :D
L'application est Console avec un 386.
Aucun bug connu n'est actuellement à ma connaissance.
Amusez-vous bien... [car c'est pas facile !]
Source / Exemple :
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc ; y'a sûrement encore plus de déclarations que nécessaire...
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.const
SCrLf EQU 13,10
SSeparator EQU "---------------------------------------------------"
BNbBoxes DB 24d
AWinnings DD 0, 0, 0, 1, 5, 10, 20, 50, 150, 300, 700,
1500, 3000, 5000, 7500, 10000, 12500, 15000,
20000, 25000, 50000, 100000, 200000, 500000
ADrawByRound DB 4,4,4,3,3,3,1,0
SHeader DB "===[ LE JEU DES 24 BO×TES ]========================[ MASM32 ]===========",SCrLf,SCrLf,SCrLf,0
SChooseBox EQU " Veuillez choisir votre bo?te parmi les 24 disponibles : ",0
SAverageWin DB SCrLf," L'esp?rance des gains ? ce jeu est de %d euros !",SCrLf,SCrLf,
" Et ?a fond comme neige au soleil...",SCrLf,SCrLf,SCrLf,0
SMenuChoice DB " Liste des actions :",SCrLf,SCrLf,
" 1) Voir les bo?tes restantes",SCrLf,
" 2) Voir les sommes restantes",SCrLf,
" 3) perdues",SCrLf,SCrLf,
" 4) Choisir des bo?tes",SCrLf,
" 5) N?gocier avec l'homme myst?rieux",SCrLf,SCrLf,
" 6) Nouvelle partie",SCrLf,
" 7) Quitter le jeu / Repartir avec votre bo?te",SCrLf,SCrLf,
SSeparator,SCrLf,SCrLf,0
SPrompt EQU "> ",0
SQuitContinue EQU "Continuer ? (0/1) ",0
SBoxContains DB SCrLf,
" ______" ,SCrLf,
" / /| La bo?te contenait :" ,SCrLf,
" /_____/ |" ,SCrLf,
" | | | %d euros" ,SCrLf,
" | | /" ,SCrLf,
" -------/" ,SCrLf,
SCrLf,0
SYourBoxIs DB " Votre bo?te est la Nø%d",SCrLf,0
STextRemainBox DB "Voici les bo?tes restantes :",SCrLf,SCrLf,0
SRestBox DB SCrLf," Il en reste %d.",SCrLf,0
SBoxList DB "%s %d",0
SNewLine DB "%s",SCrLf,0
SAddSpace DB "%s ",0
STextRemainWin DB " Voici les gains restants :",SCrLf,0
STextLostWin DB " Voici les gains perdus :",SCrLf,0
SAddWin DB "%s",SCrLf," %d",0
SWhichBox DB "Choisissez %d bo?tes :",SCrLf,SCrLf,0
SChoseOneBox DB "Choisissez 1 bo?te :",SCrLf,0
SBankHasSomething DB SCrLf," --> L'homme myst?rieux veut vous parler...",SCrLf,0
SConfirmNewGame DB " Òtes vous s?r(e) de vouloir relancer une nouvelle partie (0/1) ?",SCrLf,SCrLf,0
SDealBoxExchange DB " Il propose d'?changer votre bo?te. Cela vous convient-il ? (0/1)",SCrLf,0
SDealMoney DB " Il vous ach?te votre bo?te au prix de %d Euros.",SCrLf,
" Si vous acceptez, la partie se termine et vous remportez cette somme.",SCrLf,SCrLf,
" Votre choix (0/1) : ",SCrLf,0
SLastBox DB " Ceci ?tait votre derni?re bo?te...",SCrLf,
" Vous allez maintenant savoir ce que vous avez ""gagn?"".",SCrLf,0
SBoxHad DB SCrLf,SCrLf," --> Votre bo?te contenait %d euros.",SCrLf,0
SEndOfGame DB " F?licitations !!",SCrLf,SCrLf,
" Vous repartez avec la somme de %d euros !",SCrLf,
" Votre bo?te contenait : %d euros",SCrLf,SCrLf,SCrLf,
" Pas la peine de sauter au plafond, vous ne receverez jamais ce ch?que ;D",SCrLf,
" Ce jeu ASM est juste une adaptation ""for the fun"" de ce jeu europ?en.",SCrLf,SCrLf,SCrLf,
" Malgr? tout, c'est stressant de jouer !)",SCrLf,SCrLf,SCrLf,SCrLf,
" Bonne chance ? vous pour la prochaine partie ...",SCrLf,SCrLf,0
SWinOfGame DB " F?licitations !!",SCrLf, SCrLf,
" Vous ?tes arriv? ? la derni?re bo?te qui renferme la modique somme de :",SCrLf,SCrLf,
" %d euros",SCrLf,SCrLf,SCrLf,
" PS: cet argent est simplement pour vos r?ves et fantasmes... :Q",SCrLf,SCrLf,SCrLf,SCrLf,
" Ce jeu ASM est juste une adaptation ""for the fun"" de ce jeu europ?en.",SCrLf,SCrLf,SCrLf,
" Une nouvelle partie va ?tre imm?diatement charg?e !",SCrLf,SCrLf,
" Bonne chance ? vous ! ...",SCrLf,SCrLf,0
SKeyForEnd DB SCrLf," Appuyez sur Entr?e pour quitter le jeu...",0
SErrorAlreadyChosen DB " D?j? choisie... recommencez !",SCrLf,0
SErrorUnavailable DB " Non disponible... recommmencez !",SCrLf,0
SErrorIsUserBox DB " Vous ne pouvez pas choisir votre propre bo?te... recommencez !",SCrLf,0
SErrorInterval DB " Le num?ro de la bo?te est incorrect... recommencez !",SCrLf,0
SErrorNoDealNow DB " L'homme myst?rieux est absent.",SCrLf," Tirez plut?t des bo?tes !",SCrLf,0
SOfferYesDealNow DB " L'homme myst?rieux a une offre pour vous.",SCrLf," Allez le rencontrer...",SCrLf,0
SNoError DB " OK",SCrLf,0
.data?
RandBase DD ?
ABoxValue DB 24 dup(?)
ABoxAvailable DB 24 dup(?)
BUserBox DB ?
SOutput DB 1024 dup(?)
BNbBoxesToChoose DB ?
BAllowDeal DB ?
BRoundID DB ?
DWon DD ?
.code
Randomize proc
CALL GetTickCount
MOV RandBase, EAX
RET
Randomize endp
Random proc
MOVZX EAX, BNbBoxes
IMUL EDX, RandBase, 08088405h
INC EDX
MOV RandBase, EDX
MUL EDX
MOV EAX, EDX
RET
Random endp
InitGame proc
OR BUserBox, 0FFh
AND BRoundID, 00h
AND BAllowDeal, 00h
LEA EAX, ABoxValue
LEA EDX, ABoxAvailable
MOV ECX, 6d
@@:
AND DWord PTR [EAX], 00000000h
OR DWord PTR [EDX], 0FFFFFFFFh
ADD EAX, 4d
ADD EDX, 4d
DEC ECX
JNZ @B
RET
InitGame endp
GenerateBoxes proc uses EBX
PUSH OFFSET ABoxAvailable
PUSH OFFSET ABoxValue
PUSH OFFSET AWinnings
MOVZX ECX, BNbBoxes
@@:
CALL Random
MOV EBX, [ESP+8]
ADD EBX, EAX
MOVZX EDX, Byte PTR [EBX]
CMP DL, 00h
JE @B
AND Byte PTR [EBX], 00h
MOV EBX, [ESP+4]
ADD EBX, EAX
MOV Byte PTR [EBX], CL
DEC Byte PTR [EBX]
DEC CL
JNZ @B
MOV EDX, 6d
@@:
OR DWord PTR [ABoxAvailable + 4*EDX - 4], 0FFFFFFFFh
DEC EDX
JNZ @B
ADD ESP, 12d
RET
GenerateBoxes endp
GetUserWinnings proc
MOVZX EAX, BUserBox
MOVZX EAX, Byte PTR [ABoxValue + EAX]
MOV EAX, DWord PTR [AWinnings + 4*EAX]
RET
GetUserWinnings endp
ShowHeader proc
cls
invoke StdOut, ADDR SHeader
RET
ShowHeader endp
Welcome proc
@NewWelcome:
CALL ShowHeader
XOR EAX, EAX
MOVZX ECX, BNbBoxes
@@:
MOV EDX, DWord PTR [AWinnings + 4*ECX - 4]
ADD EAX, EDX
DEC ECX
JNZ @B
XOR EDX, EDX
MOVZX ECX, BNbBoxes
DIV ECX
invoke wsprintf, ADDR SOutput, ADDR SAverageWin, EAX
invoke StdOut, ADDR SOutput
MOV EAX, sval(input(SChooseBox))
DEC EAX
CMP AL, BNbBoxes
JAE @NewWelcome
MOV BUserBox, AL
RET
Welcome endp
Menu proc
@@:
CALL ShowHeader
MOVZX EAX, BUserBox
INC EAX
invoke wsprintf, ADDR SOutput, ADDR SYourBoxIs, EAX
invoke StdOut, ADDR SOutput
CALL CountRemainingBoxes
invoke wsprintf, ADDR SOutput, ADDR SRestBox, EAX
invoke StdOut, ADDR SOutput
print chr$(SCrLf,SCrLf)
invoke StdOut, ADDR SMenuChoice
MOV EAX, sval(input(SPrompt))
PUSH EAX
print chr$(SCrLf,SCrLf)
POP EAX
.IF EAX == 1d
CALL ShowRemainingBoxes
JMP @B
.ELSEIF AL==2d
PUSH Byte PTR 0FFh
CALL ShowWinnings
JMP @B
.ELSEIF AL==3d
PUSH Byte PTR 00h
CALL ShowWinnings
JMP @B
.ELSEIF AL==4d
CALL ChooseBox
JMP @B
.ELSEIF AL==5d
CALL MakeDeal
JMP @B
.ELSEIF AL==6d
CALL NewGame
JMP @B
.ELSEIF AL==7d
MOV EAX, sval(input(SQuitContinue))
.IF EAX == 1d
CALL GetUserWinnings
invoke wsprintf, ADDR SOutput, ADDR SBoxHad, EAX
invoke StdOut, ADDR SOutput
invoke StdOut, ADDR SKeyForEnd
.ELSE
JMP @B
.ENDIF
.ELSE
JMP @B
.ENDIF
MOV EAX, input(0)
RET
Menu endp
CountRemainingBoxes proc
XOR EAX, EAX
MOVZX ECX, BNbBoxes
@@:
.IF Byte PTR [ABoxAvailable + ECX - 1] == 0FFh
INC AL
.ENDIF
DEC CL
JNZ @B
RET
CountRemainingBoxes endp
ShowRemainingBoxes proc
LOCAL BIndex:Byte
LOCAL BCount:Byte
invoke StdOut, ADDR STextRemainBox
PUSH OFFSET ABoxAvailable
AND BIndex, 00h
AND BCount, 00h
AND Byte PTR [SOutput], 00h
@StartBox:
MOV EAX, [ESP]
MOVZX ECX, BIndex
CMP Byte PTR [EAX+ECX], 0FFh
JNE @F
CMP CL, BUserBox
JE @F
INC ECX
.IF ECX < 10
PUSH ECX
invoke wsprintf, ADDR SOutput, ADDR SAddSpace, ADDR SOutput
POP ECX
.ENDIF
invoke wsprintf, ADDR SOutput, ADDR SBoxList, ADDR SOutput, ECX
INC BCount
.IF BCount == 6d
invoke wsprintf, ADDR SOutput, ADDR SNewLine, ADDR SOutput
AND BCount, 00h
.ENDIF
@@:
INC BIndex
MOV AL, BIndex
CMP AL, BNbBoxes
JNE @StartBox
invoke StdOut, ADDR SOutput
print chr$(SCrLf,SCrLf)
MOV EAX, input(0)
ADD ESP, 4d
RET
ShowRemainingBoxes endp
BoxToPosition proc uses ECX BRequiredBox:Byte
MOVZX ECX, BNbBoxes
OR EAX, 0FFFFFFFFh
@@:
MOV DL, Byte PTR [ABoxValue + ECX - 1]
.IF DL == BRequiredBox
MOV EAX, ECX
DEC AL
JMP @F
.ENDIF
DEC CL
JNZ @B
@@:
RET
BoxToPosition endp
ShowWinnings proc BType:Byte
.IF BType == 0FFh
invoke StdOut, ADDR STextRemainWin
.ELSEIF
invoke StdOut, ADDR STextLostWin
.ENDIF
XOR ECX, ECX
AND Byte PTR [SOutput], 00h
@@:
invoke BoxToPosition, CL
MOV DL, Byte PTR [ABoxAvailable + EAX]
.IF DL == BType
MOV EAX, DWord PTR [AWinnings + 4*ECX]
PUSH ECX
invoke wsprintf, ADDR SOutput, ADDR SAddWin, ADDR SOutput, EAX
POP ECX
.ENDIF
INC CL
CMP CL, BNbBoxes
JNE @B
invoke wsprintf, ADDR SOutput, ADDR SNewLine, ADDR SOutput
invoke StdOut, ADDR SOutput
MOV EAX, input(0)
RET
ShowWinnings endp
ChooseBox proc
.IF BAllowDeal != 00h
invoke StdOut, ADDR SOfferYesDealNow
JMP @NoMore
.ENDIF
MOVZX EAX, BRoundID
MOVZX EAX, Byte PTR [ADrawByRound + EAX]
MOV BNbBoxesToChoose, AL
invoke wsprintf, ADDR SOutput, ADDR SWhichBox, EAX
invoke StdOut, ADDR SOutput
@@:
MOV EAX, sval(input(SPrompt))
AND EAX, 0FFh
DEC AL
.IF AL >= BNbBoxes
invoke StdOut, ADDR SErrorInterval
JMP @B
.ENDIF
.IF AL == BUserBox
invoke StdOut, ADDR SErrorIsUserBox
JMP @B
.ENDIF
.IF Byte PTR [ABoxAvailable + EAX] == 00h
invoke StdOut, ADDR SErrorAlreadyChosen
JMP @B
.ENDIF
AND Byte PTR [ABoxAvailable + EAX], 00h
MOVZX EDX, Byte PTR [ABoxValue + EAX]
MOV EAX, DWord PTR [AWinnings + 4*EDX]
invoke wsprintf, ADDR SOutput, ADDR SBoxContains, EAX
invoke StdOut, ADDR SOutput
DEC BNbBoxesToChoose
JNZ @B
NOT BAllowDeal
INC BRoundID
invoke StdOut, ADDR SBankHasSomething
CALL CountRemainingBoxes
.IF AL == 2d
print chr$(SCrLf,SCrLf)
invoke StdOut, ADDR SLastBox
MOV EAX, input(0)
CALL ShowHeader
CALL GetUserWinnings
invoke wsprintf, ADDR SOutput, ADDR SWinOfGame, EAX
invoke StdOut, ADDR SOutput
MOV EAX, input(0)
ADD ESP, 4d
JMP start
.ENDIF
@NoMore:
MOV EAX, input(0)
RET
ChooseBox endp
CalcDeal proc
LOCAL BNumber:Byte
AND BNumber, 00h
XOR EAX, EAX
MOVZX ECX, BNbBoxes
@@:
.IF (Byte PTR [ABoxAvailable + ECX - 1] != 00h) && (CL != BUserBox)
MOVZX EDX, Byte PTR [ABoxValue + ECX - 1]
MOV EDX, DWord PTR [AWinnings + 4*EDX]
ADD EAX, EDX
INC BNumber
.ENDIF
DEC ECX
JNZ @B
XOR EDX, EDX
MOVZX ECX, BNumber
DIV ECX
MOV ECX, 100d
XOR EDX, EDX
DIV ECX
MUL ECX
RET
CalcDeal endp
MakeDeal proc
.IF BAllowDeal == 00h
invoke StdOut, ADDR SErrorNoDealNow
JMP @QuitWithConfirm
.ENDIF
.IF (BRoundID == 3d) || (BRoundID == 6d)
.IF BRoundID == 6d
OR EAX, 0FFFFFFFFh
CALL Random
AND EAX, 1b
CMP AL, 00h
JE @AskForMoney
.ENDIF
invoke StdOut, ADDR SDealBoxExchange
MOV EAX, sval(input(SPrompt))
CMP AL, 1d
JNE @QuitNoConfirm
print chr$(SCrLf,SCrLf)
invoke StdOut, ADDR SChoseOneBox
@@:
MOV EAX, sval(input(SPrompt))
AND EAX, 0FFh
DEC AL
.IF AL >= BNbBoxes
invoke StdOut, ADDR SErrorInterval
JMP @B
.ENDIF
.IF AL == BUserBox
invoke StdOut, ADDR SErrorIsUserBox
JMP @B
.ENDIF
.IF Byte PTR [ABoxAvailable + EAX] == 00h
invoke StdOut, ADDR SErrorUnavailable
JMP @B
.ENDIF
MOV BUserBox, AL
.ELSEIF
@AskForMoney:
CALL CalcDeal
MOV DWon, EAX
invoke wsprintf, ADDR SOutput, ADDR SDealMoney, EAX
invoke StdOut, ADDR SOutput
MOV EAX, sval(input(SPrompt))
.IF AL == 1d
CALL ShowHeader
CALL GetUserWinnings
invoke wsprintf, ADDR SOutput, ADDR SEndOfGame, DWon, EAX
invoke StdOut, ADDR SOutput
MOV EAX, input(0)
ADD ESP, 4d
JMP start
.ENDIF
.ENDIF
@QuitNoConfirm:
NOT BAllowDeal
RET
@QuitWithConfirm:
MOV EAX, input(0)
RET
MakeDeal endp
NewGame proc
invoke StdOut, ADDR SConfirmNewGame
MOV EAX, sval(input(SPrompt))
CMP AL, 1d
JE @F
RET
@@:
CALL GetUserWinnings
invoke wsprintf, ADDR SOutput, ADDR SBoxHad, EAX
invoke StdOut, ADDR SOutput
MOV EAX, input(0)
ADD ESP, 4d
NewGame endp
start:
CALL Randomize
CALL InitGame
CALL GenerateBoxes
CALL Welcome
CALL Menu
exit
end start
Conclusion :
Vous pouvez toujours aller visiter
http://altert.family.free.fr/
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.