У меня проблема с загрузкой сохранений в текстовой игре.C#

Место общения программистов C#
Ответить
Anonymous
 У меня проблема с загрузкой сохранений в текстовой игре.

Сообщение Anonymous »

Когда я сохраняю комнату, сохраняется все внутри, особенно предметы, которые можно взять. Однако при загрузке сохранения, если я беру объект из комнаты и меняю комнату, та, в которой я был до этого, возвращается такая же, как и в сохранении (пересоздается список объектов, которые были там раньше, независимо от изменения, сделанные мною незадолго до этого)
это часть основного:

Код: Выделить всё

 public static bool MainMenu()
{
bool exit = false;
bool ValidOption = false;
do
{
WriteLine("\tBENVENUTO IN FUGA DALLO SPAZIO\t\n\t\tcosa vuoi fare?\t\n\n[1] AVVIA NUOVA PARTITA\n[2] CARICA SALVTAGGIO\n[3] ESCI");
string? risposta = ReadLine();

switch (risposta)
{
case "1":
ValidOption = true;
NewGame();
exit = StartGame();
break;
case "2":
ValidOption = true;
string FileName = "PlayerSaves.json";
string jsonString = File.ReadAllText(FileName);
Global.Giocatore = JsonSerializer.Deserialize
(jsonString)!;

FileName = "RoomsSaves.json";
jsonString = File.ReadAllText(FileName);
Global.rooms = JsonSerializer.Deserialize(jsonString)!;
//ricreo le global aggiornate
Global.Inizio = Global.rooms[0];
Global.Stanza1 = Global.rooms[1];
Global.Stanza2 = Global.rooms[2];
Global.Stanza3 = Global.rooms[3];
Global.Stanza4 = Global.rooms[4];
Global.Stanza5 = Global.rooms[5];
Global.Stanza6 = Global.rooms[6];
Global.Stanza7 = Global.rooms[7];
Global.NULLA = Global.rooms[8];
FileName = "RobotSaves.json";
jsonString = File.ReadAllText(FileName);
Global.robot = JsonSerializer.Deserialize(jsonString)!;

FileName = "AlienSaves.json";
jsonString = File.ReadAllText(FileName);
Global.Alien = JsonSerializer.Deserialize(jsonString)!;
exit = StartGame();
break;
case "3":
ValidOption = true;
exit = true;
break;
}
} while (!ValidOption);
return !exit;
}
private static void NewGame()
{
//impostazione del nome del giocatore
WriteLine("Inserisci il nome del tuo personaggio:");
string? nome = ReadLine();
if (nome.Length == 0)
{
WriteLine("L'impatto deve averti scosso la testa così tanto da non farti nemmeno ricordare il nome.\nSulla tua tuta c'è una targhetta con su scirtto Charlie, Probabilmente è quello.");
nome = "Charlie";
}
nome.ToLower();
Global.Giocatore.Name = nome;
Global.Giocatore.Description = $"Hai addosso una tuta spaziale con un cartellino con su scritto {Global.Giocatore.Name}, è la tuta dell' agenzia che ti ha mandato qui,\n la \"D.O.M.\", un' agenzia che ha preso molto piede da quando la terra è passata al matriarcato";
//scelta difficoltà
bool difficultySetted = false;
do
{
WriteLine("Scegliere la difficolta a cui si vuole giocare:\n1. FACILE\n2. NORMALE\n3.  DIFFICILE");
Global.Giocatore.Difficulty = Convert.ToInt32(Console.ReadLine());
if (Global.Giocatore.Difficulty == 1 || Global.Giocatore.Difficulty == 2 || Global.Giocatore.Difficulty == 3)
{
difficultySetted = true;
}
} while (!difficultySetted);
//imposta la vita dell'alieno in base alla difficoltà
int base_healt = Convert.ToInt32(ConfigurationManager.AppSettings["base_healt_alieno"]);
Global.Alien.Hp = base_healt * Global.Giocatore.Difficulty;
//pongo il danno delle armi prendendolo dall'app.config
Global.chiave_inglese.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Chiave_inglese_danno"]);
Global.pugnale.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Pugnale_danno"]);
Global.blaster.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Blaster_danno"]);
//inizio della partita
WriteLine("Prima di iniziare la partita ecco alcuni consigli:\n-L'inventario del giocatore segue la logica LIFO, ovvero potrai usare solo l'ultimo oggetto inserito" +
"\n-Il tuo scopo è trovare 4 oggetti (...), una volta ottenuti torna alla tua nave e usa il comando \"ripara\"" +
"\n-Non tutti gli oggetti nella stanza con cui puoi interagie compaiono sotto \"Oggetti particoalri visibili\", alcuni vengono citati nella descrizione della stanza" +
"\n-Alcuni oggetti hanno bisogno di essere aperti prima di poter sapere cosa contengono" +
"\n-Le risposte puoi scriverle sia in MAIUSCOLO che in minuscolo, inoltre gli articoli tra il verbo e l'oggetto non vengono considerati\n-Di seguito la lista dei comandi, buona fortuna!" +
"\n---------\nVai + [nord/sud/est/ovest] --> Muoversi per le stanze\nUsa + [Nome oggetto] --> Usare un oggetto dell'inventario" +
"\nPrendi/Raccogli + [Nome oggetto] --> Raccogliere un oggetto particolare che si trova nella stanza\nAttacca --> Attaccare il nemico" +
"\nEsamina + [Nome oggetto] --> Esaminare un oggetto\nApri + [Nome oggetto] --> Aprire porte o altro\nLascia/Togli --> Rimuovere l'oggetto in cima dall'inventario" +
"\nInventario --> Vedere quali oggetti hai nello zaino\nTeletrasporto --> usare la macchina del teletrasporto\nRipara ---> Per riparare la nave e vincere la partita" +
"\nHelp --> Aprire la lista comandi\nSave --> Salvare la partita\nQuit --> Uscire dal gioco\n---------\n");
//descrizione della storia
WriteLine($"\n\n\tIn una galassia lontana lontana...\t\nl'umanità ha raggiunto nuove frontiere nello spazio.\nUn coraggioso astronauta di nome {Global.Giocatore.Name} viene scelto per una missione vitale:" +
"\nesplorare un pianeta sconosciuto alla ricerca di risorse preziose.\nDurante il viaggio, accade qualcosa di terribile:\nun guasto catastrofico al motore provoca un brusco atterraggio di emergenza sul misterioso pianeta" +
"\n\nAncora frastornato dall'impatto, l'astronauta fa una scoperta inquietante: accanto alla sua navicella distrutta,\ngiace un'altra astronave, abbandonata e avvolta nel mistero.\nSenza altre opzioni," +
"\nl'astronauta non ha altra scelta se non avventurarsi all'interno di questa enigmatica nave spaziale.\n\nCosa troverà tra i corridoi oscuri e i macchinari arrugginiti?"  +
"\nDovrai risolvere enigmi, affrontare pericoli sconosciuti e prestare attenzione a ciò che ti circonda\n per trovare le risorse necessarie a riparare la tua navicella.\nLa missione non sarà facile, una lotta contro la sopravvivenza ti attende.\n---------");
#region inserimento
//inserimento oggetti nelle stanze
Global.Inizio.ItemInRoom = Global.items_Inizio;

Global.Stanza1.ItemInRoom = Global.items_Stanza1;
Global.Stanza1.OtherItem = Global.Structural_items_stanza1;
Global.Stanza1.Doors = Global.Openable_items_stanza1;

Global.Stanza2.ItemInRoom = Global.items_Stanza2;
Global.Stanza2.OtherItem = Global.Structural_items_stanza2;
Global.Stanza2.Doors = Global.Openable_items_stanza2;

Global.Stanza3.ItemInRoom = Global.items_Stanza3;
Global.Stanza3.OtherItem = Global.Structural_items_stanza3;
Global.Stanza3.Doors = Global.Openable_items_stanza3;

Global.Stanza4.ItemInRoom = Global.items_Stanza4;
Global.Stanza4.OtherItem = Global.Structural_items_stanza4;
Global.Stanza4.Doors = Global.Openable_items_stanza4;

Global.Stanza5.ItemInRoom = Global.items_Stanza5;
Global.Stanza5.OtherItem = Global.Structural_items_stanza5;
Global.Stanza5.Doors = Global.Openable_items_stanza5;

Global.Stanza6.ItemInRoom = Global.items_Stanza6;
Global.Stanza6.OtherItem = Global.Structural_items_stanza6;
Global.Stanza6.Doors = Global.Openable_items_stanza6;

Global.Stanza7.ItemInRoom = Global.items_Stanza7;
Global.Stanza7.OtherItem = Global.Structural_items_stanza7;
Global.Stanza7.Doors = Global.Openable_items_stanza7;
#endregion
}
private static bool StartGame()
{
string? risposta;
bool quit = false;

//creo le connessioni tra le stanze
Connection IndottoInizio = new Connection(Global.NULLA, Global.NULLA,Global.Stanza4, Global.NULLA);
Connection Indotto1 = new Connection(Global.Stanza4, Global.NULLA, Global.Stanza2, Global.NULLA);
Connection Indotto2 = new Connection(Global.NULLA, Global.NULLA, Global.Stanza3, Global.Stanza1);
Connection Indotto3 = new Connection(Global.Stanza5, Global.NULLA, Global.NULLA, Global.Stanza2);
Connection Indotto4 = new Connection(Global.Stanza6, Global.Stanza1, Global.Stanza5, Global.Inizio);
Connection Indotto5 = new Connection(Global.NULLA, Global.Stanza3, Global.NULLA, Global.Stanza4);
Connection Indotto6 = new Connection(Global.NULLA, Global.Stanza4, Global.NULLA, Global.NULLA);
Connection Indotto7 = new Connection(Global.NULLA, Global.NULLA, Global.NULLA, Global.Stanza6);
//inserisco le connessioni nelle varie stanze
Global.Inizio.Direction =IndottoInizio;
Global.Stanza1.Direction = Indotto1;
Global.Stanza2.Direction = Indotto2;
Global.Stanza3.Direction = Indotto3;
Global.Stanza4.Direction = Indotto4;
Global.Stanza5.Direction = Indotto5;
Global.Stanza6.Direction = Indotto6;
Global.Stanza7.Direction = Indotto7;
if (Global.Stanza6.Doors[0].IsOpen)
{
Global.Stanza6.Direction.East = Global.Stanza7;
}

//imposto le connessioni alla stanza del giocatore, lo usero nei load
foreach (Room room in Global.rooms)
{
if (room.Name == Global.Giocatore.Position.Name)
{
Global.Giocatore.Position.Direction.North = room.Direction.North;
Global.Giocatore.Position.Direction.South = room.Direction.South;
Global.Giocatore.Position.Direction.East = room.Direction.East;
Global.Giocatore.Position.Direction.West = room.Direction.West;
break;
}
}
//ribalto l'inventario del giocatore dai load
if (Global.Giocatore.Inventario.Count > 1 )
{
List inventario = [];
while (Global.Giocatore.Inventario.Count != 0)
{
inventario.Add(Global.Giocatore.Inventario.Peek());
Global.Giocatore.Inventario.Pop();
}
for (int i = 0; i < inventario.Count; i++)
{
Global.Giocatore.Inventario.Push(inventario[i]);
}
}
//creo un array di stanze per il teletrasporto
List  AllStanze = [Global.Stanza1, Global.Stanza3, Global.Stanza4, Global.Stanza5, Global.Stanza6];
#region ciclo di gioco
//ciclo di gioco
do
{

//Descrivo dove si trova il giocatore e cosa vede
WriteLine("---------");
WriteLine(Global.Giocatore.Position.Name);
WriteLine(Global.Giocatore.Position.Description);
if (Global.Giocatore.Position.ItemInRoom != null && Global.Giocatore.Position.ItemInRoom.Count != 0)
{
//WriteLine(Global.Stanza4.ItemInRoom[0].Name);

Global.Giocatore.Position.RoomItem(Global.Giocatore.Position);
}
else
{
WriteLine("Nessun oggetto particolare è visibile");
}
WriteLine("---------");
Я подозреваю, что проблема связана с глобальными комнатами, я провел различные тесты, но комнаты, которые я загружаю из сохранений, похоже, без проблем подключаются к глобальным комнатам


Подробнее здесь: https://stackoverflow.com/questions/785 ... -text-game
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»