Solana 游戏开发入门:用 Tiny Adventure 写出第一句 Hello World

·

本文将带你 30 分钟内在浏览器内完成第一款链上游戏 _Tiny Adventure_:一个只能左右移动的小游戏,却能完整体验 Solana 开发的 核心关键词:程序部署、Anchor 框架、PDA 地址、游戏状态、SDK 调用、链上交互、Devnet 测试


为什么选择 Solana 做链游?


快速热身:一键启动 Solana Playground

  1. 打开 Solana Playground → 点击 Connect Wallet
  2. 在弹窗里新建 Playground Wallet(会自动在 Devnet 给你地址)
  3. 右上角 + New Project → 模板选 Anchor → Tiny Adventure

如无 SOL,可在 Terminal 直接跑

solana airdrop 5 --url https://api.devnet.solana.com

游戏设计原型

机制说明
位置一条 4 格数轴:0 → 1 → 2 → 3
操作两个指令:move_leftmove_right
状态存储使用 PDA level1player_position

代码走读:从 0 到上线

定义游戏账户结构

#[account]
pub struct GameDataAccount {
    player_position: u8,
}

关键词技巧:#[account] 告诉 Anchor 自动反序列化,节省 gas。

初始化指令

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.game_data_account.player_position = 0;
    msg!("A Journey Begins!");
    msg!("o.......");
    Ok(())
}

移动指令

pub fn move_right(ctx: Context<MoveRight>) -> Result<()> {
    let acc = &mut ctx.accounts.game_data_account;
    if acc.player_position < 3 {
        acc.player_position += 1;
    }
    print_player(acc.player_position);
    Ok(())
}

同理,左移就是 -1 并保底 0


构建 & 部署

在 Playground Terminal 执行:

anchor build
anchor deploy

首次部署大约在 5–10 秒;成功后会出现:

Program Id: BouPBVWkdVHbxsdzqeMwkjqd5X67RX5nwMEwxn8MDpor

👉 想亲眼看交易在链上被确认?马上点开验证链接跟踪最新区块详情


客户端如何调用

Solana Playground 已生成 client.ts,我们只需三步:

1. 计算 PDA

const [pda] = await anchor.web3.PublicKey.findProgramAddress(
  [Buffer.from("level1", "utf8")],
  program.programId
);

2. 初始化账户

await program.methods
  .initialize()
  .accounts({ gameDataAccount: pda })
  .rpc();

3. 移动并回显位置

for (let i = 0; i < 3; i++) {
  await program.methods.moveRight().accounts({ gameDataAccount: pda }).rpc();
  const state = await program.account.gameDataAccount.fetch(pda);
  console.log("当前位置:", state.playerPosition);
}

实战结果示例

运行 client.ts 后,终端输出:

A journey begins...
o.......  (初始 0)
....o.... (位移到 1)
......o.. (位移到 2)
........\o/ (胜利 3)

FAQ:新手最疑惑的 6 个问题

Q1:PDA 与普通地址有何不同?
A:PDA 由 program 地址 + 种子哈希生成,永远不会碰撞,天然适合做“命名”存储,本次用 level1 固定那个场景。

Q2:为什么可以多人共用同一个 game account?
A:默认代码未限制签名者,因此所有人都能指挥同一角色。加个 [signer.key().as_ref()] 种子即可为每位玩家建独立关卡。

Q3:必须装本地 Rust 吗?
A:浏览器里的 Playground 已集成 rust-analyzer + anchor-cli,无需本地下载。

Q4:部署主网费用高吗?
A:此合约不到 8 kB,主网部署成本不足 0.02 SOL;开发期强烈建议在 Devnet 反复验证。

Q5:如果链上数据越来越多会不会变慢?
A:Solana 采用并行执行,不同 PDA 的读写并发处理,单个账户状态并不会阻塞整条链。

Q6:下一步还能怎样扩展?
A:常见思路是加入 Token 奖励系统NFT 角色皮肤 或把一维扩展到二维地图,源码参考👉 进阶示范仓库


下一步实践清单


总结

本篇 Tiny Adventure Hello World 覆盖了 Solana 游戏开发的全链路:Anchor 程序、PDA 存储、链上状态更新、客户端 JavaScript 调用。掌握以上 核心关键词:Anchor、PDA、Devnet、Rust、链游 后,你已在区块链游戏世界迈出稳健第一步。继续发挥创意,把你的下一个百万级链游写进下一份 Rust 文件吧!