Wednesday, November 5, 2008

Game Memory

REPORT zmemory.
INCLUDE .
TABLES : sscrfields.
*** internal table for storing the list of icons temporarily
DATA : BEGIN OF i_icons OCCURS 1000,
id LIKE icon-id,
END OF i_icons.
*** internal table for storing the 32 icons/pictures
DATA : BEGIN OF i_iconlist OCCURS 32,
id LIKE icon-id,
END OF i_iconlist.

*** internal table for storing the icons in the 64 positions
DATA : BEGIN OF i_layout OCCURS 0,
row(1) TYPE n,
col(1) TYPE n,
id LIKE icon-id,
END OF i_layout.
*** data declaration
DATA : w_layout LIKE i_layout.
DATA : ran_no TYPE i.
DATA : len TYPE i.
DATA : subrc LIKE sy-subrc.
DATA : count TYPE i.
DATA : name(10).
DATA : flg_one.
DATA : flg_two.
DATA : icon_one LIKE icon-id.
DATA : icon_two LIKE icon-id.

DATA : b_one(5).
DATA : b_two(5).
DATA : current_ucomm LIKE sscrfields-ucomm.
DATA : ls_memory TYPE zmemory.
DATA: lv_start TYPE i,
lv_total TYPE i,
lv_tick TYPE i,
lv_timlo TYPE i.


