查看: 2596|回复: 6

[已经解决] 输出的txt文件中出现乱码

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-5-5 23:54:33 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 纯属小虫 于 2022-5-6 00:00 编辑

想要做一个配合其他脚本,以txt文件形式输出物品掉落表,技能表等的脚本,以方便检查这些数据中是否存在错误
以下以多物品掉落为例子

[fold=完整的脚本][pre lang="ruby"]$多格掉宝 = {} # 初始化
   
# ---------------------------
# $多格掉宝 设置
# ---------------------------
# 设置范例
#============================================================
#$多格掉宝[1] = [[0, 1, 10],[1, 2, 100],[1, 2, 100], [2, 5, 80]]
$多格掉宝[1] = [[0, 1, 10],[1, 2, 100]]
$多格掉宝[2] = [[0, 5, 10],[1, 6, 100]]
#============================================================

# 脚本中的掉宝设置不会覆盖数据库中的设置,而是在基础上叠加
# $多格掉宝[敌人id] = [掉宝类型,id以及概率的数组]

# 掉宝类型,id以及概率的数组 说明:
# 索引为 0 的值
# 0 是 物品 1 是武器 2 是防具
# 索引为 1 的值
# 物品 武器 防具 的 id
# 索引为 2 的值
# 概率
# 可支持同种物品掉落多个!

# 需要有个检测程序,来导出这些数据,以验证爆率的准确度!
# 导出一个字符串,字符串显示掉宝的 【怪物名称】   【物品类型】 【物品名称】  【概率】

掉宝纠正测试 = true
if 掉宝纠正测试 == true
  内容 = "\n"
  $data_actors        = load_data("Data/Actors.rxdata")
  $data_classes       = load_data("Data/Classes.rxdata")
  $data_skills        = load_data("Data/Skills.rxdata")
  $data_items         = load_data("Data/Items.rxdata")
  $data_weapons       = load_data("Data/Weapons.rxdata")
  $data_armors        = load_data("Data/Armors.rxdata")
  $data_enemies       = load_data("Data/Enemies.rxdata")
  $data_troops        = load_data("Data/Troops.rxdata")
  $data_states        = load_data("Data/States.rxdata")
  $data_animations    = load_data("Data/Animations.rxdata")
  $data_tilesets      = load_data("Data/Tilesets.rxdata")
  $data_common_events = load_data("Data/CommonEvents.rxdata")
  $data_system        = load_data("Data/System.rxdata")
  for i in 0..100
    if $多格掉宝 != nil
      怪物名称 = $data_enemies.name
      内容X = "\n"
      for j in $多格掉宝
        case j[0]
        when 0
          if $data_items[j[1]] != nil
            物品类型 = "物品"
            物品名称 = $data_items[j[1]].name
          end
        when 1
          if $data_weapons[j[1]] != nil
            物品类型 = "武器"
            物品名称 = $data_weapons[j[1]].name
          end
        when 2
          if $data_armors[j[1]] != nil
            物品类型 = "武器"
            物品名称 = $data_armors[j[1]].name
          end
        end
        概率 = j[2].to_s
        内容X +=物品类型 + "#" + 物品名称 + "  " + 概率 + "    | "
      end
      内容 += 怪物名称+ "==>>" + 内容X + "\n"
    end
  end
  outfile_name = "掉宝测试.txt"
  outfile = File.open(outfile_name, "wb") #输出文件
  data = 内容
  Marshal.dump(data, outfile)
  outfile.close

  p "已将掉宝表导出至根目录"
end






