1、#define J_RIGHT 0xE04D#define J_UP 0xE048#define J_DOWN 0xE050#define J_PGUP 0xE049#define J_DELETE 0xE053#define J_END 0xE04F#define J_PGDW 0xE051#define S_TIME 230#define CALTIME(x) (S_TIME-(x)*22)/*-*/* LOCAL FUNCTION DECLARE */void ShowBye (void);void ShowPause (void);void print_explian (void);v
2、oid gotoxy (int x, int y);void draw_map (Psnake *head);void draw_snake (Psnake *head);void EmptySnake (Psnake *head);void draw_food (Coordinate *food);void HasKey (Dir *direction, int * pause);void IniHead (Psnake * head, Psnake *tail);void IniCoord (Psnake * head, int x, int y);void IniSnake (Psnak
3、e * head, Psnake *tail, int n);void DelTail (Psnake *head, Psnake * tail, int x, int y);int Menu();int SetDifficulty(int *diff);int jkGetKey(void);int setCursorVisible(int b);int IniFood (Psnake *head, Coordinate *food);int InSnake (Psnake *head, int x, int y);int MoveSnake (Psnake *head, Psnake *ta
4、il, Dir * direction, Coordinate *food, int *leng);int IsOver (Psnake *head, int x, int y);int HitSelf (Psnake *head, int x, int y);int ShowOver (int *score);函数接口实现#include stdlib.hwindows.hconio.hassert.htime.h#include snake.h/直接移动光标到X,Y 坐标上。windows api实现void gotoxy(int x,int y) COORD pos; pos.X = x
5、; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);/获取按键信息int jkGetKey(void) int rk = 0; int k = getch(); if (k = J_FUNC_KEY) k = getch(); rk = 0xFF00 | k; return rk; if (k = J_CTRL_KEY) rk = 0xE000 | k; rk = 0x0000 | k;/绘制地图 void draw_map (Psnake *head) int i; system (cls);
6、for (i = min_x; i coord.x, pnode-coord.y);# pnode = pnode-next;/绘制食物void draw_food (Coordinate *food) gotoxy (food-x, food-y); printf (%c,3);int Menu()/这里是菜单选择的界面 int choose = 1, ischoose = 1; int diff = 1, i;/display menu interface system(/clear screen首先清屏 printf(*n Start game.n Choose Difficulty.n
7、 Quit.n n Warning:Please select English input method.nn do for(i=1;i1) choose -; break; case J_DOWN: if (choose 1) (*diff) -; if (*diff next = NULL; pnode-next = newsnake; pnode = newsnake; *tail = pnode;/初始化坐标地址void IniCoord (Psnake * head, int x, int y)coord.x = x-;coord.y = y;/初始化食物int IniFood (P
8、snake *head, Coordinate *food) srand (unsigned)time (NULL); food-x = rand () % (max_x -2) + 1;y = rand () % (max_y -2) + 1; while (InSnake (head, food-y); return TRUE;/判断食物是否生成在 蛇身体上int InSnake (Psnake *head, int x, int y) if (pnode-coord.x = x & pnode-coord.y = y) return TRUE; return FALSE;/移动蛇int
9、MoveSnake (Psnake *head, Psnake *tail, Dir * direction, Coordinate *food, int *leng) Snake * pnode = *head; int x = pnode-coord.x; int y = pnode-coord.y; int being_food = TRUE; switch (*direction) case U: y-; case D: y+; case L: x-; case R: x+; default: if (food-x = x & food-y = y) /判断是否是食物 newsnake
10、 = (Snake *) malloc (sizeof (Snake); assert (newsnake !next = *head;coord.x = x; *head = newsnake; being_food = FALSE; (*leng)+; if (IsOver(head, x, y)/判断是否死亡 return OVER; if (being_food) DelTail (head, tail, x, y); /未吃到食物时 return being_food;/跟新尾部坐标 擦除尾部,移到下一坐标 造成视觉移动void DelTail (Psnake *head, Psna
11、ke * tail, int x, int y) gotoxy (*tail)-coord.x, (*tail)- while (pnode-next != *tail) (*tail)- *head = *tail; *tail = pnode;/判断游戏结束int IsOver (Psnake *head, int x, int y) if (x = min_x | x = max_x | y = min_y | y = max_y | HitSelf (head, x, y) = 1) return TRUE;/判断是否吃到自己,返回 结果int HitSelf (Psnake *hea
12、d, int x, int y) Snake *pnode = (*head)-/打印说明void print_explian(void)/说明 gotoxy (61, 5);Level : gotoxy (61, 8);Score: gotoxy (61, 15);欢迎来到贪吃蛇游戏! gotoxy (61, 16);按空格键暂停! gotoxy (61, 17);祝你好运 !/释放内存void EmptySnake (Psnake *head) Snake *psave; while (*head) psave = (*head)- free (*head); *head = psave;
13、void ShowPause()/显示暂停的界面 char key; gotoxy(0, max_y / 2-6); * * * * * * * * * * * * * * * *n * * * * * * * * n * * * * * * * * * * * * * * * * * * *n * * * * * * * n * * * * * * * * * * * * * * *nnn Please press SPACE to continue. while(key = jkGetKey() /只当按下回车键时退出循环返回游戏 if(key = J_SPACE) break;/消除光标
14、, 直接COPY的int setCursorVisible(int b) HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO ccInfo; GetConsoleCursorInfo(hd, &ccInfo); ccInfo.bVisible = !b; return SetConsoleCursorInfo(hd, &/判断是否按键void HasKey (Dir *direction, int * pause) if (kbhit() switch (jkGetKey() case J_UP : if (*dir
15、ection != D) *direction = U; break;= U) *direction = D; case J_RIGHT: if (*direction != L) *direction = R; case J_LEFT := R) *direction = L; case J_SPACE: *pause = 1; ; /初始化head, tailvoid IniHead (Psnake * head, Psnake *tail) *head = (Snake *) malloc (sizeof (Snake); assert (*head ! (*head)- *tail = (Snake *) malloc (sizeof (Snake); assert (*tail !/显示结果int ShowOver (int *score) int key; gotoxy (16, max_y/2 -3);= gotoxy (16, max_y/2 -2); GAME OVER gotoxy (16, max_y/2 -1); gotoxy (16, max_y/2 +1); YOU GOT SCORE: %u, *score); Sleep (2000); gotoxy (16, max_y/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1