Owen Cavender 201159294

Dependencies:   mbed Gamepad2

Revision:
5:d716013c6a18
Parent:
3:d17d712c2e45
Child:
6:bf90044188d0
--- a/snake.cpp	Tue May 26 18:42:16 2020 +0000
+++ b/snake.cpp	Wed May 27 10:27:34 2020 +0000
@@ -11,102 +11,24 @@
 }
 
 
-void Snake::init ()
+void Snake::init (GameEngine &engine)
 {
 
     //WIDTH =84 HEIGHT = 42 //snakebody[0] is initalised may have to initilaise the other 2 og snake parts
+    Vector2D SnakeHead = engine.get_Snakehead();
+
     _length = 2;                                                //  how do i initalise
     _gameover = false;
     _score = 0;
     _direction = up;
-
-}
-
-
-
-int Snake::set_direction(Gamepad &pad)     //int type as Directions is an enum
-{
-
-    Directions _direction;
-
-
-    if (pad.A_pressed()) {
-        _direction = right;
-    }
-
-    if (pad.B_pressed()) {
-        _direction = left;     //check these are orrecrt
-    }
-
-    if (pad.X_pressed()) {
-        _direction = up;
-    }
-    if (pad.Y_pressed()) {
-        _direction = down;
-    }
-    else {
-        _direction = _direction;
-    }
-    return _direction;
+    Vector2D S0 = SnakeHead;
+    
+    // Vector2D S1 = engine.get_oldSnakehead();
+    // Vector2D &Snakehead = {42, 24};
+    // Vector2D &oldSnakehead  = {42, 23};
 }
 
 
-void Snake::move_and_draw_snake(Gamepad &pad, N5110 &lcd)
-{
-    Vector2D Snakehead = _engine.get_Snakehead();
-    Vector2D oldSnakehead = _engine.get_oldSnakehead();
-
-    Vector2D *_snakebody = new Vector2D [_length];            //  im unsure that this code would work- creates dynamic array - each bit having 2 parts (x,y) - number of bits of snakebody = length
-
-    _snakebody[0].x = Snakehead.x;                            // snakebody[0] = Snakehead
-    _snakebody[0].y = Snakehead.y;
-    _snakebody[1].x = oldSnakehead.x;
-    _snakebody[1].y = oldSnakehead.y;
-
-    while(1) {
-        if (_direction == up) {           //           /-/
-            Snakehead.y++;                           ///// alters Snakehead initial value
-            oldSnakehead.y = (Snakehead.y - 1);
-            oldSnakehead.x = (Snakehead.x);                                          //    Does this code look okay ? returning _direction in previous function and accessing it in this one - _direction should be member function
-        }
-        if (_direction == down) {             // Direction should remain  after button is pressed - should not just change the snakehead coordinate once
-            Snakehead.y--;
-            oldSnakehead.y = (Snakehead.y + 1);
-            oldSnakehead.x = (Snakehead.x);                 //
-        }
-        if (_direction == left) {
-            Snakehead.x--;
-            oldSnakehead.x = (Snakehead.x + 1);
-            oldSnakehead.y = (Snakehead.y);
-        }
-        if (_direction == right) {
-            Snakehead.x++;
-            oldSnakehead.x = (Snakehead.x - 1);         //updates the head position before rendering so when it draws i=1 the 0 position will be new
-            oldSnakehead.y = (Snakehead.y);
-        }
-
-
-        for(int i=2; i<=_length; i++) {                     //0 being head of snake  so snakepos[1]=snakepos[0] which is the head - moving up one place
-            _snakebody[i].x = _snakebody[i-1].x;              //Snake needs to follow itself - low numbers lead the way
-            _snakebody[i].y = _snakebody[i-1].y;
-            if(_snakebody[i].x == Snakehead.x && _snakebody[i].y == Snakehead.y) {  //  Unsure how to initially define the snake with (3 bits, when score =0) starting position  *without* redeclaring Vector2D *snakebody = new Vector2D [_length];
-                _gameover = true;
-
-            }
-        }
-
-        for(int i = 0; i <= _length; i++) {
-            lcd.setPixel(_snakebody[i].x, _snakebody[i].y, 1);
-
-            // is snakebody[0] being plotted? do you think this would work?
-            // ideally would define snakebody[0], snakebody[1], snake[2] so the snake starts as 3 bits and bit 1 knows to go to bit zero, bit 2 know to go to bit 1 position
-
-        }
-    }
-}
-
-
-
 
 
 void Snake::gameover_true(N5110 &lcd)      //taking action if crash has occured
@@ -129,38 +51,103 @@
 
 
 
