привязка карты к файлу с помощью scala для запуска текстовой игры - PullRequest
1 голос
/ 27 октября 2011

Я беру урок программирования для начинающих, и мы приступаем к созданию текстовых игр, больше похоже на чтение ваших собственных приключений, чем на настоящие игры, и я не совсем понимаю, как получить информацию с моей карты,который содержит всю информацию о комнате, в файл, который будет запускать его.У меня есть файл комнат, настроенный как ...

0 roomone
you enter a room, and it looks odd. you can go north or south. which way?
2
north 1
south 2
//will having a space here make a difference? should i delete these?
1 hall
theres a hall here, with a door running east. continue north,go east, or go back south?
3
north 3
south 0
east 4

и так далее, так что комнате присваивается номер и имя, затем она получает описание, затем перечисляет количество выходов, списокчто это такое, а затем перечислите номер комнаты, к которой должен прийти ответ.Я не знаю, как получить его так, чтобы он читался на две вещи: одну, которая берет первые три бита информации в качестве информации о комнате, и вторую, которая считывает число выходов и создает массив с таким количеством выходов,а затем читает в выходах и их числах.

что у меня есть

case class Map(location:Int,place:String,description:String,exits:Array )

case class Exits(numberexits:Int,direction:String,destination:Int)

Я знаю, что, возможно, есть какой-то простой ответ, но я действительно довольно потерян на том, что я должен бытьделает.Я не знаю, как прочитать мой файл, чтобы нужные части были в нужных местах, и я достаточно новичок, что многое из того, что я читал, мне не очень понятно, так что, надеюсь, мойвопросы достаточно ясны, чтобы кто-то мог мне помочь, и скажите, собираюсь ли я поступить об этом, даже как-то правильно, и если это сработает, когда я на самом деле пытаюсь собрать это вместе, поскольку, если я понимаю, что я делаю, это должноВозьмите пользовательский ввод, найдите направление, введенное из массива выходов, посмотрите на пункт назначения, связанный с ним, затем выберите этот пункт назначения и найдите место на карте с таким номером, и вы попадете туда и потом println (Map.description) и ждать следующего ввода?

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

Кажется, что каждый второй вопрос в эти дни я вижу комбинаторы синтаксического анализатора.

case class Exit(direction:String,destination:Int)
case class Map(location:Int, place:String, description:String, exits:List[Exit] )

object ReadConf extends scala.util.parsing.combinator.RegexParsers {
  override protected val whiteSpace = " +".r
  def eol = "\n"
  def number = "\\d+".r ^^ (_.toInt)

  // Overall format
  def conf = (comment.* ~> map).*
  def map = header ~ description ~ exits ^^ {
    case location ~ place ~ description ~ exits => 
      Map(location, place, description, exits)
  }
  def comment = "//.*".r ~ eol

  // Map parts (except exits)
  def header = location ~ place <~ eol
  def description = ".*".r <~ eol
  def location = number
  def place = "\\w+".r

  // Exits
  def exits = numberOfExits <~ eol >> nExits
  def nExits(n: Int) = repN(n, exit)
  def exit = direction ~ destination <~ eol ^^ {
    case direction ~ destination => Exit(direction, destination)
  }
  def numberOfExits = number
  def direction = "\\w+".r
  def destination = number
}
2 голосов
/ 27 октября 2011

Считайте файл с помощью val lines = scala.io.source.fromFile.getLines().toList или как-нибудь.

Не называйте ничего Map, поскольку у Scala уже есть Map, который вы можете использовать.

Теперь, когда у вас есть все строки, вы можете понять, как их анализировать. Вы можете использовать соответствующие:

lines match {
  case a :: b :: c :: remainder =>
    // Execute this code if and only if there are at least 3 lines in the list;
    // if so, pull the first 3 out and call them a, b, and c
  case _ =>
    // Otherwise execute this
 }

И вы также можете использовать рекурсию (это просто разбило бы вещь на список комнат, но не извлекало бы информацию из каждой комнаты):

def parse(lines: List[String], roomsText: List[List[String]] = Nil): List[List[String]] = {
  lines match {
    case Nil => rooms    // Parsed all the lines, so return what we've already found
    case /* whatever conditions you need */ =>
      // do stuff to find one more room
      parse(remainingLines, newRoom :: roomsText)
  }
}

Как только вы выполните дополнительный анализ (.split(" ") для строк может быть полезным) и поместите все в класс case, который я назову Room вместо Map, вы принимаете пользовательский ввод (см. Console), преобразовать его в целое число (попробуйте .toInt) и найдите его в своем списке комнат. Для этого может пригодиться реальная карта:

val roomsByNumber = rooms.map(room => (room.location, room)).toMap

Теперь roomsByNumber(n) будет искать n 'комнату.

Надеюсь, это поможет вам начать. Удачи!

P.S. Я понятия не имею, чему вас уже учили, поэтому я не могу сказать, имеет ли смысл то, что я пишу, или похоже на бред; большинство классов ожидают, что вы будете использовать в основном то, чему вас уже научили, поэтому вы должны увидеть, что вы можете сделать, учитывая то, что вы уже узнали, пытаясь принять любую стратегию, которую я предложил здесь. Но не называйте класс случая комнаты Map, если явно не сказано - это просто вызывает проблемы при использовании встроенного Map.

...