Como posso representar salas e ações associadas e inventário em um jogo de aventura baseado em texto?


8

Estou apenas começando a aprender a fazer jogos. Eu criei um jogo simples baseado em texto, onde o usuário pode andar entre as salas e interagir com os objetos em cada sala. No entanto, sinto que minha abordagem levou a uma pilha de códigos ruins de espaguete. Não sei ao certo qual seria uma boa maneira de estruturar um jogo como esse.

Minha abordagem foi ter uma classe com um método para cada sala e todos os objetos e interações que pudessem ser feitos naquela sala. Por exemplo, este é o método para o estudo:

public static void Study() 
{
    bool studyexited = false;

    while (!studyexited) {
        string usercommand = Console.ReadLine ();
        usercommand.ToLower ();

        switch (usercommand) {
        case "turn left":
            GameEventText.StudyLeft ();
            break;
        case "turn right":
            GameEventText.StudyRight ();
            break;
        case "go forward":
            Notes firstsetofclues = new Notes ("First Note");
            GameEventText.StudyFront ();
            string firststudycommand = Console.ReadLine ();
            firststudycommand.ToLower ();

            if (firststudycommand == "read note") {
                firstsetofclues.Firstnotereading ();
            }

            Console.WriteLine ("Picking up this note would prove valuable");
            string secondstudycommand = Console.ReadLine ();
            secondstudycommand.ToLower ();

            if (secondstudycommand == "pick up note") {
                if (MainClass.PlayerInventory.AddItem (firstsetofclues)) 
                {
                    Console.WriteLine ("The note has been added to your inventory");
                } else {
                    Console.WriteLine ("Your inventory is full");
                }

                MainClass.PlayerInventory.Inventorydisplay ();
            }
        }
    }
}

Não acho que essa seja uma abordagem que será dimensionada; ou seja, não consigo escrever funções como essa para todos os cômodos. Acredito que o uso de arquivos de alguma forma seria uma boa estratégia para evitar a "codificação" que estou fazendo atualmente. Mas não tenho certeza de como posso conseguir isso?


Este é realmente um tópico de programação geral, exceto talvez os bits sobre loops de jogos e outros (que são muito amplos). É difícil dizer, no entanto, porque sua pergunta não está clara como está escrita.

Eu não entendo como não está claro como eu tentei o meu melhor para explicar. talvez você possa me ajudar?
Mohamed Serry

Muito disso tem a ver com a falta de pontuação, capitalização e espaçamento entre parágrafos. Fundamentalmente, parece que você está perguntando como evitar codificar uma única classe por sala no seu jogo. Isso está correto? Nesse caso, eu posso ajudar a editar sua pergunta.

até certo ponto sim. Eu quero evitar codificação embutida durante todo o jogo.
Mohamed Serry

Respostas:


10

Você está no caminho certo com sua noção de uso de arquivos para ajudar a aliviar a quantidade de comportamento codificado que você possui. Você quer fazer com que os dados do seu jogo sejam direcionados o máximo possível: não é um conceito complicado, é exatamente o que parece. Conduza o comportamento do jogo por meio de dados, e não diretamente por código.

Uma boa mentalidade a ser adotada ao determinar como dirigir algum sistema por meio de dados é procurar as generalidades. O que há em comum entre todas as instâncias desses sistemas? Os pontos em comum tornam-se propriedades do sistema e os valores dessas propriedades são os dados. Os quartos, por exemplo, geralmente todos têm uma descrição e uma lista de saídas. Eles também podem ter um "inventário", uma lista de itens que estão na sala.

Uma opção que você pode seguir é usar arquivos XML ou de texto sem formatação (os quais são bastante simples de analisar em C #) para armazenar dados e conteúdo da sala.

Considere um arquivo estruturado XML como este:

<room name="Study">
  <description>
  You enter a well-furnished study. A heavy wooden desk sits in one corner, an ugly lamp illuminating its surface.
  </description>
  <exits>
    <exit command="north">Hallway</exit>
  </exits>
  <items>
    <item name="Pen">
  </items>
</room>

Essa estrutura simples define exatamente o que listei acima. A cooresponding Roomclasse teria propriedades para a Description, uma List<T>das saídas (que são referências para outros quartos e o comando "go" usado para chegar lá, no exemplo acima norte indo levaria o jogador para o corredor). Há também alguns List<T>itens.

Em vez de colocar um whileloop em uma função para cada sala (o que você não pode fazer agora, pois só possui uma única Roomclasse), você cria um loop principal mais generalizado:

while(!done) {
  Console.WriteLine(currentRoom.Description);
  var command = Command.Parse(Console.ReadLine());
  switch(command.Verb) {
    case "go":
      nextRoom = allRooms[currentRoom.GetExitForDirection(command.Object)];
      if (nextRoom == null) {
        Console.WriteLine("You cannot go that way.");
      }
      else {
        currentRoom = nextRoom;
      }
      break;
    ...
  }
}

Observe que a Command.Parsefunção é deixada como um excersize para você, mas basicamente deve analisar a entrada do usuário e retornar algum tipo de par "verbo / objeto" ou similar (consulte esta pergunta para um kickstart ao fazê-lo, está um pouco além do escopo do seu questão). No exemplo acima, o verbo seria "go" e o objeto pode ser "norte" ou "sul" ou qualquer outra coisa.

Mas, além disso, o que esse loop está fazendo é apresentar as salas de maneira generalizada; sempre, imprima a descrição da sala, aguarde a entrada do usuário. Se a entrada do usuário for "vá para outra sala", você encontrará a saída da sala atual correspondendo à direção que o usuário inseriu. Se não houver saída nessa direção, diga-o; caso contrário, defina a sala atual para a nova sala. Então repita.

Você pode continuar refinando essa abordagem (por exemplo, a descrição acima imprime a descrição da sala após cada comando; você pode ver como fazê-la imprimir a descrição apenas na primeira vez em que entra na sala? Que tal mais quando você digita uma "aparência" "comando?). Você também pode dimensioná-lo para incluir o manuseio de itens de maneira semelhante.


Muito obrigado pelo seu apoio, Josh. eu tentarei isso e tentarei desenvolver o progresso o máximo que puder
Mohamed Serry

1

Se você conhece o html, pode pensar nas salas como páginas da Web, nas saídas como links, nas ações talvez como âncoras e no próprio jogo como um navegador. A única coisa adicional que o jogo precisa gerenciar é um inventário e os NPCs, que são basicamente uma classe estática ou duas com o estado de cada item e personagem do jogo, foram tirados, já foram usados ​​/ falados, já foram? foi destruído / derrotado.

Se você usar html em vez de xml puro de maneira semelhante ao que Josh descreveu, poderá depurar no navegador, pelo menos no que diz respeito à navegação.


A resposta de josh é tecnicamente mais completa e diretamente relevantes, mas esta analogia é muito bom e pode ajudar a entender o conceito geral
jhocking
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.