先放图,做一个简单的屏幕实战,主要实现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.