c++贪吃蛇二维数组

写的贪吃蛇代码无法控制贪吃蛇上下左右移动,求更正方式

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#define High 20
#define Width 30

//值0:空格;值1:蛇头;值大于1:蛇身;值-1:边框;值-2:食物
//全局变量
char moveDirection;
int food_x, food_y;
int canvas[High][Width] = { 0 };
int isFailure = 0;


void gotoxy(int x, int y) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
void HideCursor(void)
{
    CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void moveSnake() {
    int i, j;
    int max = 0;
    int oldTail_i, oldTail_j, oldHead_i, oldHead_j;
    int newHead_i, newHead_j;
    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
                canvas[i][j]++;

    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
            {
                if (max < canvas[i][j])
                {
                    max = canvas[i][j];
                    oldTail_i = i;
                    oldTail_j = j;
                }
                if (canvas[i][j] == 2)
                {
                    oldHead_i = i;
                    oldHead_j = j;
                }
            }
    canvas[oldTail_i][oldTail_j] = 0;

    if (moveDirection == 'A') {
        newHead_j = oldHead_j - 1;
        newHead_i = oldHead_i;
    }
    else if (moveDirection == 'B') {
        newHead_j = oldHead_j + 1;
        newHead_i = oldHead_i;
    }
    else if (moveDirection == 'C') {
        newHead_i = oldHead_i - 1;
        newHead_j = oldHead_j;
    }
    else if (moveDirection == 'D') {
        newHead_i = oldHead_i + 1;
        newHead_j = oldHead_j;
    }
    if (canvas[newHead_i][newHead_j] == -2)
    {
        canvas[food_x][food_y] = 0;
        food_x = rand() % (High - 5) + 2;
        food_y = rand() % (Width - 5) + 2;
        canvas[food_x][food_y] = -2;
    }
    else
        canvas[oldTail_i][oldTail_j] = 0;

    if (canvas[newHead_i][newHead_j] > 0 || canvas[newHead_i][newHead_j] == -1)
    {
        printf("游戏失败\n");
        system("pause");
        exit(0);
        
    }
    else
        canvas[newHead_i][newHead_j] = 1;
    Sleep(200);

}
void start() {
    int i=0, j=0;
    for (i = 0; i < High; i++) {
        canvas[i][0] = -1;
        canvas[i][Width-1] = -1;
    }
    for (j = 0; j < Width; j++) {
        canvas[0][j] = -1;
        canvas[High - 1][j] = -1;
    }
    canvas[High / 2][Width / 2+i] = 1;//蛇头
    for (int i = 1; i <= 4; i++) {
        canvas[High / 2][Width / 2] = i + 1;
    }//蛇身
    moveDirection = 'D';
    food_x = rand() % (High - 5) + 2;
    food_y = rand() % (Width - 5) + 2;
    canvas[food_x][food_y] = -2;
}
void show() {
    gotoxy(0, 0);
    int i, j;
    for (i = 0; i < High; i++) {
        for (j = 0; j < Width; j++) {
            if (canvas[i][j] ==0)
                printf( " ");
            else if (canvas[i][j] == 1)
                printf ("@");
            else if (canvas[i][j] > 1)
                printf("*");
            else if (canvas[i][j] == -1)
                printf("#");
            else if (canvas[i][j] == -2)
                printf( "F");
        }
        printf("\n");
    }
}

void updateWithoutInput() {
    moveSnake();
}

void updateWithInput() {
    if (_kbhit())
        {
            char input = _getch();
            if (input == 'A' || input == 'S' || input == 'D' || input == 'W')
            {
                moveDirection = input;
                moveSnake();
            }
        }
    }

int main() {
    start();
    while (1) {
        show();
        HideCursor();
        updateWithInput();
        updateWithoutInput();
    }
    return 0;
}

对键盘捕捉的设置不对,代码已做了修改可以移动,请参考:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#define High 20
#define Width 30

//值0:空格;值1:蛇头;值大于1:蛇身;值-1:边框;值-2:食物
//全局变量
char moveDirection;
int food_x, food_y;
int canvas[High][Width] = { 0 };
int isFailure = 0;


void gotoxy(int x, int y) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
void HideCursor(void)
{
    CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void moveSnake() {
    int i, j;
    int max = 0;
    int oldTail_i, oldTail_j, oldHead_i, oldHead_j;
    int newHead_i, newHead_j;
    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
                canvas[i][j]++;

    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
            {
                if (max < canvas[i][j])
                {
                    max = canvas[i][j];
                    oldTail_i = i;
                    oldTail_j = j;
                }
                if (canvas[i][j] == 2)
                {
                    oldHead_i = i;
                    oldHead_j = j;
                }
            }
    canvas[oldTail_i][oldTail_j] = 0;

    if (moveDirection == 'a') {
        newHead_j = oldHead_j - 1;
        newHead_i = oldHead_i;
    }
    else if (moveDirection == 'd') {
        newHead_j = oldHead_j + 1;
        newHead_i = oldHead_i;
    }
    else if (moveDirection == 'w') {
        newHead_i = oldHead_i - 1;
        newHead_j = oldHead_j;
    }
    else if (moveDirection == 's') {
        newHead_i = oldHead_i + 1;
        newHead_j = oldHead_j;
    }
    if (canvas[newHead_i][newHead_j] == -2)
    {
        canvas[food_x][food_y] = 0;
        food_x = rand() % (High - 5) + 2;
        food_y = rand() % (Width - 5) + 2;
        canvas[food_x][food_y] = -2;
    }
    else
        canvas[oldTail_i][oldTail_j] = 0;

    if (canvas[newHead_i][newHead_j] > 0 || canvas[newHead_i][newHead_j] == -1)
    {
        printf("游戏失败\n");
        system("pause");
        exit(0);

    }
    else
        canvas[newHead_i][newHead_j] = 1;
    Sleep(200);

}
void start() {
    int i = 0, j = 0;
    for (i = 0; i < High; i++) {
        canvas[i][0] = -1;
        canvas[i][Width - 1] = -1;
    }
    for (j = 0; j < Width; j++) {
        canvas[0][j] = -1;
        canvas[High - 1][j] = -1;
    }
    canvas[High / 2][Width / 2 + i] = 1;//蛇头
    for (int i = 1; i <= 4; i++) {
        canvas[High / 2][Width / 2] = i + 1;
    }//蛇身
    moveDirection = 'd';
    food_x = rand() % (High - 5) + 2;
    food_y = rand() % (Width - 5) + 2;
    canvas[food_x][food_y] = -2;
}
void show() {
    gotoxy(0, 0);
    int i, j;
    for (i = 0; i < High; i++) {
        for (j = 0; j < Width; j++) {
            if (canvas[i][j] == 0)
                printf(" ");
            else if (canvas[i][j] == 1)
                printf("@");
            else if (canvas[i][j] > 1)
                printf("*");
            else if (canvas[i][j] == -1)
                printf("#");
            else if (canvas[i][j] == -2)
                printf("F");
        }
        printf("\n");
    }
}

void updateWithoutInput() {
    moveSnake();
}

void updateWithInput() {
    if (_kbhit())
    {
        char input = _getch();
        if (input == 'a' || input == 's' || input == 'd' || input == 'w')
        {
            moveDirection = input;
            moveSnake();
        }
    }
}

int main() {
    start();
    while (1) {
        show();
        HideCursor();
        updateWithInput();
        updateWithoutInput();
    }
    return 0;
}



我有写过这个题目的文章,您可以去看看,如果您很想要您这个程序请看我修改后的


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#define High 20
#define Width 30

//值0:空格;值1:蛇头;值大于1:蛇身;值-1:边框;值-2:食物
//全局变量
char moveDirection;
int food_x, food_y;
int canvas[High][Width] = { 0 };
int isFailure = 0;
int snakeHeadRow, snakeHeadCol;

void gotoxy(int x, int y) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
void HideCursor(void)
{
    CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void moveSnake() {
    int i, j;
    int max = 0;
    int oldTail_i, oldTail_j, oldHead_i, oldHead_j;
    int newHead_i, newHead_j;
    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
                canvas[i][j]++;

    for (i = 1; i < High - 1; i++)
        for (j = 1; j < Width - 1; j++)
            if (canvas[i][j] > 0)
            {
                if (max < canvas[i][j])
                {
                    max = canvas[i][j];
                    oldTail_i = i;
                    oldTail_j = j;
                }
                if (canvas[i][j] == 2)
                {
                    oldHead_i = i;
                    oldHead_j = j;
                }
            }
    canvas[oldTail_i][oldTail_j] = 0;

    if (moveDirection == 'A') {
        newHead_j = snakeHeadCol - 1;
        newHead_i = snakeHeadRow;
    }
    else if (moveDirection == 'D') {
        newHead_j = snakeHeadCol + 1;
        newHead_i = snakeHeadRow;
    }
    else if (moveDirection == 'W') {
        newHead_i = snakeHeadRow - 1;
        newHead_j = snakeHeadCol;
    }
    else if (moveDirection == 'S') {
        newHead_i = snakeHeadRow + 1;
        newHead_j = snakeHeadCol;
    }
    if (canvas[newHead_i][newHead_j] == -2)
    {
        canvas[food_x][food_y] = 0;
        food_x = rand() % (High - 5) + 2;
        food_y = rand() % (Width - 5) + 2;
        canvas[food_x][food_y] = -2;
    }
    else
        canvas[oldTail_i][oldTail_j] = 0;

    if (canvas[newHead_i][newHead_j] > 0 || canvas[newHead_i][newHead_j] == -1)
    {
        printf("游戏失败\n");
        system("pause");
        exit(0);

    }
    else
        canvas[newHead_i][newHead_j] = 1;

    snakeHeadRow = newHead_i;
    snakeHeadCol = newHead_j;

    Sleep(200);

}
void start() {
    int i=0, j=0;
    for (i = 0; i < High; i++) {
        canvas[i][0] = -1;
        canvas[i][Width-1] = -1;
    }
    for (j = 0; j < Width; j++) {
        canvas[0][j] = -1;
        canvas[High - 1][j] = -1;
    }
    snakeHeadCol = Width / 2 + 4;
    snakeHeadRow = High / 2;
    canvas[snakeHeadRow][snakeHeadCol] = 1;//蛇头
    for (int i = 1; i <= 4; i++) {
        canvas[snakeHeadRow][snakeHeadCol-i] = i + 1;
    }//蛇身
    moveDirection = 'S';
    food_x = rand() % (High - 5) + 2;
    food_y = rand() % (Width - 5) + 2;
    canvas[food_x][food_y] = -2;
}
void show() {
    gotoxy(0, 0);
    int i, j;
    for (i = 0; i < High; i++) {
        for (j = 0; j < Width; j++) {
            if (canvas[i][j] ==0)
                printf( " ");
            else if (canvas[i][j] == 1)
                printf ("@");
            else if (canvas[i][j] > 1)
                printf("*");
            else if (canvas[i][j] == -1)
                printf("#");
            else if (canvas[i][j] == -2)
                printf( "F");
        }
        printf("\n");
    }
}

void updateWithoutInput() {
    moveSnake();
}

void updateWithInput() {
    int state_left = GetAsyncKeyState('A');
    int state_right = GetAsyncKeyState('D');
    int state_up = GetAsyncKeyState('W');
    int state_down = GetAsyncKeyState('S');

    if (state_left & 0x8000) {
        moveDirection = 'A';
    }
    else if (state_right & 0x8000) {
        moveDirection = 'D';
    }
    else if (state_up & 0x8000) {
        moveDirection = 'W';
    }
    else if (state_down & 0x8000) {
        moveDirection = 'S';
    }

    moveSnake();
}

int main() {
    start();
    while (1) {
        show();
        HideCursor();
        updateWithInput();
        updateWithoutInput();
    }
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在该代码中,需要更新函数 updateWithInput(),控制蛇的上下左右移动。

可以将当前的代码:

if (_kbhit())
{
    char input = _getch();
    if (input == 'A' || input == 'S' || input == 'D' || input == 'W')
    {
        moveDirection = input;
        moveSnake();
    }
}

更改为:

if (_kbhit())
{
    char input = _getch();
    if (input == 'A' && moveDirection != 'D')
        moveDirection = 'A';
    else if (input == 'S' && moveDirection != 'C')
        moveDirection = 'D';
    else if (input == 'D' && moveDirection != 'A')
        moveDirection = 'B';
    else if (input == 'W' && moveDirection != 'D')
        moveDirection = 'C';
}
moveSnake();

该更改将检查用户按下的键是否为四个箭头键之一,并确定是否移到相反的方向。如果不是,则改变当前移动的方向。可以在最后调用 moveSnake() 函数以移动贪吃蛇。

重新编译代码并运行以测试更改后的效果。希望这可以帮助解决您的问题。

你的代码中贪吃蛇的移动是通过键盘输入来控制的,但是没有把获取键盘输入的函数 _getch() 和 _kbhit() 放在两个不同的循环中,所以无法同时实现贪吃蛇的移动和键盘输入。解决方法是将获取键盘输入的代码放在一个循环中,而贪吃蛇的移动代码放在另一个循环中。

具体的更正方式如下:

int main() {
    start();
    while (1) {
        show();
        HideCursor();
        updateWithInput(); // 键盘输入循环
    }
    return 0;
}

void updateWithInput() {
    if (_kbhit())
        {
            char input = _getch();
            if (input == 'A' || input == 'S' || input == 'D' || input == 'W')
            {
                moveDirection = input;
            }
        }
    updateWithoutInput(); // 贪吃蛇移动循环
}

以上修改后,在程序运行时,当有键盘输入时,会更新移动方向,同时在每次循环中都会执行一遍贪吃蛇的移动操作。这样,就可以实现贪吃蛇的上下左右移动了。

moveDirection 变量来控制移动,但是你并没有检测啊!!!需要在updateWithoutInput() 函数中检测一下。盲猜一下,蛇是不是只在开始时向右移动了一次???
借鉴文心一言:
updateWithoutInput() 函数中检查 moveDirection 变量是否发生了变化。如果发生了变化,就调用 moveSnake() 函数来更新蛇的位置。你可以修改 updateWithoutInput() 函数如下:




void updateWithoutInput() {

    if (_kbhit()) {

        char input = _getch();
        if (input == 'A' || input == 'S' || input == 'D' || input == 'W') {

            moveDirection = input;

        } else if (moveDirection != 'D') { // 如果输入的不是 D,那么将 moveDirection 重置为初始值

            moveDirection = 'D';

        }

    } else { // 如果没有输入,那么将 moveDirection 重置为初始值

        moveDirection = 'D';

    }

    if (moveDirection == 'A') { // 如果 moveDirection 是 A,那么将 newHead_j 设置为 oldHead_j - 1

        newHead_j = oldHead_j - 1;

        newHead_i = oldHead_i;

    } else if (moveDirection == 'B') { // 如果 moveDirection 是 B,那么将 newHead_j 设置为 oldHead_j + 1

        newHead_j = oldHead_j + 1;

        newHead_i = oldHead_i;

    } else if (moveDirection == 'C') { // 如果 moveDirection 是 C,那么将 newHead_i 设置为 oldHead_i - 1

        newHead_i = oldHead_i - 1;

        newHead_j = oldHead_j;

    } else if (moveDirection == 'D') { // 如果 moveDirection 是 D,那么将 newHead_i 设置为 oldHead_i + 1

        newHead_i = oldHead_i + 1;

        newHead_j = oldHead_j;

    }

    if (canvas[newHead_i][newHead_j] == -2) { // 如果新的蛇头位置是食物,那么重新生成食物并更新 canvas

        food_x = rand() % (High - 5) + 2;

        food_y = rand() % (Width - 5) + 2;

        canvas[food_x][food_y] = -2;
    } else if (canvas[newHead_i][newHead_j] > 0 || canvas[newHead_i][newHead_j] == -1) { // 如果新的蛇头位置不是食物或者已经死亡,那么游戏失败并退出

        printf("游戏失败\n");

        system("pause");

        exit(0);

    } else if (canvas[newHead_i][newHead_j] != canvas[oldTail_i][oldTail_j]) { // 如果新的蛇头位置和旧的蛇尾位置不同,那么更新 canvas 并移动蛇尾到新的位置

        canvas[oldTail_i][oldTail_j] = 0;

        if (moveDirection == 'A') { // 如果 moveDirection 是 A,那么将 oldTail_j 减一,然后将 oldTail 作为新的蛇尾位置

            oldTail_i = oldTail_j;

            oldTail_j--;

            canvas[oldTail_i][oldTail_j] = canvas[newHead_i][newHead_j];

        } else if (moveDirection == 'B') { // 如果 moveDirection 是 B,那么将 oldTail_j 加上一,然后将 oldTail 作为新的蛇尾位置

            oldTail_i = oldTail_j;

            oldTail_j++;

            canvas[oldTail_i][oldTail_j] = canvas[newHead_i][newHead_j];

        } else if (moveDirection == 'C') { // 如果 moveDirection 是 C,那么将 oldTail_i 加上一,然后将 oldTail 作为新的蛇尾位置

            oldTail_i++;

            oldTail_j = oldTail_i;

            canvas[oldTail_i][oldTail_j] = canvas[newHead_i][newHead_j];

        } else if (moveDirection == 'D') { // 如果 moveDirection 是 D,那么将 oldTail_i 减去一,然后将 oldTail 作为新的蛇尾位置

            oldTail

借鉴AI只是不想写代码哈哈,如有帮助还请帮忙点个赞