0

Using the BBC Micro bit.

There are two buttons on the micro bit and in my code button A is for even numbers and button B is for negative numbers. The game runs fine if the numbers are only a 1 or a 0 anything else it ends the game and i'm not sure why anymore.

Tried using just 1 number in the array and it works, or even changing the order of the array the first number in the array is the only one which will be accepted.

#include "MicroBit.h"

MicroBit uBit;

bool game = true;
bool press = false;
int i;
int score;
int number;
int nextNumber;
int odd[5] = {1, 3, 5, 7, 9};
int even[5] = {0, 2, 4, 6, 8};

void endGame()
{
    game = false;
}

void evenNumber()
{
    if(number == even[i])
    {
        score++;
        //number = nextNumber;
    }
    else
    {
        endGame();
    }
}

void oddNumber()
{
    if(number == odd[i])
    {
        score++;
        //number = nextNumber;
    }
    else
    {
        endGame();
    }
}

void onButtonA(MicroBitEvent)
{
    evenNumber();
    press = true;
}

void onButtonB(MicroBitEvent)
{
    oddNumber();
    press = true;
}

void reset(MicroBitEvent)
{
    game = true;
}

int main()
{
    // Initialise the micro:bit runtime.
    uBit.init();
    // Random number between 0 - 10
    uBit.seedRandom(uBit.random(10));
    number = uBit.random(10);
    nextNumber = number;

    while (game == true)
    {
        press = false;
        number = nextNumber;
        nextNumber = uBit.random(10);
        // If numbers are the same, randomise again.
        while(nextNumber == number)
        {
            nextNumber =  uBit.random(10);
        }

        uBit.display.print(number);

        // Button press and shake
        uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA);
        uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB);
        uBit.messageBus.listen(MICROBIT_ID_ACCELEROMETER, MICROBIT_ACCELEROMETER_EVT_SHAKE, reset);

        while (press == false){
            uBit.sleep(100);
        }
    }

    // Make sure we don't exit main
    uBit.sleep(1000);

    // Shows score
    uBit.display.scroll("YOUR SCORE IS:", 80);
    uBit.display.scroll(score, 80);

    release_fiber();
}

All even numbers up to 8 should work on button click A and odd numbers on button click B up to 9.

Ratata Tata
  • 2,781
  • 1
  • 34
  • 49
  • 3
    You never change `i`. You also don't initialize it, but since it is a global variable it will be set to 0. – Retired Ninja Feb 10 '19 at 02:49
  • @RetiredNinja Hi can i ask how I would implement that or at least could you please guide me in the right direction, thanks! – Rex Richards Feb 10 '19 at 03:42
  • Perhaps try a different way of finding even or odd. An even number could be found with `bool isEven(int num) { return num % 2 == 0; }` and an odd number is one that is not even `bool isOdd(int num) { return !isEven(num); }` – Retired Ninja Feb 10 '19 at 05:33
  • @RetiredNinja and i'd implement them im guessing within void evenNumber and void oddNumber? – Rex Richards Feb 10 '19 at 13:37

1 Answers1

1

Welcome to Stackoverflow. I replicated your problem. Here's some code that works for me. I removed some lines that aren't needed any more. As @RetiredNinja said, you need to change how you check for odd and even numbers.

#include "MicroBit.h"

MicroBit uBit;

bool game = true;
bool press = false;
int score;
int number;
int nextNumber;

void endGame()
{
    game = false;
}

void evenNumber()
{
    if(number%2 == 0)
    {
        score++;
        //number = nextNumber;
    }
    else
    {
        endGame();
    }
}

void oddNumber()
{
    if(number%2 == 1)
    {
        score++;
        //number = nextNumber;
    }
    else
    {
        endGame();
    }
}

void onButtonA(MicroBitEvent)
{
    evenNumber();
    press = true;
}

void onButtonB(MicroBitEvent)
{
    oddNumber();
    press = true;
}

void reset(MicroBitEvent)
{
    game = true;
}

int main()
{
    // Initialise the micro:bit runtime.
    uBit.init();
    // Random number between 0 - 10
    uBit.seedRandom(uBit.random(10));
    number = uBit.random(10);
    nextNumber = number;

    while (game == true)
    {
        press = false;
        number = nextNumber;
        nextNumber = uBit.random(10);
        // If numbers are the same, randomise again.
        while(nextNumber == number)
        {
            nextNumber =  uBit.random(10);
        }

        uBit.display.print(number);

        // Button press and shake
        uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA);
        uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB);
        uBit.messageBus.listen(MICROBIT_ID_ACCELEROMETER, MICROBIT_ACCELEROMETER_EVT_SHAKE, reset);

        while (press == false){
            uBit.sleep(100);
        }
    }

    // Make sure we don't exit main
    uBit.sleep(1000);

    // Shows score
    uBit.display.scroll("YOUR SCORE IS:", 80);
    uBit.display.scroll(score, 80);

    release_fiber();
}

Oppy
  • 2,662
  • 16
  • 22