一、基本要求

C编程基础以及Linux基本操作
C编程基础:包括但不限于数据结构链表基础,C变量,流程控制,函数,指针,结构体等
Linux基本操作:包括但不限于 如何编写代码,如何编译代码,如何运行程序,如何创建文件夹

二、为什么需要ncurse

通俗易懂的来讲就是,C语言基础自带的库不存在单按方向键就能直接控制蛇的移动,必须按下方向键和回车键才可以响应,ncurse封装的一些库不需要按下回车,直接按下方向键就可以响应

三、安装ncurse

编译linux内核需ncurses, Ubuntu命令:

sudo apt-get install libncurses5-dev

四、ncurse的用法

  1. 包含头文件:curses.h
  2. 编译时应加上链接语句-lcurses,如:gcc temp.c -o temp -lcurses
  3. 重要的函数: 函数 功能
    程序中所调用的函数
    initscr() 初始化curses库和ttty(在开始curses编程之前,必须使用initscr()这个函数来开启curses模式)
    endwin() 关闭curses并重置tty(结束curses编程时,最后调用的一个函数)
    move(y,x) 将游标移动至 x,y 的位置
    printw(format,str) curses中的 printf() ,以一定的格式输出至萤幕
    getch() 从键盘读取一个字元。(注意!传回的是整数值)
    refresh() 使屏幕按照你的意图显示。比较工作屏幕和真实屏幕的差异,然后refresh通过终端驱动送出那些能使真实屏幕于工作屏幕一致的字符和控制码。(工作屏幕就像磁盘缓存,curses中的大部分的函数都只对它进行修改)
    keypad()函数 这个函数允许使用功能键,例如:F1、F2、方向键等功能键。几乎所有的交互式程序都需要使用功能键,因为绝大多数用户界面主要用方向键进行操作。使用keypad(stdscr,TURE)就为“标准屏幕”(stdscr)激活了功能键。

五、实现贪吃蛇代码

