【C语言】——基于Ncurse图形库的C语言小程序

article/2025/1/10 12:10:21

游戏说明:运行在Linux环境下 基于Ncurse图形库的C语言小程序

项目知识要求:C编程基础、Linux基本操作(代码编写、编译代码、运行代码、创建文件夹)

代码的编辑:vi test1.c 进入文档按下i进行编写代码 按下esc进入命令行输入:wq保存代码

编译代码:gcc test1.c 然后回生成可执行的程序

运行代码:./a.out

创建文件夹:mkdir tanchishe

项目的目的与意义:启到承上启下的作用

承上:C语言基础、数据结构链表基础,C变量,流程控制,函数,指针,结构体等

启下:Linux系统编程,文件编程,进程,线程,通信,第三方包等

项目解读:

1.为什么要用ncurse?        相应键盘的上下左右键

2.地图规划  

1.ncurse的输入输出

#include <curses.h>//包含头文件
int main()
{initscr();//nurse界面的初始化函数printw(“This is a curses window.\n”);//在ncurse模式下的printfgetch();//等待用户输入,如果没有这句话,程序就退出了,看不到运行的结果,也就是看不到上面那句话endwin();//程序退出,调用改函数来恢复shell终端的显示,如果没有这句话,shell终端字乱码,坏掉
}

使用curses时包含头文件#include<curses.h>

curses函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。

在linux中可以查看头文件中包含的内容 vi /uesr/include/curses.h,使用这些函数要用keypad函数

编译ncurse文件时需要包含头文件<curses.h>编译时gcc 工程名 -lcurses

int main()
{int key;initscr();keypad(stdscr,1);while(1){key = getch();switch(key){case KEY_DOWN:printw("DOWN\n");break;case KEY_UP:printw("UP\n");break;case KEY_LEFT: printw("LEFT\n");break;case KEY_RIGHT:printw("RIGHT\n"); break; }}endwin();      return 0;
}

2.地图规划

技术点:普通C语言的for循环语句和printw的输出

大小20x20

地图竖直方向上的边界”|“

地图水平方向上的边界”--“

贪吃蛇的身子”[]“

贪吃蛇食物”##“

#include "curses.h"void initNcurse()
{	initscr();keypad(stdscr,1);
}void gamePic()
{int hang;int lie;for(hang = 0;hang < 20;hang++){if(hang == 0){for(lie=0;lie<20;lie++){printw("--");	}printw("\n");}if(hang>=0 && hang <=19){	for(lie=0;lie<=20;lie++){if(lie == 0 || lie == 20){printw("|");}else{printw("  ");}}printw("\n");}if(hang == 19){for(lie=0;lie<20;lie++){printw("--");	}printw("\n");printw("BY Walker F.M");			}}
}int main()
{initNcurse();gamePic();getch();endwin();return 0;
}

3.贪吃蛇的绘制 

3.1贪吃蛇的身子节点

1.行坐标

2.列坐标

3.下一个节点的位置(地址/指针)

