0

以下是我当前的代码:

    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确定要访问的数组部分,它应该显示redstimPanelbluestimPanel

因此,如果“trialCounter”等于 8,并且 TrialArray 中的 8 等于 1,则“redstimPanel”应该变为可见。或者,如果“TrialArray”中的 8 等于 2,则“bluestimPanel”应该变为可见。

然而,这并没有像我希望的那样工作。因此,我的代码显然存在一些问题。大家有什么建议吗?

4

2 回答 2

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; }
}
于 2012-05-20T22:19:09.580 回答
0

请允许我给你一些提示和一些关于你的代码的解释:

首先,您可能希望本地 button1Click 变量稍后知道按钮是否已被单击。为此,您应该将它放在该函数之外,否则它将永远不会被使用,并且每次单击按钮时都是如此,如下所示:

bool button1Click = false;
private void button1_Click(object sender, EventArgs e)
{                
    if (!button1Click)
    {
  1. 当您有条件时,您希望代码决定表达式是真还是假,您可以省略“== true”部分,因为它不会添加任何新内容。

  2. 你有两个时间。您的想法是使用第一段代码运行计数器直到 5,然后从 5 到 10 运行第二段代码。现在让我试着解释一下到底发生了什么。计数器将持续到 5 个随机索引填充 1 秒。然后在 5 处,while 中的表达式将变为 false,并从循环中跳出。由于第二个 while 具有完全相同的表达式,因此它只是避免它并继续。许多解决方案之一是在这样的循环中有一个 if:

    while (counter < 10) { if (counter<5) { // 填充红色 } else { // 填充蓝色 } }

  3. 填充数组中的值的方式。你有没有想过当同一个索引被生成多次时会发生什么?这意味着它将覆盖以前的值,而某些索引将保持 -1。

于 2012-05-20T22:44:22.370 回答