2013-03-19 2 views
-1

Этот код не дает мне результатов, которых я ожидал бы.Петли с делегатами отсутствуют весь текст C#

После некоторых исследований я обнаружил, что с делегатами в цикле вы должны фиксировать значение счетчика - как видно из этого через inneri и innerj. Однако по какой-то причине с моей петлей for с j , строка stringThisRoll имеет только первые два числа рулона кости.

Я не могу понять, почему это происходит. В поле intThisRoll указано число, которое соответствует числу костей, которые должны быть свернуты, но stringThisRoll не имеет всего этого.

Я рассмотрел некоторые другие вопросы здесь, в stackoverflow, но никто, казалось, не прояснил это, просто необходимость захвата счетчика.

Благодаря

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Better_Betrayal_Dice_Roller 
{ 
    public partial class Form1 : Form 
    { 
     TextBox txtBox = new TextBox(); 
    List<Button> buttons = new List<Button>(); 
    List<Label> labels = new List<Label>(); 

    public Form1() 
    { 
     int NumberOfOptions = 9; 

     /*Makes the controls*/ 
     for (int i = 0; i < NumberOfOptions; i++) 
     { 
      Button tmpButton = new Button(); 
      Label tmpLabel = new Label(); 

      buttons.Add(tmpButton); 
      labels.Add(tmpLabel); 
     } 
     /*Add the controls to the form*/ 
     for (int i = 0; i < NumberOfOptions; i++) 
     { 
      buttons[i].Visible = true; 
      labels[i].Visible = true; 

      buttons[i].Text = "Roll " + (i + 1).ToString(); 
      labels[i].Text = "Please Roll"; 

      buttons[i].Location = new Point(10, (30 * i) + 10); 
      labels[i].Location = new Point(100, (30 * i) + 15); 

      labels[i].Size = new Size(100, 20); 

      this.Controls.Add(buttons[i]); 
      this.Controls.Add(labels[i]); 
     } 

     /*delegates for the buttons*/ 
     for (int i = 0; i < NumberOfOptions; i++) 
     { 
      int inneri = i; 
      int numberOfDice = inneri + 1; 

      buttons[i].Click += delegate(Object send, EventArgs e) 
      { 
       labels[inneri].Text = ""; 
       string stringThisRoll = ""; 
       int intThisRoll = 0; 
       var tempResults = diceResults(inneri+1); 
       for (int j = 0; j < tempResults.Count; j++) 
       { 
        int innerj = j; 
        intThisRoll += tempResults[innerj]; 
        stringThisRoll += tempResults[innerj].ToString() + " "; 
       } 
       labels[inneri].Text = intThisRoll.ToString(); 
       labels[inneri].Text += " Made of: " + stringThisRoll; 
       //MessageBox.Show(inneri.ToString()); 
       //labels[inneri].Text += "Last one: " + tempResults[tempResults.Count-1].ToString(); 
      }; 
     } 
     InitializeComponent(); 
    } 

    List<int> diceResults(int numDice) 
    { 
     Random rnd = new Random(); 
     List<int> resultList = new List<int>(); 
     int total = 0; 
     for (int i = 0; i < numDice; i++) 
     { 
      resultList.Add(rnd.Next(0, 3)); 
     } 
     return resultList; 
    } 
} 

}

+2

Вы пытались отладить его шаг за шагом? Обычно это проще, чем просто попытаться найти проблему, просто глядя на код. – Andrey

+4

innerJ не требуется, потому что j не является * внешней переменной * анонимной функции. –

+0

'Похоже, что это требует какой-то серьезной отладки' от' OP' – MethodMan

ответ

0

intThisRoll дает число, которое является правильным для количества кубиков, которые должны быть свернуты, но stringThisRoll Безразлично У меня все есть.

Убедитесь, что элементы управления Label достаточно большие.

//labels[i].Size = new Size(100, 20); 
    labels[i].AutoSize = true; 
Смежные вопросы