在Ruby中制作基于RPG文本的游戏。如何存储和运行控件和场景?

在Ruby中制作基于RPG文本的游戏。如何存储和运行控件和场景?,ruby,Ruby,我对Ruby非常陌生,一直在通过一些资源来尝试和学习。我完成了Codecadamy的Ruby课程,通过艰苦的学习Ruby,我的成绩达到了75%。此外,我已经阅读了大约100页的雄辩的Ruby和pickaxe Ruby书籍(但到目前为止,我还没有读到这些书) 我正在尝试用Ruby制作一个基于文本的RPG游戏以供练习。我决定重新制作Chrono触发器,因为我对游戏很熟悉,我不想花时间去思考角色和故事;只是想练习编码 我试图制作四个简单的控件供玩家使用,但我发现很难将它们融入场景中 例如,我有控件“t

我对Ruby非常陌生,一直在通过一些资源来尝试和学习。我完成了Codecadamy的Ruby课程,通过艰苦的学习Ruby,我的成绩达到了75%。此外,我已经阅读了大约100页的雄辩的Ruby和pickaxe Ruby书籍(但到目前为止,我还没有读到这些书)

我正在尝试用Ruby制作一个基于文本的RPG游戏以供练习。我决定重新制作Chrono触发器,因为我对游戏很熟悉,我不想花时间去思考角色和故事;只是想练习编码

我试图制作四个简单的控件供玩家使用,但我发现很难将它们融入场景中

例如,我有控件“talk”,我使用“if/else”语句根据用户输入运行场景。如果用户多次输入“talk”,我发现自己不得不经历无数的if/else场景

下面是我的代码。这是非常混乱,因为我是一个初学者,但如果有人可以看看它,给我一些建议,如何使它的工作,这将是伟大的

---------欢迎方法----------- ---------克罗诺下一步该怎么办------ ----------------帮助菜单---------------- ----------------帮助菜单-----------------
基于文本的游戏实际上相当复杂,最终遵循了许多与传统视频游戏相同的逻辑和设计模式。你可能想在谷歌上搜索关于游戏设计的指南——它们有很多,基本原理适用于任何编程语言

也就是说,如果你想继续你的游戏而不迷失在无尽的if语句中,你应该使用类来管理你的场景

每个游戏都有一个主循环,这是一个无休止的循环,处理3个主要任务:在屏幕上显示内容、收集用户输入和计算游戏状态的变化。这种情况一再发生:

#main.rb
scene = Scene.new(:chapter_1)
while true
  scene.display
  print "> "
  action = $stdin.gets.chomp
  if command == 'talk'
    scene = scene.talk
  elsif command == 'action'
    scene = scene.action
  elsif command = 'attack'
    scene = scene.attack
  elsif command = 'flee'
    scene = scene.flee
  else
    puts 'unknown command!'
  end
end
scene类基本上只保存每个场景的文本以及哪些动作将哪些场景链接到哪些其他场景。这种结构称为状态机,它是跟踪游戏状态的最简单方法:

