우선 g_con 으로 컨테이너를 screen 100 에 만들어주시고
STATUS에 BACK EXIT CANC 를 설정해주시고요
TITLE 에 & & << 요것좀 넣어주시고 만들어주시면 잘 실행되실꺼에요 ^^;;;
초보가 만든거니.. 이해들 해주시고요...딱히 올릴곳이 없어서 여기다 올립니다.
REPORT z_ljs_008 MESSAGE-ID zljs.
*----------------------------------------------------------------------*
*베이스볼 게임
*추억의 고전 게임으로 실행을 하면 초기 범위값을 설정하는 파라미터에
*범위값을 입력(초기값10)하고 실행을 하면 그 입력값보다 같거나 작은
*중복되지 않는 값이 3개가 랜덤으로 설정된다.
*이 세개의 값을 찾는 것이 이 게임의 목표이다.
*도전 버튼을 눌러 값을 세개를 다 채운후 입력을 누르면
*정답과 비교하여 숫자 1개가 동일한 위치에 동일한 값이 입력되었으면
*1스트라이크 2볼로 결과값으로 옆에 출력이됩니다.
*만약 숫자 2개가 동일한 위치에 동알한 값이 입력되었으면
*2스트라이크 1볼로 결과값으로 옆에 출력이 됩니다.
*3개의 숫자를 다 맞추면 팝업메세지로 'N'번만에 성공하셨습니다라는
*메세지를 출력시켜줍니다.
*여러명이서 할경우 더 적은 도전으로 3스트라이크를 잡으신 분이
*승리하신 겁니다.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION DEFERRED.
*----------------------------------------------------------------------*
DATA: g_event TYPE REF TO lcl_event_receiver.
DATA: g_con TYPE REF TO cl_gui_custom_container,
g_grid TYPE REF TO cl_gui_alv_grid,
gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat,
gt_sort TYPE lvc_t_sort,
gs_sort TYPE lvc_s_sort,
gt_exclude TYPE ui_functions,
gs_exclude TYPE ui_func,
gs_layout TYPE lvc_s_layo,
gt_celltab TYPE lvc_t_styl,
gs_celltab TYPE lvc_s_styl,
gs_scroll TYPE lvc_s_stbl,
ok_code TYPE sy-ucomm,
save_ok TYPE sy-ucomm.
DATA: gt_color TYPE lvc_t_scol,
gs_color TYPE lvc_s_scol.
DATA: gs_variant TYPE disvariant.
*----------------------------------------------------------------------*
* internal table
*----------------------------------------------------------------------*
DATA: BEGIN OF gs_game,
ball_1 TYPE n LENGTH 2,
ball_2 TYPE n LENGTH 2,
ball_3 TYPE n LENGTH 2,
result TYPE c LENGTH 40,
celltab TYPE lvc_t_styl,
f_col TYPE lvc_t_scol,
END OF gs_game.
DATA: gt_game LIKE TABLE OF gs_game.
DATA: answers_1 TYPE n LENGTH 2,
answers_2 TYPE n LENGTH 2,
answers_3 TYPE n LENGTH 2.
*----------------------------------------------------------------------*
* selection-screen
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK block WITH FRAME TITLE text-001.
PARAMETERS : p_init TYPE n LENGTH 2.
SELECTION-SCREEN END OF BLOCK block.
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object
e_interactive ,
handle_ucomm FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS. "lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object.
ENDMETHOD. "handle_toolbar
METHOD handle_ucomm.
PERFORM handle_ucomm USING e_ucomm.
ENDMETHOD. "handle_ucomm
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
CLEAR: gs_game, gt_game.
gs_game-result = 'GAME을 시작합니다!! 행운을 빕니다 ^^'.
APPEND gs_game TO gt_game.
p_init = 10.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*
PERFORM get_answers.
*----------------------------------------------------------------------*
END-OF-SELECTION.
*----------------------------------------------------------------------*
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
DATA: l_title TYPE c LENGTH 10.
CLEAR l_title.
CONCATENATE p_init '까지 베이스볼 게임' INTO l_title. "게임title.
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE' WITH l_title. "TITLE에 & & & & 넣어주시고
* l_TITLE로 받아서 TEXT 뿌려줍니다.
*----------------------------------------------------------------------*
* PBO
*----------------------------------------------------------------------*
IF g_con IS INITIAL. "INIT.
CREATE OBJECT g_con
EXPORTING
container_name = 'G_CON'.
CREATE OBJECT g_grid
EXPORTING
i_parent = g_con
i_appl_events = 'X'.
*---LAYOUT
PERFORM layout.
*---FCAT
PERFORM fcat.
*---EXCLUDE
PERFORM exclude.
*---EVENT_RECEIVER
PERFORM event_receiver.
*---GRID_SET
PERFORM grid_set.
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit INPUT.
CLEAR ok_code.
ok_code = sy-ucomm.
CASE ok_code.
WHEN 'BACK' OR 'EXIT' OR 'CANC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Form HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_OBJECT text
*----------------------------------------------------------------------*
FORM handle_toolbar USING p_object TYPE REF TO
cl_alv_event_toolbar_set.
DATA: ls_toolbar TYPE stb_button.
CLEAR ls_toolbar.
ls_toolbar-butn_type = 3.
APPEND ls_toolbar TO p_object->mt_toolbar.
CLEAR ls_toolbar.
ls_toolbar-function = 'NEW'.
ls_toolbar-icon = icon_create.
ls_toolbar-text = '도전'.
APPEND ls_toolbar TO p_object->mt_toolbar.
CLEAR ls_toolbar.
ls_toolbar-function = 'ENTE'.
ls_toolbar-icon = icon_complete.
ls_toolbar-text = '입력'.
APPEND ls_toolbar TO p_object->mt_toolbar.
ENDFORM. " HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& Form HANDLE_UCOMM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM handle_ucomm USING p_ucomm TYPE sy-ucomm.
DATA: l_line LIKE gs_game.
DATA: l_tabix TYPE i.
DATA: l_fieldname(10).
DATA: l_text TYPE c LENGTH 40.
DATA: l_strike TYPE n,
l_ball TYPE n.
CLEAR: l_line, l_tabix.
CLEAR: gs_celltab, gt_celltab.
CASE p_ucomm.
WHEN 'NEW'.
DESCRIBE TABLE gt_game LINES l_tabix.
READ TABLE gt_game INTO gs_game INDEX l_tabix.
APPEND l_line TO gt_game.
CLEAR l_fieldname. l_fieldname = 'BALL_1'.
PERFORM celltab USING l_fieldname 'E'.
CLEAR l_fieldname. l_fieldname = 'BALL_2'.
PERFORM celltab USING l_fieldname 'E'.
CLEAR l_fieldname. l_fieldname = 'BALL_3'.
PERFORM celltab USING l_fieldname 'E'.
WHEN 'ENTE'.
DESCRIBE TABLE gt_game LINES l_tabix.
READ TABLE gt_game INTO gs_game INDEX l_tabix.
IF gs_game-ball_1 = gs_game-ball_2
OR gs_game-ball_1 = gs_game-ball_3
OR gs_game-ball_2 = gs_game-ball_3.
MESSAGE s000 WITH '같은 숫자가 두개 입력되었습니다.'
DISPLAY LIKE 'E'.
EXIT.
ELSE.
DELETE TABLE gt_game FROM gs_game.
CLEAR l_fieldname. l_fieldname = 'BALL_1'.
PERFORM celltab USING l_fieldname 'D'.
CLEAR l_fieldname. l_fieldname = 'BALL_2'.
PERFORM celltab USING l_fieldname 'D'.
CLEAR l_fieldname. l_fieldname = 'BALL_3'.
PERFORM celltab USING l_fieldname 'D'.
CLEAR: l_text, l_tabix, l_strike, l_ball.
IF gs_game-ball_1 = answers_1.
l_strike = l_strike + 1.
ELSEIF gs_game-ball_1 <> answers_1.
l_ball = l_ball + 1.
ENDIF.
IF gs_game-ball_2 = answers_2.
l_strike = l_strike + 1.
ELSEIF gs_game-ball_2 <> answers_2.
l_ball = l_ball + 1.
ENDIF.
IF gs_game-ball_3 = answers_3.
l_strike = l_strike + 1.
ELSEIF gs_game-ball_3 <> answers_3.
l_ball = l_ball + 1.
ENDIF.
CONCATENATE l_strike '스트라이크 ' l_ball '볼'
INTO l_text.
gs_game-result = l_text.
APPEND gs_game TO gt_game.
ENDIF.
ENDCASE.
IF l_strike = 3.
CLEAR l_tabix.
DESCRIBE TABLE gt_game LINES l_tabix.
l_tabix = l_tabix - 1.
MESSAGE i000 WITH l_tabix '의 시도만에 성공하셨습니다.'.
ENDIF.
IF p_ucomm = 'NEW'.
LOOP AT gt_game INTO gs_game.
IF l_tabix < sy-tabix.
gs_game-celltab = gt_celltab.
MODIFY gt_game FROM gs_game TRANSPORTING celltab.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT gt_game INTO gs_game.
gs_game-celltab = gt_celltab.
MODIFY gt_game FROM gs_game TRANSPORTING celltab.
ENDLOOP.
ENDIF.
PERFORM refresh.
ENDFORM. " HANDLE_UCOMM
*&---------------------------------------------------------------------*
*& Form CELL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM celltab USING p_name p_type.
CASE p_type.
WHEN 'D'.
gs_celltab-fieldname = p_name.
gs_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT gs_celltab INTO TABLE gt_celltab.
WHEN 'E'.
gs_celltab-fieldname = p_name.
gs_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
INSERT gs_celltab INTO TABLE gt_celltab.
ENDCASE.
ENDFORM. " CELL
*&---------------------------------------------------------------------*
*& Form LAYOUT_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM layout.
CLEAR gs_layout.
gs_layout-sel_mode = 'A'. "ALV제어:선택모드
gs_layout-zebra = 'X'. "줄무늬
gs_layout-cwidth_opt = 'X'. "열 너비 최적화
gs_layout-stylefname = 'CELLTAB'. "ALV제어
gs_layout-ctab_fname = 'F_COL'. "ALV제어
gs_variant-report = sy-repid.
ENDFORM. " LAYOUT
*&---------------------------------------------------------------------*
*& Form EXCLUDE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM exclude .
CLEAR: gs_exclude, gt_exclude[].
PERFORM : set_exclude USING
cl_gui_alv_grid=>mc_fc_excl_all. "모든아이콘삭제.
ENDFORM. " EXCLUDE
*&---------------------------------------------------------------------*
*& Form SET_EXCLUDE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_CL_GUI_ALV_GRID=>MC_FC_EXCL_AL text
*----------------------------------------------------------------------*
FORM set_exclude USING p_exclude.
CLEAR gs_exclude.
gs_exclude = p_exclude.
APPEND gs_exclude TO gt_exclude.
ENDFORM. " SET_EXCLUDE
*&---------------------------------------------------------------------*
*& Form FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fcat .
CLEAR: gs_fcat, gt_fcat.
PERFORM fcat_make USING :
'S' 'FIELDNAME' 'BALL_1',
' ' 'COL_POS' '1',
'E' 'COLTEXT' '첫번째공',
'S' 'FIELDNAME' 'BALL_2',
' ' 'COL_POS' '2',
'E' 'COLTEXT' '두번째공',
'S' 'FIELDNAME' 'BALL_3',
' ' 'COL_POS' '3',
'E' 'COLTEXT' '세번째공',
'S' 'FIELDNAME' 'RESULT',
' ' 'COL_POS' '4',
'E' 'COLTEXT' '결과'.
ENDFORM. " FCAT
*&---------------------------------------------------------------------*
*& Form FCAT_MAKE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fcat_make USING p_start p_option p_value.
DATA l_option(40).
CLEAR l_option.
IF p_start = 'S'.
CLEAR gs_fcat.
ENDIF.
FIELD-SYMBOLS <fs>.
CONCATENATE 'GS_FCAT-' p_option INTO l_option.
ASSIGN (l_option) TO <fs>.
MOVE p_value TO <fs>.
IF p_start = 'E'.
APPEND gs_fcat TO gt_fcat.
ENDIF.
ENDFORM. " FCAT_MAKE
*&---------------------------------------------------------------------*
*& Form GRID_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM grid_set .
CALL METHOD g_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
i_bypassing_buffer = 'X'
i_save = 'A'
i_default = 'X'
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
is_variant = gs_variant
CHANGING
it_outtab = gt_game[]
it_fieldcatalog = gt_fcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
ENDFORM. " GRID_SET
*&---------------------------------------------------------------------*
*& Form EVENT_RECEIVER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM event_receiver .
CREATE OBJECT g_event.
SET HANDLER g_event->handle_toolbar FOR g_grid.
SET HANDLER g_event->handle_ucomm FOR g_grid.
*-----*
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
*-----*
ENDFORM. " EVENT_RECEIVER
*&---------------------------------------------------------------------*
*& Form REFRESH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM refresh .
CLEAR gs_scroll.
gs_scroll-row = 'X'.
gs_scroll-col = 'X'.
CALL METHOD g_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD g_grid->refresh_table_display
EXPORTING
is_stable = gs_scroll.
CALL METHOD cl_gui_cfw=>flush.
ENDFORM. " REFRESH
*&---------------------------------------------------------------------*
*& Form ANSWERS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_answers .
DATA: l_line TYPE sy-tabix.
DATA: l_answ_1 TYPE i,
l_answ_2 TYPE i,
l_answ_3 TYPE i.
DATA: BEGIN OF lt_answ OCCURS 0,
answers TYPE i,
END OF lt_answ.
REFRESH lt_answ.
CLEAR: l_answ_1, l_answ_2, l_answ_3.
PERFORM random USING l_answ_1.
lt_answ-answers = l_answ_1.
APPEND lt_answ.
DO 10 TIMES.
PERFORM random USING l_answ_2.
IF l_answ_2 = l_answ_1.
CLEAR l_answ_2.
PERFORM random USING l_answ_2.
ELSE.
lt_answ-answers = l_answ_2.
APPEND lt_answ.
EXIT.
ENDIF.
ENDDO.
DO 10 TIMES.
PERFORM random USING l_answ_3.
IF l_answ_3 = l_answ_1 OR l_answ_3 = l_answ_2.
CLEAR l_answ_3.
PERFORM random USING l_answ_3.
ELSE.
lt_answ-answers = l_answ_3.
APPEND lt_answ.
EXIT.
ENDIF.
ENDDO.
CLEAR: l_line, answers_1, answers_2, answers_3.
LOOP AT lt_answ.
l_line = sy-tabix.
CASE l_line.
WHEN '1'.
answers_1 = lt_answ-answers.
WHEN '2'.
answers_2 = lt_answ-answers.
WHEN '3'.
answers_3 = lt_answ-answers.
ENDCASE.
ENDLOOP.
ENDFORM. " ANSWERS
*&---------------------------------------------------------------------*
*& Form RANDOM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM random USING p_answer.
DATA: l_min TYPE i,
l_max TYPE i.
CLEAR: l_min, l_max.
l_min = 1.
l_max = p_init.
DO 20 TIMES.
CALL FUNCTION 'RANDOM_I4'
EXPORTING
rnd_min = l_min
rnd_max = l_max
IMPORTING
rnd_value = p_answer.
ENDDO.
ENDFORM. " RANDOM