1

値 0 で初期化する変数「start」があります。

1 つの引数が true になったときに別のループに切り替えるにはどうすればよいですか。

だからここに私が達成しようとしているものがあります

ボタンをクリックすると

最初のループは、「XXXX」を含む textBlock 1 で始まり、 Variable'Start' は 34 に達するまでクリック/タッチするたびに 1 ずつ増加します。したがって、カウンターが 34 に達すると、テキストは「YYYY」に変わります

2 番目のループは、カウンターがリセットされ、再び 0 から開始されるときですが、今回は 33 まで上昇するだけで済みます。33 に達するとすぐに、テキストが「ZZZZ」に変わります。

最後のループ: カウンターがリセットされ、再び 33 まで上がります。しかし、今回はそれが終わるとき。ループ1に戻ります。

ここに私が今持っているコードがありますが、最後のループを行う方法がわかりません。

public partial class MainPage : PhoneApplicationPage
{
    private int start = 0;
    private bool sw = false;
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        int start = 0;

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        tasbih();            
    }
    public void tasbih()
    {
        if (sw == false)
        {
            textBlock1.Text = "TEXTBX 1";
        }
        start++;
        String text1 = Convert.ToString(start);
        textBlock2.Text = text1;

        if (start >= 35)
        {
            textBlock1.Text = "TEXTBX 2";
            start = 0;
            String text2 = Convert.ToString(start);
            textBlock2.Text = text2;
            sw = true;                
        }


    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {


        textBlock1.Text = "Reset";
        tasbih();

    }

また、カウンターのどこにいても、すべてを最初からやり直すリセットボタンがあります。どうすればそれができるかについての指針はありますか?

4

2 に答える 2

0
// these have to be member variables, or you'll never be able to reset
// or even remember the counter between calls
private int clicks = 0;  // the number of clicks in the current loop
private int state = 0;   // which loop we're in

// these are just so we don't have to repeat ourselves.
// each element corresponds to a possible value of `state`.
// both arrays should have the same number of elements.
// alternatively, you could have a type containing the label and max together,
// and just have an array of those.
private string[] labels = { "TEXTBX 1", "TEXTBX 2", "ZZZZ" };
private int[] max = { 34, 33, 33 };


public void reset() {
    clicks = 0;
    state = 0;
    // probably reset text boxes here too.  If you don't want to, then delete
    updateTextBoxes();
}

public void bump()
{
    // bump the counter, and if it's high enough, switch to the next state
    // and reset the counter
    // (the "% max.Length" causes 3 to be 0, so states wrap around)
    if (++clicks > max[state])
    {
         state = (state + 1) % max.Length;
         clicks = 0;
    }

    updateTextBoxes();
}

private void updateTextBoxes() {
    textBlock1.Text = labels[state];
    textBlock2.Text = clicks.ToString();
}
于 2012-09-20T21:54:20.123 に答える
0

より明示的な状態変数を用意し、すべてのロジックでそれをキーオフすることをお勧めします。start現在、 への移行のためだけにキーをオフにしsw = trueています。明示的な状態があると、より簡単になります。

enum MyState { Part1, Part2, Part3 }


MyState currentState = Part1;
int clickCount = 0;

public void tasbih()
{
    clickCount++;

    // First, do state transitions.
    switch(currentState)
    {
        case MyState.Part1:
            if(clickCount >= 34) { currentState = MyState.Part2; clickCount = 0; } 
            break;
        case MyState.Part2:
            if(clickCount >= 33) { currentState = MyState.Part3; clickCount = 0; } 
            break;
        case MyState.Part3:
            if(clickCount >= 33) { currentState = MyState.Part1; clickCount = 0; } 
            break;
    }

    // Now, act on the current (or new) state.
    switch(currentState)
    {
        case MyState.Part1:
            textBlock1.Text = "TEXTBX 1";
            textBlock2.Text = clickCount.ToString();
            break;
        case MyState.Part2:
            textBlock1.Text = "TEXTBX 2";
            textBlock2.Text = clickCount.ToString();
            break;
        case MyState.Part3:
            textBlock1.Text = "ZZZZ";
            textBlock2.Text = clickCount.ToString();
            break;
    }
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    currentState = MyState.Part1;
    clickCount = 0;
    tasbih();
}
于 2012-09-20T21:25:42.780 に答える