贪心杨 2023-03-22 19:40 采纳率: 100%
浏览 13
已结题

Easyx用c语言制作的贪吃蛇无法吃食物

Easyx用c语言制作的贪吃蛇无法吃食物
用的Vs2022和最新版的easyx


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>

#define weith 900
#define heigth 640
#define MAX 500


enum keys
{
    DOWN,
    UP,
    LEFT,
    RIGHT,
};

struct snake
{
    int speek;//蛇的速度
    int dar;//蛇的方向
    int num;//蛇的长度
    POINT snake[MAX];
}a;

struct Food
{
    int size;//颜色
    int color;//颜色
    int x;//坐标
    int y;
    bool flag;//判断食物是否被吃掉
}food;

//初始化
void start() {
    srand(GetTickCount());
    initgraph(weith, heigth);
    a.num = 3;
    a.speek = 10;
    a.dar = RIGHT;
    //初始化蛇的坐标
    for (int i = 0; i < a.num; i++) {
        a.snake[i].x = (10 + 10 * a.num)-10 * i;
        a.snake[i].y = 10;
    }
    food.x = rand() % (weith / 10) * 10;
    food.y = rand() % (heigth / 10) * 10;
    food.size = rand() % 8 + 8;
    food.color = rand() % 256;
    food.flag = 1;
}

void set_color() {
    BeginBatchDraw();
    setbkcolor(BLUE);
    cleardevice();
    setfillcolor(YELLOW);
    for (int i = 0; i < a.num; i++) {
        solidcircle(a.snake[i].x, a.snake[i].y, 5);//绘制蛇
    }
    if (food.flag == 1) {//蛇头的坐标是否与食物的坐标重叠
        solidcircle(food.x, food.y, food.size);//绘制食物
    }
    EndBatchDraw();//双缓冲
}

void Set_key() {
    if (_kbhit()) {//获取键盘的信息
        switch (_getch())
        {
        case 'W':
        case 'w':
        case 72:
            if (a.dar != DOWN) {//使蛇不能瞬间向相反的方向运动
                a.dar = UP;
            }
            break;
        case 'S':
        case 's':
        case 80:
            if (a.dar != UP) {
                a.dar = DOWN;
            }
            break;
        case 'A':
        case 'a':
        case 75:
            if (a.dar != RIGHT) {
                a.dar = LEFT;
            }
            break;
        case 'D':
        case 'd':
        case 77:
            if (a.dar != LEFT) {
                a.dar = RIGHT;
            }
            break;
        }
    }
}
void Move_Circle() {
    for (int i = a.num - 1; i > 0; i--) {//让蛇的身体能够跟随蛇头运动
        a.snake[i].x = a.snake[i - 1].x;
        a.snake[i].y = a.snake[i - 1].y;
    }
    switch (a.dar) {
    case UP:
        a.snake[0].y -= a.speek;//让蛇头向键盘输入的方向运动
        break;
    case DOWN:
        a.snake[0].y += a.speek;
        break;
    case LEFT:
        a.snake[0].x -= a.speek;
        break;
    case RIGHT:
        a.snake[0].x += a.speek;
        break;
    }
}

void Eat_FOOD() {//判断蛇头的位置是否与食物相撞
    if (a.snake[0].x >= (food.x - food.size) && a.snake[0].x <= (food.x + food.size) &&
        a.snake[0].y >= (food.y + food.size) && a.snake[0].y <= (food.y - food.size)) {
        food.flag = 0;//让这个食物消失
        a.num++;//增加蛇的长度
    }
}

int main() {
    start();
    while (1) {
        set_color();
        Set_key();
        Move_Circle();
        Eat_FOOD();
        Sleep(50);
    }
    system("pause");
    return 0;
}
  • 写回答

2条回答 默认 最新

  • CSDN专家-sinJack 2023-03-22 19:49
    关注

    为了让贪吃蛇能够吃到食物,需要在判断蛇头位置与食物相撞时,修改一下判断条件:

    if (a.snake[0].x >= (food.x - food.size) && 
        a.snake[0].x <= (food.x + food.size) && 
        a.snake[0].y >= (food.y - food.size) && //修改这一行
        a.snake[0].y <= (food.y + food.size)) { //修改这一行
            food.flag = 0;
            a.num++;
    } 
    

    将原来的通过一个负数将判断条件变成相减的方式,改成了通过将判断条件变成相加的方式,即可让蛇能够顺利吃到食物。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月22日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装