The computer will randomly select a secret combination. The player needs to guess the combination in as few turns as possible, from a pallet of colours shown on the screen. The user's selection history is shown, along with the results for each turn. Features include display settings, and a game settings. The game is VERY user friendly and easy to play.
************************************************************************ * Program Name: ZMASMIND | Version 2.0 ********************* This is the graphic version! ********************* * Description : Master Mind - The Ultimate Edition * The computer will randomly select a secret combination. The player * needs to guess the combination in as few turns as possible, from * a pallet of colours shown on the screen. The user's selection * history is shown, along with the results for each turn. * Features include display settings, and a game settings. * The game is VERY user friendly and easy to play. ************************************************************************ * Installation: All you need to do is create an executable program * with the name ZMASMIND, and upload this source to it. * You will then need to set up the selection screen text * as follows: * text-002: Display Options * text-004: Game Options * P_ALDUP : Allow Duplicates In Combination * P_INTE : Use Intensified Colours * P_SCPL : Show Results On The Fly * P_SSTATS: Show Statistics * P_SKEY : Show Results Key Chart ************************************************************************ * Created 05.08.2002 by David Bann (VZAP) South Africa * e-mail :
This e-mail address is being protected from spam bots, you need JavaScript enabled to view it
*
This e-mail address is being protected from spam bots, you need JavaScript enabled to view it
* Feel free to send any comments or suggestions to the above addresses. ************************************************************************ * Modification Log ************************************************************************ * Date : * Search By : * Description: ************************************************************************ REPORT ZMASMIND NO STANDARD PAGE HEADING LINE-SIZE 132 LINE-COUNT 65.
INCLUDE <SYMBOL>.
** DATA **************************************************************** DATA: TURN_NO TYPE I, " Turn Number NO_TRIES TYPE I, TIMER LIKE SY-UZEIT.
DATA: BEGIN OF USER_HISTORY OCCURS 0, TURN_NO TYPE I, COL_1, COL_2, COL_3, COL_4, COL_5, END OF USER_HISTORY, BEGIN OF SECRET_COM, COL_1 TYPE I, COL_2 TYPE I, COL_3 TYPE I, COL_4 TYPE I, COL_5 TYPE I, END OF SECRET_COM.
DATA: NO_OF_WINS TYPE I, NO_OF_GAMES TYPE I, SUBRC LIKE SY-SUBRC, TOT_TRIES TYPE I.
** CONSTANTS *********************************************************** CONSTANTS: L LIKE SY-VLINE VALUE '|', TRUE VALUE 'X', FALSE VALUE SPACE, START VALUE 'X', STOP VALUE SPACE. CONSTANTS: COL_1 TYPE I VALUE 1, COL_2 TYPE I VALUE 2, COL_3 TYPE I VALUE 3, COL_4 TYPE I VALUE 4, COL_5 TYPE I VALUE 5, COL_6 TYPE I VALUE 6, COL_7 TYPE I VALUE 7, NO_TURNS TYPE I VALUE 10. " Number of tries the user has
** RANGES ************************************************************** RANGES: CUCOL FOR SY-CUCOL. " Clickable regions
** SELECTION SCREEN **************************************************** * - Display Options SELECTION-SCREEN: BEGIN OF BLOCK B12 WITH FRAME TITLE TEXT-002. * - Use Intensified Colours PARAMETERS: P_INTE AS CHECKBOX DEFAULT 'X', P_SSTATS AS CHECKBOX DEFAULT 'X', P_SKEY AS CHECKBOX DEFAULT ''. SELECTION-SCREEN: END OF BLOCK B12. SELECTION-SCREEN: BEGIN OF BLOCK B13 WITH FRAME TITLE TEXT-004. * - Show Results On The Fly PARAMETERS: P_SCPL AS CHECKBOX DEFAULT 'X', * - Allow Duplicates In Secret Combination P_ALDUP AS CHECKBOX. SELECTION-SCREEN: END OF BLOCK B13.
** INITIALIZATION ****************************************************** INITIALIZATION. PERFORM SET_UP_CLICK_REGIONS.
** AT LINE SELECTION *************************************************** AT LINE-SELECTION. PERFORM LINE_SELECTION.
** START OF SELECTION ************************************************** START-OF-SELECTION. PERFORM SET_UP. PERFORM NEW_GAME.
** END OF SELECTION **************************************************** END-OF-SELECTION.
** FORMS *************************************************************** *&---------------------------------------------------------------------* *& Form SHOW_PALLET *&---------------------------------------------------------------------* * Shows the colour pallet for the user to pick from *----------------------------------------------------------------------* FORM SHOW_PALLET. DATA: PCOL_1, PCOL_2, PCOL_3, PCOL_4, PCOL_5, PCOL_6, PCOL_7.
SY-LSIND = 0.
* We need to do this to center the numbers (constants don't center) PCOL_1 = COL_1. PCOL_2 = COL_2. PCOL_3 = COL_3. PCOL_4 = COL_4. PCOL_5 = COL_5. PCOL_6 = COL_6. PCOL_7 = COL_7.
WRITE: /10(29) SY-ULINE, /10 L NO-GAP, (3) PCOL_1 COLOR = COL_1 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_2 COLOR = COL_2 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_3 COLOR = COL_3 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_4 COLOR = COL_4 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_5 COLOR = COL_5 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_6 COLOR = COL_6 NO-GAP HOTSPOT CENTERED, L NO-GAP, (3) PCOL_7 COLOR = COL_7 NO-GAP HOTSPOT CENTERED, L NO-GAP, /10(29) SY-ULINE.
ENDFORM. " SHOW_PALLET
*&---------------------------------------------------------------------* *& Form SET_UP *&---------------------------------------------------------------------* * Sets up variables from the selection screen *----------------------------------------------------------------------* FORM SET_UP. IF P_INTE NE 'X'. FORMAT INTENSIFIED OFF. ENDIF. NO_TRIES = NO_TURNS. TURN_NO = 0. ENDFORM. " SET_UP
*&---------------------------------------------------------------------* *& Form NEW_GAME *&---------------------------------------------------------------------* * Starts a new game *----------------------------------------------------------------------* FORM NEW_GAME. PERFORM RESET_AND_RANDOMIZE. PERFORM SHOW_PALLET. PERFORM SHOW_GRID. ENDFORM. " NEW_GAME
*&---------------------------------------------------------------------* *& Form SHOW_GRID *&---------------------------------------------------------------------* * Shows the users selection history *----------------------------------------------------------------------* FORM SHOW_GRID.
WRITE: /14(21) SY-ULINE NO-GAP.
* Show users selection history LOOP AT USER_HISTORY. WRITE: /14 L NO-GAP, (3) USER_HISTORY-COL_1 NO-GAP COLOR = USER_HISTORY-COL_1 CENTERED, L NO-GAP, (3) USER_HISTORY-COL_2 NO-GAP COLOR = USER_HISTORY-COL_2 CENTERED, L NO-GAP, (3) USER_HISTORY-COL_3 NO-GAP COLOR = USER_HISTORY-COL_3 CENTERED, L NO-GAP, (3) USER_HISTORY-COL_4 NO-GAP COLOR = USER_HISTORY-COL_4 CENTERED, L NO-GAP, (3) USER_HISTORY-COL_5 NO-GAP COLOR = USER_HISTORY-COL_5 CENTERED, L NO-GAP.
* IF selected, show the results of each selection on the fly IF P_SCPL = 'X'. PERFORM SHOW_RESULTS USING FALSE. ELSE. IF NOT USER_HISTORY-COL_5 IS INITIAL. PERFORM SHOW_RESULTS USING FALSE. ENDIF. ENDIF. WRITE: /14(21) SY-ULINE.
ENDLOOP.
DESCRIBE TABLE USER_HISTORY LINES NO_TRIES. NO_TRIES = NO_TURNS - NO_TRIES.
* This is used to show the whole grid. ie: If not all turns have been * taken, then empty blocks are shown IF NO_TRIES GT 0. DO NO_TRIES TIMES. WRITE: /14 L NO-GAP, (3) SPACE NO-GAP, L NO-GAP. DO 4 TIMES. WRITE: (3) SPACE NO-GAP, L NO-GAP. ENDDO. WRITE: /14(21) SY-ULINE. ENDDO. ENDIF.
IF P_SSTATS = 'X'. PERFORM SHOW_STATS. ENDIF.
IF P_SKEY = 'X'. PERFORM SHOW_KEY. ENDIF.
ENDFORM. " SHOW_GRID *&---------------------------------------------------------------------* *& Form CHECK_SELECTION *&---------------------------------------------------------------------* * Checks the user selection to see if the combination is correct. * If it is, sy-subrc = 0, if not, sy-subrc = 4. *----------------------------------------------------------------------* FORM CHECK_SELECTION. IF USER_HISTORY-COL_1 = SECRET_COM-COL_1 AND USER_HISTORY-COL_2 = SECRET_COM-COL_2 AND USER_HISTORY-COL_3 = SECRET_COM-COL_3 AND USER_HISTORY-COL_4 = SECRET_COM-COL_4 AND USER_HISTORY-COL_5 = SECRET_COM-COL_5. SY-SUBRC = 0. " Player has guessed right ELSE. SY-SUBRC = 4. " Incorrect ENDIF. ENDFORM. " CHECK_SELECTION
*&---------------------------------------------------------------------* *& Form RESET_AND_RANDOMIZE *&---------------------------------------------------------------------* * Resets variables and creates a secret combination *----------------------------------------------------------------------* FORM RESET_AND_RANDOMIZE. NO_TRIES = NO_TURNS. TURN_NO = 0. REFRESH USER_HISTORY. CLEAR USER_HISTORY. CLEAR SECRET_COM.
* If no duplicates allowed IF P_ALDUP NE 'X'.
* Need to do this twice, because otherwise the first number is always * the same (The random function module does this) PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_1. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_1.
WHILE SECRET_COM-COL_2 = SECRET_COM-COL_1 OR SECRET_COM-COL_2 IS INITIAL. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_2. ENDWHILE. WHILE SECRET_COM-COL_3 = SECRET_COM-COL_1 OR SECRET_COM-COL_3 = SECRET_COM-COL_2 OR SECRET_COM-COL_3 IS INITIAL. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_3. ENDWHILE. WHILE SECRET_COM-COL_4 = SECRET_COM-COL_1 OR SECRET_COM-COL_4 = SECRET_COM-COL_2 OR SECRET_COM-COL_4 = SECRET_COM-COL_3 OR SECRET_COM-COL_4 IS INITIAL. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_4. ENDWHILE. WHILE SECRET_COM-COL_5 = SECRET_COM-COL_1 OR SECRET_COM-COL_5 = SECRET_COM-COL_2 OR SECRET_COM-COL_5 = SECRET_COM-COL_3 OR SECRET_COM-COL_5 = SECRET_COM-COL_4 OR SECRET_COM-COL_5 IS INITIAL. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_5. ENDWHILE. * If duplicates are allowed ELSE. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_1. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_2. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_3. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_4. PERFORM GET_RANDOM_NUMBER CHANGING SECRET_COM-COL_5. ENDIF. ENDFORM. " RESET_AND_RANDOMIZE
*&---------------------------------------------------------------------* *& Form SHOW_SECRET_COM *&---------------------------------------------------------------------* * Shows the secret combination *----------------------------------------------------------------------* FORM SHOW_SECRET_COM. WRITE: /14(21) SY-ULINE, /14 L NO-GAP, (3) SECRET_COM-COL_1 COLOR = SECRET_COM-COL_1 NO-GAP CENTERED, L NO-GAP, (3) SECRET_COM-COL_2 COLOR = SECRET_COM-COL_2 NO-GAP CENTERED, L NO-GAP, (3) SECRET_COM-COL_3 COLOR = SECRET_COM-COL_3 NO-GAP CENTERED, L NO-GAP, (3) SECRET_COM-COL_4 COLOR = SECRET_COM-COL_4 NO-GAP CENTERED, L NO-GAP, (3) SECRET_COM-COL_5 COLOR = SECRET_COM-COL_5 NO-GAP CENTERED, L NO-GAP, /14(21) SY-ULINE NO-GAP.
ENDFORM. " SHOW_SECRET_COM
*&---------------------------------------------------------------------* *& Form LINE_SELECTION *&---------------------------------------------------------------------* * Handles line selection *----------------------------------------------------------------------* FORM LINE_SELECTION. DATA: SELECTION TYPE I.
IF P_INTE NE 'X'. FORMAT INTENSIFIED OFF. ENDIF.
IF SY-LISEL = ' | 1 | 2 | 3 | 4 | 5 | 6 | 7 |' AND SY-CUCOL IN CUCOL.
* Find what number was chosen CASE SY-CUCOL. WHEN 12 OR 13 OR 14. SELECTION = COL_1. WHEN 16 OR 17 OR 18. SELECTION = COL_2. WHEN 20 OR 21 OR 22. SELECTION = COL_3. WHEN 24 OR 25 OR 26. SELECTION = COL_4. WHEN 28 OR 29 OR 30. SELECTION = COL_5. WHEN 32 OR 33 OR 34. SELECTION = COL_6. WHEN 36 OR 37 OR 38. SELECTION = COL_7. ENDCASE.
CLEAR USER_HISTORY. READ TABLE USER_HISTORY WITH KEY TURN_NO = TURN_NO. SUBRC = SY-SUBRC.
TOT_TRIES = TOT_TRIES + 1.
* Find the first empty selection CASE SPACE. WHEN USER_HISTORY-COL_1. USER_HISTORY-COL_1 = SELECTION. WHEN USER_HISTORY-COL_2. USER_HISTORY-COL_2 = SELECTION. WHEN USER_HISTORY-COL_3. USER_HISTORY-COL_3 = SELECTION. WHEN USER_HISTORY-COL_4. USER_HISTORY-COL_4 = SELECTION. WHEN USER_HISTORY-COL_5. USER_HISTORY-COL_5 = SELECTION. PERFORM NEXT_TURN. WHEN OTHERS. TURN_NO = TURN_NO + 1. PERFORM LINE_SELECTION. EXIT. ENDCASE.
IF SUBRC = 0. MODIFY USER_HISTORY TRANSPORTING COL_1 COL_2 COL_3 COL_4 COL_5 WHERE TURN_NO = TURN_NO. ELSE. USER_HISTORY-TURN_NO = TURN_NO. APPEND USER_HISTORY. ENDIF. PERFORM SHOW_PALLET. PERFORM SHOW_GRID. ENDIF. ENDFORM. " LINE_SELECTION
*&---------------------------------------------------------------------* *& Form GET_RANDOM_NUMBER *&---------------------------------------------------------------------* * Generates a random number between 1 and 7 *----------------------------------------------------------------------* * <--P_NUM Variable to insert random number into *----------------------------------------------------------------------* FORM GET_RANDOM_NUMBER CHANGING P_NUM. CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING RAN_INT_MAX = 7 RAN_INT_MIN = 1 IMPORTING RAN_INT = P_NUM. ENDFORM. " GET_RANDOM_NUMBER *&---------------------------------------------------------------------* *& Form SET_UP_CLICK_REGIONS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM SET_UP_CLICK_REGIONS. CUCOL-SIGN = 'I'. CUCOL-OPTION = 'BT'.
CUCOL-LOW = 12. CUCOL-HIGH = 14. APPEND CUCOL.
CUCOL-LOW = 16. CUCOL-HIGH = 18. APPEND CUCOL.
CUCOL-LOW = 20. CUCOL-HIGH = 22. APPEND CUCOL.
CUCOL-LOW = 24. CUCOL-HIGH = 26. APPEND CUCOL.
CUCOL-LOW = 28. CUCOL-HIGH = 30. APPEND CUCOL.
CUCOL-LOW = 32. CUCOL-HIGH = 34. APPEND CUCOL.
CUCOL-LOW = 36. CUCOL-HIGH = 38. APPEND CUCOL.
ENDFORM. " SET_UP_CLICK_REGIONS *&---------------------------------------------------------------------* *& Form NEXT_TURN *&---------------------------------------------------------------------* * Check to see if the selection was correct and go to next turn *----------------------------------------------------------------------* FORM NEXT_TURN. DATA: TMP_TRN TYPE I.
PERFORM CHECK_SELECTION. IF SY-SUBRC = 0. " Correct PERFORM GAME_OVER USING TRUE. PERFORM NEW_GAME. STOP. ENDIF.
TMP_TRN = TURN_NO + 1.
IF TMP_TRN GE NO_TURNS AND SY-SUBRC NE 0. " Lost game PERFORM GAME_OVER USING FALSE. PERFORM NEW_GAME. STOP. ENDIF.
ENDFORM. " NEXT_TURN
*&---------------------------------------------------------------------* *& Form GAME_OVER *&---------------------------------------------------------------------* * End of game *----------------------------------------------------------------------* * -->P_WON_GAME The user won the game *----------------------------------------------------------------------* FORM GAME_OVER USING P_WON_GAME. DATA: MSG(100) TYPE C. NO_OF_GAMES = NO_OF_GAMES + 1.
IF P_WON_GAME = TRUE. NO_OF_WINS = NO_OF_WINS + 1.
MSG = 'Well done! You won!'. MESSAGE I999(ZZ) WITH MSG. ELSE. MESSAGE I999(ZZ) WITH 'Sorry - You loose!'. ENDIF. ENDFORM. " GAME_OVER *&---------------------------------------------------------------------* *& Form SHOW_RESULTS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->p_newline Start on a new line * -->p_first_char First character to start with *----------------------------------------------------------------------* FORM SHOW_RESULTS USING P_NEWLINE. DATA: COUNTER TYPE I, BEGIN OF CHECK_TAB OCCURS 5, POSITION TYPE I, VALUE, END OF CHECK_TAB, SECRET_TAB LIKE CHECK_TAB OCCURS 5 WITH HEADER LINE, RESULTS LIKE CHECK_TAB OCCURS 5 WITH HEADER LINE.
IF P_NEWLINE = TRUE. WRITE: / ''. ENDIF.
PERFORM CHECK_SELECTION. IF SY-SUBRC = 0. COUNTER = 1. DO 5 TIMES. WRITE: SYM_FILLED_CIRCLE AS SYMBOL. COUNTER = COUNTER + 1. ENDDO. ELSE. CLEAR CHECK_TAB. REFRESH CHECK_TAB.
CHECK_TAB-POSITION = 1. CHECK_TAB-VALUE = USER_HISTORY-COL_1. APPEND CHECK_TAB. CHECK_TAB-POSITION = 2. CHECK_TAB-VALUE = USER_HISTORY-COL_2. APPEND CHECK_TAB. CHECK_TAB-POSITION = 3. CHECK_TAB-VALUE = USER_HISTORY-COL_3. APPEND CHECK_TAB. CHECK_TAB-POSITION = 4. CHECK_TAB-VALUE = USER_HISTORY-COL_4. APPEND CHECK_TAB. CHECK_TAB-POSITION = 5. CHECK_TAB-VALUE = USER_HISTORY-COL_5. APPEND CHECK_TAB.
CLEAR SECRET_TAB. REFRESH SECRET_TAB.
SECRET_TAB-POSITION = 1. SECRET_TAB-VALUE = SECRET_COM-COL_1. APPEND SECRET_TAB. SECRET_TAB-POSITION = 2. SECRET_TAB-VALUE = SECRET_COM-COL_2. APPEND SECRET_TAB. SECRET_TAB-POSITION = 3. SECRET_TAB-VALUE = SECRET_COM-COL_3. APPEND SECRET_TAB. SECRET_TAB-POSITION = 4. SECRET_TAB-VALUE = SECRET_COM-COL_4. APPEND SECRET_TAB. SECRET_TAB-POSITION = 5. SECRET_TAB-VALUE = SECRET_COM-COL_5. APPEND SECRET_TAB.
LOOP AT CHECK_TAB. CLEAR SECRET_TAB. READ TABLE SECRET_TAB WITH KEY POSITION = CHECK_TAB-POSITION. IF CHECK_TAB-VALUE = SECRET_TAB-VALUE. RESULTS-POSITION = CHECK_TAB-POSITION. RESULTS-VALUE = SYM_FILLED_CIRCLE. APPEND RESULTS. CONTINUE. ENDIF.
LOOP AT SECRET_TAB. IF CHECK_TAB-VALUE = SECRET_TAB-VALUE. RESULTS-POSITION = CHECK_TAB-POSITION. RESULTS-VALUE = SYM_CIRCLE. APPEND RESULTS. CONTINUE. ENDIF. ENDLOOP. ENDLOOP.
COUNTER = 1. DO 5 TIMES. CLEAR RESULTS. RESULTS-VALUE = SYM_BOLD_MINUS. READ TABLE RESULTS WITH KEY POSITION = COUNTER. WRITE: RESULTS-VALUE AS SYMBOL. COUNTER = COUNTER + 1. ENDDO. ENDIF.
ENDFORM. " SHOW_RESULTS *&---------------------------------------------------------------------* *& Form SHOW_STATS *&---------------------------------------------------------------------* * Shows the statistics of the current session *----------------------------------------------------------------------* FORM SHOW_STATS. DATA: LOSSES TYPE I.
LOSSES = NO_OF_GAMES - NO_OF_WINS.
FORMAT INTENSIFIED ON.
WRITE: /10(30) SY-ULINE, /10 L, (26) 'Statistics' CENTERED COLOR 3. FORMAT COLOR 3 INVERSE ON INTENSIFIED ON. WRITE: 39 L, /10(30) SY-ULINE, /10 L, 'Number of games played:', (3) NO_OF_GAMES, 39 L, /10 L, 'Number of wins :', (3) NO_OF_WINS, 39 L, /10 L, 'Number of losses :', (3) LOSSES, 39 L, /10 L, 'Total clicks :', (3) TOT_TRIES, 39 L, /10(30) SY-ULINE. ENDFORM. " SHOW_STATS *&---------------------------------------------------------------------* *& Form SHOW_KEY *&---------------------------------------------------------------------* * Shows the key for the results *----------------------------------------------------------------------* FORM SHOW_KEY. FORMAT COLOR OFF INVERSE OFF INTENSIFIED ON. WRITE: /4(42) SY-ULINE, /4 L, (38) 'Results Key Chart' CENTERED COLOR 3, L. FORMAT COLOR 3 INVERSE ON INTENSIFIED ON. WRITE: /4(42) SY-ULINE, /4 L, SYM_FILLED_CIRCLE AS SYMBOL, ': Correct colour in correct position', L, /4 L, SYM_CIRCLE AS SYMBOL, ': Correct colour in wrong position ', L, /4 L, SYM_BOLD_MINUS AS SYMBOL, ': Colour not in combination ', L, /4(42) SY-ULINE. ENDFORM. " SHOW_KEY
Related Items:
|