SAP 一段无聊的ABAP代码写的消灭星星程序

一段无聊的ABAP代码写的消灭星星程序,看到一段ABAP代码写的消灭星星游戏的程序,分享给大家仅供娱乐!

游戏界面:相同颜色的双击消除

在这里插入图片描述
下面是代码分享:

*&---------------------------------------------------------------------*
*& Report ZWULIAOABAP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZWULIAOABAP           NO STANDARD PAGE HEADING.

TYPE-POOLS: icon.

TYPES:
  ty_farbe(2) TYPE n.

DATA:
  g_max_x(3)  TYPE n,
  punkte(5)   TYPE n,
  punkte1     TYPE i,
  punkte_undo TYPE i,
  punktec(5)  TYPE c,
  l_x(2)      TYPE n,
  l_y(2)      TYPE n,
  l_line      TYPE i,
  l_feld(20)  TYPE c,
  l_tabix     TYPE i,
  l_anzahl    TYPE i,
  l_farbe     TYPE ty_farbe,
  l_spalte(2) TYPE n,
  t_spalte    TYPE STANDARD TABLE OF ty_farbe,

  BEGIN OF spielfeld OCCURS 0,
    x(2)     TYPE n,
    y(2)     TYPE n,
    farbe(2) TYPE n,
    mark     TYPE c,
  END OF spielfeld,
  spielfeld2     LIKE spielfeld OCCURS 0 WITH HEADER LINE,
  spielfeld_undo LIKE spielfeld OCCURS 0 WITH HEADER LINE,
  l_spiel        LIKE spielfeld.

DATA:p_x(2)      TYPE n,
     p_y(2)      TYPE n,
     p_farben(1) TYPE c,
     p_norm      TYPE c,
     p_fort      TYPE c.
*** Spielfeld ***
*SELECTION-SCREEN BEGIN OF BLOCK sfeld WITH FRAME TITLE text-fld.
*PARAMETERS:
*  p_x(2)          TYPE n DEFAULT 30,
*  p_y(2)          TYPE n DEFAULT 30,
*  p_farben(1)     TYPE c DEFAULT 5.
*SELECTION-SCREEN END OF BLOCK sfeld.
*
**** Spielmodus ***
*SELECTION-SCREEN BEGIN OF BLOCK modus WITH FRAME TITLE text-mod.
*PARAMETERS:
*  p_norm          RADIOBUTTON GROUP mod DEFAULT 'X',
*  p_fort          RADIOBUTTON GROUP mod.
*SELECTION-SCREEN END OF BLOCK modus.

AT SELECTION-SCREEN.
  IF p_farben > 7.
    p_farben = 7.
    MESSAGE w000(su) WITH 'Nur 7 Farben m?glich!'.
  ENDIF.

START-OF-SELECTION.
  p_x = 30.
  p_y = 30.
  p_farben = 5.
  p_norm = 'X'.

  PERFORM init.

  PERFORM spielfeld_malen.

AT LINE-SELECTION.

  GET CURSOR FIELD l_feld LINE l_y.

  IF l_feld = 'ICON_SYSTEM_UNDO'.
*** Undo-Funktion
    spielfeld[] = spielfeld_undo[].
    SUBTRACT punkte_undo FROM punkte.
    CLEAR punkte_undo.
  ELSE.
    l_x = ( sy-cucol  - 1 ) / 2.


    READ TABLE spielfeld WITH KEY x = l_x
                                  y = l_y.
    IF sy-subrc = 0.
      l_tabix = sy-tabix.
      l_farbe = spielfeld-farbe.
      CASE spielfeld-mark.

        WHEN 1.
*** Erster Klick:
*-- Alte Auswahl l?schen
          LOOP AT spielfeld INTO l_spiel WHERE mark = 0.
            l_spiel-mark = 1.
            MODIFY spielfeld FROM l_spiel.
          ENDLOOP.

*-- Undo
          spielfeld_undo[] = spielfeld[].

