#include #include #include #include #include #include #define up 0 #define down 1 #define left 2 #define right 3 struct segment {int dir, x, y;}; struct segment segments[2520]; int key, length = 1; int mx = 0, my = 0, i; void graphic() { int gdriver = DETECT, gmode, errorcode; initgraph (&gdriver, &gmode, "C:\\BC\\BGI"); errorcode = graphresult(); if (errorcode != grOk) { clrscr (); printf ("Graphics error: %s\n", grapherrormsg (errorcode)); printf ("Press any key to halt"); getch (); exit (1); } } void definedir() { if (key == 80) { segments[0].dir = up; } if (key == 72) { segments[0].dir = down; } if (key == 77) { segments[0].dir = right; } if (key == 75) { segments[0].dir = left; } } void movehead() { if (segments[0].dir == up) { segments[0].x; segments[0].y++; } if (segments[0].dir == down) { segments[0].x; segments[0].y--; } if (segments[0].dir == right) { segments[0].x++; segments[0].y; } if (segments[0].dir == left) { segments[0].x--; segments[0].y; } setcolor (7); circle (segments[0].x*10, segments[0].y*10, 5); } void movebody() { segments[length].x = segments[length-1].x; segments[length].y = segments[length-1].y; setcolor (0); circle (segments[length].x*10,segments[length].y*10,5); for (i = 1; i < length; i++) { segments[length-i].x = segments[length-1-i].x; segments[length-i].y = segments[length-1-i].y; setcolor (7); circle (segments[length-i].x*10,segments[length-i].y*10,5); } } void wallcrash() { if (segments[0].x*10 < 13 | segments[0].x*10 > 627 | segments[0].y*10 < 13 | segments[0].y*10 > 397) { setfillstyle(1,4); bar (10,400,629,479); setcolor (15); rectangle (12, 12, 627, 397); outtextxy (240, 440, "Snake has crashed"); getch (); closegraph (); } } void selfcrash() { for (i = 1; i < length; i++) if (segments[0].x == segments[length-i].x && segments[0].y == segments[length-i].y) { setfillstyle(1,4); bar (0,400,639,479); setcolor (15); rectangle (12, 12, 627, 397); outtextxy (240, 440, "Snake has crashed"); getch (); closegraph (); } } void checkmeal() { if (segments[0].x == mx && segments[0].y == my) { circle (mx*10, my*10, 5); setfillstyle (1, 0); floodfill (mx*10, my*10, 0); mx = random(62); my = random(39); if (mx < 2) mx=+2; if (mx == 62) mx--; if (my < 2) my=+2; if (my == 39) my--; setcolor (13); circle (mx*10,my*10,4); setfillstyle (1,13); floodfill (mx*10,my*10, 13); length++; } } void firstmeal() { mx = random(62); my = random(39); if (mx < 2) mx=+2; if (mx == 62) mx--; if (my < 2) my=+2; if (my == 39) my--; setcolor(13); circle(mx*10,my*10,4); setfillstyle(1,13); floodfill(mx*10,my*10, 13); } int main() { graphic(); segments[0].x = 31; segments[0].y = 20; segments[0].dir = 0; rectangle (13, 13, 627, 397); getch(); randomize(); firstmeal(); while (key != 27) { if (kbhit()) key = getch(); movebody(); definedir(); movehead(); wallcrash(); selfcrash(); checkmeal(); delay(150); } getch(); closegraph(); }