使用Ruby是否有更有效的方法来控制控制台光标(车厢位置等)?

使用Ruby是否有更有效的方法来控制控制台光标(车厢位置等)?,ruby,console,Ruby,Console,在我用Ruby制作的基于文本的游戏中,我希望在一行文本上有多种颜色。paint gem似乎只适用于两种颜色,但我需要更多颜色,因此我查找了那些终端代码来操纵光标位置,这样我就可以向上移动一行并以新颜色打印字符串 有没有更有效的方法?以下是商店购买功能的代码: clr draw_stats_main shopbag = Game_DB.weapons_array bagkeys = shopbag.keys bagkeys.delete_

在我用Ruby制作的基于文本的游戏中,我希望在一行文本上有多种颜色。paint gem似乎只适用于两种颜色,但我需要更多颜色,因此我查找了那些终端代码来操纵光标位置,这样我就可以向上移动一行并以新颜色打印字符串

有没有更有效的方法?以下是商店购买功能的代码:

      clr
      draw_stats_main
      shopbag = Game_DB.weapons_array
      bagkeys = shopbag.keys
      bagkeys.delete_if {|i| i == 0}
      shopbag.each { |id, value|
        if id != 0
          if id >= 10
            string1 = " (" + id.to_s + ")" + " " + value[0]
            str1 = string1.size
          else
            string1 = "  (" + id.to_s + ")" + " " + value[0]
            str1 = string1.size
          end
          string2 = "ATTACK: #{value[1]}"; str2 = string2.size
          string3 = "SPEED: #{value[2]}"; str3 = string3.size
          string4 = "" if !value[3]
          string4 = "TWO HANDED WEAPON" if value[3]
          str3 = string3.size
          pa "#{string1}"
          pa "\033[1A \033[#{str1}C #{string2}", :red, :bright
          pa "\033[1A \033[#{str1+str2+4}C #{string3}", :yellow, :bright if value[1] < 10
          pa "\033[1A \033[#{str1+str2+str3+9}C #{string4}", :red if value[1] < 10
          pa "\033[1A \033[#{str1+str2+3}C #{string3}", :yellow, :bright if value[1] > 10 && value[1] < 100
          pa "\033[1A \033[#{str1+str2+str3+8}C #{string4}", :red if value[1] > 10 && value[1] < 100
          pa "\033[1A \033[#{str1+str2+2}C #{string3}", :yellow, :bright if value[1] >= 100
          pa "\033[1A \033[#{str1+str2+str3+7}C #{string4}", :red if value[1] >= 100
          pa "        >> Cost: #{value[4]}", :yellow
        end
      }
      pa "#{Game_DB.tx(:other, 0)}"
      pa "#{Game_DB.tx(:common, 22)}", :green, :bright
      loop do
        key = gets.chomp.to_i
        if bagkeys.include?(key)
          if @player.gold >= shopbag[key][4]
            @player.remove_gold(shopbag[key][4])
            @player.add_item(:weapon, key)
            weap = shopbag[key][0]; weapstr = weap.delete " "
            pa "#{Game_DB.tx(:other, 0)}"
            pa " You purchased #{weapstr} for #{shopbag[key][4]} gold! Dont forget to equip it!", :green, :bright
            key = gets
            break
          else
            pa " You don't have enough gold!", :red
            key = gets
            break
          end
        elsif key == 0
          @shopmenu[0] = false
          break
        end
      end
clr
绘制主数据
shopbag=游戏\u DB.武器\u阵列
bagkeys=购物袋
bagkeys.delete_如果{i | i==0}
Shoppag.each{| id,value|
如果id!=0
如果id>=10
string1=“(“+id.to_s+”)“+”+值[0]
str1=字符串1.1大小
其他的
string1=“(“+id.to_s+”)“+”+值[0]
str1=字符串1.1大小
结束
string2=“攻击:#{value[1]}”;str2=string2.size
string3=“速度:#{value[2]}”;str3=string3.size
string4=”“if!值[3]
string4=“双手武器”如果值[3]
str3=string3.0尺寸
pa“#{string1}”
pa“\033[1A\033[#{str1}C{string2}”,红色,明亮
pa“\033[1A\033[#{str1+str2+4}C{string3}”,如果值[1]小于10,则为黄色,:明亮
pa“\033[1A\033[#{str1+str2+str3+9}C{string4}”,如果值[1]小于10,则为红色
pa“\033[1A\033[#{str1+str2+3}C{string3}”,如果值[1]>10和值[1]<100,则为黄色和明亮
pa“\033[1A\033[#{str1+str2+str3+8}C{string4}”,如果值[1]>10和值[1]<100,则为红色
pa“\033[1A\033[#{str1+str2+2}C{string3}”,如果值[1]>=100,则为黄色,:亮
pa“\033[1A\033[#{str1+str2+str3+7}C{string4}”,如果值[1]>=100,则为红色
pa“>>成本:#{value[4]}”,黄色
结束
}
pa“#{Game_DB.tx(:other,0)}”
pa“#{Game_DB.tx(:common,22)}”,:绿色,:明亮
环道
key=get.chomp.to_i
如果是BagKey,则包括?(键)
if@player.gold>=购物袋[钥匙][4]
@玩家。移除黄金(购物袋[钥匙][4])
@玩家。添加物品(:武器,钥匙)
weap=shoppag[key][0];weapstr=weap.delete“”
pa“#{Game_DB.tx(:other,0)}”
pa“你用#{shoppag[key][4]}黄金购买了#{weapstr}!别忘了装备它!”,:绿色,:明亮
key=get
打破
其他的
爸爸:“你没有足够的金子!”,红色
key=get
打破
结束
elsif键==0
@shopmenu[0]=错误
打破
结束
结束

下面是玩家看到的这段代码的屏幕截图:

我听说有人使用带有ruby的
ncurses
bindings@maxpleaner这个gem看起来正是我想要的。它与ruby 2.7.2兼容吗?你认为我应该升级到ruby 3吗?我想我在启动这个pro时已经获得了最新版本JET,但我似乎是在2.7.2上,我认为Ruby 2.7和Ruby 3的区别在这里并不重要。如果你想升级,你可以升级,除非你正在做一些只存在于Ruby 3Curses中的事情。自从20世纪80年代以来,Ruby的变体就已经出现了,所以你在Ruby版本上没有问题。唯一的问题是它不能很好地使用JRuby和Windows存在问题。