-void Snake::check_if_scored(N5110 &lcd, Gamepad &pad)
+void Snake::check_scored(N5110 &lcd, Gamepad &pad, GameEngine &engine)
 {
-    Vector2D Snakehead = _engine.get_Snakehead();
-    Vector2D Applepos = _engine.get_Applepos();                           //need to code clear apple and make sure apple isnt spawning every time
+   Vector2D Applepos = engine.get_Applepos();   
+                            //need to code clear apple and make sure apple isnt spawning every time
 
-    if(Snakehead.x == Applepos.x && Snakehead.y == Applepos.y) {
+    if(S0.x == Applepos.x && S0.y == Applepos.y) {
 
         lcd.setPixel(Applepos.x, Applepos.y, 0);   // Plem:: Wanted to make sure that this didnt clear the pixel of the snake as it passes through it
         _score++;                                 //by waiting unil the snake has passed through before clearing the old apple however the new apple spawn needs to be ASAP after collection
         _length = _length++;
-        _engine.set_Applepos(lcd);    //randomises new values for _apx,_apy and draws on lcd -- the position is not needed until we compare it to Snakehead
+        engine.set_Applepos(lcd);    //randomises new values for _apx,_apy and draws on lcd -- draws on next loop-- the position is not needed until we compare it to Snakehead
         pad.tone(1500.0,0.5);          //need to clear apple
         pad.leds_on();
         wait(0.5);
         pad.leds_off();
 
     }
+    lcd.setPixel(Applepos.x, Applepos.y,1);
+}
+
+
+
+int Snake::set_direction(Gamepad &pad)     //int type as Directions is an enum
+{
+
+    Directions _direction;
+
+
+    if (pad.A_pressed()) {
+        _direction = right;
+    }
+
+    if (pad.B_pressed()) {
+        _direction = left;     //check these are orrecrt
+    }
+
+    if (pad.X_pressed()) {
+        _direction = up;
+    }
+    if (pad.Y_pressed()) {
+        _direction = down;
+    } else {
+        _direction = _direction;
+    }
+    return _direction;
 }
 
+
+
+void Snake::move_snakebody(GameEngine &engine, N5110 &lcd)
+{
+    lcd.refresh();
+    
+    Vector2D *_snakebody = new Vector2D [_length];
+    _snakebody[0].x = S0.x;           //assign _sb0[0] before changing value
+    _snakebody[0].y = S0.y;           //engine.get_oldSnakehead;                                           // _engine.get_oldSnakehead();
+
+
+    while(1) {
+        if (_direction == up) {           //           /-/
+            S0.y++;                           ///// alters Snakehead initial value
+            //    Does this code look okay ? returning _direction in previous function and accessing it in this one - _direction should be member function
+        }
+        if (_direction == down) {             // Direction should remain  after button is pressed - should not just change the snakehead coordinate once
+            S0.y--;
+        }
+        if (_direction == left) {
+            S0.x--;
+        }
+
+        if (_direction == right) {
+            S0.x++;
+        }
+        lcd.setPixel(S0.x, S0.y, 1);   
+                                                            //updates the head position before rendering so when it draws i=1 the 0 position will be new
+        for(int i=1; i<=_length; i++) {                     //0 being head of snake  so snakepos[1]=snakepos[0] which is the head - moving up one place
+            _snakebody[i].x = _snakebody[i-1].x;
+            _snakebody[i].y = _snakebody[i-1].y;             //plotting of snake
+        
+            lcd.setPixel(_snakebody->x, _snakebody->y, 1);  //pointer used - need to point to x and y
+                                                                    //Snake needs to follow itself - low numbers lead the way
+
+            if((_snakebody[i].x == _snakebody[0].x) && (_snakebody[i].x == _snakebody[0].x)) { //  Unsure how to initially define the snake with (3 bits, when score =0) starting position  *without* redeclaring Vector2D *snakebody = new Vector2D [_length];
+                _gameover = true;
+            }
+        }
+
+    }
+}
 void Snake::check_wall_collisions()     // Vector2D *&snakebody hopefully this points to values stored in snakebody then can compare to snakehead
 {
-    Vector2D Snakehead = _engine.get_Snakehead();
 
-
-    if (Snakehead.x == 0 || Snakehead.x == 84 || Snakehead.y == 0 || Snakehead.y == 42) {   //how do i access snakehead.headx
+    if (S0.x == 0 || S0.x == 84 || S0.y == 0 || S0.y == 42) {   //how do i access snakehead.headx
 
         _gameover = true;
     } else {
-        _gameover = false;
-
-    }
+    
+    _gameover = _gameover;
 }
-
-
-    
+}