lsmCC 发表于 2024-2-17 21:21:09

为什么运行之后蛇会动不了,直接结束程序了,不知道哪里出了bug,求修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#define WIDE 60
#define HIGH 30
// 1 设置地图范围(边界)宽 高
// 2 初始化蛇
// 3 将蛇和食物显示在屏幕上
// 4 蛇的移动(wasdk控制)
/*
   蛇碰到墙
   蛇碰到蛇的身体
   蛇碰到障碍物
   蛇碰到食物(蛇身体增长一节,原食物消失,增加新的食物,获得分数)
*/
typedef struct _boby
{
    int x,y;
}BODY;
typedef struct snake
{
    BODY list ; // 身体,身体每一节坐标都是BODY
    int size; //蛇身体的大小
    BODY food; // 食物的坐标
    COORD coord;// 光标的位置信息
    int dx;    // 蛇沿x轴移动的方向
    int dy;    // 蛇沿y轴移动的方向
    int score; //分数
}SNAKE;


void init_ui()
{
    for(int i=0;i<HIGH;i++)
    {
      for(int j=0;j<WIDE;j++)
      {
            printf("#");
      }
      printf("\n");
    }
}
void show_ui(SNAKE *snake)
{
    // 显示蛇 注意:每次显示蛇或食物,都要显示蛇的位置
    for(int i=0;i<snake->size;i++)
    {
      snake->coord.X=snake->list.x;
      snake->coord.Y=snake->list.y;
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),snake->coord);
      if(i==0) printf("@");
      else printf("*");
    }
    // 显示食物
    snake->coord.X=snake->food.x;
    snake->coord.Y=snake->food.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),snake->coord);
    printf("#");

}
// 初始化食物
void init_food(SNAKE *snake)
{
    srand(time(NULL)); //设置随机数种子
    snake->food.x=rand()%WIDE;
    snake->food.y=rand()%HIGH;

}
void init_snake(SNAKE *snake)
{
    // 初始化蛇头
    snake->list.x=WIDE/2;
    snake->list.y=HIGH/2;
    // 初始化蛇尾
    snake->list.x=WIDE/2-1;
    snake->list.y=HIGH/2;
    // 初始化蛇身体的大小
    snake->size=2;
    // 初始化食物的坐标
    init_food(snake);
    //初始化蛇的移动方向
    snake->dx=1;
    snake->dy=0;
    // 初始化分数
    snake->score=0;

}
void move_snake(SNAKE *snake)
{
    // 更新蛇的身体坐标,除蛇头
    for(int i=snake->size-1;i>0;i--)
    {
      snake->list=snake->list;
    }
    // 更新蛇头
    snake->list.x+=snake->dx;
    snake->list.y+=snake->dy;
}

void control_snake(SNAKE *snake)
{
    char key=0;
    while(_kbhit())//判断按键是否按下,按下则不等于0w
    {
      key=_getch();
    }
    switch (key)
    {
      case 'a':snake->dx=-1;snake->dy=0;break;
      case 'w':snake->dx=0;snake->dy=-1;break;
      case 's':snake->dx=0;snake->dy=1;break;
      case 'd':snake->dx=1;snake->dy=0;break;
    }

}
void game_end(SNAKE *snake)
{
    snake->coord.X=25;
    snake->coord.Y=25;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),snake->coord);
    printf("游戏结束,得分为%d\n",snake->score);
    Sleep(3000);
    exit(0);

}
// 咬到自己
void snake_eat_body(SNAKE *snake)
{
    // 如果蛇头和蛇身体任意一节身体坐标相同,则吃到自己的身体
    for(int i=0;i<snake->size;i++)
    {
      if(snake->list.x==snake->list.x&&snake->list.y==snake->list.y)
      {
            game_end(snake);
      }
    }
}
void snake_eat_food(SNAKE *snake)
{
    // 如果蛇头与食物坐标相同,则吃到了食物
    if(snake->list.x==snake->food.x&&snake->list.y==snake->food.y)
    {
      // 原食物消失,生成新的食物(由于先更新的蛇,所以不用让食物消失)
      init_food(snake);
      // 蛇的身体增长一节
      snake->size++;
      // 分数增加(if去实现多个条件)
      snake->score+=10;

    }
}
void start_game(SNAKE *snake)
{
    while(snake->list.x<60&&snake->list.x>=0&&snake->list.y<30&&snake->list.y>=0)
    {
      // 控制蛇更新的方向
      control_snake(snake);
      // 更新蛇的坐标
      move_snake(snake);
      // 清屏
      system("cls");
      // 蛇移动
      show_ui(snake);
      // 蛇是否碰到墙
      // 蛇是否碰到自己
      snake_eat_body(snake);
      // 蛇是否碰到食物
      snake_eat_food(snake);
      Sleep(500); //延时0.5s
    }
    game_end(snake);
}
int main()
{
    // init_ui();
    SNAKE *snake =(SNAKE *)malloc(sizeof(SNAKE));
    init_snake(snake); //初始化蛇和食物
    show_ui(snake); //显示界面
    start_game(snake);// 开始游戏
    system("pause");
    return 0;
}

FishC 发表于 2024-2-17 21:21:26

问题出在move_snake函数中的循环和赋值语句上,你当前的逻辑是将蛇身体的每个点都赋值给它前一个点,但实际上应该是将每个点的下一个点的坐标赋值给当前点。修改move_snake函数的代码如下:

void move_snake(SNAKE *snake) {
    for (int i = snake->size - 1; i > 0; i--) {
      snake->list.x = snake->list.x;
      snake->list.y = snake->list.y;
    }
    snake->list.x += snake->dx;
    snake->list.y += snake->dy;
}
此外,你还需要修改show_ui函数的循环来显示整个蛇身体。修改后的代码如下:

void show_ui(SNAKE *snake) {
    system("cls");
    for (int i = 0; i < snake->size; i++) {
      printf("O");
    }
    printf("\n");
    printf("Score: %d\n", snake->score);
}
希望这次修改能解决问题。如果还有其他问题,欢迎随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

zhangchenyvn 发表于 2024-2-21 16:04:54

缺不缺头文件
页: [1]
查看完整版本: 为什么运行之后蛇会动不了,直接结束程序了,不知道哪里出了bug,求修改