最近设计了一款简陋游戏的雏形

工作学习 工作学习 1233 人阅读 | 11 人回复 | 2024-06-04

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 孤星8 于 2024-6-7 16:42 编辑

在命令行窗口下,执行我的程序可以用左键和右键移动太空船(其实只是^符号),暂时不能发射武器。

1.png


我是用汇编写的,用的GetKeyState来读取键盘。
  1. format PE console
  2. entry start

  3. include 'win32a.inc'

  4. MOST_LEFT equ 1
  5. MOST_RIGHT equ 70
  6. START_COL equ 35
  7. ;START_ROW equ 20

  8. section '.data' data readable writeable

  9. _newpos           dd START_COL
  10. _oldpos           dd START_COL
  11. _spaceship        db '^'
  12. _bullet           db '|'
  13. _blank            db ' '
  14. _ansi_cls         db 27,'[H',27,'[J'
  15. _ansi_cls_len     = $ - _ansi_cls
  16. _ansi_reset       db   27,'[0m'   ; ANSI escape code (reset color)
  17. _ansi_reset_len   = $ - _ansi_reset
  18. _instruction      db 'Press Left and Right arrow to move; ESC to quit'
  19. _instruction_len  = $ - _instruction
  20. _stdout           dd ?
  21. _mode             dd ?
  22. _number           rb 10
  23. _ansi_goto_new    rb 9   ; 27,'[00;00H'
  24. _ansi_goto_old    rb 9
  25. _count            dd ?

  26. ;CSI n ; m H
  27. ;Moves the cursor to row n, column m. The values are 1-based, and default to 1 (top left corner) if omitted.

  28. ;VK_ESCAPE      0x1B    ESC key
  29. ;VK_LEFT        0x25    LEFT ARROW key
  30. ;VK_UP   0x26    UP ARROW key
  31. ;VK_RIGHT        0x27    RIGHT ARROW key
  32. ;VK_DOWN 0x28    DOWN ARROW key

  33. section '.code' code readable executable

  34. start:

  35.          push    -11
  36.          call    [GetStdHandle]
  37.          mov     dword [_stdout], eax

  38.          push    _mode
  39.          push    [_stdout]
  40.          call    [GetConsoleMode]
  41.          or      [_mode], 4      ;ENABLE_VIRTUAL_TERMINAL_PROCESSING

  42.          push    [_mode]
  43.          push    [_stdout]
  44.          call    [SetConsoleMode]

  45.          push    0
  46.          push    0
  47.          push    _ansi_cls_len
  48.          push    _ansi_cls
  49.          push    dword [_stdout]
  50.          call    [WriteConsole]  ;Clear entire screen

  51.          push    0
  52.          push    0
  53.          push    _instruction_len
  54.          push    _instruction
  55.          push    dword [_stdout]
  56.          call    [WriteConsole]  ;Print keyboard instruction

  57.          mov     eax, dword [_newpos]
  58.          call    itoa
  59.          mov     [_count], ebx
  60.          call    DrawSpaceship

  61. .loop:
  62.          push    100
  63.          call    [Sleep]
  64.          push    0x1B           ;ESC key
  65.          call    [GetKeyState]
  66.          bt      eax, 15        ; If the high-order bit is 1, the key is down; otherwise, it is up
  67.          jc      .done
  68.          push    0x25           ;LEFT ARROW key
  69.          call    [GetKeyState]
  70.          bt      eax, 15
  71.          jc      .left
  72.          push    0x27           ;RIGHT ARROW key
  73.          call    [GetKeyState]
  74.          bt      eax, 15
  75.          jc      .right
  76.          jmp     .loop

  77. .left:
  78.          call    SaveValue
  79.          sub     [_newpos], 1
  80.          cmp     [_newpos], MOST_LEFT
  81.          jl      .keepleft
  82.          mov     eax, dword [_newpos]
  83.          call    itoa
  84.          mov     [_count], ebx
  85.          ;push    0
  86.          ;push    0
  87.          ;push    ebx
  88.          ;push    _number
  89.          ;push    dword [_stdout]
  90.          ;call    [WriteConsole]

  91.          call    DrawSpaceship
  92.          jmp     .loop

  93. .keepleft:
  94.          mov     [_newpos], MOST_LEFT
  95.          jmp     .loop

  96. .right:
  97.          call    SaveValue
  98.          add     [_newpos], 1
  99.          cmp     [_newpos], MOST_RIGHT
  100.          jg      .keepright
  101.          mov     eax, dword [_newpos]
  102.          call    itoa
  103.          mov     [_count], ebx
  104.          ;push    0
  105.          ;push    0
  106.          ;push    ebx
  107.          ;push    _number
  108.          ;push    dword [_stdout]
  109.          ;call    [WriteConsole]

  110.          call    DrawSpaceship
  111.          jmp     .loop

  112. .keepright:
  113.          mov     [_newpos], MOST_RIGHT
  114.          jmp     .loop

  115. .done:
  116.          push    0
  117.          call    [ExitProcess]


  118. itoa:                      ;-) Nice code snippet by Pauli Lindgren  (https://pkl.paldex.fi/)
  119. ; INPUT:  EAX
  120. ; OUTPUT: _number
  121. ; LEN OF OUTPUT: EBX
  122.          mov     ecx, 10
  123.          xor     ebx, ebx

  124. .divide:
  125.          xor     edx, edx
  126.          div     ecx
  127.          push    edx
  128.          inc     ebx
  129.          test    eax, eax
  130.          jnz     .divide

  131.          mov     ecx, ebx
  132.          lea     esi, [_number]
  133. .next:
  134.          pop     eax
  135.          add     al, '0'
  136.          mov     [esi], al
  137.          inc     esi
  138.          loop    .next
  139.          ret

  140. SaveValue:   ;Save old spaceship position
  141.          mov     eax, [_newpos]
  142.          mov     [_oldpos], eax
  143.          mov     ecx, 8
  144.          lea     edi, [_ansi_goto_old]
  145.          lea     esi, [_ansi_goto_new]
  146.          rep     movsb
  147.          ret

  148. DrawSpaceship:
  149.          mov     ecx, [_count]
  150.          lea     edi, [_ansi_goto_new]
  151.          mov     byte [edi], 27
  152.          mov     byte [edi+1], '['
  153.          mov     byte [edi+2], '2'  ;START_ROW = 20
  154.          mov     byte [edi+3], '0'
  155.          mov     byte [edi+4], ';'
  156.          add     edi,5
  157.          lea     esi, [_number]
  158.          rep     movsb
  159.          mov     byte [edi], 'H'
  160.          mov     byte [edi+1], 0

  161.          push    0
  162.          push    0
  163.          push    8
  164.          push    _ansi_goto_new          ;New position
  165.          push    dword [_stdout]
  166.          call    [WriteConsole]

  167.          push    0
  168.          push    0
  169.          push    1
  170.          push    _spaceship
  171.          push    dword [_stdout]
  172.          call    [WriteConsole]          ;Draw new spaceship

  173.          push    0
  174.          push    0
  175.          push    8
  176.          push    _ansi_goto_old          ;Old position
  177.          push    dword [_stdout]
  178.          call    [WriteConsole]

  179.          push    0
  180.          push    0
  181.          push    1
  182.          push    _blank
  183.          push    dword [_stdout]
  184.          call    [WriteConsole]          ;Delete old spaceship

  185.          ret

  186. section '.idata' import readable writeable

  187.   library kernel32, 'KERNEL32.DLL', \
  188.           user32, 'USER32.DLL'

  189.   import kernel32,\
  190.          GetStdHandle, 'GetStdHandle', \
  191.          WriteConsole, 'WriteConsoleA', \
  192.          ExitProcess,'ExitProcess', \
  193.          GetConsoleMode, 'GetConsoleMode',\
  194.          SetConsoleMode, 'SetConsoleMode',\
  195.          Sleep, 'Sleep'

  196.    import user32,\
  197.          GetKeyState, 'GetKeyState'
复制代码


shooter.zip

818 Bytes, 下载次数: 0

回答|共 11 个

simonzhd 发表于 2024-6-5 05:24:56| 字数 41 | 显示全部楼层

作为一个web开发者,很敬重游戏开发者,哪怕只是雏形,而且还是汇编语言编写的,哈哈

james007 发表于 2024-6-5 06:34:18| 字数 2 | 显示全部楼层

加油
人生是一部书

孤星8 发表于 2024-6-5 12:44:14| 字数 111 来自手机 | 显示全部楼层

simonzhd 发表于 2024-6-5 05:24
作为一个web开发者,很敬重游戏开发者,哪怕只是雏形,而且还是汇编语言编写的,哈哈 ...

站长过奖了,你准备学Flutter用Xcode编译iOS应用更让我敬佩你的毅力。哈哈。

孤星8 发表于 2024-6-5 12:44:46| 字数 45 来自手机 | 显示全部楼层

james007 发表于 2024-6-5 06:34
加油

谢谢james007,也期待你的作品。

蓝莓糖 发表于 2024-6-6 21:41:03| 字数 5 | 显示全部楼层

看不太明白

孤星8 发表于 2024-6-6 22:20:08| 字数 170 来自手机 | 显示全部楼层

蓝莓糖 发表于 2024-6-6 21:41
看不太明白

很是高兴得到蓝莓糖的重视。你是指源代码看不明白吧? 这个程序打开后中间只有一个^ 符号,可以左右移动,迟点希望可以完善它,射出子弹,再迟点可以有外星飞船,给玩家对准射击。中文有个名称,不知道是什么了,英文名有几个名称,泛称Alien Shooting game / Galaxy spaceship....

green5 发表于 2024-6-7 13:03:24| 字数 18 | 显示全部楼层

总觉得会编程写码的人很牛。为你点赞!

孤星8 发表于 2024-6-7 14:27:55| 字数 51 | 显示全部楼层

green5 发表于 2024-6-7 13:03
总觉得会编程写码的人很牛。为你点赞!

很高兴得到绿姐的称赞!

孤星8 发表于 2024-6-7 16:43:51| 字数 82 | 显示全部楼层

本帖最后由 孤星8 于 2024-6-7 16:52 编辑

我上传了shooter.zip,内含一个文件shooter.exe,可以用Windows打开运行。(已扫描电脑病毒)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则