Le jeu des 24 boîtes de l'homme mystérieux [masm]

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 / 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/

Codes Sources

A voir également

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.