snake

[unmaintained] Terminal snake game
git clone git://mcdim.xyz/snake.git
Log | Files | Refs | README | LICENSE

snake.c (4420B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <time.h>
      4 #include <unistd.h>
      5 #include <X11/Xlib.h>
      6 #include "X11/keysym.h"
      7 
      8 
      9 #define X 20  /* vertical */
     10 #define Y 50 /* horizontal */
     11 
     12 #define VOID ' '
     13 #define CELL '#'
     14 #define APPL 'o'
     15 #define WALL '$'
     16 
     17 char a[X][Y];
     18 int score = 0;
     19 
     20 
     21 typedef struct position {
     22 	int x;
     23 	int y;
     24 } Position;
     25 
     26 
     27 typedef struct snake {
     28 	Position cells[100];
     29 	int direction[100];
     30 	int length;
     31 } Snake;
     32 
     33 
     34 void
     35 print_panel()
     36 {
     37 	printf("\033[0;0H");
     38 
     39 	int i;
     40 	for (i = 0; i < Y + 2; i++) {
     41 		printf("%c", WALL);
     42 	}
     43 	printf("\n");
     44 
     45 	int j;
     46 	for (i = 0; i < X; i++) {
     47 		printf("%c", WALL);
     48 		for (j = 0; j < Y; j++) {
     49 			printf("%c",a[i][j]);
     50 		}
     51 		printf("%c\n", WALL);
     52 	}
     53 
     54 	for (i = 0; i < Y + 2; i++) {
     55 		printf("%c", WALL);
     56 	}
     57 	printf("\n");
     58 }
     59 
     60 void
     61 fill_array(char panel[][Y])
     62 {
     63 	int i, j;
     64 	for (i = 0; i < X; i++) {
     65 		for (j = 0; j < Y; j++) {
     66 			panel[i][j] = VOID;
     67 		}
     68 	}
     69 }
     70 
     71 void
     72 update_snake(Snake snake)
     73 {
     74 	int i;
     75 	for (i = 0; i < snake.length; i++) {
     76 		a[snake.cells[i].x][snake.cells[i].y] = CELL;
     77 	}
     78 
     79 	int x = snake.cells[snake.length-1].x;
     80 	int y = snake.cells[snake.length-1].y;
     81 
     82 	if (snake.direction[0] == 1)
     83 		y = snake.cells[snake.length - 1].y - snake.length -1;
     84 	else if (snake.direction[0] == 2)
     85 		y = snake.cells[snake.length - 1].y + snake.length +1;
     86 	else if (snake.direction[0] == 3)
     87 		x = snake.cells[snake.length - 1].x - snake.length -1;
     88 	else if (snake.direction[0] == 4)
     89 		x = snake.cells[snake.length - 1].x + snake.length +1;
     90 
     91 	/*if (snake.direction[snake.length-1] == 1)
     92 		y = snake.cells[snake.length-1].y -1;
     93 	else if (snake.direction[snake.length-1] == 2)
     94 		y = snake.cells[snake.length-1].y  +1;
     95 	else if (snake.direction[snake.length-1] == 3)
     96 		x = snake.cells[snake.length-1].x - 1;
     97 	else if (snake.direction[snake.length-1]  == 4)
     98 		x = snake.cells[snake.length - 1].x +1;*/
     99 
    100 	a[x][y] = VOID;
    101 }
    102 
    103 Position
    104 get_apple()
    105 {
    106 	Position apple;
    107 
    108 	do {
    109 		srand(time(0));
    110 		apple.x = rand() % (X - 0 + 1);
    111 
    112 		srand(time(0));
    113 		apple.y = rand() % (Y - 0 + 1);
    114 
    115 	} while (a[apple.x][apple.y] == CELL);
    116 
    117 	a[apple.x][apple.y] = APPL;
    118 
    119 	return apple;
    120 }
    121 
    122 
    123 int
    124 key_is_pressed(KeySym ks)
    125 {
    126 	Display *dpy = XOpenDisplay(":0");
    127 	char keys_return[32];
    128 	XQueryKeymap(dpy, keys_return);
    129 	KeyCode kc2 = XKeysymToKeycode(dpy, ks);
    130 	int isPressed = !!(keys_return[kc2 >> 3] & (1 << (kc2 & 7)));
    131 	XCloseDisplay(dpy);
    132 	return isPressed;
    133 }
    134 
    135 Snake
    136 get_keys(Snake snake)
    137 {
    138 	for (int i = 0; i < snake.length; i++)
    139 		snake.direction[i+1] = snake.direction[i];
    140 
    141 
    142 	if (key_is_pressed(XK_Up) || key_is_pressed(XK_W)) {
    143 		snake.direction[0] = 4;
    144 	}
    145 
    146 	if (key_is_pressed(XK_Down) || key_is_pressed(XK_S)) {
    147 		snake.direction[0] = 3;
    148 	}
    149 
    150 	if (key_is_pressed(XK_Left) || key_is_pressed(XK_A)) {
    151 		snake.direction[0] = 2;
    152 	}
    153 
    154 	if (key_is_pressed(XK_Right) || key_is_pressed(XK_D)) {
    155 		snake.direction[0] = 1;
    156 	}
    157 	return snake;
    158 }
    159 
    160 Snake
    161 generation(Snake snake)
    162 {
    163 	for (int i = 0; i <= snake.length; i++) {
    164 		snake.cells[i+1].y = snake.cells[i].y;
    165 		snake.cells[i+1].x = snake.cells[i].x;
    166 	}
    167 
    168 	if (snake.direction[0] == 1) {
    169 		snake.cells[0].y++;
    170 	} else if (snake.direction[0] == 2) {
    171 		snake.cells[0].y--;
    172 	} else if (snake.direction[0] == 3) {
    173 		snake.cells[0].x++;
    174 	} else if (snake.direction[0] == 4) {
    175 		snake.cells[0].x--;
    176 	}
    177 
    178 	return snake;
    179 }
    180 
    181 int
    182 main()
    183 {
    184 	fill_array(a);
    185 
    186 	Snake snake;
    187 
    188 	snake.length = 1;
    189 	snake.cells[0].y = Y / 2;
    190 	snake.cells[0].x = X / 2;
    191 
    192 	snake.direction[0] = 2;
    193 	Position apple = get_apple();
    194 	print_panel();
    195 
    196 	do {
    197 		if (snake.cells[0].x == apple.x &&
    198 	    	    snake.cells[0].y == apple.y) {
    199 			apple = get_apple();
    200 			score += 10;
    201 
    202 			int x = snake.cells[snake.length-1].x;
    203 			int y = snake.cells[snake.length-1].y;
    204 
    205 			if (snake.direction[snake.length - 1] == 1)
    206 				y = snake.cells[snake.length - 1].y + 1;
    207 			else if (snake.direction[snake.length - 1] == 2)
    208 				y = snake.cells[snake.length - 1].y - 1;
    209 			else if (snake.direction[snake.length - 1] == 3)
    210 				x = snake.cells[snake.length - 1].x + 1;
    211 			else if (snake.direction[snake.length - 1] == 4)
    212 				x = snake.cells[snake.length - 1].x - 1;
    213 
    214 			snake.length++;
    215 			snake.cells[snake.length-1].x = x;
    216 			snake.cells[snake.length-1].y = y;
    217 		}
    218 
    219 		update_snake(snake);
    220 		print_panel();
    221 		printf("x=%d, y=%d\n", snake.cells[0].x, snake.cells[0].y);
    222 		printf("score: %d\nlength: %d\n", score, snake.length);
    223 
    224 		snake = get_keys(snake);
    225 		snake = generation(snake);
    226 
    227 		usleep(60000);
    228 
    229 	} while (1);
    230 
    231 	return 0;
    232 }