/*ASCII for 201 will gives: ╔
ASCII for 187 will gives: ╗
ASCII for 205 will gives: ═
ASCII for 186 will gives: ║
ASCII for 200 will gives: ╚
ASCII for 188 will gives: ╝
*/

/*
int getch_noblock() {
    if (_kbhit()) {
        int key = _getch();
        if (key == 0xE0 || key == 0) { // check for arrow keys
            key = _getch();
            switch (key) {
                case 77: // right arrow
                    return 'r';
                // add cases for other arrow keys if needed
            }
        } else {
            return tolower(key);
        }
    }
    return -1;
}

*/
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#define N 20
#define M 40
int a, b, i, j, Field[N][M], x, y, Gy, Head, Tail, Game, Frogs, var, dir;



int getch_noblock () {
  if (_kbhit())
    return _getch();

  else
    return -1;
}







void movement() {
    var = getch_noblock();
    var = tolower(var);

    switch (var) {
        case 'l':
            if (dir != 'j') dir = var;
            break;
        case 'j':
            if (dir != 'l') dir = var;
            break;
        case 'k':
            if (dir != 'i') dir = var;
            break;
        case 'i':
            if (dir != 'k') dir = var;
            break;
        default:
            break;
    }

    if (dir == 'l') {
        y++;
        Head++;
        Field[x][y] = Head;
    }
    else if (dir == 'j') {
        y--;
        Head++;
        Field[x][y] = Head;
    }
    else if (dir == 'k') {
        x++;
        Head++;
        Field[x][y] = Head;
    }
    else if (dir == 'i') {
        x--;
        Head++;
        Field[x][y] = Head;
    }
}



void Random () {
  srand(time(0));
  a=1 + rand() % 18;
  b=1 + rand() % 38;
  if (Frogs == 0 && Field[a][b]==0) {
    Field[a][b]=-1;
    Frogs=1;
  }

}



void print () {
  for (i=0; i<=M+1; i++) {          /* Game field start*/
    if (i==0) {
      printf("%c", 201);
    } else if (i==M+1) {
      printf("%c", 187);
    } else   {
      printf("%c", 205);
    }
  }
  printf("\n");
  for (i=0; i<N; i++) {
    printf("%c", 186);
    for (j=0; j<M; j++) {
      if (Field[i][j]==0) printf(" ");
      if(Field[i][j]>0 && Field[i][j]!=Head)  printf("%c",177);
      if(Field[i][j]==Head) printf("%c", 178);
      if (Field[i][j]==-1) printf("%c", 15);//44 line
      if (j==M-1) printf("%c\n", 186);
    }

 
  }
  for (i=0; i<=M+1; i++) {
    if (i==0) {
      printf("%c", 200);
    } else if (i==M+1) {
      printf("%c", 188);
    } else   {
      printf("%c", 205);
    }  /* Game field start*/
  }
}


void snake () {
  for (i=0; i<N; i++) {
    for (j=0; j<M; j++) {
      Field[i][j]=0;
    }
  }
  x=N/2;
  y=M/2;
  Gy=y;
  Head=5;
  Tail=1;
  Game=0;
  Frogs=0;
  for (i=0; i<Head; i++) {
    Gy++;
    Field[x][Gy-Head]=i+1;
  }
}


void ResetScreenPosition() {
  HANDLE hOut;
  COORD Position;
  hOut=GetStdHandle(STD_OUTPUT_HANDLE);
  Position.X=0;
  Position.Y=0;
  SetConsoleCursorPosition(hOut, Position);
}



void TailRemove() {
  for (i=0; i<N; i++) {
    for (j=0; j=N; j++) {
      Field[i][j]=0;
    }
    
  }
}

int main () {
  snake();
  while (Game == 0) {

    TailRemove();
    print();
    ResetScreenPosition();
    Random();
    movement();
    Sleep(99);
  }
  return 0;
}