*-- Neue Auswahl
          CLEAR punkte1.
          spielfeld-mark = 0.
          MODIFY spielfeld INDEX l_tabix.
          PERFORM suchen USING l_x l_y l_farbe.
          l_anzahl = 0.
          LOOP AT spielfeld INTO l_spiel WHERE mark = 0.
            ADD 1 TO l_anzahl.
          ENDLOOP.
          IF l_anzahl < 2.
            READ TABLE spielfeld INDEX l_tabix.
            IF sy-subrc = 0.
              spielfeld-mark = 1.
              MODIFY spielfeld INDEX l_tabix.
            ENDIF.
          ELSE.
            punkte1 = l_anzahl * l_anzahl.
          ENDIF.

        WHEN 0.
*** Zweiter Klick: L?schen der markierten felder.
          LOOP AT spielfeld WHERE mark = 0.
            spielfeld-farbe = 0.
            spielfeld-mark  = 2.
            MODIFY spielfeld.
          ENDLOOP.
          ADD punkte1 TO punkte.
          punkte_undo = punkte1.
          CLEAR punkte1.
          PERFORM rutschen.
          PERFORM rechts_sammeln.
          PERFORM auffuellen.
          PERFORM ende_pruefen.
        WHEN OTHERS.
      ENDCASE.
    ENDIF.
  ENDIF.

  PERFORM spielfeld_malen.

*&--------------------------------------------------------------------*
*&      Form  suchen
*&--------------------------------------------------------------------*
*      -->F_X        text
*      -->F_Y        text
*      -->F_FARBE    text
*---------------------------------------------------------------------*
FORM suchen USING f_x f_y f_farbe.

  DATA:
    u_x(2) TYPE n,
    u_y(2) TYPE n.

  u_y = f_y.
  u_x = f_x - 1.
  PERFORM test USING u_x u_y f_farbe 'X'.

  u_x = f_x + 1.
  PERFORM test USING u_x u_y f_farbe 'X'.

  u_x = f_x.
  u_y = f_y - 1.
  PERFORM test USING u_x u_y f_farbe 'X'.

  u_y = f_y + 1.
  PERFORM test USING u_x u_y f_farbe 'X'.


ENDFORM.                                                    "suchen

*&--------------------------------------------------------------------*
*&      Form  test
*&--------------------------------------------------------------------*
*      -->F_X        text
*      -->F_Y        text
*      -->F_FARBE    text
*---------------------------------------------------------------------*
FORM test USING VALUE(f_x) VALUE(f_y) f_farbe f_rekursiv.

  IF f_x = 0 OR f_x > p_x OR f_y = 0 OR f_y > p_y.
    EXIT.
  ELSE.
    READ TABLE spielfeld INTO l_spiel
         WITH KEY x = f_x  y = f_y.
    IF sy-subrc      = 0 AND
       l_spiel-farbe = f_farbe AND
       l_spiel-mark  = 1.
      l_spiel-mark = 0.
      MODIFY spielfeld FROM l_spiel INDEX sy-tabix.
      IF f_rekursiv = 'X'.
        PERFORM suchen USING f_x f_y f_farbe.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                                                    "test

*&--------------------------------------------------------------------*
*&      Form  init
*&--------------------------------------------------------------------*
FORM init.

  g_max_x = p_x * 3 + 1.

  DO p_x TIMES.
    l_x = sy-index.

    DO p_y TIMES.
      l_y = sy-index.

      spielfeld-x = l_x.
      spielfeld-y = l_y.
      PERFORM zufallsfarbe CHANGING spielfeld-farbe.
      spielfeld-mark = 1.
      APPEND spielfeld.

    ENDDO.

  ENDDO.

  spielfeld_undo[] = spielfeld[].

ENDFORM.                                                    "init

*&--------------------------------------------------------------------*
*&      Form  spielfeld_malen
*&--------------------------------------------------------------------*
FORM spielfeld_malen.

  DATA l_pos TYPE i.

  SET BLANK LINES ON.
  sy-lsind = 0.
  SKIP TO LINE 1.

  IF punkte =  0.
    punktec = 'null'.
  ELSE.
    WRITE punkte TO punktec NO-ZERO LEFT-JUSTIFIED.
  ENDIF.