#scene.rb
class Scene
  def initialize beginning_state
    @state = beginning_state
    @scenes = {
      chapter_1: [
        "Hello and welcome to chapter 1 of my game!", 
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_talk: [
        "Please stop talking while I'm talking!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_action: [
        "W-what are you doing?!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_attack: [ 
        "Stop, that hurts :c",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      chapter_2: [ 
        "Congratulations, you have entered...\n chapter 2!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_talk: [
        "I'm ignoring you",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_action: [
        "I don't even care",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_attack: [ 
        "You're no match for me",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_flee: [
        "Okay, goodbye!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
    }
  end

  def display
    puts @scenes[@state][0]
  end

  def talk
    @state = @scenes[@state][1]
  end

  def action
    @state = @scenes[@state][2]
  end

  def attack
    @state = @scenes[@state][3]
  end

  def flee
    @state = @scenes[@state][4]
  end
end

对不起,这有点复杂,但游戏有点复杂。同样理想的情况是,您可以将场景保存在特殊格式的文本文件中,然后将其加载到游戏中,而不是像我那样在源代码中定义它们。

基于文本的游戏实际上相当复杂,最终遵循许多与传统视频游戏相同的逻辑和设计模式。你可能想在谷歌上搜索关于游戏设计的指南——它们有很多,基本原理适用于任何编程语言

也就是说,如果你想继续你的游戏而不迷失在无尽的if语句中,你应该使用类来管理你的场景

每个游戏都有一个主循环,这是一个无休止的循环,处理3个主要任务:在屏幕上显示内容、收集用户输入和计算游戏状态的变化。这种情况一再发生:

#main.rb
scene = Scene.new(:chapter_1)
while true
  scene.display
  print "> "
  action = $stdin.gets.chomp
  if command == 'talk'
    scene = scene.talk
  elsif command == 'action'
    scene = scene.action
  elsif command = 'attack'
    scene = scene.attack
  elsif command = 'flee'
    scene = scene.flee
  else
    puts 'unknown command!'
  end
end
scene类基本上只保存每个场景的文本以及哪些动作将哪些场景链接到哪些其他场景。这种结构称为状态机,它是跟踪游戏状态的最简单方法:

#scene.rb
class Scene
  def initialize beginning_state
    @state = beginning_state
    @scenes = {
      chapter_1: [
        "Hello and welcome to chapter 1 of my game!", 
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_talk: [
        "Please stop talking while I'm talking!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_action: [
        "W-what are you doing?!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_attack: [ 
        "Stop, that hurts :c",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      chapter_2: [ 
        "Congratulations, you have entered...\n chapter 2!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_talk: [
        "I'm ignoring you",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_action: [
        "I don't even care",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_attack: [ 
        "You're no match for me",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_flee: [
        "Okay, goodbye!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
    }
  end

  def display
    puts @scenes[@state][0]
  end

  def talk
    @state = @scenes[@state][1]
  end

  def action
    @state = @scenes[@state][2]
  end

  def attack
    @state = @scenes[@state][3]
  end

  def flee
    @state = @scenes[@state][4]
  end
end

对不起,这有点复杂,但游戏有点复杂。同样理想的情况是,您可以将场景保存在特殊格式的文本文件中,然后将其加载到游戏中,而不是像我那样在源代码中定义它们。

请将帖子限制为指向代码特定区域的特定问题关于工作代码的问题更适合,但我不会在那里问这个问题,除非把它收紧一些。这是一个有点“代码转储”的问题,但如果它只关注一组较小的代码,那么这可能是一个很好的问题。非常抱歉!我是新加入社区和编程的,对此我深表歉意。@Caleb欢迎加入,别担心。请将帖子限制在一个特定的问题上,指向你代码的特定领域。关于工作代码的问题更适合,但我不会在那里问这个问题,除非把它收紧一些。这是一个有点“代码转储”的问题,但如果它只关注一组较小的代码,那么这可能是一个很好的问题。非常抱歉!我对社区和编程都是新手,对此我深表歉意。@Caleb欢迎来到SO,别担心。非常感谢您抽出时间对此发表评论!!是的,我同意这对我现在的理解来说有点太复杂了,但是它为我提供了关于如何继续我的项目的深刻见解。您在示例中使用的场景是否被视为符号?化妆看起来像一个没有值的散列。很高兴能帮上忙!是的,我正在使用放入数组中的符号。散列通常使用符号作为键,因此它们在这里看起来很相似是有道理的。另外,欢迎来到StackOverflow和编程世界c:非常感谢您花时间对此发表评论!!是的,我同意这对我现在的理解来说有点太复杂了,但是它为我提供了关于如何继续我的项目的深刻见解。您在示例中使用的场景是否被视为符号?化妆看起来像一个没有值的散列。很高兴能帮上忙!是的,我正在使用放入数组中的符号。散列通常使用符号作为键,因此它们在这里看起来很相似是有道理的。另外,欢迎来到StackOverflow和编程c的世界:
#main.rb
scene = Scene.new(:chapter_1)
while true
  scene.display
  print "> "
  action = $stdin.gets.chomp
  if command == 'talk'
    scene = scene.talk
  elsif command == 'action'
    scene = scene.action
  elsif command = 'attack'
    scene = scene.attack
  elsif command = 'flee'
    scene = scene.flee
  else
    puts 'unknown command!'
  end
end
#scene.rb
class Scene
  def initialize beginning_state
    @state = beginning_state
    @scenes = {
      chapter_1: [
        "Hello and welcome to chapter 1 of my game!", 
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_talk: [
        "Please stop talking while I'm talking!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_action: [
        "W-what are you doing?!",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      ch1_attack: [ 
        "Stop, that hurts :c",
        :ch1_talk, 
        :ch1_action,
        :ch1_attack,
        :chapter_2],
      chapter_2: [ 
        "Congratulations, you have entered...\n chapter 2!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_talk: [
        "I'm ignoring you",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_action: [
        "I don't even care",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_attack: [ 
        "You're no match for me",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
      ch2_flee: [
        "Okay, goodbye!",
        :ch2_talk, 
        :ch2_action,
        :ch2_attack,
        :ch2_flee],
    }
  end

  def display
    puts @scenes[@state][0]
  end

  def talk
    @state = @scenes[@state][1]
  end

  def action
    @state = @scenes[@state][2]
  end

  def attack
    @state = @scenes[@state][3]
  end

  def flee
    @state = @scenes[@state][4]
  end
end