当前位置: 首页 > news >正文

0422-Box-实现推箱子游戏

环境

  • Time 2024-03-07
  • Zig 0.12.0-dev.3152+90c1a2c41
  • WSL-Ubuntu 22.04.3 LTS

前言

说明

参考资料:

  1. 《游戏开发:世嘉新人培训教材》

目标

使用 Zig 语言实现一个控制台的推箱子游戏。

实现游戏的更新

fn update(state: []MapItem, input: ?u8) void {const char = input orelse return;// 操作角色移动的距离const delta: isize = switch (char) {'w' => -stageWidth,'s' => stageWidth,'d' => 1,'a' => -1,else => return,};// 角色当前位置const currentIndex = for (state, 0..) |value, index| {if (value == MapItem.MAN or value == MapItem.MAN_ON_GOAL) break index;} else return;const index = @as(isize, @intCast(currentIndex)) + delta;if (index < 0 or index > stageLength) return;// 角色欲前往的目的地const destIndex = @as(usize, @intCast(index));updateMap(state, currentIndex, destIndex, delta);
}

更新游戏地图

fn updateMap(state: []MapItem, current: usize, dest: usize, delta: isize) void {if (state[dest] == .SPACE or state[dest] == .GOAL) {// 如果是空地或者目标地,则可以移动state[dest] = if (state[dest] == .GOAL) .MAN_ON_GOAL else .MAN;state[current] = if (state[current] == .MAN_ON_GOAL) .GOAL else .SPACE;} else if (state[dest] == .BLOCK or state[dest] == .BLOCK_ON_GOAL) {//  如果是箱子或者目的地上的箱子,需要考虑该方向上的第二个位置const index = @as(isize, @intCast(dest)) + delta;if (index < 0 or index > stageLength) return;const next = @as(usize, @intCast(index));if (state[next] == .SPACE or state[next] == .GOAL) {state[next] = if (state[next] == .GOAL) .BLOCK_ON_GOAL else .BLOCK;state[dest] = if (state[dest] == .BLOCK_ON_GOAL) .MAN_ON_GOAL else .MAN;state[current] = if (state[current] == .MAN_ON_GOAL) .GOAL else .SPACE;}}
}

主函数 main

pub fn main() void {// 初始化地图var state: [stageLength]MapItem = undefined;initialize(&state, stageMap);const stdin = std.io.getStdIn().reader();while (true) {// 画出游戏地图draw(&state);// 检查游戏胜利条件if (checkClear(&state)) break;std.debug.print("a:left d:right w:up s:down. command?\n", .{});// 获取用户输入const char = inputChar(stdin);// 根据输入更新游戏地图update(&state, char);}// 游戏胜利std.debug.print("Congratulation's! you win.\n", .{});
}

效果

########
# .. p #
# oo   #
#      #
########
a:left d:right w:up s:down. command?
s
########
# ..   #
# oo p #
#      #
########
a:left d:right w:up s:down. command?
s
########
# ..   #
# oo   #
#    p #
########
a:left d:right w:up s:down. command?
a
########
# ..   #
# oo   #
#   p  #
########
a:left d:right w:up s:down. command?
a
########
# ..   #
# oo   #
#  p   #
########
a:left d:right w:up s:down. command?
w
########
# .O   #
# op   #
#      #
########
a:left d:right w:up s:down. command?
s
########
# .O   #
# o    #
#  p   #
########
a:left d:right w:up s:down. command?
a
########
# .O   #
# o    #
# p    #
########
a:left d:right w:up s:down. command?
w
########
# OO   #
# p    #
#      #
########
Congratulation's! you win.

总结

使用 Zig 语言,实现了命令行的推箱子游戏。

附录

源码

https://github.com/jiangbo/game/tree/main/zig/box/box1

http://www.jsqmd.com/news/1384926/

相关文章:

  • 同城GEO:本地生意如何被AI看见并推荐
  • Gemini大模型深度集成macOS:自然语言驱动开发与系统自动化实践
  • 2026年潍坊做智慧燃气安全监管平台的公司有哪些?
  • WebSocket技术转型:从HTTP轮询到实时通信的架构演进
  • 揭秘宿迁城乡建设监督网站:百姓身边的透明窗与便民通
  • SMUDebugTool终极指南:如何免费调试AMD Ryzen处理器硬件参数
  • MetaPost (mpost) 安装配置与绘图实战:从零搭建矢量绘图环境
  • Python实现FlashAlgo:嵌入式Flash编程算法原理与工程实践
  • PvZWidescreen 宽屏补丁完整指南:把《植物大战僵尸》的黑边变成你的新战场
  • GitHub 完全指南:从入门到精通,开发者必备的代码托管平台
  • 3大理由告诉你为什么MelonLoader是Unity游戏模组加载的最佳选择
  • 0425-Box-新增地图模块
  • 江西省九江市诚信可靠服务好的合同纠纷律师怎么联系?洪亮亮经验丰富、专业靠谱 - 专业优选推荐榜
  • Galgame翻译工具YUKI实测:从下载到多引擎对照,15分钟跑通全流程
  • 如何自学网络安全
  • 降重降AIGC率工具实测与推荐
  • 两阶段鲁棒优化与CCG算法:应对不确定性的决策框架与MATLAB实现
  • 2026专业空净选购评测|6大品牌硬核对比,避坑六大准则,无滤网成主流趋势 - 互联网科技品牌测评
  • 2026年济宁做智慧燃气安全监管平台的公司有哪些?
  • 终极PDF对比神器diff-pdf:5分钟快速上手,告别手动核对烦恼!
  • NHSE动物森友会存档编辑器:5分钟掌握终极岛屿改造神器
  • 萍乡本地防水维修科普:漏水原因、施工方案与选择建议 - 筑宅安
  • 从代码补全到多智能体协作:AI编程的演进与CrewAI实战
  • 江苏宽带隐藏套餐揭秘:日均8毛背后的真实价值与办理全攻略
  • 3步掌握MelonLoader:Unity游戏模组加载器终极指南
  • 快可美纹理天缝剂 - 甄选测评官
  • DeepSeek-V4-Pro 正式版深夜突袭:Agent 评测暴涨 50 分,一套代码通吃 OpenAI 与 Anthropic 双生态
  • 如何让SQL格式化一键完成?SQL Beautify VSCode插件上手全攻略
  • 2026 年江苏混凝土切割水钻打孔,开窗开门口施工公司推荐 - LYL仔仔
  • Web前端周刊2026W32 | Next.js 16.3发布,React Router v8发布,Astro 7.2发布,Node.js v26.6.0发布,ioredis 6.0发布