Soyez le premier à donner votre avis sur cette source.
Vue 6 094 fois - Téléchargée 794 fois
.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
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.