*** Titel: "Jawbreaker: & Punkte"
  SET TITLEBAR 'JAW' WITH punktec.

  DO p_y TIMES.
    l_y = sy-index.
    l_pos = 1.
    DO p_x TIMES.
      l_x = sy-index.
      READ TABLE spielfeld WITH KEY x = l_x
                                    y = l_y.
      IF sy-subrc = 0.
        IF spielfeld-farbe = 2.
          WRITE: '..' NO-GAP HOTSPOT OFF.
        ELSEIF spielfeld-mark = 1.
          WRITE: '  ' COLOR = spielfeld-farbe NO-GAP
                    HOTSPOT ON INTENSIFIED = spielfeld-mark.
        ELSE.
          WRITE: '**' COLOR = spielfeld-farbe NO-GAP
                    HOTSPOT ON INTENSIFIED ON .
        ENDIF.
      ENDIF.
      ADD 2 TO l_pos.
    ENDDO.
    NEW-LINE.
  ENDDO.

  SKIP 1.
  WRITE: / 'Punkte:', punkte1 NO-ZERO.
  WRITE AT 30 icon_system_undo AS ICON HOTSPOT ON.

ENDFORM.                    "spielfeld_aufbauen

*&--------------------------------------------------------------------*
*&      Form  zufallsfarbe
*&--------------------------------------------------------------------*
FORM zufallsfarbe CHANGING f_farbe.

  DATA:
    l_min TYPE i,
    l_max TYPE i,
    l_rnd TYPE i.

  l_min = 3.
  l_max = p_farben + 2.

  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      ran_int_max   = l_max
      ran_int_min   = l_min
    IMPORTING
      ran_int       = l_rnd
    EXCEPTIONS
      invalid_input = 1
      OTHERS        = 2.

  f_farbe = l_rnd.

ENDFORM.                    "zufallsfarbe

*&--------------------------------------------------------------------*
*&      Form  rutschen
*&--------------------------------------------------------------------*
FORM rutschen.

  DATA:
  l_y2(2)  TYPE n.

  DO p_x TIMES.
    l_x = sy-index.
    l_y = p_y.
    CLEAR t_spalte.
    DO p_y TIMES.
      READ TABLE spielfeld WITH KEY x = l_x y = l_y.

      IF spielfeld-farbe <> 0.
        APPEND spielfeld-farbe TO t_spalte.
      ENDIF.
      SUBTRACT 1 FROM l_y.

    ENDDO.
    l_y2 = p_y.
    DO p_y TIMES.
      READ TABLE spielfeld WITH KEY x = l_x y = l_y2.
      l_tabix = sy-tabix.
      READ TABLE t_spalte INTO spielfeld-farbe INDEX sy-index.
      IF sy-subrc = 0.
        spielfeld-mark = 1.
      ELSE.
        spielfeld-farbe = 2.
        spielfeld-mark  = 1.
      ENDIF.
      MODIFY spielfeld INDEX l_tabix.
      SUBTRACT 1 FROM l_y2.
    ENDDO.

  ENDDO.

ENDFORM.                                                    "rutschen

*&--------------------------------------------------------------------*
*&      Form  rechts_sammeln
*&--------------------------------------------------------------------*
FORM rechts_sammeln.

  DATA:
  l_y2(2)  TYPE n.

*** Rechts beginnen
  l_x = p_x.
  DO p_x TIMES.
    DO p_x TIMES.
*** Prüfen, ob die Spalte leer ist
      LOOP AT spielfeld WHERE x = l_x
                          AND farbe <> 2.
        EXIT.
      ENDLOOP.
      IF sy-subrc = 0.
*** spalte nicht leer; schleife verlassen
        EXIT.                                               "from do
      ELSE.
