m0_73634332 2023-06-09 08:44 采纳率: 100%
浏览 90
已结题

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;
}

  • 写回答

5条回答 默认 最新

  • 急速光粒 2023-06-10 15:05
    关注

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

    #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;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 已采纳回答 6月11日
  • 请回答用户的提问 6月9日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 tensorflow在特定账户下不可用
  • ¥15 JavaScript 修改 chrome 上 传感器的经纬度
  • ¥50 flask前后端数据传输问题
  • ¥15 关于#java#的问题:怎么通过ffmpeg把第一个文件的后30秒、第二个文件全部、第三个文件前30合并到一起怎么通过ffmpeg把第一个文件的后30秒、第二个文件全部、第三个文件前30合并到一起
  • ¥15 求推荐发表需要付费的深度学习遥感场景分类SCI期刊
  • ¥15 无法在java控制台录入文字
  • ¥15 flutter网页应用用python的http服务器访问速度慢
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥15 python实现CAD识图