C語言編寫貪吃蛇
阿新 • • 發佈:2018-12-10
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <signal.h> #include <termios.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <pthread.h> #define KEYCODE_U 0x41 // 向上按鍵 #define KEYCODE_D 0x42 // 向下按鍵 #define KEYCODE_L 0x44 // 向左按鍵 #define KEYCODE_R 0x43 // 向右按鍵 int kfd = 0; struct termios cooked, raw; char dir = KEYCODE_U; // 當前蛇的移動方向 // 獲取鍵盤響應:上、下、左、右鍵 void* get_dir(void *a) { while(1) { char c; tcgetattr(kfd, &cooked); // 得到 termios 結構體儲存,然後重新配置終端 memcpy(&raw, &cooked, sizeof(struct termios)); raw.c_lflag &=~ (ICANON | ECHO); raw.c_cc[VEOL] = 1; raw.c_cc[VEOF] = 2; tcsetattr(kfd, TCSANOW, &raw); if(read(kfd, &c, 1) < 0) { perror("read():"); exit(-1); } tcsetattr(kfd, TCSANOW, &cooked);//在程式結束時在恢復原來的配置 dir = c; } } unsigned char map[17][17] = {0}; // 遊戲地圖 int snake[50] = {133}; // 初始化蛇座標,遊戲開始的時候蛇在(8,5)這個位置 int food = 67; // 食物的座標,遊戲開始的時候在(4,3)這個位置 int len = 1; // 儲存蛇的當前長度 // 將 數字 轉化為座標系 void num_to_xy(int num, int *x, int *y) { //char *p1=x; //char *p2=y; *x = num / 17 ; *y = num % 17 ; } // 更新地圖資料 void update_map() { int i=0,j; int xfood,yfood; num_to_xy(food, &xfood ,&yfood); int xsnake,ysnake; int k; for(i = 0; i < 17; i++ ) { for(j = 1; j < 17; j++ ) { if(i == 0 || i == 16 || j == 0 || j == 16) map[i][j] = '#' ; else if(i == xfood && j == yfood) { map[i][j] = '!' } else map[i][j] = ' '; } } for(k = 0; k < len ; k++) num_to_xy(snake[k], &xsnake,&ysnake); for(i = 0; i < 17; i++ ) { for(j = 1; j < 17; j++ ) { if(i == x && j == y) map[i][j] = '*'; } ) } // 列印地圖 void print_map() { //usleep(len / 3 + 1);//睡眠時間 //system("clear"); int i=0,j; for(i = 0; i < 17; i++ ) { for(j = 1; j < 17; j++ ) { if(i == 0 || i == 16 || j == 0 || j == 16) map[i][j] = '#' ; } } //地圖邊框 } // 生成食物 void generate_food(char* food) { int x,y; int k; srand(time(NULL)); food = rand()%289; num_to_xy(food ,&x , &y); while(i == 0 || i == 16 || j == 0 || j == 16) { food = rand()%289; num_to_xy(food ,&x , &y); } for(k = 0; k < len ; k++) { num_to_xy(snake[0], &xsnake,&ysnake); if(snake[0] == food) { food = rand()%289; k = 0; num_to_xy(food,&x,&y) } } } // 移動蛇 void move_snake() { int x,y; // 座標 num_to_xy(snake[0], &x, &y); // 獲取蛇頭的座標 int i, end; // 判斷移動方向 switch (dir) { case KEYCODE_U: // 向上移動 x--; break; case KEYCODE_D: // 向下移動 x++; break; case KEYCODE_L: // 向左移動 y--; break; case KEYCODE_R: // 向右移動 y++; break; } end = snake[len - 1]; for(i = len - 1; i > 0; i --) { snake[i] = snake[i-1]; } snake[0] = x*17+y; if(snake[0] == food) { len ++; snake[len - 1]=len; } } // 判斷蛇是否應該存活,如果返回值是1代表應該存活,0代表不應該存活 int isalive() { int temp = 1; int x,y; int i; num_to_xy(snake[0], &x, &y); if(i == 0 || i == 16 || j == 0 || j == 16) temp = 0; //查重 for(i = 1; i < len ; i++) { if(snake[0]==snake[i]) temp = 0 ; } } int main() { // 開啟一個執行緒用於獲取鍵盤的上下左右鍵響應 pthread_t tid1; pthread_create(&tid1, NULL, get_dir, NULL); while(1) { // 更新地圖資料 update_map(); // 列印地圖 system("clear"); print_map(); usleep(500000(len / 3 + 1));//睡眠時間 // 移動蛇 move_snake(); // if (isalive() == 1) // { // break; // } // } tcsetattr(kfd, TCSANOW, &cooked);//在程式結束時在恢復原來的配置 printf ("Game Over!\n"); return 0; }