Linux C++ 贪吃蛇游戏 -- 方向键控制蛇移动

1. 代码

#include <iostream>
#include <ncurses.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <thread>using namespace std;// 定义方向
enum class Direction { UP, DOWN, LEFT, RIGHT };class SnakeGame {
public:SnakeGame(int width, int height) : width(width), height(height), score(0), gameover(false) {srand(time(nullptr));initscr(); // 初始化终端keypad(stdscr, true); // 启用键盘输入noecho(); // 关闭回显nodelay(stdscr, true); // 非阻塞模式curs_set(0); // 隐藏光标getmaxyx(stdscr, max_y, max_x);window = newwin(height, width, (max_y - height) / 2, (max_x - width) / 2);box(window, 0, 0); // 绘制窗口边框refresh();wrefresh(window);generateFood();snake.push_back(make_pair(height / 2, width / 2)); // 初始化贪吃蛇位置drawSnake();}~SnakeGame() {delwin(window);endwin();}void run() {// 游戏循环while (!gameover) {int ch = getch();handleInput(ch);moveSnake();checkCollision();std::this_thread::sleep_for(std::chrono::milliseconds(100));}showGameOver();}private:int width, height;int score;bool gameover;int max_x, max_y;WINDOW *window;vector<pair<int, int>> snake;pair<int, int> food;Direction direction = Direction::RIGHT;void generateFood() {do {food.first = rand() % (height - 2) + 1;food.second = rand() % (width - 2) + 1;} while (isSnakeCell(food.first, food.second));mvwaddch(window, food.first, food.second, '@');refresh();wrefresh(window);}void drawSnake() {for (const auto& cell : snake) {mvwaddch(window, cell.first, cell.second, '#');}refresh();wrefresh(window);}void moveSnake() {pair<int, int> head = snake.front();pair<int, int> newHead = head;switch (direction) {case Direction::UP:newHead.first--;break;case Direction::DOWN:newHead.first++;break;case Direction::LEFT:newHead.second--;break;case Direction::RIGHT:newHead.second++;break;}snake.insert(snake.begin(), newHead);mvwaddch(window, newHead.first, newHead.second, '#');refresh();wrefresh(window);if (newHead != food) {mvwaddch(window, snake.back().first, snake.back().second, ' ');snake.pop_back();} else {score++;generateFood();}}void handleInput(int ch) {switch (ch) {case KEY_UP:if (direction != Direction::DOWN) {direction = Direction::UP;}break;case KEY_DOWN:if (direction != Direction::UP) {direction = Direction::DOWN;}break;case KEY_LEFT:if (direction != Direction::RIGHT) {direction = Direction::LEFT;}break;case KEY_RIGHT:if (direction != Direction::LEFT) {direction = Direction::RIGHT;}break;}}void checkCollision() {pair<int, int> head = snake.front();// 检查是否撞墙if (head.first == 0 || head.first == height - 1 || head.second == 0 || head.second == width - 1) {gameover = true;return;}// 检查是否撞到自己的身体for (size_t i = 1; i < snake.size(); i++) {if (snake[i] == head) {gameover = true;return;}}}void showGameOver() {clear();string gameOverText = "Game Over!";mvprintw(max_y / 2, (max_x - gameOverText.length()) / 2, gameOverText.c_str());string scoreText = "Score: " + to_string(score);mvprintw(max_y / 2 + 1, (max_x - scoreText.length()) / 2, scoreText.c_str());refresh();getch();}bool isSnakeCell(int row, int col) {for (const auto& cell : snake) {if (cell.first == row && cell.second == col) {return true;}}return false;}
};int main() {SnakeGame game(40, 20);game.run();return 0;
}

2. 编译命令

alfred@ubuntu:~/c_learning/d_cplusplus_learning$ g++ -std=c++11 snake.cpp -o snake -lncurses

3. 运行游戏,使用方向键 ↑ ↓ ← → 上下左右控制蛇移动

alfred@ubuntu:~/c_learning/d_cplusplus_learning$ ./snake

4. 调整蛇移动的速度

修改延时时间100,单位为ms,数字越小,移动越快,修改完后重新编译,运行

std::this_thread::sleep_for(std::chrono::milliseconds(100));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享5款小伙伴们推荐的好用软件

​ 转眼间2023年已经只剩下一个月了&#xff0c;最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.文件格式转换——Convertio ​ Convertio是一款在线文件格式转换软件&#xff0c;可以让用户在不同的文件格…

【开题报告】基于SSM的校园爱心帮扶系统的设计与实现

1.选题背景 校园爱心帮扶系统是基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架的设计与实现&#xff0c;旨在促进校园内的爱心互助和帮扶活动。以下是一些可能的选题背景&#xff1a; &#xff08;1&#xff09;社会责任感的提升&#xff1a;随着社会发展&#…

Python sorted函数及用法以及如何用json模块存储数据

Python sorted函数及用法 sorted() 函数与 reversed() 函数类似&#xff0c;该函数接收一个可迭代对象作为参数&#xff0c;返回一个对元素排序的列表。 在交互式解释器中测试该函数&#xff0c;可以看到如下运行过程&#xff1a; >>> a [20, 30, -1.2, 3.5, 90, 3.…

MongoInvalidArgumentError: Argument “docs“ must be an array of documents

这个错误通常表示在 MongoDB 操作中&#xff0c;你提供的参数不符合预期。错误信息指出了 docs 参数必须是一个文档&#xff08;document&#xff09;数组&#xff0c;但实际上提供的参数类型可能与预期不符。 假设你在使用 MongoDB 的一个函数或方法时出现了这个错误。以下是…

Linux系统---图书管理中的同步问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、问题描述 &#xff08;1&#xff09;图书馆阅览室最多能够容纳N&#xff08;N5&#xff09;名学生&#xff0c;若有更多学生想…

FFmpeg的C++封装:FFmpegWrapper

什么是FFmpeg&#xff1f; FFmpeg 是一套完整的录制、转换、流化音视频的解决方案&#xff0c;也是一个在LGPL协议 下的开源项目。它包含了业界领先的音视频编解码库。FFmpeg是在Linux操作系统下开发的&#xff0c;但它也能在其他操作系统下编译&#xff0c;包括Windows。 整…

java常用字符串工具方法封装

Java常用的字符串工具方法有很多&#xff0c;以下是一些常见的封装&#xff1a; 判断字符串是否为空或null public static boolean isNullOrEmpty(String str) {return str null || str.trim().isEmpty(); }判断字符串是否为数字 public static boolean isNumeric(String s…

跨境代采怎么实现(代采网站)

中国代购作为一种新型的业务形式&#xff0c;此类服务能够帮助消费者购买来自全球的商品&#xff0c;同时也为商家提供了在线销售机会。代购行业的兴起&#xff0c;有助于打破传统的地域和跨境限制&#xff0c;促进了国际贸易和经济发展。 一、中国代购的定义和特点 代购可以被…

冬季吃得过饱?羊大师教你几招消食的小妙招!

冬季吃得过饱&#xff1f;羊大师教你几招消食的小妙招&#xff01; 冬季是人们容易吃得过饱的季节&#xff0c;美食诱惑频出&#xff0c;很容易导致胃口过大&#xff0c;饭量过多&#xff0c;造成消化不良甚至影响身体健康。所以&#xff0c;如何消食&#xff0c;让胃得到缓解…

如何拆解Unity 2022.3版本的AssetBundle

1&#xff09;如何拆解Unity 2022.3版本的AssetBundle 2&#xff09;Unity 2022 LTS版本的稳定性 3&#xff09;关于AssetBundle禁用TypeTree之后的一些可序列化的问题 这是第363篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖…

long转int类型转换问题

在业务代码中排序时需要根据日期排序&#xff0c;写了如下代码 sorted((o1, o2) -> {String str1 null;String str2 null;try {Field field getField(fieldMap, configBO.getCodeName());str1 String.valueOf(field.get(o1));str2 String.valueOf(field.get(o2));} ca…

【Qt开发流程】之对象模型1:信号和槽

Qt对象模型 标准c对象模型为对象范型提供了非常有效的运行时支持。但是它的静态特性在某些问题领域是不灵活的。图形用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。Qt通过结合c的速度和Qt对象模型的灵活性提供了这一点。 Qt将这些特性添加到c中: 一个非常强大的…

基于Go语言实现简易Web应用

目录 前言Go语言特点写在使用Go语言实现Web应用前面创建Web服务器声明一个结构体操作加入中间件的使用使用静态文件服务器最后 前言 在编程语言中&#xff0c;近几年问世的几个新语言都是非常不错的&#xff0c;比如Go、Python、 Rust等等。其中&#xff0c;Go语言(Golang)作…

CookieSession Redis 到JWT会话管理历史

单应用时期&#xff0c;通常使用 Cookies 和 Session 进行会话管理。 用户登录后&#xff0c;服务器创建一个唯一的会话标识符&#xff08;Session ID&#xff09;&#xff0c;将其存储在浏览器的 Cookies 中&#xff0c;并在服务端维护一个关联该标识符的会话对象。 这种方…

基因名潘多拉

同一基因可能会有多种命名&#xff0c;如Ensembl gene ID、NCBI Entrez gene ID、Gene Symbol等 基因有哪些名儿&#xff0c;你知道嘛&#xff1f; Ensembl gene ID&#xff1a;Ensembl数据库中对基因的命名&#xff0c;如ENSMUSG00000000538。ENS是固定字符&#xff0c;表示…

全国停车位收费标准接口API

1) 请求地址 接口地址https://psbg.jparking.cn/cw-gateway/cwzg/v1/near_park 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 数据来源捷停车 不可用于商用 概不负责 4) 请求参数: {"latitude": "29.563009", //坐标"longitude&quo…

