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

0450-Bomb-生成地图道具

环境

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

前言

说明

参考资料:

  1. 《游戏开发:世嘉新人培训教材》
  2. 图片素材:https://www.ituring.com.cn/book/1742

目标

在上一节的基础上,再次生成地图上的道具。

map.zig

实现了地图上的道具的随机生成,重点在 generateItem 方法。

const std = @import("std");
const engine = @import("engine.zig");var tileMap: engine.TileMap = undefined;pub fn init() void {tileMap = engine.TileMap.init("map.png", 32);
}pub fn deinit() void {tileMap.deinit();
}const StageData = struct {enemy: usize,brickRate: usize,power: usize,bomb: usize,
};const stageData = [_]StageData{.{ .enemy = 2, .brickRate = 90, .power = 4, .bomb = 6 },.{ .enemy = 3, .brickRate = 80, .power = 1, .bomb = 0 },.{ .enemy = 6, .brickRate = 30, .power = 0, .bomb = 1 },
};// 定义地图的类型
pub const MapType = enum(u8) {space = 9,wall = 7,brick = 8,bomb = 2,power = 3,
};
const MapTypeSet = std.enums.EnumSet(MapType);const width = 19;
const height = 15;
var data: [width * height]MapTypeSet = undefined;fn toIndex(set: MapTypeSet) usize {return @intFromEnum(if (set.contains(.wall)) MapType.wall //// else if (set.contains(.brick)) MapType.brick //else if (set.contains(.bomb)) MapType.bomb //else if (set.contains(.power)) MapType.power //else MapType.space);
}pub const WorldMap = struct {width: usize = width,height: usize = height,data: []MapTypeSet,pub fn init(_: std.mem.Allocator, _: usize) ?WorldMap {const map = WorldMap{ .data = &data };return map.generateMap(stageData[0]);}fn generateMap(self: WorldMap, info: StageData) WorldMap {var bricks: [data.len]usize = undefined;var brickNumber: usize = 0;for (0..self.height) |y| {for (0..self.width) |x| {self.data[x + y * width] = if (isFixWall(x, y))MapTypeSet.initOne(.wall)else if (isFixSpace(x, y))MapTypeSet.initOne(.space)else if (engine.random(100) < info.brickRate) label: {bricks[brickNumber] = x << 16 | y;brickNumber += 1;break :label MapTypeSet.initOne(.brick);} else MapTypeSet.initOne(.space);}}generateItem(self, bricks[0..brickNumber], info);return self;}fn isFixWall(x: usize, y: usize) bool {if (x == 0 or y == 0) return true;if (x == width - 1 or y == height - 1) return true;if (x % 2 == 0 and y % 2 == 0) return true;return false;}fn isFixSpace(x: usize, y: usize) bool {return y + x < 4;}fn generateItem(self: WorldMap, bricks: []usize, info: StageData) void {for (0..info.bomb + info.power) |i| {const swapped = engine.randomX(i, bricks.len);const tmp = bricks[i];bricks[i] = bricks[swapped];bricks[swapped] = tmp;const x = bricks[i] >> 16 & 0xFFFF;const item: MapType = if (i < info.power) .power else .bomb;self.data[x + (bricks[i] & 0xFFFF) * self.width].insert(item);}}pub fn draw(self: WorldMap) void {for (0..self.height) |y| {for (0..self.width) |x| {const index = toIndex(data[x + y * self.width]);tileMap.drawI(index, x, y);}}}pub fn size(self: WorldMap) usize {return self.width * self.height;}pub fn deinit(_: WorldMap) void {// self.allocator.free(self.data);}
};

效果

bomb

总结

随机生成了地图上的道具。

附录

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

相关文章:

  • 数据结构与算法-动态规划、回溯与贪心
  • Codex 模型怎么选?GPT-5.6 Sol、Terra、Luna 等模型能力与应用场景对比
  • Java调用栈获取全解析:从Thread到StackWalker的四种方式对比与实践
  • Java编译参数-parameters详解:解决Spring MVC与MyBatis-Plus参数名缺失问题
  • IDEA 2022创建Maven Web项目:两种方式详解与Tomcat配置
  • IDEA自动导包与删包配置全解析:提升Java开发效率的核心技巧
  • Jupyter Notebook默认路径修改:原理、配置与高效工作流实践
  • 银河麒麟V10安装CrossOver运行Windows软件:兼容层原理与实战指南
  • 【车间调度】基于卷积神经网络的两阶段算法求解柔性作业车间调度问题附Matlab代码
  • 新手做拼多多一件代发,去哪里找便宜又靠谱的厂家一手货源?
  • K230开源图传方案:从硬件搭建到性能调优的完整实践指南
  • AtCoder Beginner Contest 281-300
  • 选对AI写作辅助平台少熬 3 个大夜!高口碑工具盘点 + 避坑全攻略
  • Day 20-Ansible 自动化运维实战复盘:从环境搭建到高可用集群部署
  • 润博企业营销策划适合哪些线下活动策划需求者
  • 2026 年临汾墅美爱家装饰|临汾装修公司如何做到报价透明不踩坑 - 收录优先
  • Serverless DApp 本地环境:模拟链、密钥与部署配置
  • M3U8怎么转换成MP4?在线转换M3U8视频的简单方法
  • Model Context Protocol 解析 PDF 表格:5 次对齐失败后,Claude Code 救了我
  • Andriod APP Kotlin 开发学习 001 ------ XML 脚本基础
  • 中山优才教育:资阳人工智能应用工程师报名入口、条件与流程详解 - 学历提升热点资讯
  • 事件触发控制在网络控制系统中的应用与优化
  • 服务网格巡检要看什么:配置下发、代理状态与请求错误
  • OpenClaw浏览器插件配置实战:打通AI智能体与网页自动化
  • DeepSeek V4接入Codex平台:0.24元完成3个数据分析任务的实战指南
  • 从零搭建本地AI编程助手:基于DeepSeek与VS Code的完整实践指南
  • 南宁市靠谱的本地正规防水补漏维修团队哪家好_渗漏治理本地修缮队伍分辨方法,业主实际挑选心得,避雷 - 雨婺虹修缮
  • 深入解析JavaScript事件循环:从宏任务微任务到异步编程实战
  • pprof 自动抓取 CPU 异常:触发条件与数据留存
  • 内景 新中式 展厅 展览馆