-2

このコードは、私が期待する結果を私に与えていません。

いくつかの調査の結果、ループ内のデリゲートを使用すると、カウンターの値をキャプチャする必要があることがわかりましinneriinnerj。しかし、何らかの理由でforjを使用したループで,は、文字列stringThisRollにはダイスロールの最初の2つの数字しかありません。

なぜこれが起こっているのか理解できないようです。は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;
    }
}

}

4

1 に答える 1

0

intThisRollは、振る必要のあるサイコロの数に対して正しい数を示しますが、stringThisRollにはすべてが含まれているわけではありません。

ラベルコントロールが十分に大きいことを確認してください。

 //labels[i].Size = new Size(100, 20);
   labels[i].AutoSize = true;
于 2013-03-19T18:51:37.790 に答える