Accueil > > > LE JEU DES 24 BOÎTES DE L'HOMME MYSTÉRIEUX [MASM]
LE JEU DES 24 BOÎTES DE L'HOMME MYSTÉRIEUX [MASM]
Information sur la source
Description
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
- .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
.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/
Historique
- 31 août 2006 09:41:59 :
- - Ajout d'une précision
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Console MMC [ par vtoub ]
Bonjour a tous, J'aimerais transformer une application Visual Basic .NET pour l'utiliser dans la console MMC. Je ne sais vraiment comment m'y pren
algo pour jeu de shoot en asm [ par cable ]
Bonjourje suis un jeune débutant en programmation en assembleur et je cherche l'algo (voir le code source) d'un jeu de shoot 'em up en scroling horizo
modification de programme [ par GMib ]
Bonjour, j'ai telecharger un jeu et je voudrai le modifier pour qu'il se lance en 640*480 o lieu de 800*600mon ecran ne suporte pas le 800*600 je ne p
Tuto ES Console [ par coockiesch ]
Hello!!!Je cherche un tuto qui explique les ES Console, en fr et compatible TASM (oui, c bcp)...Merci@++Raf
Stdout cmd.exe ou console.com [ par Stormy ]
Salut à tous!Sauriez-vous comment obtenir le output qui suit une commande sur CMD. Pour bien exprimer mon problème, voici un exemple. Le code commande
Console sans API [ par vecchio56 ]
Est-il possible de coder une application en mode protégé sous Windows à un niveau suffisament bas pour pouvoir écrire du texte dans la console sans êt
Programme console avec Masm32 [ par LordBob ]
Bonjour a tous,voila je me lance dans la programmation assembleur... et j'aimerais si avec masm32, il était possible de créer des programmes consoles
systeme d'exploitation de console [ par kryptorkid ]
bonjour à tous, Je voudrais savoir quels sont les outils qui permettent de créer un Systeme d'Exploitation, pour consoles de jeux. Est ce d
Jeu du morpion [ par Prodigy2020 ]
Bonjour, je me présente je suis en 3e année de licence info et j'ai un problème:j'ai à rendre pour dans 2semaines un projet en as
affichage console [ par Kangourou_Nomade ]
Je voulais savoir (pour ma culture personnelle) comment fonctionne le systeme d'adressage pour les affichages de texte sur la console cmd lors de l'ex
|
Derniers Blogs
[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril CERTIFICATIONS BETA .NET 4CERTIFICATIONS BETA .NET 4 par KooKiz
Les inscriptions pour les certifications beta .NET 4 ont commencé. L'inscription est offerte pour les examens suivants : - 71-511, TS: Windows Applications Development with Microsoft .NET Framework 4 - 71-515, TS: Web Applications Development with...
Cliquez pour lire la suite de l'article par KooKiz [MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2[MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2 par redo
J'imagine que la plupart d'entre vous connaissent bien et utilisent le service de traduction de Google, mais connaissez-vous celui de Microsoft . Microsoft Translator ? Effectivement, Microsoft nous annoncé le lancement version 2 de la Technologie Preview...
Cliquez pour lire la suite de l'article par redo LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010!LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010! par MPOWARE
Toutes les vidéos de ce lancement sont en ligne!
Partie I - Intro
http://www.youtube.com/watch?v=LkQzTQ8T6CA
Partie II - Démo 1
http://www.youtube.com/watch?v=drAhYQ7lqvo
Partie III - Démo 2
http://www.youtube.com/watch?v=c8KM_1Gqybc...
Cliquez pour lire la suite de l'article par MPOWARE
Forum
ASSEMBLEURASSEMBLEUR par solleil
Cliquez pour lire la suite par solleil RE : CSHARPRE : CSHARP par ghuysmans99
Cliquez pour lire la suite par ghuysmans99
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|