FIELD-SYMBOLS : TYPE ANY.
**** selection-screen declaration.
*** keeping the button names and its user-command same will
*** make things easier later....
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title NO INTERVALS.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(25) no_tries.
PARAMETERS : p_tries TYPE i MODIF ID hid VISIBLE LENGTH 14.
PARAMETERS : p_secon TYPE i MODIF ID hid VISIBLE LENGTH 14.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(25) yu_score.
PARAMETERS : p_score TYPE char25 MODIF ID hid VISIBLE LENGTH 14.
PARAMETERS : l_score TYPE char25 MODIF ID hid VISIBLE LENGTH 14.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(25) lu_secon.
PARAMETERS : l_second TYPE char25 MODIF ID hid VISIBLE LENGTH 14.
PARAMETERS : h_second TYPE char25 MODIF ID hid VISIBLE LENGTH 14.
SELECTION-SCREEN END O
F LINE.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb11 USER-COMMAND pb11.
SELECTION-SCREEN PUSHBUTTON 9(4) pb12 USER-COMMAND pb12.
SELECTION-SCREEN PUSHBUTTON 16(4) pb13 USER-COMMAND pb13.
SELECTION-SCREEN PUSHBUTTON 23(4) pb14 USER-COMMAND pb14.
SELECTION-SCREEN PUSHBUTTON 30(4) pb15 USER-COMMAND pb15.
SELECTION-SCREEN PUSHBUTTON 37(4) pb16 USER-COMMAND pb16.
SELECTION-SCREEN PUSHBUTTON 44(4) pb17 USER-COMMAND pb17.
SELECTION-SCREEN PUSHBUTTON 51(4) pb18 USER-COMMAND pb18.
SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN PUSHBUTTON /2(4) pb21 USER-COMMAND pb21.
SELECTION-SCREEN PUSHBUTTON 9(4) pb22 USER-COMMAND pb22.
SELECTION-SCREEN PUSHBUTTON 16(4) pb23 USER-COMMAND pb23.
SELECTION-SCREEN PUSHBUTTON 23(4) pb24 USER-COMMAND pb24.
SELECTION-SCREEN PUSHBUTTON 30(4) pb25 USER-COMMAND pb25.
SELECTION-SCREEN PUSHBUTTON 37(4) pb26 USER-COMMAND pb26.
SELECTION-SCREEN PUSHBUTTON 44(4) pb27 USER-COMMAND pb27.
SELECTION-SCREEN PUSHBUTTO
N 51(4) pb28 USER-COMMAND pb28.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb31 USER-COMMAND pb31.
SELECTION-SCREEN PUSHBUTTON 9(4) pb32 USER-COMMAND pb32.
SELECTION-SCREEN PUSHBUTTON 16(4) pb33 USER-COMMAND pb33.
SELECTION-SCREEN PUSHBUTTON 23(4) pb34 USER-COMMAND pb34.
SELECTION-SCREEN PUSHBUTTON 30(4) pb35 USER-COMMAND pb35.
SELECTION-SCREEN PUSHBUTTON 37(4) pb36 USER-COMMAND pb36.
SELECTION-SCREEN PUSHBUTTON 44(4) pb37 USER-COMMAND pb37.
SELECTION-SCREEN PUSHBUTTON 51(4) pb38 USER-COMMAND pb38.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb41 USER-COMMAND pb41.
SELECTION-SCREEN PUSHBUTTON 9(4) pb42 USER-COMMAND pb42.
SELECTION-SCREEN PUSHBUTTON 16(4) pb43 USER-COMMAND pb43.
SELECTION-SCREEN PUSHBUTTON 23(4) pb44 USER-COMMAND pb44.
SELECTION-SCREEN PUSHBUTTON 30(4) pb45 USER-COMMAND pb45.
SELECTION-SCREEN PUSHBUTTO
N 37(4) pb46 USER-COMMAND pb46.
SELECTION-SCREEN PUSHBUTTON 44(4) pb47 USER-COMMAND pb47.
SELECTION-SCREEN PUSHBUTTON 51(4) pb48 USER-COMMAND pb48.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb51 USER-COMMAND pb51.
SELECTION-SCREEN PUSHBUTTON 9(4) pb52 USER-COMMAND pb52.
SELECTION-SCREEN PUSHBUTTON 16(4) pb53 USER-COMMAND pb53.
SELECTION-SCREEN PUSHBUTTON 23(4) pb54 USER-COMMAND pb54.
SELECTION-SCREEN PUSHBUTTON 30(4) pb55 USER-COMMAND pb55.
SELECTION-SCREEN PUSHBUTTON 37(4) pb56 USER-COMMAND pb56.
SELECTION-SCREEN PUSHBUTTON 44(4) pb57 USER-COMMAND pb57.
SELECTION-SCREEN PUSHBUTTON 51(4) pb58 USER-COMMAND pb58.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb61 USER-COMMAND pb61.
SELECTION-SCREEN PUSHBUTTON 9(4) pb62 USER-COMMAND pb62.
SELECTION-SCREEN PUSHBUTTON 16(4) pb63 USER-COMMAND pb63.
SELECTION-SCREEN PUSHBUTTON 23(4) pb64 USER-COMMAND pb64.
SELECTION-SCREEN PUSHBUTTON 30(4) pb65 USER-COMMAND pb65.
SELECTION-SCREEN PUSHBUTTON 37(4) pb66 USER-COMMAND pb66.
SELECTION-SCREEN PUSHBUTTON 44(4) pb67 USER-COMMAND pb67.
SELECTION-SCREEN PUSHBUTTON 51(4) pb68 USER-COMMAND pb68.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb71 USER-COMMAND pb71.
SELECTION-SCREEN PUSHBUTTON 9(4) pb72 USER-COMMAND pb72.
SELECTION-SCREEN PUSHBUTTON 16(4) pb73 USER-COMMAND pb73.
SELECTION-SCREEN PUSHBUTTON 23(4) pb74 USER-COMMAND pb74.
SELECTION-SCREEN PUSHBUTTON 30(4) pb75 USER-COMMAND pb75.
SELECTION-SCREEN PUSHBUTTON 37(4) pb76 USER-COMMAND pb76.
SELECTION-SCREEN PUSHBUTTON 44(4) pb77 USER-COMMAND pb77.
SELECTION-SCREEN PUSHBUTTON 51(4) pb78 USER-COMMAND pb78.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /2(4) pb81 USER-COMMAND pb81.
SELECTION-SCREEN PUSHBUTTON 9(4) pb82 USER-COMMAND pb82.
SELECTION-SCREEN PUSHBUTTON 16(4) pb83 USER-COMMAND pb83.
SELECTION-SCREEN PUSHBUTTON 23(4) pb84 USER-COMMAND pb84.
SELECTION-SCREEN PUSHBUTTON 30(4) pb85 USER-COMMAND pb85.
SELECTION-SCREEN PUSHBUTTON 37(4) pb86 USER-COMMAND pb86.
SELECTION-SCREEN PUSHBUTTON 44(4) pb87 USER-COMMAND pb87.
SELECTION-SCREEN PUSHBUTTON 51(4) pb88 USER-COMMAND pb88.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 2(22) hu_score.
PARAMETERS : h_score TYPE char50 MODIF ID hid VISIBLE LENGTH 50.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(22) low_sc.
PARAMETERS : plow_sc TYPE char50 MODIF ID hid VISIBLE LENGTH 50.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(22) yu_secon.
PARAMETERS : y_second TYPE char25 MODIF ID hid VISIBLE LENGTH 15.
PARAMETERS : z_second TYPE char25 MODIF ID hid VISIBLE LENGTH 15.
SELECTION-SCREEN END OF LINE.


SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
PERFORM do_initialization.

AT SELECTION-SCREEN OUTPUT.
IF i_layout[] IS INITIAL.
lv_total = lv_timlo - lv_start.
MESSAGE i001(00) WITH 'Congratulations You did it !!!'.
ls_memory-uname = sy-uname.
ls_memory-sc_date = sy-datlo.
ls_memory-sc_time = sy-timlo.
ls_memory-sc_tries = p_tries.
ls_memory-sc_seconds = lv_total.
INSERT INTO zmemory VALUES ls_memory.
ENDIF.
*** make the count field display only
LOOP AT SCREEN.
IF screen-group1 = 'HID'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.

