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 項目のグローバル配列を作成しようとしています。ボタンをクリックすると、半分に値 1 が含まれ、残りの半分に値 2 が含まれるように、10 個の項目が変更されることになっています。

trialCounter次に、タイマー ティックで、アクセスする配列の部分を決定するの値に応じて、redstimPanelまたは のいずれかを表示する必要がありbluestimPanelます。

したがって、「trialCounter」が 8 に等しく、TrialArray の 8 が 1 に等しい場合、「redstimPanel」は可視になります。あるいは、'TrialArray' の 8 が 2 に等しい場合、'bluestimPanel' は可視になります。

しかし、これは私が望むようには機能していません。したがって、私のコードには明らかにいくつかの問題があります。みなさん何か提案はありますか?

4

2 に答える 2

0

コードに関するいくつかのヒントと説明をさせてください。

まず第一に、ボタンがクリックされたかどうかを後で知るために、そのローカルの button1Click 変数が必要になるでしょう。それを機能させるには、その関数の外に配置する必要があります。そうしないと、使用されることはなく、ボタンをクリックするたびに true になります。次のようになります。

bool button1Click = false;
private void button1_Click(object sender, EventArgs e)
{                
    if (!button1Click)
    {
  1. 条件がある場合、式が true か false かをコードで判断する必要がある場合は、「== true」の部分を省略できます。これは、新しいものを追加しないためです。

  2. あなたには2つの間があります。あなたのアイデアは、最初のコード部分で 5 までカウンターを実行し、次に 2 番目のコード部分で 5 から 10 まで実行することでした。それでは、実際に何が起こっているのかを説明してみましょう。カウンターは、ランダムなインデックスで 1 が 5 つ埋まるまで続きます。次に 5 で、while の式が false になり、ループから抜け出します。2番目のwhileは全く同じ表現なので、単純に避けて進みます。多くの解決策の 1 つは、次のようにループ内に if を含めることです。

    while (counter < 10) { if (counter<5) { // 赤で塗りつぶす } else { // 青で塗りつぶす } }

  3. 配列の値を埋める方法。同じインデックスが複数回生成されるとどうなるか考えたことはありますか? これは、特定のインデックスが -1 のままである間に、以前の値を上書きすることを意味します。

于 2012-05-20T22:44:22.370 に答える
0

カウンターをリセットしたり、2 番目のループ (2 を設定するループ) を完全な配列にすることはありません。

乱数 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 に答える