Snake Code


/*

 I will add comments later... Good luck.

*/  

 

// Anlalog input pins for joystick pots

#define xPin 0

#define yPin 1

 

// Size of LED grid (these may actually be backwards)

#define numRows 5

#define numCols 7

 

#define maxSnakeLength 10 //Snakes over 10 dots long are unwieldy 

 

// Pins drivng the LED grid (this may be backwards as well...)

// The columns (as defined here) are ground pins, and the

// rows are Vcc pins.

const int rowPins[numRows] = {9,10,11,12,13};

const int colPins[numCols] = {2,3,4,5,6,7,8};

 

int currentSnakeLength = 3; // Start off with a 3-dot snake

 

int currentRows[maxSnakeLength+1]; // Indicies of the row pins currently on

int currentCols[maxSnakeLength+1]; // Indicies of the coumn pins currently on

 

// Keeps track of which LED is on (the program alternates between

// all of the LEDs that are supposed to be on (because only one

// LED can be powered on at a time) to give the appearance that

// all of the specified LEDs are on.

int currentlyBlinking = 0;

 

int score = 0; // Stores score

int alive = 1; // Stores game state, if alive == 0, you are dead

 

void setup() {

  // These next two for() loops set all of the digital pins to OUTPUT

  // and turns off all of the LEDs (by reverse voltaging them, not ideal,

  // I know, but it's the only way it works...)

 

  // Set all of the Vcc pins to output and set them LOW

  for(int i = 0; i < numRows; ++i){

    pinMode(rowPins[i], OUTPUT);

    digitalWrite(rowPins[i], LOW);

  }

  // Set all of the Ground pins to output and set them HIGH

  for(int i = 0; i < numCols; ++i){

    pinMode(colPins[i], OUTPUT);

    digitalWrite(colPins[i], LOW);

  }

 

  // Set all LED off in the arrays

  for(int i = 0; i < maxSnakeLength; ++i){

    currentRows[i] = -1;

    currentCols[i] = -1;

  }

 

  // Choose a random LED to be the "food" (always stored in the last array slot)

  currentRows[maxSnakeLength] = random(0, numRows);

  currentCols[maxSnakeLength] = random(0, numCols);

 

  // Setup serial

  Serial.begin(9600);

}

 

void loop() {

  if(alive == 0){

    // If the game is over, turn on all of the LEDs and bail

    for(int i = 0; i < numRows; ++i){

      digitalWrite(rowPins[i], HIGH);

    }

 

    for(int i = 0; i < numCols; ++i){

      digitalWrite(colPins[i], LOW);

    }

    delay(100);

    return;

  }

  int xPos = analogRead(xPin);

  int yPos = analogRead(yPin);

 

  int row = xPos/205;

  int col = yPos/147;

 

  if(row != currentRows[0] || col != currentCols[0]){

 

    for(int i = currentSnakeLength-1; i >= 1; --i){

      currentRows[i] = currentRows[i-1];

      currentCols[i] = currentCols[i-1];

    }

    currentRows[0] = row;

    currentCols[0] = col;

 

    if(currentSnakeLength > 3){

      for(int i = 4; i < currentSnakeLength; ++i){

        if(row == currentRows[i] && col == currentCols[i]){

          Serial.println("You Lose!");

          alive = 0;

          return;

        }

      }

    }

 

    if(row == currentRows[maxSnakeLength] && col == currentCols[maxSnakeLength]){

      currentRows[maxSnakeLength] = random(0, numRows);

      currentCols[maxSnakeLength] = random(0, numCols);

      ++score;

      if(currentSnakeLength < maxSnakeLength){

        ++currentSnakeLength;

      }

      Serial.print("You just scored!");

      Serial.print(" Your score is: ");

      Serial.println(score);

    }

  }

 

  int rPin, cPin;

 

  if(currentlyBlinking == currentSnakeLength){

    rPin = currentRows[maxSnakeLength];

    cPin = currentCols[maxSnakeLength];

  }else{

    rPin = currentRows[currentlyBlinking];

    cPin = currentCols[currentlyBlinking];

  }

 

  for(int i = 0; i < numRows; ++i){

    digitalWrite(rowPins[i], (i == rPin) ? HIGH : LOW);

  }

 

  for(int i = 0; i < numCols; ++i){

    digitalWrite(colPins[i], (i == cPin) ? LOW : HIGH);

  }

 

  if(currentlyBlinking < currentSnakeLength){

    ++currentlyBlinking;

  }else{

    currentlyBlinking = 0;

  }

  delay(1);

}