** spalte ist leer
        l_spalte = l_x - 1.
        DO l_x TIMES.
          PERFORM verschiebe_spalte USING l_spalte.
          SUBTRACT 1 FROM l_spalte.
        ENDDO.
      ENDIF.
    ENDDO.
    SUBTRACT 1 FROM l_x.
  ENDDO.

ENDFORM.                    "rechts_sammeln


*&--------------------------------------------------------------------*
*&      Form  verschiebe_spalte
*&--------------------------------------------------------------------*
FORM verschiebe_spalte USING f_spalte.

  DATA: l_spalte2(2) TYPE n.
  CLEAR t_spalte.

  LOOP AT spielfeld WHERE x = f_spalte.

    APPEND spielfeld-farbe TO t_spalte.
    spielfeld-farbe = 2.
    spielfeld-mark  = 1.
    MODIFY spielfeld.
  ENDLOOP.

  l_spalte2 = f_spalte + 1.
  l_tabix = 0.
  LOOP AT spielfeld WHERE x = l_spalte2.
    ADD 1 TO l_tabix.
    READ TABLE t_spalte INTO spielfeld-farbe INDEX l_tabix.
    MODIFY spielfeld.

  ENDLOOP.

ENDFORM.                    "verschiebe_spalte

*---------------------------------------------------------------------*
*       FORM ende_pruefen                                             *
*---------------------------------------------------------------------*
FORM ende_pruefen.

  DATA:
    u_x(2)  TYPE n,
    u_y(2)  TYPE n,

    v_x(2)  TYPE n,
    v_y(2)  TYPE n,

    v_farbe TYPE ty_farbe.


  spielfeld2[] = spielfeld[].


  DO p_x TIMES.
    v_x = sy-index.
    DO p_y TIMES.
      v_y = sy-index.
      READ TABLE spielfeld2 WITH KEY x = v_x y = v_y.
      CHECK spielfeld2-farbe > 2.
      v_farbe = spielfeld2-farbe.
      u_x = v_x - 1.
      u_y = v_y.
      PERFORM test USING u_x u_y v_farbe ' '.

      u_x = v_x + 1.
      PERFORM test USING u_x u_y v_farbe ' '.

      u_x = v_x.
      u_y = v_y - 1.
      PERFORM test USING u_x u_y v_farbe ' '.

      u_y = v_y + 1.
      PERFORM test USING u_x u_y v_farbe ' '.
    ENDDO.
  ENDDO.

  LOOP AT spielfeld WHERE mark = 0.

  ENDLOOP.
  IF sy-subrc > 0.
    SKIP p_y.
    SKIP 4.
    WRITE: / 'Spiel ist zuende! Gewinnpunkte:', punkte NO-ZERO.
  ELSE.
    spielfeld[] = spielfeld2[].
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM spalte_auffuellen                                        *
*---------------------------------------------------------------------*
FORM spalte_auffuellen USING VALUE(fx).

  DATA:
    l_frb TYPE ty_farbe,
    l_anz TYPE i,
    l_min TYPE i,
    l_max TYPE i,
    l_rnd TYPE i,
    l_row TYPE i.

  l_max = p_y.
  l_min = 1.

  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      ran_int_max   = l_max
      ran_int_min   = l_min
    IMPORTING
      ran_int       = l_rnd
    EXCEPTIONS
      invalid_input = 1
      OTHERS        = 2.

  l_row = p_y.
  DO l_rnd TIMES.
    READ TABLE spielfeld WITH KEY x = fx y = l_row.
    l_tabix = sy-tabix.
    PERFORM zufallsfarbe USING spielfeld-farbe.
    MODIFY spielfeld INDEX l_tabix.
    SUBTRACT 1 FROM l_row.
  ENDDO.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM auffuellen                                               *
*---------------------------------------------------------------------*
FORM auffuellen.

  DATA l_spalte(2) TYPE n.

  IF p_fort = 'X'.

    l_spalte = p_x.
    DO p_x TIMES.
      LOOP AT spielfeld WHERE x = l_spalte AND farbe <> 2.
      ENDLOOP.
      IF sy-subrc > 0.
        PERFORM spalte_auffuellen USING l_spalte.
      ENDIF.
      SUBTRACT 1 FROM l_spalte.
    ENDDO.
  ENDIF.

