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.

  

 

转载于:https://www.cnblogs.com/yibing-jia/p/11543326.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值