在 SAPGUI 里用 ABAP 编写和运行俄罗斯方块

文摘   2024-11-21 18:08   北京  

昨天看到一篇公众号文章:

17岁高中生写了个神级 Prompt,直接把 Claude 强化成了满血 o1

这个 Prompt 的作者名叫涂津豪,2007年出生,现在是一位17岁的高中生

Prompt 全文 1500 字,号称能够极大程度上增强 Claude 的推理能力。完整的 Prompt,在小涂的 Github 上能下载。

https://github.com/richards199999/Thinking-Claude/tree/main

抱着试一试的想法,我把这个 Prompt 稍稍做了修改,然后用在 ChatGPT 上。

ChatGPT 接收并理解了这个复杂的指令,并答应会尽力而为。

于是我让 ChatGPT 用 ABAP 在 SAPGUI 中编写一个俄罗斯方块游戏,要求给出详细的需求拆解步骤和实现的完整源代码。

这个需求其实是个伪命题,有点强人所难。

因为 SAPGUI 虽然名称带有一个 GUI,但根本不适合用来运行常规的游戏。

ABAP 语言的初衷是为商业应用开发设计,特别是以处理业务逻辑和数据库交互为核心任务,这是一个和游戏开发截然不同的领域。

图形处理能力极为有限

游戏开发对图形处理的要求极高。无论是 2D 还是 3D 游戏,渲染图像的速度、表现力和动态交互都需要专门的图形处理能力。现代游戏引擎(如 Unity、Unreal Engine)都使用 GPU 加速,能够处理复杂的渲染、光影效果和物理计算。而 SAP GUI 的图形表现非常有限,只能用于渲染静态的 UI 元素,如按钮、表格和简单图标。

在 SAPGUI 中,图形元素通常是通过 ABAP List Viewer (ALV) 或其他简单的 UI 元素进行展示。在 SAP 中展示数据图表时,可以用 ABAP 编写一些代码,生成柱状图或折线图。

然而,这样的图形渲染对于一个现代游戏来说显然是远远不够,因为 SAPGUI 根本没有为这种需求提供低级别的图形硬件接口,也没有必要的 API 来支持实时渲染。

比如要实现一个简单的 2D 游戏贪吃蛇。在常规的游戏开发环境中,使用 JavaScript 和 HTML5 的 Canvas API,我们可以轻松地实现蛇的移动、食物的出现以及碰撞检测等功能。

而在 SAPGUI 中,即使只是简单地在屏幕上显示一条可移动的“蛇”,ABAP 开发者也会面临极大的挑战。因为 SAP GUI 没有原生的图形绘制 API,开发者只能通过不断地刷新屏幕来显示蛇的位置更新,这种方式的延迟和资源消耗都是不可接受的。

事件驱动编程能力的局限性

游戏需要大量的实时事件处理,比如玩家输入、物体碰撞、动画更新等。这些事件往往需要在极短的时间内完成响应,以确保游戏的流畅体验。现代游戏开发一般采用事件驱动架构来实现这些需求,而 ABAP 的事件处理模型则非常不适合这个场景。

ABAP 更擅长处理事务性任务,而不是实时响应的用户输入。SAPGUI 的事件处理机制主要用于处理用户的按钮点击、输入字段的更改等交互,这种机制的反应速度相对于游戏开发来说过于缓慢。例如玩家在玩一个动作游戏时按下跳跃键,期望角色立即跳起,而在 SAPGUI 中,事件的处理需要经过多个层次的服务器响应和客户端渲染,导致无法满足实时性的需求。

在 SAP 系统中,当用户点击某个按钮执行查询操作时,背后涉及到的步骤包括用户请求传递给服务器,服务器执行相应的 ABAP 代码,查询数据库,然后将结果返回给客户端进行渲染。在这样的流程中,数据的传输和处理通常需要数百毫秒到几秒不等。

如果用这种模式来处理游戏中的角色移动指令,游戏的体验显然会受到严重影响,玩家会感受到明显的卡顿和延迟。

内存和资源管理的劣势

游戏开发还需要对内存和硬件资源进行非常精细的管理,以优化性能,确保帧率的稳定。

ABAP 运行于 SAP 应用服务器之上,本身的内存管理和硬件资源访问都被 SAP 系统严格控制,开发者并没有低级别的硬件访问权限。

例如在一个游戏中,开发者可能需要管理复杂的对象和纹理资源,在合适的时候加载和释放,以避免内存溢出和帧率下降。而在 ABAP 中,开发者无法直接控制内存的分配与释放。这些任务都是由 SAP 内核自动管理的,且内核的设计目标是保证系统的稳定和数据的完整性,而不是实时性和高性能的渲染。

并行处理和多线程支持的缺乏

现代游戏引擎在处理物理计算、AI 行为、渲染等任务时,通常会利用多核 CPU 进行并行处理,以提高游戏的性能。