#include "curses.h"
#include "stdlib.h"#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2struct Snake
{int hang;int lie;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.hang = x;food.lie  = y;
}void initNcurse()
{	initscr();keypad(stdscr,1);noecho();//涓嶈鎶婃棤鍏崇殑閿€兼樉绀哄湪鍥句笂
}int hasSnakeNode(int i,int j)
{struct Snake *p;p = head;while(p != NULL){if(p->hang == i && p->lie == j){return 1;	}p = p->next;}return 0;
}int hasfood(int i,int j)
{if(food.hang == i && food.lie == j){return 1;}return 0;
}
void gamePic()
{int hang;int lie;move(0,0);for(hang = 0;hang < 20;hang++){ if(hang == 0){for(lie=0;lie<20;lie++){printw("--");	}printw("\n");}if(hang>=0 && hang <=19){	for(lie=0;lie<=20;lie++){if(lie == 0 || lie == 20){printw("|");}else if(hasSnakeNode(hang,lie)){printw("[]");}else if(hasfood(hang,lie)){printw("##");}else{printw("  ");}}printw("\n");}if(hang == 19){for(lie=0;lie<20;lie++){printw("--");	}printw("\n");printw("BY Walker F.M,key = %d\n",key);			}}
}void addNode()
{struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake));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;
}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->hang = 1;head->lie  = 1;head->next = NULL;tail = head;//璁╁ご灏捐妭鐐归兘鎸囧悜{2,2,NULL}	addNode();	addNode();	addNode();	
}void deleNode()
{struct Snake *p;p = head;head = head->next;free(p);
}int ifSnakeDie()
{	struct Snake *p;p = head;if(tail->hang < 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(hasfood(tail->hang,tail->lie)){initfood();}else{deleNode();	}if(ifSnakeDie()){initSnake();}
}void* refreshJieMian()
{while(1)	{moveSnake();gamePic();refresh();usleep(100000);}
}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()
{pthread_t t1;pthread_t t2;initNcurse();initSnake();gamePic();pthread_create(&t1,NULL,refreshJieMian,NULL);pthread_create(&t2,NULL,changeDir,NULL);while(1);getch();//涓€鐩寸瓑寰呰鐢ㄦ埛杈撳叆闃叉绋嬪簭閫€鍑?endwin();//闃叉shell缁堢涔辩爜return 0;
}

 


http://chatgpt.dhexx.cn/article/PRuJ5e5d.shtml

相关文章

C语言图形库EasyX安装及基本使用

本文章介绍C用EasyX进行C基础图形编程介绍。 EasyX安装&#xff1a; 1、点击上方超链接&#xff0c;进入官网&#xff0c;点击右侧下载EasyX 2、点击下载后的可执行文件&#xff1a; 3、EasyX安装非常简单&#xff0c;进入可执行文件&#xff0c;直接next&#xff0c;然后会自…

c语言的图形库

图形库链接http://www.easyx.cn/ 使用图形库头文件easyx.h或graphics.h 同样在里面下载图形库帮助文档进行查询 vs vc都可使用图形库 图形库窗口: initgraph打开窗口 closegraph关闭窗口 颜色 RGB值 RGB(,,):red green blue 下表值都可以在函数中直接使用填充颜色 上图为图形…

在Dev C++中使用c语言图形库的配置

[img]C:\Documents and Settings\Administrator\桌面\devcppEditor1.gif[/img]Dev-C Installation If you are installing Dev-C on your own computer, you should make some changes and additions to the default installation. Here are the details. If you are planning…

利用DevC++和EGE图形库写出一款C语言飞机大战小游戏

利用DevC以及EGE图形库写出一款C语言飞机大战小游戏 前言&#xff1a; 上学期期末大作业利用C语言写过一个极其简陋的飞机大战&#xff08;只有黑洞洞的终端窗口&#xff0c;至于飞机&#xff0c;额&#xff0c;也是一言难尽&#xff09;&#xff0c;暑假闲来无事&#xff0c…

【c语言】五子棋(EasyX图形库+背景音乐)

大家好&#xff0c;有没有觉得写了好多c语言代码&#xff0c;面对的都是黑框框控制台&#xff0c;当我们学习了基础的c语言知识&#xff0c;和EasyX图形库后&#xff0c;终于可以和黑框框saygoodbye,今天要分享给大家的是小游戏五子棋&#xff0c;跟着小张一起学习吧 EasyX图形…

C语言课程设计图形库

记得刚上大学的时候&#xff0c;大一学C语言&#xff0c;最后有一个大作业&#xff0c;用的是Turbo C2.0&#xff0c;然后大部分设计题都需要用到里面的图形界面&#xff0c;也就是引用<graphics.h>.差不10年过去了&#xff0c;不知道现在的学生还用不用Turbo C&#xff…

C语言画图形(图形库graphics的使用)

目录 工具 c语言基本绘图 文字输出 c语言基本贴图 获取鼠标、键盘信息 工具 &#xff08;1&#xff09;环境&#xff1a;VC &#xff08;2&#xff09;库函数&#xff1a;graphics.h&#xff08;因为不是标准库函数&#xff0c;所以需下载EASYX&#xff09; &#xff08;3&am…

codeblock c语言图形库,C语言入门项目——扫雷游戏(ege图形库+codeblocks)

扫雷游戏适合C练手,会C基本语法就可以尝试。需要导入ege图形库(文章后半部分写了ege如何导入codeblocks,以及我用到的ege函数) 一、先介绍如何将ege图形库导入codeblocks: 1、下载codeblocks 2、下载ege图形库的文件包 官方网址:ege图形库主站 (1)打开下载好的压缩包,找到…

【精选】适合初学者小游戏井字棋(三子棋)(C语言),Easyx图形库应用+源代码分享

【精选】井字棋&#xff08;三子棋&#xff0c;C语言&#xff09; 目录 【精选】井字棋&#xff08;三子棋&#xff0c;C语言&#xff09;游戏展示一、项目环境简单介绍一下easyx图形库Easyx图形库 二、游戏规则介绍三、运行效果展示四、项目介绍五、项目源代码分享总结与思考B…

C语言图形库——EasyX基本贴图

在C语言的学习过程中&#xff0c;接触最多的就是黑乎乎的DOS窗口&#xff0c;这也是在消磨学习者的兴趣&#xff0c;学到最后可能还不知道C语言到底能做什么&#xff0c;难道就是输入输出数据吗&#xff1f;当然不是&#xff0c;C的用处很广泛&#xff0c;这里不做讨论。我们能…

#C语言或C++中强大的图形库——easyx

1.了解easyx图形库 EasyX Graphics Library 是针对 Visual C 的免费绘图库&#xff0c;支持 VC6.0 ~ VC2022&#xff08;以及VS2013~VS2022)&#xff0c;简单易用&#xff0c;学习成本极低&#xff0c;应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。 使用范围&…

产品 • B端和C端产品经理有什么区别?

一些概念 to-C产品分类&#xff1a; 直接触达型&#xff1a;类似一级市场——微信、微博等平台&#xff1b;间接触达型&#xff1a;二级市场——广告、公众号等 &#xff1b; 总的市场规模&#xff1a; 用户规模可用时间 —— 御豪同学 • 京东金融 • 数据产品经理 每位用户每…

B端产品思维全解析,提升产品经理核心竞争力

产品思维和用户思维组成了产品经理两大核心思维方法论。对两者的理解也代表了产品经理的产品理解方向。 很多人把产品思维和用户思维混在一起说&#xff0c;我觉得是不合适的&#xff0c;因为两个是互相搭配的关系&#xff0c;你也可以把产品思维理解成智商&#xff0c;用户思维…

全方位解析 C 端和 B 端的产品特性

近年来&#xff0c;互联网进入下半场&#xff0c;C 端流量红利逐渐消退&#xff0c;很多企业转向了 B 端服务&#xff0c;随之而来的是产品设计者的转型&#xff0c;现在越来越多的 C 端产品设计师开始涉足到 B 端产品的设计&#xff0c;这是一个知识迁移的过程&#xff0c;需要…

B端产品经理,应从哪些方面理解业务?

新人入职新公司后&#xff0c;第一个工作就是了解公司业务&#xff0c;一般都是看公司项目PPT、产品需求文档&#xff0c;根据现有系统功能梳理功能结构图、产品流程等方式&#xff0c;但并不能系统化地帮助我们了解公司业务&#xff0c;容易流于表面。 由于TO B业务往往具有鲜…

B端和C端产品区别

一、定义 B端的B是单词Business的缩写&#xff0c;即企业用户。 C端的C是单词Consumer的缩写&#xff0c;即个人用户。 二、区别 B端产品&#xff08;如**管理系统&#xff09;&#xff1a; B端产品注重操作的实用性&#xff0c;注重功能的实现效率&#xff0c;是为了工作而…

新入行的产品做C端还是B端?

作为一名产品经理&#xff0c;你是否曾思考过&#xff1a;新入行的产品&#xff0c;做C端还是B端发展前景更好&#xff1f; C端产品需要对用户需求有深刻的了解。你需要研究市场趋势、用户行为、竞争对手&#xff0c;然后设计出符合用户期望的产品。同时&#xff0c;你需要面对…

【产品经理】B端产品经理需知道几个市场概念

美国市场营销协会称&#xff1a;“市场是指一种货物或劳务的潜在购买者的集合需求。”简单的说市场是买卖双方交易的领域&#xff0c;有买方、有卖方、有商品或服务、有需求。我们可以简单的了解市场竞争程度、需求和供给模型和边际成本模型。 01市场竞争程度 《西方经济学》里…

为什么说用C端产品的思维做B端产品就是死路一条?

经常听行业大佬说起&#xff1a;如果用C端产品的思维做B端产品就是死路一条&#xff0c;那原因究竟是什么呢&#xff1f; 首先&#xff0c;需要明确的是C端产品和B端产品的用户群体和需求存在很大差异。C端产品的用户主要是消费者&#xff0c;更多的是被情感驱动。而B端产品的…