메뉴 건너뛰기

SAP 한국 커뮤니티



추억의 베이스볼 게임을 아밥으로 짜보았습니다..

그림장이 2011.08.12 17:28 조회 수 : 20055 추천:2

우선 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