当前位置: 首页 > 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;万万亿。在企业层面数值金额转换设置到千亿、万亿就行了。大的集团…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...