Yes, changing the values of your variables won't move the snake. You need the equivalent of putchar() to do that.
When the head has found a valid place to move to, then the entire snake body needs to move so it occupies the former position of the segment in front of it. So it's a quick "wave" action, from head to tail, as the segments of the snake move.
In a windows text game, it looks like this in a text based game. Here, the user's char is ascii 1, and d is "door", but "door" really means "room". (Don't ask, OK?)
Code:
if (GetAsyncKeyState(VK_UP) & 0xf) // Up! key
{
t = (r - 1);
Goto(user.x, user.y);
switch (room[*d][t][c]) {
case ' ': // Space.
//printf("room[y2][x]: %uc\n",room[y2][x]); //getchar();
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
--r;
Goto(c, r); putchar(1);
break;
case TMD: // Health Pack.
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
--r;
Goto(user.x, r); putchar(1);
user.life += 5;
break;
case GOLD: // Gold! //bags of gold dust
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
--r;
Goto(user.x, r); putchar(1);
user.gold++;
break;
case '-':
room[*d][r][c] = ' ';
putchar(' ');
if (r == 1)
r = MAXROW - 2;
else
r = r - 2;
Goto(c, r); putchar(1);
room[*d][r][c] = 1;
}
} else if (GetAsyncKeyState(VK_DOWN) & 0xf) // Down!
{
t = (r + 1);
Goto(user.x, user.y);
switch (room[*d][t][c]) {
case ' ': // Space.
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
++r;
Goto(c, r); putchar(1);
break;
case TMD: // Health Pack
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
++r;
Goto(c, r); putchar(1);
user.life += 5;
break;
case GOLD: // Gold!
room[*d][r][c] = ' ';
room[*d][t][c] = '\1';
putchar(' ');
++r;
Goto(c, r); putchar(1);
user.gold++;
break;
case '-': // Door
room[*d][r][c] = ' ';
putchar(' ');
if (r == MAXROW - 2)
r = 1;
else
r = r + 2;
Goto(c, r);
putchar(1);
room[*d][r][c] = 1;
}
} else if (GetAsyncKeyState(VK_LEFT) & 0xf) // Left!
{
t = (c - 1);
Goto(user.x, user.y);
switch (room[*d][r][t]) {
case ' ': // Space
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
--c;
Goto(c, r);
putchar(1); //1
break;
case TMD: // Health Pack
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
--c;
Goto(c, r);
putchar(1);
user.life += 5;
break;
case GOLD: //Gold!
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
--c;
Goto(c, r);
putchar(1);
user.gold++;
break;
case '|': // Door
room[*d][r][c] = ' ';
putchar(' ');
if (c == 1) {
c = MAXCOL - 3;
(*d)--; // to a lower door
room[*d][r][c] = 1; // put user into the array
user.x=c; user.y=r;
printRoom(*d);
SetConsoleTextAttribute(hConsole, 0x0E);
}else
c -= 2;
room[*d][r][c] = 1;
Goto(c, r);
putchar(1);
break;
}
}else if (GetAsyncKeyState(VK_RIGHT) & 0xf) // Right!
{
t = (c + 1);
Goto(user.x, user.y);
switch (room[*d][r][t]) {
case ' ': // Space
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
++c;
Goto(c, r);
putchar(1);
break;
case TMD: // Health Pack
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
++c;
Goto(c, r);
putchar(1);
user.life += 5;
break;
case GOLD: //Gold!
room[*d][r][c] = ' ';
room[*d][r][t] = '\1';
putchar(' ');
++c;
Goto(c, r);
putchar(1);
user.gold++;
break;
case '|': // Door
room[*d][r][c] = ' ';
putchar(' ');
if (c == MAXCOL - 3) {
c = 2;
(*d)++;
room[*d][r][c]= 1;
user.x=c; user.y=r;
printRoom(*d);
SetConsoleTextAttribute(hConsole, 0x0E);
}else
c += 2;
room[*d][r][c] = 1;
Goto(c, r);
putchar(1);
break;
}
}else if (GetAsyncKeyState(VK_ESCAPE) & 0xf) {
exit(1);
}
user.x = c;
user.y = r;
}
Goto is not like goto in programming - it's like goto(x,y), in text based cursor movement, on the console window.