#include<stdio.h>
#include<curses.h>
#include<stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2struct JieGouT
{int hang;int lie;struct JieGouT *next;
};struct JieGouT *head = NULL;
struct JieGouT *tail = NULL;
int key;
int dir;struct JieGouT sfood;void initJieM()
{initscr();//打开curses模式 进入你的终端//完成initscr后,输入模式为预处理模式,(1)所有处理是基于行的,就是说,只有按下回车,输入数据才被传给程序;(2)键盘特殊字符启用,按下合适组合键会产生信号//keypad(WINDOW *, bool); keypad(stdscr,1);//指定窗口 激活功能键  上下左右 F1 F2等//Stdscr数据结构对应的是“标准屏幕”,它的工作方式与stdout相似,是curses程序中的默认输出窗口//Stdscr:指curses窗口,它与显示器的物理屏幕的尺寸完全一样。//标准屏幕noecho();//关闭回显 让键盘输入字符 不显示在终端上
}void initFood(){//确定食物的坐标在地图内int x=rand()%20;//在0-20之间随机出现一个数int y=rand()%20;sfood.hang = x;sfood.lie =y;
}int bianli(int hang,int lie){//确定蛇的坐标struct JieGouT *p;p = head;while(p !=NULL){if(p->hang == hang && p->lie == lie){return 1;}p = p->next;}return 0;
}int food(int hang,int lie){//确定食物的坐标if(sfood.hang == hang && sfood.lie == lie){return 1;}return 0;
}
void map()//打印地图
{int hang;int lie;move(0,0);for(hang=0;hang<20;hang++){if(hang==0){for(lie=0;lie<20;lie++){printw("--");//在ncurse模式下的printf}printw("\n");}if(hang>=0 || hang<=19){for(lie=0;lie<=20;lie++){if(lie==0 || lie==20){printw("|");}else if(bianli(hang,lie)){printw("[]");}else if(food(hang,lie)){printw("##");}else{printw("  ");}}printw("\n");}if(hang==19){for(lie=0;lie<20;lie++){printw("--");}printw("\n");}}}void addNode()//用链表的方式设计蛇的身子增长
{struct JieGouT *new = (struct JieGouT *)malloc(sizeof(struct JieGouT));new->next =NULL;switch(dir){case UP:new->hang=tail->hang-1;new->lie=tail->lie;break;case DOWN:new->hang=tail->hang+1;new->lie=tail->lie;break;case LEFT:new->hang=tail->hang;new->lie=tail->lie-1;break;case RIGHT:new->hang=tail->hang;new->lie=tail->lie+1;break;}tail->next = new;//将tail与new连接在一起tail=new;//增加一节长度
}void initSnake()//初始化蛇
{struct JieGouT *p;dir=RIGHT;while(head != NULL){  //判断是否是第二次游戏p=head;head=head->next;free(p);/*防止内存泄漏,当第一场游戏结束,第二场游戏开始时,遍历链表,释放内存*/}initFood();head = (struct JieGouT *)malloc(sizeof(struct JieGouT));head->hang=1;head->lie=1;head->next=NULL;tail=head;addNode();addNode();addNode();
}void deleNode()//用链表的方式设计蛇的身子减少
{struct JieGouT *p;p=head;head=head->next;free(p);//释放内存}int ifSnakeDie()//蛇碰到边界和自己的身体死亡
{struct JieGouT *p=NULL;p=head;if(tail->hang < 0/*地图是从等于0开始的所以最上面一行要满足小于0才能死掉*/ | tail->lie == 0 | tail->hang == 20 | tail->lie ==20){//判断是否头和边界相碰撞return 1;}while(p->next != NULL){//做遍历,判断吃到东西了以后if(p->hang == tail->hang && p->lie == tail->lie){//判断是否头和身子相碰撞return 1;}p=p->next;}
return 0;}void moveSnake()//移动蛇,通过增加一个节点和减少一个节点的方式
{addNode();if(food(tail->hang,tail->lie)){initFood();}else{deleNode();}if(ifSnakeDie()){initSnake();}}void *refresh1(){while(1){moveSnake();map();refresh();//每次在屏幕绘制之后,需要调用refresh()刷新屏幕usleep(100000);//蛇移动的速度}}void *refresh2(){while(1){moveSnake();map();refresh();usleep(80000);}}void turn(int dir1){if(abs(dir) != abs(dir1)){/*就是蛇在右移的过程中不能左移只能上下,反之一样,在上移的时候不能下移只能左右,反之一样*///判断此时蛇移动的方向值的绝对值是否等于你按下键的值的绝对值dir = dir1;}}
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()
{int data1;pthread_t t1;pthread_t t2;pthread_t t3;printf("plese choose model:\n 1.difficult\n 2.easy\n");scanf("%d",&data1);initJieM();initSnake();if(data1 == 1){pthread_create(&t3,NULL,refresh2,NULL);}pthread_create(&t1,NULL,refresh1,NULL);pthread_create(&t2,NULL,changeDir,NULL);while(1);getch();//等待用户输入,如果没有这句话程序就会退出,看不到运行的结果endwin();//程序退出,调用该函数来恢复shell终端的显示,如果没有这句话,shell终端乱码return 0;
}

基于ncurse的贪吃蛇小游戏相关推荐

  1. 基于STM32的贪吃蛇小游戏

    基于STM32的贪吃蛇小游戏 初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃蛇的经验,所以实现出来并不困难. 作品简介 游戏面版将在4.3寸480*800)液晶上显示,初 ...

  2. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

  3. STM32F407基于陀螺仪的贪吃蛇小游戏(全网最详细)

    一.前言 本次设计我用MPU6050在KEIL 5的环境下改进了贪吃蛇小游戏,用的开发板是STM32F407,本次设计综合利用多种ARM外设接口实现对外部设备信息的采集.处理及显示,实现了贪吃蛇游戏实 ...

  4. 【精选】基于EasyX的贪吃蛇小游戏

    文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...

  5. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  6. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  7. 计算机毕业设计-基于Java的GUI实现贪吃蛇小游戏

    标题:基于Java多线程版本GUI贪吃蛇小游戏 1.项目技术点 1.多线程的运用. 2.JAVA的GUI的运用. 3.数据结构的灵活运用. 4.随机食物的生成. 5.关卡加速,随着蛇身增长,蛇的速度也 ...

  8. 基于STL实现自动贪心寻路算法的贪吃蛇小游戏

    基于STL实现自动贪心寻路算法的贪吃蛇小游戏 写贪吃蛇小游戏的想法来自CometOJ-Contest#13的B题,当时用STL双端队列维护蛇身的时候觉得非常方便,现在用EasyX图形库实现一下. 运行 ...

  9. 基于Linux ncurses图形库的贪吃蛇小游戏

    达者为先  师者之意 基于Linux ncurses图形库的贪吃蛇小游戏 前言 1 ncurses库程序的标准模式 2 ncurses库的常用函数 3 基于Linux ncurses图形库的贪吃蛇小游 ...

最新文章

  1. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
  2. JS同时上传表单图片和表单信息并把上传信息存入数据库,带php后端源码
  3. 做程序员的苦恼,智办事助力团队协作更简单
  4. ggcor包的安装与绘图示例
  5. python元组(tuple)使用示例+常用方法+列表(list)和元组(tuple)的异同?
  6. 常见几种浏览器兼容性问题与解决方案
  7. 初识莫队——小Z的袜子
  8. 一维二维_更高效的一维、二维材料过渡态搜索
  9. js处理16进制hex转str出现的中文乱码问题
  10. 多次点击android版本出现棒棒糖,android – 为前棒棒糖设备创建循环显示
  11. 在google map上显示Instagram的照片
  12. C语言丨线性表(三):双链表
  13. azure云数据库_在Azure SQL数据库中实现动态数据屏蔽
  14. PMP第五版第一次考试相关提醒
  15. 电脑麦克风插孔是哪个_科唛BoomXD 2.4G数字无线麦克风
  16. BPS数据包常见问题
  17. C++小游戏 双人贪吃蛇
  18. orcadcapture安装_电路原理图设计软件(OrCAD Capture CIS 中文版) 16.6 免费安装版
  19. 五分钟学会PowerDesigner创建概念数据模型
  20. BOOST升压有源功率因数校正

热门文章

  1. java中的inherits_node.js 下使用 util.inherits 来实现继承
  2. 无线网卡改打印服务器,怎样将喷墨打印机改装成无线连接
  3. 渗透测试之地基服务篇:无线攻防之Kali自搭建钓鱼Wifi
  4. 如何查看端口状态及端口占用情况
  5. 2020年重庆区块链论坛,大石化新区与时俱进
  6. 关于加入@RequestBody后请求报错:Required request body is missing:
  7. 北京系列10——返程
  8. 现代金融体系的构成与课程的逻辑框架
  9. 开发im即时通讯如何用Netty实现心跳机制、断线重连机制
  10. Java实现论文查重系统