0

我正在为我的一个班级做一个体验设计项目,使用旋转电话和 arduino 套件来创建基于自动电话菜单的游戏。来自旋转拨号的串行输入通过 arduino 运行,现在我正在使用处理来编写菜单。

我有一个动作大纲,并且已经开始编写一些 if then 语句来开始,但现在我偶然发现了 case 和 switch。

我对此完全陌生,但在课堂上学到了很多东西。

我的问题是如何制作一组连续的嵌套 if/then 语句或用例并切换到通过一系列提示和输入?

到目前为止,这是我的草图:

import processing.serial.*;

Serial port;  // Create object from Serial class
float val;    // Data received from the serial port

boolean task1prompted;
boolean task1;
boolean task2;
boolean dialed;

PFont font;

void setup() {
    size(800, 400);
    background(0, 0, 0);
    smooth();
    // IMPORTANT NOTE:
    // The first serial port retrieved by Serial.list()
    // should be your Arduino. If not, uncomment the next
    // line by deleting the // before it. Run the sketch
    // again to see a list of serial ports. Then, change
    // the 0 in between [ and ] to the number of the port
    // that your Arduino is connected to.
    //println(Serial.list());
    String arduinoPort = Serial.list()[0];
    port = new Serial(this, arduinoPort, 9600);

    task1 = false;
    task2 = false;
    task1prompted = false;

    font = createFont("Arial", 32);
    textFont(font, 32);
    textAlign(CENTER);
}

void draw() {
    if (port.available() > 0) { // If data is available,
        val = port.read();      // read it and store it in val
        if (val >= 48 && val <= 57) {
            val = map(val, 48, 57, 0, 9);  // Convert the value
        }
        println(val);
    }

    if (val == 97) {
        println("dialing");
    }

    if (val == 98){
        println("dialed");
        dialed = true;
    }

    /// switch will activate the task1 variable.
    // Play sound file for the prompt.
    if (task1prompted == false){
      delay(1000);
       println("for spanish, press one. for french, press 2...");
      task1prompted = true;
    }

    task1 = true;

    if (task1 == true && dialed == true) {
        ///play sound file

        if (val == 5) {
            println("Thank you for playing... Blah blah next prompt.");
            dialed = true;
            task1=false;
            task2=true;
        } else
            if (val != 5) {
            println("We're sorry, all of our international operators are busy");
            task1 = true;
            task2 = false;
            dialed = false;
        }

    }
    else
        if (task2 == true){
            delay(1000);
            println("task2 start");
        }
}

我的导师帮助我做到了这一点,我一直在寻找有关如何继续进行下一个任务/提示的答案。用例和切换会更容易吗?我什至是否以正确的方式执行嵌套 if 语句?

好吧,我只是用草图和案例命令尝试了这一点,如下所示:

    /// Switch will activate the task1 variable.
    //  Play sound file for the prompt.
    if (task1prompted == false){
        delay(1000);
        println("for spanish, press one. for french, press 2...");
        task1prompted = true;
    }

    task1 = true;

    if (task1 == true && dialed == true) {
        ///Play sound file

        int lang = (int)(val+0);

        switch(lang) {
            case 1:
            case 2:
            case 3:
            case 4:
                println("sorry no international operators");  // If 1-4 go back to choices
                task1 = true;
                task2 = false;
                dialed = false;
                break;
            case 5:
                println("thank you, move to next prompt");  // If 5 go to next prompt
                task1=false;
                task2=true;
                dialed = true;
                break;
            case 6:
            case 7:
            case 8:
            case 9:
            case 0:
                println("not a valid option, you lose");  // If not 1-5 go back to beginning
                task1=false;
                task2=false;
                dialed = true;
                break;
        }

        if (task2prompted == false){
            delay(1000);
            println("please listen while we test the line");
            task2prompted = true;
        }

        task2 = true;

        if (task2 == true && dialed == true) {
        } ///Play sound file

        int tone = (int)(val+0);

        switch(tone) {
          case 1:
          case 2:
          case 3:
          case 5:
          case 6:
          case 7:
          case 8:
          case 9:
          case 0:
            println("not a valid connection, you lose");  // If not 4 go back to beginning
            task2 = false;
            task3 = false;
            dialed = false;
            break;
          case 4:
            println("thank you, move to next prompt");  // If 4 move to next prompt
            task2=false;
            task3=true;
            dialed = true;
            break;
        }
    }
}

我仍然对如何使这具有水平而不是同时发生感到困惑。

4

2 回答 2

1

您可能想查找有限状态机。这是处理事件驱动的用户界面的一种非常常见的方法。

于 2012-03-15T23:26:19.477 回答
0

我不完全确定你的问题是什么,但也许这里的东西会回答它,如果不仅仅是澄清你在寻找什么

使用 case 语句,您无需为可能发生的每一个输出都创建一个案例。您可以避免这样做的方法是使用默认语句

例子:

    switch(tone) {
      case 4:
        println("thank you, move to next prompt");  // If 4 move to next prompt
        task2=false;
        task3=true;
        dialed = true;
        break;
      default:
        println("not a valid connection, you lose");  // If not 4 go back to beginning
        task2 = false;
        task3 = false;
        dialed = false;
    }

默认情况不需要休息,因为它在最后。但从本质上讲,如果没有其他任何事情被击中,它就是万能的。

同样在你上面的一些代码中

if (val == 97) {
    println("dialing");
}

if (val == 98){
    println("dialed");
    dialed = true;
}

最好使用“else if”来使其不必检查两者是否正确

if (val == 97) {
    println("dialing");
}

else if (val == 98){
    println("dialed");
    dialed = true;
}
于 2012-07-31T15:12:15.630 回答