• ABAP屏幕实战之24点小游戏


    先放图,做一个简单的屏幕实战,主要实现24点小游戏。

                     

    好的,让我们分解步骤。

    1,创建一个屏幕。

    2,往上拖元素,界面如上,没什么特别值得注意的地方。

    3,写程序。

    好的,做完了,我们下期再见。

    Emmm....

    还是说下程序的点,虽然是个简单的小程序,但是写起来需要注意的地方还是很多的。

    1,四个随机的数字的给出,这里把2-10以及JQKA四个字母给到了一个内表,然后用四次随机数字读取该内表,实现随机发牌。

    2,数值计算,调用函数,函数可以百度。

    3,Back功能的实现,为了实现点一次就撤销一次,这里把所有的数字以及操作符的操作都放在了一个内表(以下简称操作表)里,操作一次append一次,那么撤销一次,就是

          删除该内表的最后一条数据,同时,该内表用来生成最终的表达式。

    4, 数字的不可重复选用,这里循环了屏幕,只要操作表里有该数字对应的按钮(撤销后内表删除数据,屏幕重新设置为可用),那么该按钮变灰,同时若是该内表不同时存在所有数字,那么不可计算。

    5,...没有了,放代码吧,因为懒得下载屏幕,所以就直接放PBO和PAI事件的代码了,其他代码自行推敲。

    6,如有疑问,请联系留言获取源码。

    MODULE user_command_0666 INPUT.
    
      CASE sy-ucomm.
        WHEN 'RESET'.
          CLEAR:exp,it_exp,num1,num2,num3,num4.
        WHEN 'RETURN'. LEAVE PROGRAM.
        WHEN 'BACK'.
          DATA(n) = lines( it_exp ).
          CHECK n > 0.
          DELETE it_exp INDEX n.
        WHEN 'CON'.
          DATA(exp_tmp) = exp.
          IF  line_exists( it_exp[ key = 'NUM1' ] )
          AND line_exists( it_exp[ key = 'NUM2' ] )
          AND line_exists( it_exp[ key = 'NUM3' ] )
          AND line_exists( it_exp[ key = 'NUM4' ] ).
          ELSE. MESSAGE 'Please use all number !' TYPE 'I' DISPLAY LIKE 'E'.EXIT.
          ENDIF.
            DATA value TYPE f.
            REPLACE: 'A' IN exp_tmp WITH '1',
                     'J' IN exp_tmp WITH '11',
                     'Q' IN exp_tmp WITH '12',
                     'K' IN exp_tmp WITH '13'.
    
            CALL FUNCTION 'EVAL_FORMULA'
              EXPORTING
                formula                 = exp_tmp
              IMPORTING
                value                   = value.
    * 这里删了异常,精简需要,莫要学我
            IF value <> 24.MESSAGE 'Not win!'   TYPE 'I' .
            ELSE.          MESSAGE 'Good Game!' TYPE 'I'.
            ENDIF.
          WHEN OTHERS.
            READ TABLE it_val INTO DATA(ls_val) WITH KEY key = sy-ucomm.
            CHECK sy-subrc EQ 0.
            APPEND ls_val TO it_exp.
        ENDCASE.
    ENDMODULE.
    

      

    MODULE before_output OUTPUT.
    
      DATA: cl_random TYPE REF TO cl_random_number,
            m         TYPE i.
    
      CREATE OBJECT cl_random.
      CALL METHOD cl_random->if_random_number~init .
    
      TYPES: c2 TYPE c LENGTH 2.
      DATA t_value TYPE TABLE OF c2.
      t_value = VALUE #( ( 'A' ) ( 'J' ) ( 'Q' ) ( 'K' )
                         ( '2' ) ( '3' ) ( '4' ) ( '5' ) ( '6' ) ( '7' ) ( '8' ) ( '9' ) ( '10' ) ).
      CLEAR:exp.
      LOOP AT it_exp INTO DATA(ls_exp).exp = |{ exp } { ls_exp-val }|.ENDLOOP.
      SHIFT exp LEFT DELETING LEADING ''.
      LOOP AT SCREEN.
        CHECK screen-name+(3) EQ 'NUM'.
        READ TABLE it_exp TRANSPORTING NO FIELDS WITH KEY key = screen-name.
        IF sy-subrc EQ 0.screen-input = 0.
        ELSE.            screen-input = 1.
        ENDIF.
        MODIFY SCREEN.
      ENDLOOP.
      CHECK num1 IS INITIAL.
      LOOP AT it_val ASSIGNING FIELD-SYMBOL(<ls_val>) FROM 1 TO 4.
        CALL FUNCTION 'QF05_RANDOM_INTEGER'
          EXPORTING
            ran_int_max   = 13
            ran_int_min   = 1
          IMPORTING
            ran_int       = m
          EXCEPTIONS
            invalid_input = 1
            OTHERS        = 2.
        <ls_val>-val = VALUE #( t_value[ m ] OPTIONAL ).
        CASE sy-tabix.
          WHEN 1. num1 = <ls_val>-val.
          WHEN 2. num2 = <ls_val>-val.
          WHEN 3. num3 = <ls_val>-val.
          WHEN 4. num4 = <ls_val>-val.
        ENDCASE.
      ENDLOOP.
    ENDMODULE.
    

      

  • 相关阅读:
    微信小程序中,block的作用
    关于小程序 页面中的生命周期函数
    MySQL -- 修改root密码
    Python3 -- time 获取任意前N天的日期
    linux -- 解决配置vim中文乱码的问题
    Linux -- iTem2 长时间保持会话(不断开)
    数据结构与算法 -- Python实现【归并排序算法】
    Git -- 目录
    Linux -- screen 命令
    python3 -- Linux 离线安装pip3方法
  • 原文地址:https://www.cnblogs.com/yibing-jia/p/11543326.html
Copyright © 2020-2023  润新知