运行截图

等待开始界面

运行过程

失败界面截图

SFML配置

csdn上面已经有很多SFML配置的blog,随便就能搜到。正常配置好SFML后,还需要将字体ttf文件放在源代码同一目录和exe同一目录中,不然无法显示字符

代码部分

下面贴上各个部分的代码

头文件和全局常量

#include <SFML/Graphics.hpp>
#include <time.h>
#include<iostream>
#include<conio.h>const int BodyMaxLong = 2000;        //最长蛇身
const int SnakeInitLongth = 10;      //初始蛇身
const sf::Vector2f SnakeInitPos = {200,200}; //蛇头初始位置
const int BodyRadius = 5;             //蛇身半径
const sf::Vector2i WindowSize = { 500,500 };
const int FoodRadius = 2;
const int FoodNum = 30;
#define SnakeColor sf::Color::Green
#define FoodColor sf::Color::Red

sfml中已经定义了颜色可以直接用,还有图形类和二维向量类(int型vector2i,float型vector2f),都在名称空间sf中。

既然是贪吃蛇游戏,那么一定有蛇啦。

class Snake {                       //蛇
private:int longth;                            //蛇身长度sf::Vector2f dir;                        //蛇当前行进方向sf::CircleShape body[BodyMaxLong];        //用圆形类来建造蛇身
public:Snake() {longth = SnakeInitLongth;dir = { 5 , 0 };                       //初始方向for (int i = 0;i < 5;i++) {            //初始化位置和蛇身每个圆形之间的间距sf::Vector2f pos = { SnakeInitPos.x - i * 5, SnakeInitPos.y };body[i].setPosition(pos);}for (int i = 0;i < BodyMaxLong;i++) {        //初始化蛇身半径和颜色body[i].setRadius(BodyRadius);body[i].setFillColor(SnakeColor);}}void SnakeMove() {                      //整体移动蛇身函数,用一个循环依次移动每一个蛇身for (int i = longth - 1;i > 0;i--){body[i].setPosition(body[i - 1].getPosition().x,body[i - 1].getPosition().y);}body[0].move(dir);}void SnakeHolding(sf::Event &event) {            //控制蛇行进方向switch (event.key.code){case sf::Keyboard::Up:case sf::Keyboard::W:if (dir.x != 0 && dir.y != 5) { dir = { 0,-5 }; }break;case sf::Keyboard::Left:case sf::Keyboard::A:if (dir.x != 5 && dir.y != 0) { dir = { -5,0 }; }break;case sf::Keyboard::Right:case sf::Keyboard::D:if (dir.x != -5 && dir.y != 0) { dir = { 5,0 }; }break;case sf::Keyboard::Down:case sf::Keyboard::S:if (dir.x != 0 && dir.y != -5) { dir = { 0 , 5 }; }break;default:break;}}sf::CircleShape PreDrawSnake(int i) {        //在主函数绘制蛇时需要返回每个圆形对象return this->body[i];}int GetSnakeLongth() {return this->longth;}void UpLevel() { this->longth++; }            //吃到食物升级,长度自增sf::Vector2f GetDir() { return dir; }
};

食物

typedef struct {        //一个包含下x,y两个整型的结构体,用于表示坐标,本来可以用vector2i的,发现下面老是报错就尝试自己写个结构体,发现可以运行就这么运行了int x;int y;
}PosData;class Food {                            //食物类
private:PosData pos;sf::CircleShape Body;
public:Food() {pos = { rand() % 500,rand() % 500 };            //初始化随机食物位置Body.setFillColor(FoodColor);                    //初始化食物颜色Body.setPosition({(float)pos.x,(float)pos.y});        //将位置设置进图形对象中Body.setRadius(FoodRadius);                        //初始化食物的图形半径}sf::Vector2f GetFoodPos() {                           //返回食物位置的函数 return { (float)this->pos.x+FoodRadius,(float)this->pos.y+FoodRadius };}void SetFoodPos() {                    //一旦被吃掉,重新随机获得一个位置pos = { rand() % WindowSize.x, rand() % WindowSize.y };Body.setPosition({(float)pos.x,(float)pos.y});}sf::CircleShape PreDraFood() { return this->Body; }        //返回图形对象,以便绘制和其他功能
};

判断函数

检查有没有吃到食物用的函数

void GetFoodCheck(Snake& snake, Food& food) {sf::Vector2f snakepos = { snake.PreDrawSnake(0).getPosition().x+BodyRadius,snake.PreDrawSnake(0).getPosition().y+BodyRadius};sf::Vector2f foodpos = food.GetFoodPos();if (foodpos.x >= snakepos.x - BodyRadius && foodpos.x <= snakepos.x + BodyRadius && foodpos.y>=snakepos.y - BodyRadius && foodpos.y<=snakepos.y + BodyRadius) {snake.UpLevel();food.SetFoodPos();}
}

检查有没有撞墙或者咬到尾巴的函数,都没有则返回1,有其一则返回0

bool CollideCheck(Snake& snake) {sf::CircleShape head = snake.PreDrawSnake(0);if (head.getPosition().x >= WindowSize.x || head.getPosition().x <= 0 || head.getPosition().y >= WindowSize.y || head.getPosition().y <= 0){return 0;}int longth = snake.GetSnakeLongth();for (int i = 1;i < longth;i++) {if (snake.GetDir().x == 0){if (snake.PreDrawSnake(0).getPosition().x + BodyRadius >= snake.PreDrawSnake(i).getPosition().x && snake.PreDrawSnake(0).getPosition().x + BodyRadius <= snake.PreDrawSnake(i).getPosition().x + BodyRadius * 2){if (snake.GetDir().y > 0){if (snake.PreDrawSnake(0).getPosition().y + BodyRadius * 2 >= snake.PreDrawSnake(i).getPosition().y && snake.PreDrawSnake(0).getPosition().y + BodyRadius * 2 <= snake.PreDrawSnake(i).getPosition().y + BodyRadius * 2){return 0;}}else {if (snake.PreDrawSnake(0).getPosition().y >= snake.PreDrawSnake(i).getPosition().y && snake.PreDrawSnake(0).getPosition().y <= snake.PreDrawSnake(i).getPosition().y + BodyRadius * 2){return 0;}}}}if (snake.GetDir().y == 0){if (snake.PreDrawSnake(0).getPosition().y + BodyRadius >= snake.PreDrawSnake(i).getPosition().y && snake.PreDrawSnake(0).getPosition().y + BodyRadius <= snake.PreDrawSnake(i).getPosition().y + BodyRadius * 2){if (snake.GetDir().x > 0){if (snake.PreDrawSnake(0).getPosition().x + BodyRadius * 2 >= snake.PreDrawSnake(i).getPosition().x && snake.PreDrawSnake(0).getPosition().x + BodyRadius * 2 <= snake.PreDrawSnake(i).getPosition().x + BodyRadius * 2){return 0;}}else {if (snake.PreDrawSnake(0).getPosition().x  >= snake.PreDrawSnake(i).getPosition().x && snake.PreDrawSnake(0).getPosition().x  <= snake.PreDrawSnake(i).getPosition().x + BodyRadius * 2){return 0;}}}}}return 1;
}

main函数

int main()
{sf::Text text,score,pretext;sf::Font font,cnfont;font.loadFromFile("arial.ttf");            //加载字体文件cnfont.loadFromFile("hpsimplifiedhans-light.ttf");text.setPosition(1, 1);        //设置字体的位置score.setPosition(100, 1);pretext.setPosition(20,150);        pretext.setString("Welcome to shushuSnake Game\npress space button\n start the game");                        //设置字符内容pretext.setFont(font);pretext.setFillColor(sf::Color::Blue);text.setString("Score:");text.setFont(font);score.setFont(font);text.setFillColor(sf::Color::Black);score.setFillColor(sf::Color::Black);std::string str;srand((int)time(0));        sf::RenderWindow window(sf::VideoMode(WindowSize.x,WindowSize.y),"shushuSnake");Snake snake;            //创建蛇Food food[FoodNum];        //创建食物sf::Clock clock;                //double timer = 0, delay = 0.05;           //bool prep = 0;            //若prep = 0 等待玩家按空格开始游戏,开始游戏后prep = 1int longth;while (window.isOpen()){if (!prep){sf::Event event;while (window.pollEvent(event)) {if (event.type == sf::Event::Closed) {window.close();}if (event.type == sf::Event::KeyPressed) {if (event.key.code == sf::Keyboard::Space){prep = 1;}}}window.clear(sf::Color::White);window.draw(text);score.setString("0");window.draw(score);window.draw(pretext);window.display();}if (prep) {float time = clock.getElapsedTime().asSeconds();        //clock.restart();                        //timer += time;sf::Event event;while (window.pollEvent(event)) {if (event.type == sf::Event::Closed) {window.close();}if (event.type == sf::Event::KeyPressed) {snake.SnakeHolding(event);}}longth = snake.GetSnakeLongth();window.clear(sf::Color::White);for (int i = 0;i < FoodNum; i++)                     //食物绘制{window.draw(food[i].PreDraFood());}if (timer > delay) {timer = 0;snake.SnakeMove();for (int i = 0; i < FoodNum;i++){GetFoodCheck(snake, food[i]);}if (CollideCheck(snake) == 0)        //咬到尾巴或者撞到墙失败了{sf::Text endtext;endtext.setString("Game Over!!");endtext.setPosition(100, 150);endtext.setFont(font);endtext.setCharacterSize(50);endtext.setFillColor(sf::Color::Red);  window.clear(sf::Color::White);window.draw(text);window.draw(score);window.draw(endtext);longth = snake.GetSnakeLongth();for (int i = 0; i < longth;i++)                     //蛇身绘制window.draw(snake.PreDrawSnake(i));window.display();if (_getch())return 0;}str = std::to_string(snake.GetSnakeLongth() - SnakeInitLongth);score.setString(str);}for (int i = 0; i < longth;i++)                     //蛇身绘制window.draw(snake.PreDrawSnake(i));window.draw(text);window.draw(score);window.display();}}return 0;
}

欢迎大家一起讨论!

用c++和SFML实现简易的界面版贪吃蛇相关推荐

  1. C/C++制作简易版贪吃蛇游戏

    文章目录 C/C++制作简易版贪吃蛇游戏 一.开发环境 二.设计逻辑 三.代码块 3.1 使用initgraph()函数 3.2定义蛇和食物的结构体 3.3随机产生食物的坐标以及定义初始化的蛇的数据 ...

  2. 用Python做一个游戏——简易版贪吃蛇

    前言 今天,我来分享个中等级的简易版贪吃蛇,这次不是用turtle库,而是用pygame库和sys库. 1.导入库 我们需要把游戏所用的库导入进来: import pygame import sys ...

  3. JavaGUI简易版贪吃蛇小游戏

    做这个小游戏,主要是学习一下游戏制作的基本逻辑,加深对面向对象的理解. 游戏引擎: /*** 大牛程序员写的游戏的公共类 * 使用Game.init()方法初始化游戏* 使用Game.gameOver ...

  4. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  5. 如何用c语言实现贪吃蛇登录界面,c语言贪吃蛇UI界面版.docx

    c语言UI界面版贪吃蛇 使用ege图形库,游戏实现单双人功能.道具有炸弹,随机魔盒,炸弹.有随机障碍物生成. 不附加图片 . /************************************ ...

  6. python界面小游戏贪吃蛇_用Python实现童年小游戏贪吃蛇

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中. 尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的 ...

  7. python界面小游戏贪吃蛇_用Python实现童年贪吃蛇小游戏功能的实例代码

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中. 尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的 ...

  8. 鸿蒙系统,鸿蒙app简易登录界面,界面开发教程

    鸿蒙系统,鸿蒙app简易登录界面,界面开发教程. // 这个是主Ability public class MainAbilitySlice extends AbilitySlice {@Overrid ...

  9. Android studio设计一个简易微信界面

    一.设计要求及实现构想 1.设计一个简易微信界面框架,包含至少4个tab页面(我设计的4个分别为message.contact.find.config),要求能实现四个页面之间的点击切换. 2.首先分 ...

最新文章

  1. pyqt5从子目录加载qrc文件_PyQt5快速上手基础篇10-QSettings用法
  2. javascript span ie 与FF
  3. 有效的括号—leetcode20
  4. 消息中间件NetMQ结合Protobuf简介
  5. dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径
  6. 【MFC学习笔记-作业7-小型画图软件】【】
  7. 181226每日一句
  8. 如何批量将 Txt 文本文档转换为 xlsx 格式的 Excel 文档
  9. 大数据实战之路-数据仓库-项目运维交接文档
  10. 微信公众号支付 java_微信支付之公众号支付(java实现)
  11. 最强大脑张雨暄!14岁考入清华大学,18岁直博清华数学系
  12. CSS选择器(随笔)
  13. vue + openlayers鼠标移动获取地图经纬度格式化的两种方式
  14. 对TCL/TK的一个小总结
  15. 使用Bundle校验接口入参
  16. 2018秋季阿里实习生面试总结
  17. java基于接口的动态代理
  18. 国际期货投机有什么风险?目前正大怎么样?
  19. sed 在行首或者行尾添加文本
  20. 如何在业余时间快速学习英文

热门文章

  1. 学习编程的技术网站和app。
  2. 关于请求头header,token,setHeader()
  3. 揭穿几个著名的Windows“伪”优化技(…
  4. 全网最全!24届杭州电子科技大学自动化考研最新三年院校分析
  5. Tomcat卸载重装及为eclipse配置tomcat,一文搞定。
  6. 微信小程序好用的开源框架
  7. html集团有什么样的产品,html5高端大气集团企业通用织梦网站模板
  8. 剑网三服务器多久维护一次,《剑网三》玩家刚进游戏就领到10年大礼包,官方紧急关服!...
  9. RFCOMM protocal
  10. 计算选手得分c语言程序,c程序评分系统.doc