ELEC2645 (2019/20)
/
ELEC2645_Project_el17oc1
Owen Cavender 201159294
Diff: snake.cpp
- 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; } - - - +}