AT SELECTION-SCREEN.

* clear time and tries on restart
IF sscrfields-ucomm = 'ONLI'.
CLEAR: p_tries, p_secon.
ENDIF.

lv_timlo = sy-timlo.
CHECK sscrfields-ucomm CS 'PB'.
IF lv_start IS INITIAL.
lv_start = lv_timlo.
ENDIF.

lv_tick = lv_timlo - lv_start.
p_secon = lv_tick.

*** make sure it is one of the buttons that is clicked and
*** not clicking the same button again
*** exception is if 2 are open and you want to keep the 2nd one open
*** you can do so....

CHECK sscrfields-ucomm CS 'PB' AND
( sscrfields-ucomm <> current_ucomm OR
NOT flg_two IS INITIAL ).
current_ucomm = sscrfields-ucomm.
*** making sure again that a button is clicked and get the icon
*** hidden in the clicked button.
READ TABLE i_layout WITH KEY row = sscrfields-ucomm+2(1)
col = sscrfields-ucomm+3(1).
CHECK sy-subrc = 0.
PERFORM validate.
*&---------------------------------------------------------------------*
*& Form validate
*&---------------------------------------------------------------------*
* checking whether its the 1st or the 2nd button click, assign the ucomm
* to the field-symbol. The trick is the buttons have been named same as
* its ucomm, so assigning it gives the value of the button.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM validate.
IF NOT flg_two IS INITIAL.
ASSIGN (b_one) TO .
= '@5F@'.
ASSIGN (b_two) TO .
= '@5F@'.
CLEAR : flg_one,flg_two,
icon_one,icon_two,
b_one,b_two.
ENDIF.
IF flg_one IS INITIAL OR
flg_two IS INITIAL.
ASSIGN (sscrfields-ucomm) TO .
IF sy-subrc = 0.
= i_layout-id.
ENDIF.
IF flg_one IS INITIAL.
flg_one = 'X'.
icon_one = i_layout-id.
b_one = sscrfields-ucomm.
ELSEIF flg_two IS INITIAL.
flg_two = 'X'.
icon_two = i_layout-id.
b_two = sscrfields-ucomm.
ENDIF.
ENDIF.
IF icon_one = icon_two.
p_tries = p_tries + 1.
DELETE i_layout WHERE id = icon_one.
CLEAR : flg_one,flg_two,icon_one,icon_two.
ENDIF.
IF NOT flg_two IS INITIAL.
p_tries = p_tries + 1.
ENDIF.

ENDFORM. " validate
*&---------------------------------------------------------------------*
*& Form do_initialization
*&---------------------------------------------------------------------*
* Make all the buttons show blank space. Also select, the list of
* all icons from the standard table and select 32 from it randomly. Once
* the 32 icons are selected, lay it out in pairs on the 8 X 8 board of
* buttons.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM do_initialization.


MESSAGE i001(00) WITH 'Welcome to the Memory Game!!!'.

DATA: lv_score TYPE numc4,
lv_name TYPE uname.

*l_second.
*h_second.
SELECT MAX( sc_seconds ) FROM zmemory INTO lv_score WHERE uname = sy-uname.
IF sy-subrc NE 0.
l_score = 'Not Completed Game Yet'.
ELSE.
CONCATENATE lv_score space INTO h_second SEPARATED BY space.
ENDIF.
CLEAR: lv_score.

SELECT MIN( sc_seconds ) FROM zmemory INTO lv_score WHERE uname = sy-uname.
IF sy-subrc NE 0.
l_score = 'Not Completed Game Yet'.
ELSE.
CONCATENATE lv_score space INTO l_second SEPARATED BY space.
ENDIF.
CLEAR: lv_score.



SELECT MAX( sc_tries ) FROM zmemory INTO lv_score WHERE uname = sy-uname.
IF sy-subrc NE 0.
p_score = 'Your Previous Score is ZERO'.
ELSE.
CONCATENATE lv_score space INTO l_score SEPARATED BY space.
ENDIF.
CLEAR: lv_score.

SELECT MIN( sc_tries ) FROM zmemory INTO lv_score WHERE uname = sy-uname.
IF sy-subrc NE 0.
p_score = 'Your Previous Score is ZERO'.
ELSE.
CONCATENATE lv_score space INTO p_score SEPARATED BY space.
ENDIF.

CLEAR lv_score.