ABAP 的并行处理能力非常有限。虽然在 ABAP 中可以通过 Background Jobs 实现某种形式的并发执行,但这些任务更多是用于批处理和后端作业,而不是游戏中需要的高频并行计算。

用户体验的局限性

SAPGUI 本质上是一个企业应用程序的用户界面,设计初衷是用来展示数据和收集用户输入。

ABAP 代码能够很方便地生成数据表格、表单、按钮等典型的业务 UI 元素,但缺乏支持复杂交互动画和即时反馈的能力。现代游戏往往需要精美的动画效果、丰富的互动和快速的响应来增强玩家的体验,而 SAPGUI 完全不具备这些功能。

在 SAPGUI 中,UI 的更新是基于屏幕刷新,也就是说,任何界面上的变化都需要触发一个服务器请求。这意味着,在游戏场景中,如果需要实现一个角色跳跃的动画,开发者可能需要发送多次请求来更新角色的位置,每次请求间隔可能导致几百毫秒的延迟,这会让动画看起来非常生硬。而现代的游戏引擎如 Unity,可以通过帧动画的方式让角色的跳跃看起来非常自然和流畅。

我们还是让 ChatGPT 来试着完成这个强人所难的需求吧。

ChatGPT 的回复:

  1. 理解 SAPGUI 限制

  • SAPGUI 是基于 GUI 脚本接口的,它最初的设计目的并不是用来处理实时的游戏逻辑。实现俄罗斯方块这样的游戏需要一定的技巧,比如手动刷新屏幕、绘制图形、处理键盘事件等。

  • 界面设计

    • 使用 SAP 的经典屏幕(dynpro)设计一个简单的界面用于显示俄罗斯方块。可以通过 ALV 网格,字符矩阵或者自定义容器来进行展示。

  • 游戏主循环

    • 游戏需要一个主循环来不断更新屏幕。由于 SAP GUI 不支持实时渲染,我们可以模拟循环,通过使用 WAIT 命令加上有限次刷新,来让界面不断更新。

  • 方块的数据表示

    • 使用二维数组来表示游戏区域的状态。每个数组元素可以是 0(空白)或 1(有方块)。

  • 方块的生成和旋转

    • 编写 ABAP 程序来生成不同类型的方块(L、I、T 等)。方块可以用不同的二维数组来表示。

  • 方块的移动

    • 编写逻辑来处理方块的左移、右移、下落,以及旋转。使用用户输入来控制这些动作。

  • 碰撞检测与游戏逻辑

    • 编写碰撞检测逻辑,确保方块不会超出边界或重叠。

  • 界面刷新与游戏结束条件

    • 实现界面刷新,利用 SAPGUI 的更新函数刷新游戏画面。同时处理游戏结束的条件,例如方块堆叠到顶端。

    具体的实现源代码

    以下是一个简化版的 ABAP 实现的例子。请注意,SAPGUI 的局限性使得我们无法完全实现复杂的游戏体验,但这个代码将演示一个基本的原型。

    REPORT z_tetris.

    TABLES: sscrfields.

    DATA: game_area TYPE TABLE OF string WITH DEFAULT KEY,
    block TYPE TABLE OF string WITH DEFAULT KEY,
    command TYPE c LENGTH 1,
    done TYPE abap_bool VALUE abap_false.

    CONSTANTS: c_width TYPE i VALUE 10,
    c_height TYPE i VALUE 20.

    DATA: area_line TYPE string.

    * 初始化游戏区域
    INITIALIZATION.
    PERFORM init_game_area.

    START-OF-SELECTION.
    WHILE done = abap_false.
    PERFORM draw_game_area.
    PERFORM drop_block.
    PERFORM get_command.
    PERFORM process_command USING command.
    IF command = 'Q'.
    done = abap_true.
    ENDIF.
    ENDWHILE.

    FORM init_game_area.
    LOOP AT game_area INTO area_line.
    CLEAR area_line.
    area_line = sy-uline(10).
    APPEND area_line TO game_area.
    ENDLOOP.
    ENDFORM.

    FORM draw_game_area.
    LOOP AT game_area INTO area_line.
    WRITE: / area_line.
    ENDLOOP.
    ENDFORM.

    FORM drop_block.
    DATA: line TYPE string VALUE ' XX '.
    INSERT line INTO game_area INDEX 1.
    ENDFORM.

    FORM get_command.
    PARAMETERS: p_command TYPE c LENGTH 1.
    command = p_command.
    ENDFORM.

    FORM process_command USING p_command TYPE c.
    CASE p_command.
    WHEN 'A'.
    PERFORM move_left.
    WHEN 'D'.
    PERFORM move_right.
    WHEN OTHERS.
    " Do nothing
    ENDCASE.
    ENDFORM.

    FORM move_left.
    "
    Left movement logic
    ENDFORM.

    FORM move_right.
    " Right movement logic
    ENDFORM.

    代码详细说明

    1. 初始化游戏区域

    • 使用二维字符数组来表示游戏区域,每个元素代表一个游戏单元(空格或者方块)。

  • 显示游戏界面

    • FORM draw_game_area:遍历二维数组并显示游戏的当前状态。这里的输出是基于文本的,但我们通过动态修改字符的内容来模拟图形的变化。

  • 获取玩家输入

    • FORM get_command:让玩家输入控制字符,例如 'A' 表示左移,'D' 表示右移。

  • 方块下落

    • FORM drop_block:简单实现了方块的下落。为了实现方块的移动和旋转,需要对二维数组进行相应的变换。

  • 处理命令

    • FORM process_command:根据用户的输入,调用不同的子程序来移动方块。

    进一步优化与挑战

    1. 界面优化

    • 以上实现是基于文本的,我们可以考虑使用 SAP 图形控件(如 CL_GUI_CUSTOM_CONTAINER 和 CL_GUI_HTML_VIEWER)来提供更好的视觉效果。

  • 键盘事件处理

    • SAPGUI 的事件处理比较有限,可以考虑通过定时器和用户输入的组合来模拟游戏的实时性。

  • 游戏逻辑的完善

    • 实现方块的旋转和消行逻辑,这需要对二维数组进行更复杂的操作。

  • 多方块类型

    • 使用更多类型的二维数组来表示不同形状的方块,例如 L 形、T 形等。

    注意事项

    • 性能:由于 SAP ABAP 本身并非为实时渲染而设计,可能会出现性能瓶颈。

    • 用户体验:这种实现方式用户体验较差,更多的是验证 ABAP 的可能性而非用于真正的游戏发布。

    以上是一个初步的实现框架,展示了如何使用 ABAP 编写一个俄罗斯方块游戏的基本想法。虽然 SAPGUI 并不适合用于游戏开发,但通过这种方式可以更好地理解 ABAP 的操作逻辑和 SAPGUI 的交互能力。

    可以看出,ChatGPT 的回答避重就轻,缺乏最关键的方块渲染,随着时间间隔下落和屏幕消行逻辑的详细阐述,在源代码里更是根本没有提及。

    网络上有一个能够在 SAPGUI 里正常运行的 ABAP 版本的俄罗斯方块游戏,源代码地址如下:

    https://github.com/alejogonzaleze/SAP/blob/master/ABAP/Tetris/ZTETRIS

    在笔者 ABAP 系统里测试通过:

    推荐阅读:

    ABAP新语法1

    《ABAP新语法2》

    《SM30添加按钮:批导,筛选,排序等完整demo 》

    《关于 SM30/VIEW_MAINTENANCE_CALL锁整张表问题》

    《Demo:弹出文本输入框》

    《关于update task几个有意思的测试》

    动态批量修改任意表任意字段的值

    动态获取查询条件的一个小Demo

    使用cl_gui_docking_container 实现多ALV》

    VOFM 修改 组单开票时 会计凭拆分规则

    DEMO SUBMIT 某程序并获取该程序ALV数据

    DEMO:S/4 1809 FAGLL03H 增加字段增强

    几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了

    DEMO:BTE增强实现凭证创建检查

    SAP Parallel Accounting(平行分类账业务)配置+操作手册+BAPI demo程序

    CC02修改确认日期BAPI:Processing of change number was canceled我是怎样调试BAPI的,以F-02为例

    我是不是被代码给耽误了……不幸沦为一名程序员……

    三亚自由行攻略(自己穷游总结)

    苏州游记

    记码农十周年(20110214--20210214)

    不一样的SAP干货铺群:帅哥靓妹、红包、烤羊腿!

    十年老码农搬砖习惯和技巧

    我这个老码农是怎么debug标准程序的

    我是怎样调试BAPI的,以F-02为例

    杂谈:几种接口

    Odata 增删改查详例

    ODATA CREATE_DEEP_ENTITY 详例

    RESTful DEMO 一:SAP 如何提供 RESTful Web 服务

    RESTful DEMO 四 :增删改查及调用

    DEMO  search help 增强 ( vl03n KO03 等)

    录BDC时  弹出的公司代码框问题

    《搜索帮助系列》

    《增强相关》

    Debug 系列

    DEBUG  系列一:Dump debug
    DEBUG  系列二:Configure Debugger Layer
    DEBUG系列三:使用 F9 和 watch point
    DEBUG系列四:第三方接口debug
    DEBUG系列五:Update  模式下的function debug
    DEBUG系列六:后台JOB debug
    DEBUG系列七:保存测试参数
    DEBUG系列八:Debug弹出框
    debug系列九:SM13查看update更新报错
    DEBUG系列十:Smartforms debug
    DEBUG系列十一:GGB1 debug
    Debug系列十二:QRFC  队列 debug


    码农干货铺
    永远要保持一种无论何时何地都逼着自己更努力更优秀来享受更好生活的学习状态
     最新文章