I built a Simon Says game using an Arduino UNO board. This was my first "real" arduino project. I would like to know how to make it better, game mechanics and code efficiency.

    #define RedTone 165
    #define GreenTone 330
    #define YelloTone 659
    #define BlueTone 1319
    #define FailTone 100
    
    #define BuzzerPin 8
    
    
    /* The led and button pins are set this way because I use their position as a hexadecimal.
     *  LED PINS:
          red:0
          green:1
          yello:2
          blue:3
        Button Pins:
          red:4
          green:5
          yello:6
          blue:7
    */
    
    
    byte mem[20];
    int sound[16] = {0, RedTone, GreenTone, 0, YelloTone, 0, 0, 0, BlueTone, 0, 0, 0, 0, 0, 0, FailTone};  //the tones are placed in the arrey in the hex spot for turning on the leds.
    
    
    void setup() {
      DDRD = 0x0F;
      randomSeed(analogRead(0));
      pinMode(BuzzerPin, 1);
    }
    
    
    void blink(int i) { //Blinking and making sound
      PORTD = i;
      tone(BuzzerPin, sound[i]);
      delay(500);
      PORTD = 0x00;
      noTone(BuzzerPin);
      delay(500);
    }
    
    
    void NT(int i) { //Just blinking
      PORTD = i;
      delay(500);
      PORTD = 0x00;
      delay(500);
    }
    
    
    void set_mem() {  //sets the random order of the leds and transforms into the led's pin in hexadecimal
      int b;
      for (int i = 0; i < 20; i++) {
        b = random(4);
        if (b == 3)
          mem[i] = 0x08;
        else if (b == 2)
          mem[i] = 0x04;
        else if (b == 1)
          mem[i] = 0x02;
        else
          mem[i] = 0x01;
      }
    }
    
    
    bool check(int i) { //checks if the pressed button is correct
      byte look;
      for (int x = 0; x <= i; x++) {
        look = 0;
        do
        {
          look = PIND >> 4;  //makes the button press pin to the pin of led with the same color
        }
        while (look == 0);  //waits until a button is pressed
        blink(look); //lights up the button's led
        if (look != mem[x])
          return 0;
      }
      return 1;
    }
    
    
    void loop() {
      set_mem();
      for (int i = 0; i < 20; i++) {
        for (int x = 0; x <= i; x++)
          blink(mem[x]);
        NT(0x09); //signals when it finnished showing the order
        if (check(i) == 0) {
          blink(0x0F); //shows if the player failed
          break; //couses a restart
        }
        NT(0x06); //signals when the player finished pressing the leds
      }
    }

How it looks and works:

(I'm having problems making the snippet work, so here is the [link][1] to the site itself and [here][2] is a video of it working (sorry for the low quality).)

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

    <iframe frameborder='0' height='448' marginheight='0' marginwidth='0' scrolling='no' src='https://circuits.io/circuits/4145099-simon-says-leds-and-buttons/embed#breadboard' width='650'></iframe>

<!-- end snippet -->


  [1]: https://circuits.io/circuits/4145099-simon-says-leds-and-buttons
  [2]: https://www.youtube.com/watch?v=B_IMWXf-POc