以下是我目前的代码:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int[] trialArray = new int[10];
public int trialCounter = -1;
private void button1_Click(object sender, EventArgs e)
{
bool button1Click = true;
if (button1Click == true)
{
ITIpanel.Visible = true;
for (int i = 0; i < trialArray.Length; i++) { trialArray[i] = -1; } // Set default value through array
int counter = 0;
Random rnd = new Random();
while (counter < 10 / 2)
{ // Red trials, fill half array
int index = rnd.Next(0, 10 - 1);
if (trialArray[index] == -1) { trialArray[index] = 1; ++counter; } //if unchanged value, change it
}
while (counter < 10)
{
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 2; ++counter; }
}
}
}
private void ITIpanel_Paint(object sender, PaintEventArgs e)
{
if (ITIpanel.Visible == true)
{
trialCounter += 1;
timer1.Enabled = true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
ITIpanel.Visible = false;
timer1.Enabled = false;
if (trialArray[trialCounter] == 1) { redstimPanel.Visible = true; }
else { bluestimPanel.Visible = true;}
if (trialCounter == 9) { Application.Exit(); }
}
public int counter = 0;
public event EventHandler Clicked5TimesEvent;
private void OnClicked5TimesEvent()
{ if (Clicked5TimesEvent != null) { Clicked5TimesEvent(this, EventArgs.Empty); } }
private void bluestimPanel_MouseDown(object sender, EventArgs e)
{
//FR requirement
counter++; if (counter % 5 == 0) { redstimPanel.Visible = false; ITIpanel.Visible = true; }
}
private void redstimPanel_MouseDown(object sender, EventArgs e)
{
//FR requirement
counter++; if (counter % 5 == 0) { redstimPanel.Visible = false; ITIpanel.Visible = true; }
}
}
}
如您所见,我正在尝试使用10个项目创建一个全局数组。在按钮上单击,应该更改10个项目,使得一半包含值1,另一半包含值2.
然后,在计时器勾选时,根据trialCounter
中确定要访问的数组部分的值,它应显示redstimPanel
或bluestimPanel
。
因此,如果'trialCounter'等于8,且TrialArray中的8等于1,则'redstimPanel'应变为可见。或者,如果'TrialArray'中的8等于2,则'bluestimPanel'应变为可见。
然而,这并不像我希望的那样有效。因此,我的代码显然存在一些问题。你们都有什么建议吗?
答案 0 :(得分:0)
你永远不会重置计数器,或者让第二个循环(设置2s的循环)成为完整数组。
随机数也存在错误,rnd.Next(a,b)a - 下限(包括),b - 上限(不包括)。所以它应该是rnd.Next(0,10);所以你有机会填充最后一个数组位置。
while (counter < 10 / 2) { // Red trials, fill half array
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 1; ++counter; } //if unchanged value, change it
}
//Counter on the first loop here is already 5 (it exited the previous loop)
//So allow it to get to 10, and populate the FULL array.
while (counter < 10) {
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 2; ++counter; }
}
答案 1 :(得分:0)
请允许我向您提供有关您的代码的一些提示和一些解释:
首先,您可能希望本地button1Click变量稍后知道是否已单击该按钮。为了实现这一点,你应该把它放在那个函数之外,否则它永远不会被使用,并且每次点击按钮都会成功,如下所示:
bool button1Click = false;
private void button1_Click(object sender, EventArgs e)
{
if (!button1Click)
{
如果您有条件,您希望代码决定,无论表达式是真还是假,您可以省略“== true”部分,因为它不会添加任何新内容。
< / LI>你有两个时间。你的想法是使用第一段代码运行计数器直到5,然后从第二段代码运行5到10。现在让我试着解释一下实际发生了什么。计数器将持续到5个随机指数填充1。然后在5处,while中的表达式将变为false并且它从循环中突然出现。由于第二个while具有相同的表达式,因此它只是避免它并继续。许多解决方案之一就是在循环中使用if:
while(counter&lt; 10) { if(counter&lt; 5) { //填红 } 其他 { //填蓝色 } }
填充数组中值的方式。您是否考虑过多次生成相同索引时会发生什么?这意味着它将覆盖先前的值,而某些索引将保持为-1。