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

C语言 基于Ncurse库的贪吃蛇游戏项目

为了敲键盘及时响应,需要用到ncurse

测试代码: ncurse1.c

/* ncurse1.c */
#include <curses.h> //ncurse的头文件。int main()
{char c;int i = 0;//ncurse界面的初始化函数。initscr(); for(i=0;i<=2;i++){c = getch();printw("\n");//ncurse下的打印函数。printw("Input: %c\n",c); }//等待用户的输入,没有该函数程序会直接退出,看不到printw()的结果。getch(); //调用程序退出函数,恢复shell终端的显示,没有该函数终端可能会乱码。 endwin(); return 0;
}
//输入指令测试 gcc ncurse1.c -lcurses

 游戏的规划实现步骤

  1. Ncurse 函数初始化
  2. 边框图像设置 (for循环)
  3. 贪吃蛇身子节点    (结构体:行,列,下一个节点)
  4. 第一个节点  (静态设置)
  5. 设的整的身子  (静态设置)
  6. 改进 4,5蛇身子的问题, (采用结构体指针指向下一个,尾插法的方式)
  7. 蛇身子向右移动 move(0,0)光标界面不乱,通过按键key来向右行驶, 尾部加节点,注意必须要释放头节点来达到平衡。
  8. 贪吃蛇撞壁  
  9. 主动向右行驶,不需要按键key ,边框图像然后refresh()刷新界面。
  10. 方向键控制蛇变化 , key按键与dir配合,如果key向下,dir就变化,并switch选择增加往那个方向加节点。
  11. 主函数采用linux两个线程,(按键与自动)同时移动,并且都不退出。
  12. 贪吃蛇随机位置的设定。
  13. 咬死自己。

代码:

