void DispatchMessage() { InitSnake(); InitWall(); while (1) { CreateFood(); CreateAward(); DrawString(10, 0, " Score:%04d ", score); AppendSnakeNodeList(Head, Orientation); CheckAward(); if (CheckSnake() || CheckWall()) { DrawString(2, 2, "你死啦! 按任意键重新开始玩!"); getch(); break; } DrawString(Head->Location.x, Head->Location.y, "◎"); if (!CheckFood()) { DrawString(Tail->Location.x, Tail->Location.y, " "); DeleteSnakeNodeList(Tail); } int keep = 0; if (kbhit()) { switch (getch()) { case 0x1b://按下ESC,暂停游戏 getch(); continue; case 0xE0://按下特殊键 switch (getch()) { case 75: if(Orientation==0) keep = 1;if (Orientation%2!=0) Orientation=0; break; case 72: if(Orientation==1) keep = 1;if (Orientation%2==0) Orientation=1; break; case 77: if(Orientation==2) keep = 1;if (Orientation%2!=0) Orientation=2; break; case 80: if(Orientation==3) keep = 1;if (Orientation%2==0) Orientation=3; break; default: ; } break; } } if(!keep&&(100-score*2)>10)Sleep(100-score*2);//难度提升 else Sleep(10); } }
int main() { int parent_x, parent_y; START: head = (psnakeHead)malloc(sizeof(snakeHead)); head -> length = 0; head -> row = 14; head -> col = 14; head -> pbody = NULL; head -> headdirection = RIGHT; InitSnake(head); initscr(); raw(); /* close row buffer */ cbreak(); /* put termial to CBREAK mode */ noecho(); curs_set(FALSE); /* set cursor invisible */ keypad(stdscr,TRUE); /* recognise user's function key,F1,F2,... display some message about title and wall */ signal(SIGALRM, StartAlarm); getmaxyx(stdscr, parent_y, parent_x); WINDOW *welwin = newwin(29, parent_x, 0, 0); WINDOW *lelwin = newwin(7, parent_x, 30, 0); if (!welwin || !lelwin) { Die("Unable to allocate window memory\n"); } Welcome(welwin, 29, parent_x); int speed = Choice(lelwin); Set_ticker(speed); DrawWalls(); StartAlarm(); foodpos = DisplayFood(head); while(!isfailed && chinput !='q') { chinput = getch(); ControlSnake(chinput, head); } if(isfailed) { ClearScr(LEFT_EDGE+1, RIGHT_EDGE-1, TOP_ROW+1, BUT_ROW-1); //mark free(head -> pbody); free(head); head = NULL; } if(isrestart) { isfailed = 0; isrestart = 0; // clear the flag goto START; // go to the START statement } endwin(); return 0; }