我一直试图从第三类游戏访问我的班级马的实例 lykkesHest 。但它告诉我,当前上下文中不存在实例,因为当 lykkesHest hest时,它不会被制作为公共类。但是,当我尝试将 lykkesHest 改为公共类时,它给了我很多奇怪的错误。我为输出给用户的文字道歉,因为它是丹麦语。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lykkes_Hest
{
// The class with the main game hidden inside it!
class game
{
public static int money;
public static double fodder;
public game()
{
money = 1000;
fodder = 1;
}
public static void help()
{
Console.WriteLine("#######################");
Console.WriteLine("###### - HJÆLP - ######");
Console.WriteLine("#######################");
Console.WriteLine();
Console.WriteLine("Kommandoer du kan bruge:");
Console.WriteLine("Hjælp - viser dig denne skærm");
Console.WriteLine("fodre hesten - giver din hest mad hvis du har noget");
}
public static void exitSafely()
{
Console.WriteLine("Er du sikker på at du vil forlade spillet?");
Console.WriteLine("(Ja eller nej)");
if(Program.getBool())
{
Environment.Exit(0);
}
}
public void RegisterCommand()
{
string command = Console.ReadLine();
switch(command)
{
case "exit":
exitSafely();
break;
case "vent":
lykkesHest.PassDay();
break;
default:
Console.WriteLine("Ikke genkendt kommando.");
break;
}
}
}
// A class for making a horse
class horse
{
public string name;
public double age = 0;
public string color;
public double hunger = 50;
public double boredom = 50;
public horse()
{
Console.WriteLine("Hvad skal din hest hedde?");
name = Console.ReadLine();
Console.WriteLine("Hvor mange år er din hest?");
while (age == 0) {
try
{
age = Convert.ToInt32(Console.ReadLine());
} catch {
Console.WriteLine("Do skal skrive et tal.");
}
}
Console.WriteLine("Hvilken farve har din hest?");
color = Console.ReadLine();
}
public void Print()
{
Console.WriteLine("Din hest heder {0} er {1} år gammel og har farven {2}", name, age, color);
}
public static void Die(string cause)
{
Console.WriteLine("Din hest døde af {0}........", cause);
Console.WriteLine("Du burde passe bedre på den en anden gang!");
Console.WriteLine();
Console.WriteLine("Klik på en knap for at afslutte.");
Console.ReadKey();
Environment.Exit(0);
}
public void PassDay()
{
hunger =+ 10;
boredom =+ 10;
if(hunger >= 100 || boredom >= 100)
{
horse.Die("sult");
} else if(boredom >= 100)
{
horse.Die("Kedsomhed");
}
}
}
class Program
{
public static bool getBool()
{
while (true)
{
string answer = Console.ReadLine();
if (answer.ToLower() == "ja")
{
return true;
}
else if (answer.ToLower() == "nej")
{
return false;
}
Console.WriteLine("Du må kun skrive ja eller nej");
}
}
static void Main(string[] args)
{
// Get passowrd
Console.WriteLine("HVAD ER KODEORDET FOR AT MÅ SPILLE DET HER AMAZING SPIL?");
if (Console.ReadLine().ToLower() != "what is password?")
{
Environment.Exit(0);
}
// Initialize the game
game Spil = new game();
Console.WriteLine("###############################");
Console.WriteLine("######## -Lykkes Hest- ########");
Console.WriteLine("###############################");
Console.WriteLine();
Console.WriteLine("Velommen, du spiller version 001");
Console.WriteLine();
// Create a basic horse
horse lykkesHest = new horse();
lykkesHest.Print();
Console.WriteLine("Er dette korrekt?");
while(getBool() == false)
{
lykkesHest = new horse();
}
// Optional tutorial
Console.WriteLine();
Console.WriteLine("Vil du gerne lære de kommandoer du kan bruge?");
Console.WriteLine("(Ja eller nej)");
if (getBool())
{
Console.WriteLine();
Console.WriteLine("Lykkes hest er et interaktivt sandbox spil hvor du styrer EN FUCKING HEST!!");
Console.WriteLine("Du bestemmer selv om du vil have din hest til at en flotter præmie hest eller en sy' hurtig ræcer!");
Console.WriteLine();
Console.WriteLine("Du spiller ved at skrive nogle få kommandoer ind i kommando linjen (Den du læser fra lige nu).");
Console.WriteLine();
Console.WriteLine("Hvis du nogensinde glemmer en kommando eller vil lære nogle nye kan du altid skrive 'Hjælp' for at få dem vist.");
Console.WriteLine("Og hvis du nogensinde vil stoppe spillet kan du gøre det ved at skrive 'exit'");
}
Console.WriteLine();
Console.WriteLine();
// Loop the rest of the game
while (true)
{
Console.WriteLine("#####################################################");
Console.WriteLine("Penge: {0} - Foder: {1}", game.money, game.fodder);
Console.WriteLine("Hestens sult: {0} - Hestens kedsomhed: {1}", lykkesHest.hunger, lykkesHest.boredom);
Console.WriteLine("#####################################################");
game.RegisterCommand();
Console.WriteLine();
}
}
}
}
答案 0 :(得分:3)
如果游戏是关于管理一匹马,那么游戏类(你应该按照通常的命名惯例调用游戏)应该包含一个马类型的字段:
class Horse
{
public int Age{ get; private set };
public int Hunger { get; private set; }
public string Name { get; private set; }
public Horse(string name)
{
Name = name;
Age = 0;
Hunger = 0;
}
public bool IsDead()
{
return Hunger >= 100 || Age > 3650;
}
void PassDay()
{
Age = Age + 1;
Hunger = Hunger + 1;
}
void Feed()
{
Hunger = 0;
}
// etc.
public override string ToString()
{
return string.Format("{0} Age {1}", Name, Age);
}
}
游戏可以创建它自己的马实例,或者你必须将马实例传递给Game的构造函数。 如果游戏管理一个马,并且游戏总是具有一个马,那么在构造函数中分配它是一个很好的做法,这样你甚至不能拥有游戏没有马。
我稍微翻译(并改变了)你的游戏以使例子更清晰。
class Game
{
private readonly Horse horse;
private int money;
// more things
public Game(Horse horse, int money)
{
this.horse = horse;
this.money = money;
}
public bool IsOver
{
get { return horse.IsDead(); }
}
}
主程序类非常不同。它是一个静态类,只包含静态方法。其他类(马,游戏)是您创建对象的类。你有一个游戏,其中有一个马等等。
public static class Program
{
private static Game game;
public static void Main()
{
game = CreateNewGame();
do
{
// get input
// update game state
} while (!game.IsOver);
}
private static Game CreateNewGame()
{
Horse horse;
do
{
horse = CreateRandomHorse();
Console.WriteLine("Is this ok? : " + horse); // Calls horse.ToString()
} while (!GetBoolInput());
// have a horse, can make a game
return new Game(horse, 100);
}
}