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