C#对于许多不同的方法只使用几个按钮



我正试图用C#制作一款"选择你自己的冒险游戏",但按钮有问题。我有6个按钮,我想在故事的每个"页面"上的不同选项中重复使用它们。程序窗口

举个例子,我在btn1中使用了这个。

void page1(){
txtStory.Text = "Can you sneak past the enemy?";
btn1.Click += (sender, args) => {
luckCheck();
if (lucky) {page2(); clearButtons();}
else {page3(); clearButtons();}
};
}
void luckCheck(){
int luckTest = gen.Next(1,12);
if (luckTest <= playerLuck) {lucky = true;}
else {lucky = false;}
}
void clearButtons(){
btnN.Text = "";
btnS.Text = "";
btnE.Text = "";
btnW.Text = "";
btn1.Text = "";
btn2.Text = "";
btn3.Text = "";
btn4.Text = "";
btn5.Text = "";
btn6.Text = "";
}
void page2(){
txtStory.Text = "Lucky!";
}
void page3(){
txtStory.Text = "Not Lucky!";
}

即使它已经转移到另一个方法,如果单击,btn1仍然会重复page1中的相同命令。有没有办法阻止这种情况的发生?比如清除记忆中的按钮之类的。

您遇到的问题是,page1()正在附加一个匿名处理程序方法,该方法从未分离,因此每次调用它时,都只是添加越来越多的处理程序。

但一旦你开始添加大量页面,这种设计就会很快失控。

考虑不同的设计,其中有一个Page类来表示每个页面。该类将故事作为其属性,以及可能的Choice的集合(而不是对其中的6个进行硬编码(。Choice是一个具有Description字符串属性的类,如果使用Action方法,则它将被执行。

您的应用程序可以拥有CurrentPage属性,您的Choice's Action需要能够通过更改该页面进行导航。等等…

希望这能有所帮助。

p.S.额外小费。与其在类字段上返回luckCheck方法的结果,不如考虑重新设计它以返回结果:

bool luckCheck(){
int luckTest = gen.Next(1,12);
return luckTest <= playerLuck;
}

在不详细说明如何更好地构建上面的代码的情况下,这里有一个使用C#7的解决方案。注意如何分配本地函数来处理事件,然后取消分配-使用委托类型推断

void page1(){
txtStory.Text = "Can you sneak past the enemy?";
void Btn1Click(object s, EventArgs ev)
{
luckCheck();
if (lucky) {page2(); clearButtons(); btn1.Click -= Btn1Click; }
else {page3(); clearButtons();}
};
btn1.Click += Btn1Click;
void luckCheck(){
int luckTest = gen.Next(1,12);
if (luckTest <= playerLuck) {lucky = true;}
else {lucky = false;}
}
void clearButtons(){
btnN.Text = "";
btnS.Text = "";
btnE.Text = "";
btnW.Text = "";
btn1.Text = "";
btn2.Text = "";
btn3.Text = "";
btn4.Text = "";
btn5.Text = "";
btn6.Text = "";
}
void page2(){
txtStory.Text = "Lucky!";
}
void page3(){
txtStory.Text = "Not Lucky!";
}

最新更新