В моем проекте C raylib происходит что-то странное

В этом коде собака должна «съесть» кость, но вместо того, чтобы съесть кость, собака отходит от кости! Я думаю, что эта игра меня троллит.

#include "raylib.h"
#include <stdio.h>
#include <stdlib.h>
#include "raymath.h"
#include <time.h>

#define HEIGHT 500
#define WIDTH 700

Color extraDarkGreen = {10,30,20,255};

int main(void)
{

    InitWindow(WIDTH, HEIGHT, "Random");
    Image doge = LoadImage("/home/neraan/C/rand/Doge.png");
    ImageResize(&doge, 75, 75);
    Texture2D dogeTex = LoadTextureFromImage(doge);

    Image Bone = LoadImage("/home/neraan/C/rand/Bone.png");
    ImageResize(&Bone, 75, 75);
    Texture2D BoneTex = LoadTextureFromImage(Bone);

    Vector2 DogePos = {50,50};

    Vector2 BonePos = {GetRandomValue(10, WIDTH-10),GetRandomValue(10, HEIGHT-10)};

    SetTargetFPS(60);

    while (!WindowShouldClose())
    {
        Rectangle DogeHit = {DogePos.x,DogePos.y,20,20};
        Rectangle BoneHit = {BonePos.x,BonePos.y,20,20};

        BeginDrawing();
        ClearBackground(extraDarkGreen);
        DrawTexture(dogeTex, DogePos.x, DogePos.y,GREEN);
        DrawTexture(BoneTex, BonePos.x, BonePos.y,GREEN);

        EndDrawing();

        DogePos.x += GetRandomValue(1.0f,2.0f);
        DogePos.x -= GetRandomValue(1.0f,2.0f);
        DogePos.y -= GetRandomValue(1.0f,2.0f);
        DogePos.y += GetRandomValue(1.0f,2.0f);

        if (IsKeyDown(KEY_RIGHT)) DogePos.x += 4.0f;
        if (IsKeyDown(KEY_LEFT)) DogePos.x -= 4.0f;
        if (IsKeyDown(KEY_UP)) DogePos.y -= 4.0f;
        if (IsKeyDown(KEY_DOWN)) DogePos.y += 4.0f;

         if (CheckCollisionRecs(DogeHit,BoneHit))
        {
            SetRandomSeed((unsigned int)time(NULL));
            Vector2 BonePos = {GetRandomValue(10, WIDTH-10),GetRandomValue(10, HEIGHT-10)};
            puts("Lets GOOOO");
        }


    }




    CloseWindow();

    return 0;
}

Вот изображение вывода:

Я понятия не имею, что даже попробовать. Stack Overflow хочет, чтобы я добавил больше текста, поскольку «здесь только код!» но я буквально не знаю, что добавить. Итак, позвольте мне просто сказать вам, что я ТОЧНО не уверен, что здесь не так. На мой взгляд, вся логика подтверждается! Это ДОЛЖНО сработать, и, ради всего святого, ПОЧЕМУ ДВИЖЕТСЯ СОБАКА, А НЕ КОСТЬ!

Таким образом, вы добавляете случайное значение к позиции, а затем вычитаете случайное значение того же диапазона. Почему вы считаете, что он должен делать что-то значимое?

Eugene Sh. 10.05.2024 18:45

Помимо странного случайного расположения «Дожа», вам следует заполнять генератор случайных чисел только один раз. Да, и, пожалуйста, не пишите заглавными буквами, это все равно что кричать, а кричать на людей, которым вы хотите помочь, довольно грубо.

Some programmer dude 10.05.2024 18:49
Vector2 BonePos = ... внутри блока if создает новую локальную переменную, представляющую собственный объект в этой области. Это не влияет на предыдущее определение. Положение, используемое для рендеринга кости, никогда не меняется. Включите предупреждения компилятора, чтобы перехватывать неиспользуемые переменные.
Oka 10.05.2024 18:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Vector2 BonePos = ... внутри блока if создает новую локальную переменную, представляющую собственный объект в этой области. Это не влияет на предыдущее определение. Положение, используемое для рендеринга кости, никогда не меняется.

Включите предупреждения компилятора, чтобы перехватывать неиспользуемые переменные.

Кроме того, повторное заполнение PRNG после столкновения сомнительно. Обычно вы вызываете SetRandomSeed один раз перед началом программы или просто позволяете InitWindow неявно заполнить PRNG.

Также неясно, какова цель этих колебаний.

DogePos.x += GetRandomValue(1.0f,2.0f);
DogePos.x -= GetRandomValue(1.0f,2.0f);
DogePos.y -= GetRandomValue(1.0f,2.0f);
DogePos.y += GetRandomValue(1.0f,2.0f);

но они означают, что положение «дога» случайным образом смещается в каждом кадре.


В целом, это игра в стиле Змеи со свободным перемещением. Далее следует переработанный пример.

#include <stdio.h>
#include <stdlib.h>
#include "raylib.h"

#define WIDTH 300
#define HEIGHT 200
#define BOUND_RNG(X,Y) (GetRandomValue(10, (X) - (Y) - 10))

int main(void)
{
    InitWindow(WIDTH, HEIGHT, "Random");
    Rectangle doge = { .x = 50, .y = 50, .width = 20, .height = 20 };
    Rectangle bone = {
        .x = BOUND_RNG(WIDTH, 20),
        .y = BOUND_RNG(HEIGHT, 20),
        .width = 20,
        .height = 20
    };

    SetTargetFPS(60);

    while (!WindowShouldClose()) {
        if (IsKeyDown(KEY_RIGHT)) doge.x += 4.0f;
        if (IsKeyDown(KEY_LEFT)) doge.x -= 4.0f;
        if (IsKeyDown(KEY_UP)) doge.y -= 4.0f;
        if (IsKeyDown(KEY_DOWN)) doge.y += 4.0f;

        if (CheckCollisionRecs(doge, bone)) {
            bone.x = BOUND_RNG(WIDTH, bone.width);
            bone.y = BOUND_RNG(HEIGHT, bone.height);
        }

        BeginDrawing();
        ClearBackground(DARKGRAY);
        DrawRectangleRec(doge, YELLOW);
        DrawRectangleRec(bone, RED);
        EndDrawing();
    }

    CloseWindow();
}

Note that this example does not handle the event where the "bone" randomly moves to an overlapped position with the "doge", or prevent the "doge" from moving outside the play area. It does prevent the "bone" from clipping outside the play area when respawning.

Случайное сложение и вычитание заставляет собаку трястись.

Neraan Jain 10.05.2024 20:13

Он действительно счастлив

Neraan Jain 10.05.2024 20:46

Реальная игра на C, состоящая примерно из 25 строк кода, меня удивила.

Harith 10.05.2024 21:42

@Harith Если бы у нас была библиотека, реализующая функцию «DoGame(game_name)», у нас была бы одна строка :)

Eugene Sh. 10.05.2024 23:05

Я использую графическую библиотеку raylib, она выполняет МНОГО работы и устраняет большую часть утомительной работы и трудностей.

Neraan Jain 13.05.2024 10:28

Другие вопросы по теме