You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby数组与循环游戏开发:循环中河段切换问题

问题修正与代码优化

现有代码的核心问题

  1. 移动逻辑错误:右移时错误修改了y坐标(写成了y -=1,实际应为y +=1)
  2. 未处理初始位置的鳄鱼检查,也没判断通关条件
  3. neither分支逻辑错误:不动不是直接被吃掉,而是保持y坐标不变
  4. Ruby字符串不可变,直接修改river1[x][y]会抛出错误,需将河段转为字符数组操作
  5. 河流输出格式错误:直接打印数组会显示结构符号,需要转为字符串输出

修正后的完整代码

river = "--P--,--C--,CC-CC,CC-CC"
# 将每个河段拆分为字符数组,方便修改玩家位置
river_segments = river.split(",").map { |seg| seg.chars }
# x代表当前所在河段索引,y代表当前河段内的位置索引
x = 0
y = 2

loop do
  # 1. 检查当前位置是否有鳄鱼
  if river_segments[x][y] == 'C'
    puts "You were eaten."
    break
  end

  # 2. 输出含玩家位置的整条河流
  current_river = river_segments.map { |seg| seg.join }.join(", ")
  puts current_river

  # 3. 询问玩家移动选择
  puts "Type left, right or neither"
  input = gets.chomp.downcase # 统一转小写,兼容大小写输入

  # 4. 先清空当前位置的玩家标记
  river_segments[x][y] = '-'

  # 根据输入更新y坐标,同时限制y在0-4范围内(防止移出河段)
  case input
  when "left"
    y -= 1 unless y == 0
  when "right"
    y += 1 unless y == 4
  when "neither"
    # 保持y坐标不变
  else
    puts "Invalid input, please type left, right or neither"
    # 恢复玩家位置,重新循环
    river_segments[x][y] = 'P'
    next
  end

  # 漂流到下一个河段
  x += 1

  # 检查是否通过所有河段
  if x >= river_segments.length
    puts "You survived!"
    break
  end

  # 检查新位置是否有鳄鱼,或者是否移出河段(移出视为掉河被吃)
  if y < 0 || y > 4 || river_segments[x][y] == 'C'
    puts "You were eaten."
    break
  end

  # 在新位置标记玩家
  river_segments[x][y] = 'P'
end

关键改动说明

  • 河段处理:将每个河段转为字符数组,解决Ruby字符串不可变的问题,方便修改玩家位置
  • 鳄鱼检查:循环开始先检查当前位置,漂流后再检查新位置,覆盖所有可能触发死亡的场景
  • 移动逻辑:修正右移的坐标计算,同时限制y在0-4之间,避免玩家移出河段
  • 通关判断:当x超过最后一个河段索引时,判定为存活并终止游戏
  • 输入兼容:将输入转为小写,同时处理无效输入,让游戏更健壮

内容的提问来源于stack exchange,提问作者NikitaFFF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:45:28