#include <curses.h>
#include <stdlib.h>#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2struct Snake
{int row;int line;struct Snake* next;
};struct Snake* head = NULL;
struct Snake* tail = NULL;
int key;
int dir;struct Snake food;void initFood()//初始化食物节点
{int x = rand() % 20;//随机出现位置int y = rand() % 20;food.row = x;food.line = y;
}void initNcurse()//初始化curses图形库
{initscr();keypad(stdscr,1);//使用keypad可以在stdscr中接受键盘的功能键noecho();//对于输出的功能键的值不做出回应,以免界面溢出
}int hasSnakeNode(int i,int j)//传参:行号,列号
{struct Snake* p;p = head;while(p != NULL){if(p->row==i && p->line==j){return 1;//gamePic中打印一个节点"[]"}p=p->next;}return 0;
}int hasFood(int i,int j)//打印食物
{if(food.row==i && food.line==j){return 1;}return 0;
}void gamePic()//打印图形界面
{int row;int line;move(0,0);for(row=0;row<20;row++){//第0行为20个"--"if(row==0){for(line=0;line<20;line++){printw("--");}printw("\n");}//第0-19行为左右两边一个"|",中间21个"  "(空格)为了对齐第一行if(row>=0 && row<=19){//一共打印20行for(line=0;line<=20;line++){if(line==0 || line==20){printw("|");//打印两边}else if(hasSnakeNode(row,line)){printw("[]");//打印蛇的身体}else if(hasFood(row,line)){printw("##");//打印食物}else{printw("  ");//打印中间}}printw("\n");}//打印第19行,与第一行一样if(row==19){for(line=0;line<20;line++){printw("--");}printw("\n");printw("by Andy,key = %d\n",key);//打印作者名字以及方向键的值}}
}void addNode()//加节点
{struct Snake* new = (struct Snake*)malloc(sizeof(struct Snake));//开辟新节点空间new->next = NULL;switch(dir){//根据用户按的功能键的方向来决定如何添加一个节点case UP://列不变,行减一的位置添加new->row = tail->row - 1;new->line = tail->line;break;case DOWN:new->row = tail->row + 1;new->line = tail->line;break;case LEFT:new->row = tail->row;new->line = tail->line - 1;break;case RIGHT:new->row = tail->row;new->line = tail->line + 1;break;}tail->next = new;tail = new;//新节点变成尾部
}void deleteNode()//删除节点
{struct Snake* p;p = head;head = head->next;free(p);
}void initSnake()//初始化蛇的身体
{struct Snake* p;//使用链表dir = RIGHT;//初始化方向为右while(head != NULL){p = head;head = head->next;free(p);//遍历节点,释放空节点内存}initFood();//初始化食物head = (struct Snake*)malloc(sizeof(struct Snake));//为头节点开辟空间head->row = 1;//第一行head->line = 1;//第一列head->next = NULL;//防止野指针tail = head;//头插法addNode();//加4个节点addNode();addNode();addNode();
}int ifSnakeDie()//蛇死亡的条件
{struct Snake* p;p = head;if(tail->row < 0 || tail->line == 0 || tail->row == 20 || tail->line == 20){//四个边界return 1;}while(p->next != NULL){if(p->row == tail->row && p->line == tail->line){//头咬到尾巴return 1;}p = p->next;}return 0;
}void moveSnake()//蛇的移动
{addNode();if(hasFood(tail->row,tail->line)){initFood();}else{deleteNode();}if(ifSnakeDie()){initSnake();}
}void* refreshBox()//刷新界面
{while(1){moveSnake();//蛇移动gamePic();//重新打印界面refresh();//刷新覆盖原界面usleep(100000);//0.1s}
}void turn(int direction)//绝对值解决方向问题
{if(abs(dir) != abs(direction)){dir = direction;}
}void* changeDir()//根据用户按的功能键走位
{while(1){key = getch();switch(key){case KEY_DOWN:turn(DOWN);//转向break;case KEY_UP:turn(UP);break;case KEY_LEFT:turn(LEFT);break;case KEY_RIGHT:turn(RIGHT);break;}}
}int main()
{initNcurse();//第一步:搭建curses环境initSnake();//第三步:打印蛇的身体gamePic();//第二步:打印图形界面pthread_t th1;//线程1pthread_t th2;//线程2pthread_create(&th1,NULL,refreshBox,NULL);//运行线程1:不断刷新界面pthread_create(&th2,NULL,changeDir,NULL);//运行线程2:不断改变方向while(1);//让线程一直进行getch();//让程序一直重复输入功能键还能执行endwin();//curses函数return 0;
}

还需要不断改进。。。。。。

相关文章:

C语言 基于Ncurse库的贪吃蛇游戏项目

为了敲键盘及时响应&#xff0c;需要用到ncurse 测试代码&#xff1a; ncurse1.c /* ncurse1.c */ #include <curses.h> //ncurse的头文件。int main() {char c;int i 0;//ncurse界面的初始化函数。initscr(); for(i0;i<2;i){c getch();printw("\n");//…...

【Java基础】Java语言特性

认识Java java语言的执行过程 编写纯文本文件 .java 经过javac编译器(java complier)编译 .class .class是二进制的字节码 在源文件中定义几个类&#xff0c;就会生成几个 由JVM运行 .class JVM把字节码编译成可以在处理器上运行的高性能的本地代码&#xff08;native code),…...

python进阶--Numyp库(一)

一、Numpy库介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&#xff0c;⽐Python⾃身的嵌套列表&am…...

CV学习笔记-Inception

CV学习笔记-Inception 目录 文章目录CV学习笔记-Inception目录1. 常见的卷积神经网络2. Inception(1) Inception提出背景(2) Inception module 核心思想3. Inception的历史版本(1) InceptionV1-GoogleNet(2) InceptionV2(3) InceptionV3(4) Inception V44. Inception模型的特点…...

注意力机制笔记——结合沐神和B站老弓up主

B站【大白话浅谈【注意力机制】】 聚类 是针对 样本, 注意力机制是针对样本相关性,来进行计算的 自注意力机制 指的是 query ,key,value都是同一个部分。 可以学到 类似的 短语 ,和 语义特征。如its 指代的对象。 评论区大佬 根据这篇论文《Effective Approaches to…...

建议收藏,轻松搞懂区块链

未来已来&#xff0c;只是不均衡地分布在当下 大家好&#xff0c;我是菜农&#xff0c;欢迎来到我的频道。 本文共 5844字&#xff0c;预计阅读 30 分钟 区块链是近些年来最热门的前沿技术&#xff0c;被认为是未来十几年对金融、物联网、医疗等诸多领域产生最大影响的"…...

php设计一个新春祝福墙

记得十几年前的时候&#xff0c;每到春节&#xff0c;各大网站都会建一个祝福墙&#xff0c;上面挂满网友的新年寄语。这些年随着移动互联网的高速发展&#xff0c;web的新春祝福墙越来越少了。今天&#xff0c;咱们就来考考古&#xff0c;用快速原型法进行设计。原型设计采用M…...

KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.02.03-2023.…...

数字IC/FPGA 秋招知识点不全面整理

1. 引言 这篇文章的由来 秋招的时候,刚开始复习一些知识点的时候没有什么思路,只是盲目的看相关的书籍和资料,结果是留在脑子中的知识很有限,而且不够系统,在我需要它的时候,并不能很快的回忆起来。 于是就想着把一些典型的知识整理成一个文档,在进行刷题的时候可以比…...

你知道java8是如何排序Map嘛?

在Java中&#xff0c;有多种方法可以对Map进行排序&#xff0c;但是我们将重点介绍Java 8 Stream&#xff0c;这是实现目标的一种非常优雅的方法。 学习一下HashMap的merge()函数 在学习Map排序之前&#xff0c;有必要讲一下HashMap的merge()函数&#xff0c;该函数应用场景就…...

【李忍考研传】一、李忍

“老师&#xff0c;我来回答&#xff01;” “非常好&#xff0c;我记得你是叫……呃……是李念同学吗&#xff1f;” “不&#xff0c;老师&#xff0c;我叫李忍。” “好&#xff0c;你来回答一下这个问题。” “这题用海明码校验的知识&#xff0c;能检错一位纠错一位&a…...

测牛学堂:软件测试python深入之类和对象的属性和方法总结

类对象和实例对象 类对象就是我们定义的类。 在代码执行的时候&#xff0c;解释器会自动创建类对象。 类对象的作用&#xff1a; 1 使用类对象创建实例对象 2 存储类的一些特性&#xff0c;就是类里面定义的属性 创建对象的过程也称为实例化的对象。所以&#xff0c;类创建的对…...

css实例--新闻页面

实现效果 实现代码 html代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…...

SpringCloudGateway 动态转发后端服务

API网关的核心功能是统一流量入口&#xff0c;实现路由转发&#xff0c;SpringCloudGateway是API网关开发的技术之一&#xff0c;此外比较流行的还有Kong和ApiSix&#xff0c;这2个都是基于OpenResty技术栈。 简单的路由转发可以通过SpringCloudGateway的配置文件实现&#xf…...

使用canvas写一个flappy bird小游戏

简介 canvas 是HTML5 提供的一种新标签&#xff0c;它可以支持 JavaScript 在上面绘画&#xff0c;控制每一个像素&#xff0c;它经常被用来制作小游戏&#xff0c;接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird&#xff08;中文名&#xff1a;笨鸟先飞&am…...

KVM-2、虚拟化基础

1. 虚拟化概念 什么是虚拟化 **虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程。**虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU 、内存和存储。虚拟机管理程序会根据需要将这些计算资源分配给每个虚拟机。 虚拟化有哪…...

设计模式之观察者模式与访问者模式详解和应用

目录1.访问者模式详解1.1 访问者模式的定义1.1.1 访问者模式在生活中的体现1.1.2 访问者模式的适用场景1.2 访问者模式的通用实现1.3 访问者模式的使用案例之KPI考核1.3.1 类图设计1.3.2 代码实现1.4 访问者模式扩展---分派1.4.1 java中静态分派示例代码1.4.2 java中动态分派1.…...

[SSD固态硬盘技术 18] Over-Provisioning (OP 预留空间)详解,谁“偷”走了SSD的容量?

</...

spring注解方式整合Dubbo源码解析

系列文章目录 前言 本节我们的Dubbo源码版本基于2.6.x 在前一章我们的整合案例中&#xff0c;我们有几个比较关键的步骤&#xff1a; 在启动类上标注了EnableDubbo注解在provider类上面标注了Service注解来提供dubbo服务在消费的时候通过Reference注解引入dubbo服务在配置文件…...

大数值金额大写转换(C语言)

关于大数值金额大写转换&#xff0c;在财务管理的应用方面没什么意义。一般来说&#xff0c;千亿级&#xff0c;万亿级的数值就够了。因为在国家级层面是以亿为单位的&#xff0c;也就表达为千万亿&#xff0c;万万亿。在企业层面数值金额转换设置到千亿、万亿就行了。大的集团…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...