В этом коде собака должна «съесть» кость, но вместо того, чтобы съесть кость, собака отходит от кости! Я думаю, что эта игра меня троллит.
#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 хочет, чтобы я добавил больше текста, поскольку «здесь только код!» но я буквально не знаю, что добавить. Итак, позвольте мне просто сказать вам, что я ТОЧНО не уверен, что здесь не так. На мой взгляд, вся логика подтверждается! Это ДОЛЖНО сработать, и, ради всего святого, ПОЧЕМУ ДВИЖЕТСЯ СОБАКА, А НЕ КОСТЬ!
Помимо странного случайного расположения «Дожа», вам следует заполнять генератор случайных чисел только один раз. Да, и, пожалуйста, не пишите заглавными буквами, это все равно что кричать, а кричать на людей, которым вы хотите помочь, довольно грубо.
Vector2 BonePos = ... внутри блока if создает новую локальную переменную, представляющую собственный объект в этой области. Это не влияет на предыдущее определение. Положение, используемое для рендеринга кости, никогда не меняется. Включите предупреждения компилятора, чтобы перехватывать неиспользуемые переменные.





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.
Случайное сложение и вычитание заставляет собаку трястись.
Он действительно счастлив
Реальная игра на C, состоящая примерно из 25 строк кода, меня удивила.
@Harith Если бы у нас была библиотека, реализующая функцию «DoGame(game_name)», у нас была бы одна строка :)
Я использую графическую библиотеку raylib, она выполняет МНОГО работы и устраняет большую часть утомительной работы и трудностей.
Таким образом, вы добавляете случайное значение к позиции, а затем вычитаете случайное значение того же диапазона. Почему вы считаете, что он должен делать что-то значимое?