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 }