c - 不确定我的贪吃蛇游戏逻辑有什么问题?

标签 c graphics console cygwin

作为引用,这里是我的作业链接(类(class)是C语言类(class)):Snake

根据方向,嘴应该是“<”、“>”、“v”或“^”, body 部分应该是“*”。

所以首先,我的向上和向下箭头键控件被切换,但它打印出正确的字符(即向下移动时打印“v”,向上移动时打印“^”),我不明白为什么。

此外,当头部移动时,它只是与 body 分离,不会打印新的 body 部分(参见 Screencap )。

下面是我的自定义结构,main、scene_render 和 scene_update 函数(我们不允许为此分配修改 main 函数):

struct Point{
    int x;
    int y;
};

struct Snake {
    struct Point segments[MAX_SEGMENTS];
    int num_segments;
    int dir; //0=up, 1=down, 2=left, 3=right
};

struct Scene {
    // TODO: add fields
    struct Snake snake;
    struct Point fruit;
};

主要

int main(void) {
    // Important: do NOT modify the main function
    struct Scene scene;

    scene_init(&scene);

    int keep_going = 1;
    while (keep_going == 1) {
        scene_render(&scene);
        cons_update();
        scene_delay(&scene);
        keep_going = scene_update(&scene);
    }

    return 0;
 }

场景渲染

void scene_render(const struct Scene *s) {
    // TODO: add your code
    int num=s->snake.num_segments;
    cons_clear_screen();
    cons_move_cursor(s->snake.segments[0].y, s->snake.segments[0].x);
    if(s->snake.dir==0)
    {
        cons_printw("v");
    }
    else if(s->snake.dir==1)
    {
        cons_printw("^");
    }
    else if(s->snake.dir==2)
    {
        cons_printw(">");
    }
    else
    {
        cons_printw("<");
    }
    for(int i=1; i <num; i++)
    {
        cons_move_cursor(s->snake.segments[i].y, s->snake.segments[i].x);
        cons_printw("*");
    }
    cons_move_cursor(23, 79); //just to get blinking cursor out of the way
}

场景更新

int scene_update(struct Scene *s) {
    // This function should return 0 if the player presses 'q',
    // 1 otherwise.
    struct Scene temp=*s;
    int num=temp.snake.num_segments;

    int key = cons_get_keypress();
    // TODO: add your code
    if(key=='q')
    {
        return 0;
    }
    if(key==UP_ARROW && temp.snake.dir!=1)
    {
        temp.snake.dir=0;
        temp.snake.segments[0].y=(temp.snake.segments[0].y)+1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i].y;
            temp.snake.segments[i].x=s->snake.segments[i].x;
        }
    }
    else if(key==DOWN_ARROW && temp.snake.dir!=0)
    {
        temp.snake.dir=1;
        temp.snake.segments[0].y=(temp.snake.segments[0].y)-1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i].y;
            temp.snake.segments[i].x=s->snake.segments[i].x;
        }
    }
    else if(key==LEFT_ARROW && temp.snake.dir!=3)
    {
        temp.snake.dir=2;
        temp.snake.segments[0].x=(temp.snake.segments[0].x)-1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i].y;
            temp.snake.segments[i].x=s->snake.segments[i].x;
        }
    }
    else if(key==RIGHT_ARROW && temp.snake.dir!=2)
    {
        temp.snake.dir=3;
        temp.snake.segments[0].x=(temp.snake.segments[0].x)+1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i].y;
            temp.snake.segments[i].x=s->snake.segments[i].x;
        }
    }
    else if(key==-1)
    {
        if(temp.snake.dir==0)
        {
            temp.snake.segments[0].y=(temp.snake.segments[0].y)+1;
            for(int i=1; i<num; i++)
            {
                temp.snake.segments[i].y=s->snake.segments[i].y;
                temp.snake.segments[i].x=s->snake.segments[i].x;
            }
        }
        else if(temp.snake.dir==1)
        {
            temp.snake.segments[0].y=(temp.snake.segments[0].y)-1;
            for(int i=1; i<num; i++)
            {
                temp.snake.segments[i].y=s->snake.segments[i].y;
                temp.snake.segments[i].x=s->snake.segments[i].x;
            }   
        }
        else if(temp.snake.dir==2)
        {
            temp.snake.segments[0].x=(temp.snake.segments[0].x)-1;
            for(int i=1; i<num; i++)
            {
                temp.snake.segments[i].y=s->snake.segments[i].y;
                temp.snake.segments[i].x=s->snake.segments[i].x;
            }
        }
        else
        {
            temp.snake.segments[0].x=(temp.snake.segments[0].x)+1;
            for(int i=1; i<num; i++)
            {
                temp.snake.segments[i].y=s->snake.segments[i].y;
                temp.snake.segments[i].x=s->snake.segments[i].x;
            }
        }
    }
    temp.fruit.x=s->fruit.x;
    temp.fruit.y=s->fruit.y;
    *s=temp;

    return 1;
}

最佳答案

body 与头部分离的原因是因为你的运动代码:

    if(temp.snake.dir==0)
    {
        temp.snake.segments[0].y=(temp.snake.segments[0].y)+1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i].y;
            temp.snake.segments[i].x=s->snake.segments[i].x;
        }
    }

应该是:

    if(temp.snake.dir==0)
    {
        temp.snake.segments[0].y=(temp.snake.segments[0].y)+1;
        for(int i=1; i<num; i++)
        {
            temp.snake.segments[i].y=s->snake.segments[i-1].y;
            temp.snake.segments[i].x=s->snake.segments[i-1].x;
        }
    }

换句话说, body 的第一个部分应该移动到头部原来所在的位置。第二个 body 部位应该移动到第一个部位原来所在的位置,依此类推。按照您现在的方式,所有 body 部位始终保持在同一个位置。您需要在许多地方进行此更改,或者更好的是创建一个移动 body 的功能,这样您就不会在任何地方都有重复的代码。

至于为什么向上是向下,反之亦然,我只能想象屏幕的 y 坐标与您认为的相反(增加 y 值会向上移动或向下移动)。您应该检查哪种方式,并确保您的代码匹配。

关于c - 不确定我的贪吃蛇游戏逻辑有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29885775/

相关文章:

c++ - 创建多个顶点和索引缓冲区时会消耗大量内存

c - 如何以 "try"读取 C 中的输入

c++ - 禁用 "desktop"子窗口的透明度

C程序不会按升序排列数字

javascript - 从哪里开始学习如何制作类似可视化程序的程序比较好?

graphics - 隐藏/处置 DrawImage

python - 在 Python 控制台上居中对齐文本

c# - 控制台写入光标位置

c - 我在我的程序中找不到内存泄漏

c - 如何协调两个进程之间的共享内存