我有一个Form2,其中包含一个Hangman游戏(是的,这是类似我在前一个问题中所指的Hangman游戏)并且一旦玩家完成游戏,玩家将被带来Form4和Form6两种形式中的任何一种(一种是获胜的祝贺形式,一种是失败的嘲讽/失败形式),在Form4和Form6两种形式中,都有一个标签显示玩家从中获得的分数以前的Form2。
我已经放置了一种方法来返回Form2中得分的值。
public int getScore()
{
return score;
}
然后在Form4和Form6两种形式中,每种形式都有这些代码。
Form4
private void Form4_Load(object sender, EventArgs e)
{
Form2 game = new Form2();
lblFinalScore.Text += game.getScore().ToString();
}
Form6
private void Form6_Load(object sender, EventArgs e)
{
Form2 game = new Form2();
lblFinalScore.Text += game.getScore().ToString();
}
因此,在通过Form2并玩游戏之后,例如,当我赢得游戏并得到7分,并且Form4出现时,lblFinalScore显示0 ...为什么?! 请帮忙......
答案 0 :(得分:0)
如果使用new关键字,则创建Form2类的新实例。 这样您就可以使用两个不同的实例。不同的实例具有不同值的数据字段。
如果要从类的任何内容访问相同的数据字段,请使用static关键字。您可以将分数值存储在静态字段中,这样您就可以轻松访问它。
如果您在类中定义了静态字段,则可以从任何实例访问该字段。但是,强烈建议不要使用静态字段,因为这违反了基本的OO原则。
示例:
class Program
{
static void Main(string[] args)
{
ExampleClass ex1 = new ExampleClass();
ExampleClass ex2 = new ExampleClass();
ex1.normalfield = "new value for ex1";
ex2.normalfield = "new value for ex2";
ExampleClass.staticfield = "static value";
Console.WriteLine(ex1.normalfield);
Console.WriteLine(ex2.normalfield);
Console.WriteLine(ExampleClass.staticfield);
}
class ExampleClass
{
public string normalfield = "";
public static string staticfield = "";
}
}
传递表单的原始实例可能是更适合您的情况的方法。 这可以通过存储对Form的引用或实现Singleton模式来完成。
然而,在我看来,最好的解决方案是将游戏逻辑的表现分开。您应该使用不同的类来实现游戏逻辑并存储连接到游戏的数据值,并且表单类应该只负责呈现代表游戏状态的对象的当前状态。
答案 1 :(得分:0)
您正在创建 Form2
的两个不同实例。请参阅Form2的实际原始实例。
在Form4
和Form6
上都有类级别变量,并从相应的构造函数设置它。从Form2传递实例。