ENDFORM.

代码仅供娱乐!

更多SAP文章请点击
更多SAP文章更新,大家一起学习进步!

请添加图片描述

文章中如有错误处。敬请指正!

搜索公众号:SAP资料文库
微信号:SPRO_PP
时间:2024-07-11

### 回答1: REPORT ZTEST.DATA: BEGIN OF ITAB OCCURS 0, VBELN LIKE VBAK-VBELN, VKBUR LIKE VBAK-VKBUR, END OF ITAB.SELECT * FROM VBAK INTO ITAB WHERE VBELN IN S_VBELN.LOOP AT ITAB. WRITE:/ ITAB-VBELN, ITAB-VKBUR. ENDLOOP. ### 回答2: SAP ABAP是一种流行的企业应用程序开发语言,用于在SAP系统中开发各种功能和报表。下面是一个示例的SAP ABAP数据报表代码: REPORT Z_MY_REPORT. DATA: lt_data TYPE STANDARD TABLE OF sflight, ls_data LIKE LINE OF lt_data. SELECT * FROM sflight INTO TABLE lt_data. WRITE: / 'FLIGHT', 'CARRIER', 'PRICE'. LOOP AT lt_data INTO ls_data. WRITE: / ls_data-fldate, ls_data-carrid, ls_data-seatsmax. ENDLOOP. 在这个示例中,我们首先定义了一个内表lt_data,类型为标准表(STANDARD TABLE),并声明了一个内表行ls_data,类型与lt_data的行相同。然后,我们使用SELECT语句从SFLIGHT表中选择所有数据,并将其存储在lt_data内表中。 接下来,我们使用LOOP AT语句循环遍历lt_data内表中的每一行,并将每一行的fldate、carrid和seatsmax字段值显示在屏幕上,使用WRITE语句实现输出功能。 这段代码会生成一个简单的报表,显示所有航班的日期、航空公司和座位最大数量。你可以根据需要修改代码来适应不同的数据源和显示要求。注意,SAP ABAP具有丰富的语法和功能,可以用于更复杂的报表开发和数据处理任务。 ### 回答3: SAP ABAP是一种用于编SAP系统的应用程序的编程语言。数据报表是SAP系统中经常用于显示和处理数据的工具。以下是一个简单的SAP ABAP数据报表代码的示例: REPORT ZDATA_REPORT. TABLES: ZEMPLOYEE. DATA: GT_EMPLOYEE TYPE TABLE OF ZEMPLOYEE, GS_EMPLOYEE TYPE ZEMPLOYEE. START-OF-SELECTION. SELECT * FROM ZEMPLOYEE INTO TABLE GT_EMPLOYEE. LOOP AT GT_EMPLOYEE INTO GS_EMPLOYEE. WRITE: / GS_EMPLOYEE-EMP_NAME, GS_EMPLOYEE-EMP_DEPARTMENT, GS_EMPLOYEE-EMP_SALARY. ENDLOOP. 上述代码首先声明了一个数据表ZEMPLOYEE,然后定义了两个数据结构:GT_EMPLOYEE和GS_EMPLOYEE。GT_EMPLOYEE是ZEMPLOYEE的内表类型,用于存储从数据库中检索到的数据。GS_EMPLOYEE是ZEMPLOYEE的一行数据。 代码的START-OF-SELECTION部分是数据报表的主体代码。它使用SELECT语句从数据库中选择所有的ZEMPLOYEE数据,并将其存储到GT_EMPLOYEE内表中。 然后,通过LOOP语句遍历GT_EMPLOYEE内表,并使用WRITE语句将每个员工的姓名、部门和薪资输出到屏幕上。 以上代码是一个简单的SAP ABAP数据报表示例,它可以根据具体的需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我小时候很黑

你的打赏是对我的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值