需要帮助为Arduino创建无限数组(c / c ++)

时间:2014-03-28 01:25:01

标签: c++ c arrays arduino break

我试图制作一张arduino的Simon Says副本,这是一款儿童游戏,你可以用他们在学校里独立学习的Joy Stick按下他们之前出现的相同颜色。我认为到目前为止我所拥有或将会工作但是我所制造的阵列给了我错误:' setOrder的存储大小'不知道"这是有道理的,因为我已将其声明为" int setOrder [];",但这正是我想要的。一个数组在创建时没有变量,但可以随着游戏的进展添加变量......这就是我到目前为止在代码中所拥有的,请告诉我它的外观,以及如何制作这样的数组。谢谢!!

int xAxis = A0;
int yAxis = A1;
int push = 6;

int blue = 9;
int yellow = 10;
int green = 11;
int red = 12;
int play = 0;
int setOrder[];      /* HERE IS THE PROBLEM */

void setup()
{
  Serial.begin(9600);

  pinMode(blue, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(push, INPUT);
  digitalWrite(push, HIGH); 
}

void loop()
{
 if(!digitalRead(push)){
   play = 1;
   Serial.println("start!");
 } 

 if(play = 1){
   for(int i = 0; i<=sizeof(setOrder); i++){
     setOrder[i] = random(1, 4);
     for(int j = 0; j<=sizeof(setOrder); j++){
       int k = setOrder[j];
       if(k=1){
       digitalWrite(blue, HIGH); delay(750); digitalWrite(blue, LOW);
       }
       if(k=2){
       digitalWrite(yellow, HIGH); delay(750); digitalWrite(yellow, LOW);
       }
       if(k=3){
       digitalWrite(green, HIGH); delay(750); digitalWrite(green, LOW);
       }
       if(k=4){
       digitalWrite(red, HIGH); delay(750); digitalWrite(red, LOW);
       }
     }  

     int playback[sizeof(setOrder)];
     for(int l = 0; l<=sizeof(playback); l++){

       //player presses RIGHT green led
       if(analogRead(xAxis) > 600){
         playback[l] = 4;
           if(playback[l] == setOrder[l]){
             digitalWrite(green, HIGH);
           }
           else{
             digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
             play = 0;
             break;
           }
       }

       //player presses LEFT yellow led
       if(analogRead(xAxis) < 400){
         playback[l] = 2;
           if(playback[l] == setOrder[l]){
             digitalWrite(yellow, HIGH);
           }
           else{
             digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
             play = 0;
             break;
           }
       }

       //player presses DOWN blue led
       if(analogRead(yAxis) > 600){
         playback[l] = 1;
           if(playback[l] == setOrder[l]){
             digitalWrite(blue, HIGH);
           }
           else{
             digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
             play = 0;
             break;
           }
       }

       //player presses UP red led
       if(analogRead(yAxis) < 400){
         playback[l] = 3;
           if(playback[l] == setOrder[l]){
             digitalWrite(red, HIGH);
           }
           else{
             digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
             play = 0;
             break;
           }
       }

     }

   }

 }

}

此外,我不确定我是否正在使用&#34; break();&#34;正确的方法,如果有人能告诉我,那就太棒了!再次感谢。

4 个答案:

答案 0 :(得分:1)

我建议您查看std :: vector。

在您检查主要游戏区域if (play = 1)后的第一行,您使用sizeof(setOrder)运行for循环,而不先将数据放入setOrder。即使这确实编译了,逻辑上你的代码总是会跳过循环。一旦你找出了向量(我非常确定你正在寻找的东西),你可能想要改变它以检查你的setOrder向量的大小与预定义的最大值(在玩家赢了哪一点?)。

这里是tutorial on vectors I found from google

此外,还有其他一些可能的错误/建议:

  • 将您的循环分解为几个可以调用的子函数,这样读取代码就不是一个巨大的块。这样也可以更容易地找到错误,因为您可以检查每个函数是否正常工作,一次只能运行一个函数。
  • 当您检查if (play = 1)时,您实际上正在使用作业=运算符,而不是条件检查==。您已将1的值分配给play,而不是检查play是否等于1
  • 您未正确使用sizeof(setOrder)sizeof(X)返回X占用的字节数,不一定是X中的元素数。如果你使用一个向量,那么有一个vector.size()函数可以返回向量中的元素个数
  • 当你检查玩家的动作时,你会拨打analogRead(xAxis)四次 - 每个方向一次。在第一次通话中将始终检查玩家的第一次输入。如果它是假的,玩家将需要提供另一个输入以使其成为第二个if语句。

答案 1 :(得分:1)

对于方向检测,您可能会看到如下内容:

enum Directions {
    Center,
    Left,
    Right,
    Up,
    Down
}

const int threshold = 100;

int getJoyStick() 
{
    // get the X,Y coordinates with 0,0 the centre
    int x = analogRead(xAxis) - 500;
    int y = analogRead(yAxis) - 500;

    /check if we are in the middle.  Both X and Y need to be small for this to happen
    if (abs(x) < threshold && abs(y) < threshold) return Center;

    //to detect up, down, left, right draw diagonals at 45 degrees from the centre
    //if we are more to the right than we are up or down, then it is Right.  This
    //is to cope if it isn't exactly horizonal or vertical
    //so y big might mean up, but if x is bigger, than it is actually to the right
    if (x>y) {
      if (x>-y) return Right; else return Down;
    }
    else {
      if (x>-y) return Up; else return Left;
    }
}

枚举只是为了表明这样做的好方法。您将通过所有代码获得相同的代码。但相反,如果它对您来说更简单,您只需返回每个方向的数字代码。

答案 2 :(得分:0)

如果您使用c ++语言,就像帖子中的c ++标签所示,请使用 std :: vector 而不是数组。

向量是一个可以在程序执行期间增长的列表。 Here是关于vector的文档。

答案 3 :(得分:0)

如果您打算使用普通的旧C数组,最简单的路径将是一个静态长度数组,足以接受您最大数量的条目。然后你保留一个单独的计数器,说明你目前正在使用多少阵列。

const int MAX_ORDER_LENGTH = 1024;
int setOrder[MAX_ORDER_LENGTH];
int setOrderSize = 0;  //the number of entries currently used

然后,当您添加条目时,请确保setOrderSize保持小于MAX_ORDER_LENGTH。

请注意,sizeof(setOrder)不会给出数组中的条目数。它实际上是结构占用的字节数。

休息;命令会让你退出最里面的for循环,而不是外循环。