Raylib的贪吃蛇

2024-06-18 09:37
文章标签 贪吃蛇 raylib

本文主要是介绍Raylib的贪吃蛇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

配置Raylib库

    • 工具链
    • 主函数模板
    • Draw: 绘制网格
    • Snake: 初始化
    • Draw:绘制蛇与果
    • Input:移动
    • Logic:游戏主要逻辑
    • Draw: 游戏结束

工具链

mkdir snake
cd snake
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(snake)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(raylib CONFIG REQUIRED)
add_executable(snake main.cpp)
target_link_libraries(snake PRIVATE raylib)
  • CMakePresets.json
{"version": 2,"configurePresets": [{"name": "default","generator": "Ninja","binaryDir": "${sourceDir}/build","cacheVariables": {"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"}}]
}

主函数模板

main

#include "raylib.h"#define SNAKE_LENGTH 256
#define SQUARE_SIZE 31typedef struct Snake {Vector2 position;Vector2 size;Color color;Vector2 speed;
} Snake;typedef struct Fruit {Vector2 position;Vector2 size;Color color;bool active;
} Fruit;static const int screenWidth = 800;
static const int screenHeight = 450;static int framesCounter = 0;
static bool allowMove = false;
static bool gameOver = false;static Snake snake[SNAKE_LENGTH];
static Vector2 snakePosition[SNAKE_LENGTH];
static Vector2 offset;
static int nTail;
static Fruit fruit;static void InitGame(void);
static void Draw(void);
static void Input(void);
static void Logic(void);
int main(void) {InitWindow(screenWidth, screenHeight, "snake game with raylib");SetTargetFPS(60);InitGame();while (!WindowShouldClose()) {Draw();Input();Logic();}CloseWindow();return 0;
}
void InitGame(void) {framesCounter = 0;allowMove = true;gameOver = false;nTail = 1;offset.x = screenWidth % SQUARE_SIZE;offset.y = screenHeight % SQUARE_SIZE;// @TODO: init snake// @TODO: init fruit
}
// Draw game (one frame)
void Draw(void) {BeginDrawing();ClearBackground(RAYWHITE);if (!gameOver) {// @TODO: Draw grid lines// @TODO: Draw fruit to pick} else {// @TODO: print help message}EndDrawing();
}void Input(void) {}
void Logic(void) {}
vcpkg new --application
vcpkg add port raylib
cmake --preset=default
cmake --build build

Draw: 绘制网格

    DrawLineV(Vector2{SQUARE_SIZE * 1 + offset.x / 2, offset.y / 2},Vector2{SQUARE_SIZE * 1 + offset.x / 2, screenHeight - offset.y / 2},LIGHTGRAY);DrawLineV(Vector2{offset.x / 2, SQUARE_SIZE * 2 + offset.y / 2},Vector2{screenWidth - offset.x / 2, SQUARE_SIZE * 2 + offset.y / 2},LIGHTGRAY);for (int i = 0; i < screenWidth / SQUARE_SIZE + 1; i++) {DrawLineV(Vector2{SQUARE_SIZE * i + offset.x / 2, offset.y / 2},Vector2{SQUARE_SIZE * i + offset.x / 2, screenHeight - offset.y / 2},LIGHTGRAY);}for (int i = 0; i < screenHeight / SQUARE_SIZE + 1; i++) {DrawLineV(Vector2{offset.x / 2, SQUARE_SIZE * i + offset.y / 2},Vector2{screenWidth - offset.x / 2, SQUARE_SIZE * i + offset.y / 2},LIGHTGRAY);}

Snake: 初始化

  // @TODO: init snakefor (int i = 0; i < SNAKE_LENGTH; i++) {snake[i].position = Vector2{offset.x / 2, offset.y / 2};snake[i].size = Vector2{SQUARE_SIZE, SQUARE_SIZE};snake[i].speed = Vector2{SQUARE_SIZE, 0};if (i == 0)snake[i].color = DARKBLUE;elsesnake[i].color = BLUE;}for (int i = 0; i < SNAKE_LENGTH; i++) {snakePosition[i] = Vector2{0.0f, 0.0f};}// @TODO: init fruitfruit.size = Vector2{SQUARE_SIZE, SQUARE_SIZE};fruit.color = SKYBLUE;fruit.active = false;fruit.position = Vector2{GetRandomValue(0, (screenWidth / SQUARE_SIZE) - 1) * SQUARE_SIZE +offset.x / 2,GetRandomValue(0, (screenHeight / SQUARE_SIZE) - 1) * SQUARE_SIZE +offset.y / 2};

Draw:绘制蛇与果

    // Draw snakefor (int i = 0; i < nTail; i++)DrawRectangleV(snake[i].position, snake[i].size, snake[i].color);// Draw fruit to pickDrawRectangleV(fruit.position, fruit.size, fruit.color);

Input:移动

  if (!gameOver) {// Player controlif (IsKeyPressed(KEY_RIGHT) && (snake[0].speed.x == 0) && allowMove) {snake[0].speed = Vector2{SQUARE_SIZE, 0};allowMove = false;}if (IsKeyPressed(KEY_LEFT) && (snake[0].speed.x == 0) && allowMove) {snake[0].speed = Vector2{-SQUARE_SIZE, 0};allowMove = false;}if (IsKeyPressed(KEY_UP) && (snake[0].speed.y == 0) && allowMove) {snake[0].speed = Vector2{0, -SQUARE_SIZE};allowMove = false;}if (IsKeyPressed(KEY_DOWN) && (snake[0].speed.y == 0) && allowMove) {snake[0].speed = Vector2{0, SQUARE_SIZE};allowMove = false;}}

Logic:游戏主要逻辑

  if (!gameOver) {for (int i = 0; i < nTail; i++)snakePosition[i] = snake[i].position;if ((framesCounter % 5) == 0) {for (int i = 0; i < nTail; i++) {if (i == 0) {snake[0].position.x += snake[0].speed.x;snake[0].position.y += snake[0].speed.y;allowMove = true;} elsesnake[i].position = snakePosition[i - 1];}}// Wall behaviourif (((snake[0].position.x) > (screenWidth - offset.x)) ||((snake[0].position.y) > (screenHeight - offset.y)) ||(snake[0].position.x < 0) || (snake[0].position.y < 0)) {gameOver = true;}// Collision with yourselffor (int i = 1; i < nTail; i++) {if ((snake[0].position.x == snake[i].position.x) &&(snake[0].position.y == snake[i].position.y))gameOver = true;}// Fruit position calculationif (!fruit.active) {fruit.active = true;fruit.position = Vector2{GetRandomValue(0, (screenWidth / SQUARE_SIZE) - 1) * SQUARE_SIZE +offset.x / 2,GetRandomValue(0, (screenHeight / SQUARE_SIZE) - 1) * SQUARE_SIZE +offset.y / 2};for (int i = 0; i < nTail; i++) {while ((fruit.position.x == snake[i].position.x) &&(fruit.position.y == snake[i].position.y)) {fruit.position = Vector2{GetRandomValue(0, (screenWidth / SQUARE_SIZE) - 1) * SQUARE_SIZE +offset.x / 2,GetRandomValue(0, (screenHeight / SQUARE_SIZE) - 1) *SQUARE_SIZE +offset.y / 2};i = 0;}}}// Collisionif ((snake[0].position.x < (fruit.position.x + fruit.size.x) &&(snake[0].position.x + snake[0].size.x) > fruit.position.x) &&(snake[0].position.y < (fruit.position.y + fruit.size.y) &&(snake[0].position.y + snake[0].size.y) > fruit.position.y)) {snake[nTail].position = snakePosition[nTail - 1];nTail += 1;fruit.active = false;}framesCounter++;} else {if (IsKeyPressed(KEY_ENTER)) {InitGame();gameOver = false;}}

游戏

Draw: 游戏结束

    DrawText("PRESS [ENTER] TO PLAY AGAIN",GetScreenWidth() / 2 -MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20) / 2,GetScreenHeight() / 2 - 50, 20, GRAY);

over


该例子来自raylib官方样例

这篇关于Raylib的贪吃蛇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071846

相关文章

贪吃蛇代码~~自编~~~

这个是贪吃蛇的代码,没设置加速系统~~自己可以根据自己的需求加功能 #include<stdio.h>#include<windows.h>#include<time.h>#include<stdlib.h>#include<iostream>#define MAX_SIZE 50using namespace std;void Loc(int x,int y);void W

用C语言生成字符贪吃蛇游戏

用C语言生成字符贪吃蛇游戏 1. 引言 贪吃蛇是一个经典的小游戏,玩家通过控制蛇的移动来吃食物,随着食物的增加,蛇的长度也会增加,游戏的难度逐渐提升。本文将介绍如何使用C语言来实现一个简单的字符贪吃蛇游戏。 2. 环境准备 在开始编码之前,需要确认以下开发环境: 编译器: 支持标准C语言的编译器(如gcc)。操作系统: Windows、Linux 或 macOS。终端: 用于显示游戏

贪吃蛇的小游戏--用C语言实现

贪吃蛇的小游戏–用C语言实现 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 实现基本的功能: • 贪吃蛇地图绘制 • 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分 • 蛇⾝加速、减速 • 暂停游戏 技术要点 C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32

vue3,贪吃蛇

<template><div flex items-center justify-center h-100vh w-full relative><div class=""><div class="header"><div>得分: {{ score }}</div><div class="flex"><div w-100>速度: {{ speed }}</div><el-sliderv-model=

MFC对话框贪吃蛇小游戏

花了近一个月的时间,学习了一下VC++深入详解,做了个贪吃蛇小游戏,虽然有很多的瑕疵,但还是想分享一下战果。 说一下思路: ①我们要绘制图形,我们可以用CClientDC(客户区设备上下文,与特定的窗口关联)声明一个dc对象作图。 当然这里我们要画蛇的身体和食物,设置一个食物类和蛇身体结构体 ②我们如何让图形动起来?SetTimer创建一个计时器,KillTimer()用来销毁计时器

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 `<locale.h>`本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 SetInit5. 2. 2 Welcom

Lesson_for_java_day15--java小练习:贪吃蛇游戏(在控制台上操作)

目的:编写一个贪吃蛇游戏,在控制台中操作。 思路: 1、贪吃蛇游戏中,需要蛇对象,食物对象和操作界面对象。 2、蛇对象中,包含蛇身对象(每个点),所以用容器存储蛇对象。 3、同理食物对象也需要容器存储。 4、操作界面由每个具体的点组成,所以需要一个生成点的类。 5、再将这些对象整合到一个控制游戏过程的对象中,实现游戏的过程。 代码: 生成操作界面的点类: package

WebGL实现HTML5的贪吃蛇3D游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围。 自己写不出来,站在巨人肩膀总是有机会吧,想起《基于HTML5的电信网管3D机房监控应用》这篇提到的threejs,bab

昔日感觉尚在?在iPhone上与贪吃蛇重逢

最近听闻一款名为Snake ‘97的游戏实现了在iPhone上玩贪吃蛇的想法,而且限时免费,异常欣喜,下载之后,看到这界面的确就像找回当年的感觉,而且开发者还很用心地对按键进行了做旧处理。但是昔日的王者居然沦落到寄生于别的手机上,总不免有一种唏嘘的感觉。   曾几何时,不论是等车还是排队,诺基亚手机上的一个贪吃蛇游戏胜过如今一切歌曲、游戏、社交软件。选择最高难度,一条如脱缰野马(什么比

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型,快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程,将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或