SELECT MIN( sc_tries ) FROM zmemory INTO lv_score.
IF sy-subrc NE 0.
h_score = 'Higest Score is ZERO'.
ELSE.
SELECT SINGLE * FROM zmemory INTO ls_memory WHERE sc_tries = lv_score.
CONCATENATE lv_score 'by' ls_memory-uname 'on' ls_memory-sc_date INTO h_score SEPARATED BY space.
ENDIF.

CLEAR lv_score.
SELECT MAX( sc_tries ) FROM zmemory INTO lv_score.
IF sy-subrc NE 0.
plow_sc = 'Lowest Score is ZERO'.
ELSE.
SELECT SINGLE * FROM zmemory INTO ls_memory WHERE sc_tries = lv_score.
CONCATENATE lv_score 'by' ls_memory-uname 'on' ls_memory-sc_date INTO plow_sc SEPARATED BY space.
ENDIF.

* Time
SELECT MIN( sc_seconds ) FROM zmemory INTO lv_score.
IF sy-subrc NE 0.
h_score = 'No One Played Yet'.
ELSE.
SELECT SINGLE * FROM zmemory INTO ls_memory WHERE sc_seconds = lv_score.
CONCATENATE lv_score 'secs -' ls_memory-uname INTO y_second SEPARATED BY space.
ENDIF.

CLEAR lv_score.
SELECT MAX( sc_seconds ) FROM zmemory INTO lv_score.
IF sy-subrc NE 0.
h_score = 'No One Played Yet'.
ELSE.
SELECT SINGLE * FROM zmemory INTO ls_memory WHERE sc_seconds = lv_score.
CONCATENATE lv_score 'secs -' ls_memory-uname INTO z_second SEPARATED BY space.
ENDIF.



title = 'Watch the Clock. The time is runnig so Hurry !'.
yu_score = 'Your Best/Worst Score'.
lu_secon = 'Your Best/Worst Time'.
no_tries = 'No. of Tries/Time(Sec)'.
hu_score = 'Best Score'.
low_sc = 'Worst Score'.
yu_secon = 'Overall Min/Max Time'.

pb11 = pb12 = pb13 = pb14 = pb15 = pb16 = pb17 = pb18 = icon_space.
pb21 = pb22 = pb23 = pb24 = pb25 = pb26 = pb27 = pb28 = icon_space.
pb31 = pb32 = pb33 = pb34 = pb35 = pb36 = pb37 = pb38 = icon_space.
pb41 = pb42 = pb43 = pb44 = pb45 = pb46 = pb47 = pb48 = icon_space.
pb51 = pb52 = pb53 = pb54 = pb55 = pb56 = pb57 = pb58 = icon_space.
pb61 = pb62 = pb63 = pb64 = pb65 = pb66 = pb67 = pb68 = icon_space.
pb71 = pb72 = pb73 = pb74 = pb75 = pb76 = pb77 = pb78 = icon_space.
pb81 = pb82 = pb83 = pb84 = pb85 = pb86 = pb87 = pb88 = icon_space.
SELECT id FROM icon INTO TABLE i_icons
WHERE NOT id IN ('@5F@','@E5@','@00@','@E6@','@E7@',
'@EI@','@GE@','@GG@','@JX@','@JY@',
'@JZ@','@K0@').
DESCRIBE TABLE i_icons LINES len.
CLEAR : subrc.
WHILE subrc < 32.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = len
ran_int_min = 1
IMPORTING
ran_int = ran_no
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
READ TABLE i_icons INDEX ran_no.
READ TABLE i_iconlist WITH KEY id = i_icons-id.
IF sy-subrc <> 0.
i_iconlist-id = i_icons-id.
APPEND i_iconlist.
ENDIF.
DESCRIBE TABLE i_iconlist LINES subrc.
ENDWHILE.
REFRESH : i_icons.
CLEAR : subrc.
WHILE subrc < 64.
IF subrc <> 0.
READ TABLE i_layout INDEX subrc.
IF i_layout-col = 8.
i_layout-col = 1.
i_layout-row = i_layout-row + 1.
ELSE.
i_layout-col = i_layout-col + 1.
ENDIF.
ELSE.
i_layout-row = 1.
i_layout-col = 1.
ENDIF.
CLEAR : count,i_iconlist.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = 32
ran_int_min = 1
IMPORTING
ran_int = ran_no
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
READ TABLE i_iconlist INDEX ran_no.
LOOP AT i_layout INTO w_layout WHERE id = i_iconlist-id.
count = count + 1.
ENDLOOP.
IF count < 2.
i_layout-id = i_iconlist-id.
APPEND i_layout.
ENDIF.
CLEAR : i_layout.
DESCRIBE TABLE i_layout LINES subrc.
ENDWHILE.
CLEAR : flg_one,flg_two,icon_one,icon_two, current_ucomm.

ENDFORM. " do_initialization



No comments: