메뉴 건너뛰기

SAP 한국 커뮤니티



심심풀이 빙고게임...;;(초보니..이해해주세요 ^^;;;)

그림장이 2012.01.20 16:33 조회 수 : 16193

  <style type="text/css"> SPAN { font-family: "굴림체"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } </style> *&---------------------------------------------------------------------*
*& Report  Z_LJS_GAME
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*  - 게임 -
* 빙고게임 모두 다 아시죠...
* 숫자를 넣어주고 3빙고 되면 게임 끝 남들하고 같이 실행
* 하고 동일한 숫자를 입력해 주고 먼저 3빙고를 하신분이
* 승리한다 ㅋㅋㅋ 입니다 ㅋㅋㅋㅋ

* 스크린에 컨테이너 그리실때 위에 좀 여유좀 남겨서 거기에

* 숫자 입력하는 부분을 그려서 넣어주셔야 합니다...

 

*----------------------------------------------------------------------

* 숫자입력 [G_INT] [버튼(F_CODE : ENT)]  빙고개수 [G_BINGO]

*----------------------------------------------------------------------

*[컨테이너~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]

*----------------------------------------------------------------------

 

* 머 이런식으로... 해주세요 .... 베이스볼 게임에 이어 ....오랜만에...

* 머리좀 식힐겸 만든거니 이해해주세요....^^;;;
************************************************************************
REPORT  z_ljs_game MESSAGE-ID zmgame.
*-  SCREEN 100  -*
DATA: g_100_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_scroll           TYPE lvc_s_stbl,
      gs_layout           TYPE lvc_s_layo,
      ok_code             TYPE sy-ucomm,
      save_ok             TYPE sy-ucomm.
DATA: gs_variant          TYPE disvariant.

*-  INTERNAL TABLE  -*
*1. 정답 테이블
DATABEGIN OF gt_ans OCCURS 0,
  col1(2),
  col2(2),
  col3(2),
  col4(2),
  col5(2),
  END OF gt_ans.

DATABEGIN OF gt_val OCCURS 0,
  col(2),
  END OF gt_val.

*2. 보이는 테이블
DATA: gt_alv LIKE TABLE OF gt_ans WITH HEADER LINE.

*-OTHERS
DATA: g_int(2),
      gt_check LIKE TABLE OF gt_val WITH HEADER LINE.
DATA: g_bingo.
***********************************
INITIALIZATION.
***********************************

***********************************
AT SELECTION-SCREEN.
***********************************

***********************************
START-OF-SELECTION.
***********************************
  PERFORM get_answer.   "정답설정
  PERFORM get_alv.      "답지설정

***********************************
END-OF-SELECTION.
***********************************
  CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*&  Include           Z_LJS_GAME_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS'.
  SET TITLEBAR 'TITLE' WITH '빙고게임!!!'.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  INIT_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE init_0100 OUTPUT.
  IF g_100_con IS INITIAL.  "INIT.
    CREATE OBJECT g_100_con
      EXPORTING
        container_name = 'G_100_CON'.

    CREATE OBJECT g_grid
      EXPORTING
        i_parent      = g_100_con
        i_appl_events = 'X'.
*---LAYOUT
    PERFORM layout.
*---FCAT
    PERFORM fcat.
*---EXCLUDE
    PERFORM exclude.
*---GRID_SET
    PERFORM grid_set.
  ENDIF.
ENDMODULE.                 " INIT_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE exit INPUT.
  LEAVE TO SCREEN 0.
ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  DATA: l_line TYPE sy-tabix,
        l_cline TYPE sy-tabix.
  CLEAR : ok_code, l_line.
  ok_code = sy-ucomm.
  CASE ok_code.
    WHEN 'ENT'.
      CLEAR gt_val.
      READ TABLE gt_val WITH KEY col = g_int.
      IF sy-subrc = 0.
        CLEAR gt_check.
        READ TABLE gt_check WITH KEY col = g_int.

        IF sy-subrc <> 0.
*     숫자 입력과 빙고 체크가 둘다 이루어져야한다
*----------------------------------------------------------
*        --숫자입력부분(답지에표시)
*----------------------------------------------------------
          LOOP AT gt_ans.
            l_line = sy-tabix.
            IF g_int = gt_ans-col1.
              PERFORM open USING l_line 'COL1'.
              EXIT.
            ELSEIF g_int = gt_ans-col2.
              PERFORM open USING l_line 'COL2'.
              EXIT.
            ELSEIF g_int = gt_ans-col3.
              PERFORM open USING l_line 'COL3'.
              EXIT.
            ELSEIF g_int = gt_ans-col4.
              PERFORM open USING l_line 'COL4'.
              EXIT.
            ELSEIF g_int = gt_ans-col5.
              PERFORM open USING l_line 'COL5'.
              EXIT.
            ENDIF.
          ENDLOOP.
          gt_check-col = g_int.
          APPEND gt_check. CLEAR: g_int, gt_check.
*----------------------------------------------------------
*        --빙고체크.
*----------------------------------------------------------
*        --5개 이상부터 빙고가 나오기 시작하니깐.
          CLEAR l_cline.
          DESCRIBE TABLE gt_check LINES l_cline.
          IF l_cline > 4.
            PERFORM bingo_check.
          ENDIF.

        ELSE.
          MESSAGE s000 WITH '이미 표기한 숫자입니다.'
          DISPLAY LIKE 'E'.
        ENDIF.
      ELSE.
        MESSAGE s000 WITH '옳지 않은 값입니다.'
        DISPLAY LIKE 'E'.
      ENDIF.
  ENDCASE.

  PERFORM screen-refresh.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM layout .
  CLEAR gs_layout.
  gs_layout-sel_mode      = 'A'.        "ALV제어:선택모드
*  gs_layout-cwidth_opt    = 'X'.        "열 너비 최적화
  gs_variant-report       = sy-repid.
ENDFORM.                    " LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fcat .

  CLEAR: gs_fcat, gt_fcat.

  PERFORM fcat_make USING :

                  'S' 'FIELDNAME' 'COL1',
                  ' ' 'COL_POS'   '1',
                  ' ' 'OUTPUTLEN' '5',
                  'E' 'COLTEXT'   '빙',

                  'S' 'FIELDNAME' 'COL2',
                  ' ' 'COL_POS'   '2',
                  ' ' 'OUTPUTLEN' '5',
                  'E' 'COLTEXT'   '고',

                  'S' 'FIELDNAME' 'COL3',
                  ' ' 'COL_POS'   '3',
                  ' ' 'OUTPUTLEN' '5',
                  'E' 'COLTEXT'   '게',

                  'S' 'FIELDNAME' 'COL4',
                  ' ' 'COL_POS'   '4',
                  ' ' 'OUTPUTLEN' '5',
                  'E' 'COLTEXT'   '임',

                  'S' 'FIELDNAME' 'COL5',
                  ' ' 'COL_POS'   '5',
                  ' ' 'OUTPUTLEN' '5',
                  '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  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_CALL_XI  text
*----------------------------------------------------------------------*
FORM set_exclude  USING p_exclude.
  CLEAR gs_exclude.
  gs_exclude = p_exclude.
  APPEND gs_exclude TO gt_exclude.
ENDFORM.                    " SET_EXCLUDE
*&---------------------------------------------------------------------*
*&      Form  GRID_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM grid_set .
  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_alv[]
      it_fieldcatalog               = gt_fcat
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
ENDFORM.                    " GRID_SET
*&---------------------------------------------------------------------*
*&      Form  GET_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_alv .
  DO 5 TIMES.
    gt_alv-col1 = ' '.
    gt_alv-col2 = ' '.
    gt_alv-col3 = ' '.
    gt_alv-col4 = ' '.
    gt_alv-col5 = ' '.
    APPEND gt_alv.
  ENDDO.
ENDFORM.                    " GET_ALV
*&---------------------------------------------------------------------*
*&      Form  GET_ANSWER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_answer .
  DATA: l_value TYPE i.
  DATA: l_name(20),
        l_col(3VALUE 'COL',
        l_int TYPE i,
        l_num(1VALUE 1.

  CLEAR: gt_val[], gt_val, l_value.
*----------------------------------------
*--정답 생성
*----------------------------------------
  DO 25 TIMES.
    DO 3000 TIMES.
      PERFORM ran_dom CHANGING l_value.
      CLEAR gt_val.
      READ TABLE gt_val WITH KEY col = l_value.
      IF sy-subrc <> 0.
        gt_val-col = l_value.
        APPEND gt_val.
        EXIT.
      ENDIF.
    ENDDO.
  ENDDO.
  FIELD-SYMBOLS <fs>.
  LOOP AT gt_val.
    CONCATENATE 'GT_ANS-' l_col l_num INTO l_name.
    ASSIGN (l_name) TO <fs>.
    <fs> = gt_val-col.
    CASE l_num.
      WHEN '5'.
        l_num = '1'.
        APPEND gt_ans. CLEAR gt_ans.
      WHEN OTHERS.
        l_int = l_num + 1.
        l_num = l_int.
    ENDCASE.
  ENDLOOP.
ENDFORM.                    " GET_ANSWER
*&---------------------------------------------------------------------*
*&      Form  RAN_DOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_VALUE  text
*----------------------------------------------------------------------*
FORM ran_dom  CHANGING   p_value.
  DO 5 TIMES.
    CALL FUNCTION 'RANDOM_I4'
      EXPORTING
        rnd_min   = 1
        rnd_max   = 25
      IMPORTING
        rnd_value = p_value.
  ENDDO.
ENDFORM.                    " RAN_DOM
*&---------------------------------------------------------------------*
*&      Form  OPEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_LINE  text
*      -->P_0041   text
*----------------------------------------------------------------------*
FORM open  USING    p_line
                    value(p_col).
  CLEAR gt_alv.
  LOOP AT gt_alv.
    IF sy-tabix = p_line.
      CASE p_col.
        WHEN 'COL1'.
          gt_alv-col1 = g_int.
        WHEN 'COL2'.
          gt_alv-col2 = g_int.
        WHEN 'COL3'.
          gt_alv-col3 = g_int.
        WHEN 'COL4'.
          gt_alv-col4 = g_int.
        WHEN 'COL5'.
          gt_alv-col5 = g_int.
      ENDCASE.
      MODIFY gt_alv. CLEAR gt_alv.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " OPEN
*&---------------------------------------------------------------------*
*&      Form  SCREEN-REFRESH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM screen-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.                    " SCREEN-REFRESH
*&---------------------------------------------------------------------*
*&      Form  BINGO_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM bingo_check .
  DATA: l_bc.
  DATA: l_bc1 TYPE c,
        l_bc2 TYPE c,
        l_bc3 TYPE c,
        l_bc4 TYPE c.
  DATA: l_col1,
        l_col2,
        l_col3,
        l_col4,
        l_col5.
  DATA: l_d1,
        l_d2.

  CLEAR: l_bc1, l_bc2, l_bc3, l_bc4.
  CLEAR: l_col1, l_col2, l_col3, l_col4, l_col5.
  CLEAR: l_d1, l_d2.
  LOOP AT gt_alv.
*  --가로 빙고체크.
    IF ( gt_alv-col1 IS NOT INITIAL AND
         gt_alv-col2 IS NOT INITIAL AND
         gt_alv-col3 IS NOT INITIAL AND
         gt_alv-col4 IS NOT INITIAL AND
         gt_alv-col5 IS NOT INITIAL ).
      l_bc1 = l_bc1 + 1.
    ENDIF.
*  --세로 빙고체크.
    IF gt_alv-col1 IS NOT INITIAL.
      l_col1 = l_col1 + 1.
    ENDIF.
    IF gt_alv-col2 IS NOT INITIAL.
      l_col2 = l_col2 + 1.
    ENDIF.
    IF gt_alv-col3 IS NOT INITIAL.
      l_col3 = l_col3 + 1.
    ENDIF.
    IF gt_alv-col4 IS NOT INITIAL.
      l_col4 = l_col4 + 1.
    ENDIF.
    IF gt_alv-col5 IS NOT INITIAL.
      l_col5 = l_col5 + 1.
    ENDIF.

* -- 대각선 빙고 체크.
    CASE sy-tabix.
      WHEN '1'.
        IF gt_alv-col1 IS NOT INITIAL.
          l_d1 = l_d1 + 1.
        ENDIF.
        IF gt_alv-col5 IS NOT INITIAL.
          l_d2 = l_d2 + 1.
        ENDIF.
      WHEN '2'.
        IF gt_alv-col2 IS NOT INITIAL.
          l_d1 = l_d1 + 1.
        ENDIF.
        IF gt_alv-col4 IS NOT INITIAL.
          l_d2 = l_d2 + 1.
        ENDIF.
      WHEN '3'.
        IF gt_alv-col3 IS NOT INITIAL.
          l_d1 = l_d1 + 1.
          l_d2 = l_d2 + 1.
        ENDIF.
      WHEN '4'.
        IF gt_alv-col4 IS NOT INITIAL.
          l_d1 = l_d1 + 1.
        ENDIF.
        IF gt_alv-col2 IS NOT INITIAL.
          l_d2 = l_d2 + 1.
        ENDIF.
      WHEN '5'.
        IF gt_alv-col5 IS NOT INITIAL.
          l_d1 = l_d1 + 1.
        ENDIF.
        IF gt_alv-col1 IS NOT INITIAL.
          l_d2 = l_d2 + 1.
        ENDIF.
    ENDCASE.
  ENDLOOP.

*--세로빙고 계산.
  IF l_col1 = 5.
    l_bc2 = 1.
  ENDIF.
  IF l_col2 = 5.
    l_bc2 = l_bc2 + 1.
  ENDIF.
  IF l_col3 = 5.
    l_bc2 = l_bc2 + 1.
  ENDIF.
  IF l_col4 = 5.
    l_bc2 = l_bc2 + 1.
  ENDIF.
  IF l_col5 = 5.
    l_bc2 = l_bc2 + 1.
  ENDIF.

  IF l_d1 = 5.
    l_bc3 = l_bc3 + 1.
  ENDIF.
  IF l_d2 = 5.
    l_bc3 = l_bc3 + 1.
  ENDIF.
  CLEAR l_bc.
  l_bc = l_bc1 + l_bc2 + l_bc3.

  CLEAR g_bingo.
  CASE l_bc.
    WHEN '0'.
      g_bingo = 0.
    WHEN '1'.
      g_bingo = 1.
    WHEN '2'.
      g_bingo = 2.
    WHEN '3'.
      g_bingo = 3.
      MESSAGE i000 WITH '승리하셨습니다.'.
    WHEN OTHERS.
      MESSAGE i000 WITH '승리하셨습니다.'.
  ENDCASE.

ENDFORM.                    " BINGO_CHECK