基于SSM的零食销售系统

基于SSM的零食销售系统 零食商城系统是一个面向用户销售零食的在线平台&#xff0c;用户可以在该平台上浏览、搜索、选择和购买各种零食产品。零食商城系统的背景是随着生活水平的提高和消费观念的改变&#xff0c;人们对于各种健康、美味和方便的零食产品的需求不断增加。传统…

Verilog基础:编译指令`timescale

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 timescale编译指令用于指定指令后模块的时间单位和时间精度。时间单位是时间值的度量单位&#xff0c;例如延迟值和仿真时间&#xff1b;而仿真精度决定了最小可分…

【独家OD2023C卷真题】20天拿下华为OD笔试2023C-小明能到达的最大坐标值【欧弟算法】全网注释最详细分类最全的华为OD真题题解

题目描述与示例 题目描述 小明在玩一个游戏&#xff0c;游戏规则如下&#xff1a;在游戏开始前&#xff0c;小明站在坐标轴原点处&#xff08;坐标值为 0&#xff09;给定一组指令和一个幸运数&#xff0c;每个指令都是一个整数&#xff0c;小明按照指定的要求前进或者后退指…

集成测试如何做?

今天学习下如何进行集成测试。 什么是集成测试? 集成测试被定义为一种测试类型&#xff0c;其中软件模块在逻辑上集成并作为一个组进行测试。一个典型的软件项目由多个软件模块组成&#xff0c;由不同的程序员编码。此级别测试的目的是在集成这些软件模块时&#xff0c;暴露…