class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 开始结束战斗回合
  #--------------------------------------------------------------------------
  def start_phase5
    # 转移到回合 5
    @phase = 5
    # 演奏战斗结束 ME
    $game_system.me_play($game_system.battle_end_me)
    # 还原为战斗开始前的 BGM
    $game_system.bgm_play($game_temp.map_bgm)
    # 初始化 EXP、金钱、宝物
    exp = 0
    gold = 0
    treasures = []
   
    for enemy in $game_troop.enemies
      unless enemy.hidden
        exp += enemy.exp
        gold += enemy.gold
        if rand(100) < enemy.treasure_prob
          if enemy.item_id > 0
            treasures.push($data_items[enemy.item_id])
          end
          if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
          end
          if enemy.armor_id > 0
            treasures.push($data_armors[enemy.armor_id])
          end
        end
      end
    end
   
    # ----------------------------------------
    for enemy in $game_troop.enemies
    unless enemy.hidden
    if $多格掉宝[enemy.id] != nil
       for i in $多格掉宝[enemy.id]
          概率 = i[2]
          case i[0]
          when 0 # 物品
            if rand(100) < 概率
              if $data_items[i[1]] != nil
                treasures.push($data_items[i[1]])
              end
            end
          when 1 # 武器
            if rand(100) < 概率
              if $data_weapons[i[1]] != nil
                treasures.push($data_weapons[i[1]])
              end
            end
          when 2 # 防具
            if rand(100) < 概率
              if $data_armors[i[1]] != nil
                treasures.push($data_armors[i[1]])
              end
            end
          end
       end
    end
    end
    end
    # ----------------------------------------
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      if actor.cant_get_exp? == false
        last_level = actor.level
        actor.exp += exp
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
    end
    # 获得金钱
    $game_party.gain_gold(gold)
    # 获得宝物
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    # 生成战斗结果窗口
    @result_window = Window_BattleResult.new(exp, gold, treasures)
    # 设置等待计数
    @phase5_wait_count = 100
  end
end


#==============================================================================
# ■ Window_BattleResult
#------------------------------------------------------------------------------
#  战斗结束时、显示获得的 EXP 及金钱的窗口。
#==============================================================================

