C语言贪吃蛇按键延迟问题

Kaciry 2017-06-29 10:39:19
void runGame()   // 游戏运行函数
{
HideCursor(0);
state = R;//初始移动方向向右;
grades = 0;
while (1)
{
gotoxy(64, 5);
printf("Grades:%d ", grades);
gotoxy(64, 6);
printf("Each food score:%d", score);
gotoxy(64, 14);
printf("ESC\tFor Exit Game");
gotoxy(64, 15);
printf("SPACE\tFor Pause Game");
gotoxy(64, 18);
printf("↑\tFor UP");
gotoxy(64, 20);
printf("↓\tFor DOWN");
gotoxy(64, 22);
printf("←\tFor LEFT");
gotoxy(64, 24);
printf("→\tFor RIGHT");
if (GetAsyncKeyState(VK_UP) && state != D)
{
state = U;
}
else if (GetAsyncKeyState(VK_DOWN) && state != U)
{
state = D;
}
else if (GetAsyncKeyState(VK_LEFT) && state != R)
{
state = L;
}
else if (GetAsyncKeyState(VK_RIGHT) && state != L)
{
state = R;
}
else if (GetAsyncKeyState(VK_SPACE))
{
pauseGame();
}
else if (GetAsyncKeyState(VK_ESCAPE))
{
Sleep(300);
gotoxy(25, 12);
printf("The windows wille be exit after 3 seconds !\n");
Sleep(3000);
exit(0);
break;
}
Sleep(gameSpeed);
moveSnake();
}

}

/*************************************************
Function: moveSnake
Description: 游戏运行核心代码,控制贪吃蛇运动
Calls: void *malloc(unsigned int num_bytes)、void bitSnake()、void hitWall()、int printf(const char *format,...)、vid creatFoods()、 void free(void *ptr)
void gotoxy()
Called By: void runGame()
*************************************************/
void moveSnake()
{
SNAKE *tempNode;
SNAKE* p;
tempNode = (SNAKE*)malloc(sizeof(SNAKE));
bitSnake();
hitWall();
if (state == U)
{
tempNode->y = head->y - 1;
tempNode->x = head->x;
if (tempNode->x == food->x && tempNode->y == food->y)
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
grades = grades + 5;
createFoods();
}
else
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p->next->next != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
gotoxy(p->next->x, p->next->y);
printf(" ");
free(p->next);
p->next = NULL;
}
}
if (state == D)
{
tempNode->y = head->y + 1;
tempNode->x = head->x;
if (tempNode->x == food->x && tempNode->y == food->y)
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
grades = grades + 5;
createFoods();
}
else
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p->next->next != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
gotoxy(p->next->x, p->next->y);
printf(" ");
free(p->next);
p->next = NULL;
}
}
if (state == R)
{
tempNode->y = head->y;
tempNode->x = head->x + 1;
if (tempNode->x == food->x && tempNode->y == food->y)
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
grades = grades + 5;
createFoods();
}
else
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p->next->next != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
gotoxy(p->next->x, p->next->y);
printf(" ");
free(p->next);
p->next = NULL;
}
}
if (state == L)
{
tempNode->y = head->y;
tempNode->x = head->x - 1;
if (tempNode->x == food->x && tempNode->y == food->y)
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
grades = grades + 5;
createFoods();
}
else
{
tempNode->next = head;
head = tempNode;
p = head;
gotoxy(p->x, p->y);
printf("@");
p = p->next;
while (p->next->next != NULL)
{
gotoxy(p->x, p->y);
printf("O");
p = p->next;
}
gotoxy(p->next->x, p->next->y);
printf(" ");
free(p->next);
p->next = NULL;
}
}

}
...全文
840 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2017-07-01
  • 打赏
  • 举报
回复
引用 4 楼 u010165006 的回复:
我也写过一个贪吃蛇,按键延迟的话要调整代码,因为代码中有检测按键,有Sleep,代码执行也需要时间,我当时的想法好像是在Sleep阶段按下的按键,循环中的代码一运行到检测按键,按键已经存在了,立马检测到,贪吃蛇立即有动作,感觉反应就快了。
按键已经存在键盘缓冲区了
ooolinux 2017-07-01
  • 打赏
  • 举报
回复
我也写过一个贪吃蛇,按键延迟的话要调整代码,因为代码中有检测按键,有Sleep,代码执行也需要时间,我当时的想法好像是在Sleep阶段按下的按键,循环中的代码一运行到检测按键,按键已经存在了,立马检测到,贪吃蛇立即有动作,感觉反应就快了。
赵4老师 2017-06-29
  • 打赏
  • 举报
回复
仅供参考:
#include <conio.h>
#include <windows.h>

void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}

void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}
void GetWH(int *w,int *h) {
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {
        *w=csbi.srWindow.Right;
        *h=csbi.srWindow.Bottom;
    } else {
        *w=80;
        *h=25;
    }
}
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

int main() {
    unsigned short k;
    int x,y,w,h;
    char d;

    SetConsoleOutputCP(437);
    ClearConsole();
    GetWH(&w,&h);
    x=w/2;y=h/2;
    HideTheCursor();
    ConPrintAt(x,y,"O",1);
    d='o';
    while (1) {
        Sleep(50);
        if (kbhit()) {
            k=getch();
            if (27==k) break;//按Esc键退出
            if (0==k||0xe0==k) k|=getch()<<8;//非字符键
            switch (k) {
                case 0x48e0:case 0x04800://上
                    d='u';
                    if (y>0) {
                        ConPrintAt(x,y," ",1);
                        y--;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 0x50e0:case 0x05000://下
                    d='d';
                    if (y<h) {
                        ConPrintAt(x,y," ",1);
                        y++;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 0x4be0:case 0x04b00://左
                    d='l';
                    if (x>0) {
                        ConPrintAt(x,y," ",1);
                        x--;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 0x4de0:case 0x04d00://右
                    d='r';
                    if (x<w-1) {
                        ConPrintAt(x,y," ",1);
                        x++;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
            }
//          cprintf("%04x pressed.\r\n",k);
        } else {
            switch (d) {
                case 'u':
                    if (y>0) {
                        ConPrintAt(x,y," ",1);
                        y--;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 'd':
                    if (y<h) {
                        ConPrintAt(x,y," ",1);
                        y++;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 'l':
                    if (x>0) {
                        ConPrintAt(x,y," ",1);
                        x--;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
                case 'r':
                    if (x<w-1) {
                        ConPrintAt(x,y," ",1);
                        x++;
                        ConPrintAt(x,y,"O",1);
                    }
                break;
            }
        }
    }
    ClearConsole();
    ShowTheCursor();
    return 0;
}
Kaciry 2017-06-29
  • 打赏
  • 举报
回复
state是全局变量
Kaciry 2017-06-29
  • 打赏
  • 举报
回复
为什么这样写控制蛇移动时按下方向键会感觉不灵敏?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