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?
Respostas:
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:
Essa estrutura simples define exatamente o que listei acima. A cooresponding
Room
classe teria propriedades para aDescription
, umaList<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 algunsList<T>
itens.Em vez de colocar um
while
loop em uma função para cada sala (o que você não pode fazer agora, pois só possui uma únicaRoom
classe), você cria um loop principal mais generalizado:Observe que a
Command.Parse
funçã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.
fonte
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.
fonte