当前位置: 首页 > news >正文

C语言实战:超级玛丽游戏

以下是一个简化版的超级玛丽游戏实现,使用C语言和SDL库。这个版本包含了基本的游戏元素:角色移动、跳跃、平台和简单的碰撞检测。

#include <stdio.h>
#include <stdbool.h>
#include <SDL2/SDL.h>#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define GRAVITY 0.5
#define JUMP_FORCE -10
#define PLAYER_SPEED 5typedef struct {float x, y;float velX, velY;int width, height;bool isJumping;
} Player;typedef struct {float x, y;int width, height;
} Platform;SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
Player player;
Platform platforms[5];
bool gameRunning = true;void initialize() {SDL_Init(SDL_INIT_VIDEO);window = SDL_CreateWindow("Super Mario Clone", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, 0);renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);// 初始化玩家player.x = 50;player.y = SCREEN_HEIGHT - 100;player.width = 40;player.height = 60;player.velX = 0;player.velY = 0;player.isJumping = false;// 初始化平台platforms[0] = (Platform){0, SCREEN_HEIGHT - 40, SCREEN_WIDTH, 40}; // 地面platforms[1] = (Platform){100, 450, 200, 20};platforms[2] = (Platform){400, 350, 200, 20};platforms[3] = (Platform){200, 250, 200, 20};platforms[4] = (Platform){500, 150, 200, 20};
}void handleInput() {SDL_Event event;while (SDL_PollEvent(&event)) {if (event.type == SDL_QUIT) {gameRunning = false;}}const Uint8* keystates = SDL_GetKeyboardState(NULL);if (keystates[SDL_SCANCODE_LEFT]) {player.velX = -PLAYER_SPEED;} else if (keystates[SDL_SCANCODE_RIGHT]) {player.velX = PLAYER_SPEED;} else {player.velX = 0;}if (keystates[SDL_SCANCODE_SPACE] && !player.isJumping) {player.velY = JUMP_FORCE;player.isJumping = true;}
}bool checkCollision(float x1, float y1, int w1, int h1, float x2, float y2, int w2, int h2) {return (x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2);
}void update() {// 应用重力player.velY += GRAVITY;// 更新位置player.x += player.velX;player.y += player.velY;// 边界检查if (player.x < 0) player.x = 0;if (player.x > SCREEN_WIDTH - player.width) player.x = SCREEN_WIDTH - player.width;// 平台碰撞检测player.isJumping = true;for (int i = 0; i < 5; i++) {Platform p = platforms[i];if (checkCollision(player.x, player.y, player.width, player.height, p.x, p.y, p.width, p.height)) {// 从上方碰撞if (player.velY > 0 && player.y + player.height < p.y + p.height) {player.y = p.y - player.height;player.velY = 0;player.isJumping = false;}// 从下方碰撞else if (player.velY < 0) {player.y = p.y + p.height;player.velY = 0;}// 从左侧碰撞else if (player.velX > 0) {player.x = p.x - player.width;}// 从右侧碰撞else if (player.velX < 0) {player.x = p.x + p.width;}}}// 防止掉出屏幕底部if (player.y > SCREEN_HEIGHT) {player.y = SCREEN_HEIGHT - player.height;player.velY = 0;player.isJumping = false;}
}void render() {SDL_SetRenderDrawColor(renderer, 135, 206, 235, 255); // 天空蓝背景SDL_RenderClear(renderer);// 绘制平台SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // 棕色平台for (int i = 0; i < 5; i++) {SDL_Rect platformRect = {(int)platforms[i].x, (int)platforms[i].y, platforms[i].width, platforms[i].height};SDL_RenderFillRect(renderer, &platformRect);}// 绘制玩家SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 红色马里奥SDL_Rect playerRect = {(int)player.x, (int)player.y, player.width, player.height};SDL_RenderFillRect(renderer, &playerRect);SDL_RenderPresent(renderer);
}void cleanup() {SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();
}int main(int argc, char* argv[]) {initialize();while (gameRunning) {handleInput();update();render();SDL_Delay(16); // 约60FPS}cleanup();return 0;
}

如何运行这个游戏

  1. 你需要安装SDL2库:

    • 在Linux上:sudo apt-get install libsdl2-dev

    • 在Mac上:brew install sdl2

    • 在Windows上:下载SDL2开发库并配置你的编译器

  2. 编译命令:

    gcc super_mario.c -o super_mario -lSDL2
  3. 运行游戏:

    ./super_mario

游戏控制

  • 左右方向键:移动马里奥

  • 空格键:跳跃

扩展建议

这是一个非常基础的版本,你可以进一步扩展:

  1. 添加图形资源(替换简单的矩形)

  2. 实现敌人和碰撞检测

  3. 添加音效和背景音乐

  4. 实现关卡系统

  5. 添加金币收集机制

  6. 实现更复杂的物理系统

希望这个基础版本能帮助你开始开发自己的超级玛丽游戏!

http://www.lryc.cn/news/592359.html

相关文章:

  • 工业数据集成中间件工具OPC Router详细介绍
  • 大模型格式
  • sky-take-out项目Mybatis的使用
  • AE电源MDX 5K 10K 15K 20K 25K 30K手侧操作使用说明
  • 【Linux】环境基础与开发工具的使用
  • 数据结构--JDK17新增语法和顺序表
  • blender如何队列渲染多个工程文件的动画?
  • 集训Demo4
  • 本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)
  • 【playwright篇】教程(十六)[macOS+playwright相关问题]
  • ClickHouse物化视图避坑指南:原理、数据迁移与优化
  • IntelliJ IDEA大括号格式设置:换行改行尾
  • C#测试调用ServiceController类查询及操作服务的基本用法
  • vscode编辑Markdown文件
  • 【51】MFC入门到精通——MFC串口助手(一)---初级版(串口设置、初始化、打开/关闭、状态显示),附源码
  • el-date-picker 如何给出 所选月份的最后一天
  • 几款开源的安全监控与防御工具分享
  • 电脑装机软件一键安装管理器
  • 开源的大语言模型(LLM)应用开发平台Dify
  • 飞凌嵌入式亮相第九届瑞芯微开发者大会:AIoT模型创新重做产品
  • 【48】MFC入门到精通——MFC 文件读写总结 CFile、CStdioFile、CFileDialog
  • 源鉴SCA4.9︱多模态SCA引擎重磅升级,开源风险深度治理能力再次进阶
  • 面试150 克隆图
  • 写在 35 岁生日的时候
  • 面试150 被围绕的区域
  • vue2 面试题及详细答案150道(71 - 80)
  • vue2 面试题及详细答案150道(91 - 100)
  • C++:vector(3)
  • 基于 fetch + ReadableStream 流式输出 实现 AI 聊天问答
  • 平板可以用来办公吗?从文档处理到创意创作的全面测评