class Window_BattleResult < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     exp       : EXP
  #     gold      : 金钱
  #     treasures : 宝物
  #--------------------------------------------------------------------------
  def initialize(exp, gold, treasures)
    @数量 = Hash.new {|hash,key| hash[key] = 0}
    @重复 = []
    for item in treasures
      unless @重复.include? item
        @重复 << item
        @数量[item] += 1
      else
        @数量[item] += 1
      end
    end
    @exp = exp
    @gold = gold
    @treasures = treasures
    super(160, 0, 320, @重复.size * 32 + 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.y = 160 - height / 2
    self.back_opacity = 160
    self.visible = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    x = 4
    self.contents.font.color = normal_color
    cx = contents.text_size(@exp.to_s).width
    self.contents.draw_text(x, 0, cx, 32, @exp.to_s)
    x += cx + 4
    self.contents.font.color = system_color
    cx = contents.text_size("EXP").width
    self.contents.draw_text(x, 0, 64, 32, "EXP")
    x += cx + 16
    self.contents.font.color = normal_color
    cx = contents.text_size(@gold.to_s).width
    self.contents.draw_text(x, 0, cx, 32, @gold.to_s)
    x += cx + 4
    self.contents.font.color = system_color
    self.contents.draw_text(x, 0, 128, 32, $data_system.words.gold)
    y = 32
    for item in @重复
      draw_item_name(item, 4, y)
      if @数量[item] > 1
        contents.draw_text(24 + contents.text_size(item.name).width, y,
        width - 40, 32, " ×"+@数量[item].to_s)
      end
      y += 32
    end
  end
end[/pre][/fold]

[fold=用于导出文件的脚本][pre lang="ruby"]掉宝纠正测试 = true
if 掉宝纠正测试 == true
  内容 = "\n"
  $data_actors        = load_data("Data/Actors.rxdata")
  $data_classes       = load_data("Data/Classes.rxdata")
  $data_skills        = load_data("Data/Skills.rxdata")
  $data_items         = load_data("Data/Items.rxdata")
  $data_weapons       = load_data("Data/Weapons.rxdata")
  $data_armors        = load_data("Data/Armors.rxdata")
  $data_enemies       = load_data("Data/Enemies.rxdata")
  $data_troops        = load_data("Data/Troops.rxdata")
  $data_states        = load_data("Data/States.rxdata")
  $data_animations    = load_data("Data/Animations.rxdata")
  $data_tilesets      = load_data("Data/Tilesets.rxdata")
  $data_common_events = load_data("Data/CommonEvents.rxdata")
  $data_system        = load_data("Data/System.rxdata")
  for i in 0..100
    if $多格掉宝 != nil
      怪物名称 = $data_enemies.name
      内容X = "\n"
      for j in $多格掉宝
        case j[0]
        when 0
          if $data_items[j[1]] != nil
            物品类型 = "物品"
            物品名称 = $data_items[j[1]].name
          end
        when 1
          if $data_weapons[j[1]] != nil
            物品类型 = "武器"
            物品名称 = $data_weapons[j[1]].name
          end
        when 2
          if $data_armors[j[1]] != nil
            物品类型 = "武器"
            物品名称 = $data_armors[j[1]].name
          end
        end
        概率 = j[2].to_s
        内容X +=物品类型 + "#" + 物品名称 + "  " + 概率 + "    | "
      end
      内容 += 怪物名称+ "==>>" + 内容X + "\n"
    end
  end
  outfile_name = "掉宝测试.txt"
  outfile = File.open(outfile_name, "wb") #输出文件
  data = 内容
  Marshal.dump(data, outfile)
  outfile.close

  p "已将掉宝表导出至根目录"
end[/pre][/fold]

乱码.png

正常.png

可见,有时候会正常,有时候会变成乱码,应该是编码的问题,但是不知道如何解决
梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
回帖
205
发表于 2022-5-6 11:40:20 | 显示全部楼层
txt文件保存为utf-8编码就好了
1.手动新建个utf-8编码的空txt文件,再写入内容
2.(新建)写入内容,手动另存为utf-8编码

3.自己转码(utf-8 => gbk),写入内容   #不推荐
回复

使用道具 举报

梦石
0
星屑
5649
在线时间
600 小时
注册时间
2020-2-20
回帖
217
发表于 2022-5-6 15:02:49 | 显示全部楼层
直接把你的txt文件拖到浏览器里面打开~~
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2022-5-6 17:07:48 | 显示全部楼层
楼上两位没get到点,关键问题在于LZ使用了 Marshal.dump 写入字符串:
  1. outfile_name = "掉宝测试.txt"
  2. outfile = File.open(outfile_name, "wb") #输出文件
  3. data = 内容
  4. Marshal.dump(data, outfile)
  5. outfile.close
复制代码
请改为
  1. outfile_name = "掉宝测试.txt"
  2. outfile = File.open(outfile_name, "w") #输出文件
  3. outfile << 内容
  4. outfile.close
复制代码

点评

感恩~~~已经解决了!  发表于 2022-5-6 17:41

评分

参与人数 3星屑 +60 赞 +3 收起 理由
RyanBern + 60 + 1 被醋瞎
enghao_lim + 1 估计只有你在读脚本~XD
纯属小虫 + 1 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 1 0

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-5-6 17:47:59 | 显示全部楼层
nie89 发表于 2022-5-6 15:02
直接把你的txt文件拖到浏览器里面打开~~

hhhh,虽然没有直接解决脚本问题,但真的能用浏览器把乱码txt变正常~~~赞!
回复

使用道具 举报

梦石
0
星屑
26087
在线时间
1595 小时
注册时间
2016-1-6
回帖
3441

超评测参与极短28参与极短27参与极短26参与极短25参与

发表于 2022-5-6 18:03:48 | 显示全部楼层
是不是编码格式问题,我看楼主的截图,ANSI显示是乱码,UTF-8显示正常。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部