c语言第一个小游戏:贪吃蛇小游戏06
实现贪吃蛇四方向的风骚走位
实现代码
#include <curses.h>
#include <stdlib.h>
struct snake{
int hang;
int lie;
struct snake *next;
};
struct snake *head;
struct snake *tail;
int key;
int dir; //全局变量
#define UP 1 //这个是宏定义,主要就是让人更好理解 ,也为了后期的方向做了铺垫
#define DOWN -1
#define LEFT 2
#define RIGHT -2
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;
}
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{
printw(" ");
}
}
printw("\n");
}
if(hang == 19){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
}
printw("by shijintao\n");
printw("key =%d\n",key);
}
void addNode()
{
struct snake *new;
new =(struct snake *)malloc(sizeof(struct snake));
new->next=NULL;
switch(dir){
case UP:
new->hang=tail->hang-1;
new->lie=tail->lie;
tail->next=new;
tail = new;
break;
case DOWN:
new->hang=tail->hang+1;
new->lie=tail->lie;
tail->next=new;
tail = new;
break;
case LEFT:
new->lie=tail->lie-1;
new->hang=tail->hang;
tail->next=new;
tail = new;
break;
case RIGHT:
new->lie=tail->lie+1;
new->hang=tail->hang;
tail->next=new;
tail = new;
break;
}
}
当为dir为up的时候 hang变,lie不变
当为dir为down的时候 hang变,lie不变
当为dir为left的时候 lie变,hang不变
当为dir为right的时候 lie变,hang不变
void initSnake()
{
struct snake *p;
dir = RIGHT; //这边我们设置了一个初始方向 dir是全局变量
while(head != NULL){
p=head;
head=head->next;
free(p);
}
head = (struct snake *)malloc(sizeof(struct snake));
head->hang=2;
head->lie=2;
head->next=NULL;
tail = head;
addNode();
addNode();
}
void deleteNode()
{
struct snake *p;
p = head;
head = head->next;
free(p);
}
void moveSnake()
{
addNode();
deleteNode();
if(tail->hang==0||tail->hang==20||tail->lie==20||tail->lie==0){
initSnake();
}
}
void * changeDir()
{
while(1){
key =getch();
switch(key){ //这个key是全局变量 会通过changeDir函数改变
case KEY_DOWN:
dir = DOWN; //这个DOWN是通过宏定义定义的
break;
case KEY_UP:
dir = UP;
break;
case KEY_RIGHT:
dir = RIGHT;
break;
case KEY_LEFT:
dir = LEFT;
break;
}
}
}
void * gamerefresh()
{
while(1){
moveSnake();
gamepic();
refresh();
usleep(100000);
}
}
int main()
{
pthread_t th1;
pthread_t th2;
initNcurse();
initSnake();
gamepic();
pthread_create(&th2,NULL,gamerefresh,NULL);
pthread_create(&th1,NULL,changeDir,NULL);
while(1);//死循环不能让主线程退出,这样就可以一直玩游戏了
getch();
endwin();
return 0;
}
优化代码(方向相反不能直接走)
#include <curses.h>
#include <stdlib.h>
struct snake{
int hang;
int lie;
struct snake *next;
};
struct snake *head;
struct snake *tail;
int key;
int dir;
#define UP 1
#define DOWN -1
#define LEFT 2
#define RIGHT -2
void initNcurse()
{
initscr();
keypad(stdscr,1);
noecho(); //这个就是ncurse的按键盘的时候会弹出来乱七八糟的符号,输入这个就可以去掉,不然地图很奇怪,很多乱七八糟的符号
}
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;
}
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{
printw(" ");
}
}
printw("\n");
}
if(hang == 19){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
}
printw("by shijintao\n");
printw("key =%d\n",key);
}
void addNode()
{
struct snake *new;
new =(struct snake *)malloc(sizeof(struct snake));
new->next=NULL;
switch(dir){
case UP:
new->hang=tail->hang-1;
new->lie=tail->lie;
tail->next=new;
tail = new;
break;
case DOWN:
new->hang=tail->hang+1;
new->lie=tail->lie;
tail->next=new;
tail = new;
break;
case LEFT:
new->lie=tail->lie-1;
new->hang=tail->hang;
tail->next=new;
tail = new;
break;
case RIGHT:
new->lie=tail->lie+1;
new->hang=tail->hang;
tail->next=new;
tail = new;
break;
}
}
void initSnake()
{
struct snake *p;
while(head != NULL){
p=head;
head=head->next;
free(p);
}
head = (struct snake *)malloc(sizeof(struct snake));
dir = RIGHT;
head->hang=2;
head->lie=2;
head->next=NULL;
tail = head;
addNode();
addNode();
}
void deleteNode()
{
struct snake *p;
p = head;
head = head->next;
free(p);
}
void moveSnake()
{
addNode();
deleteNode();
if(tail->hang==0||tail->hang==20||tail->lie==20||tail->lie==0){
initSnake();
}
}
void turn(int direction)
{
if(abs(dir) != abs(direction)){
dir = direction;
}
}
//这段代码就是更改贪吃蛇不能相反移动的核心了,利用abs绝对值的方法,这个direction是新的方向,这个dir是旧方向 ,在这边我们设置左右上下的值互为相反数,如果他们的绝对值相等的话,那我们就不把新方向替代旧方向,说白了我白说了,只要绝对值相等,那么就不会换方向,只要绝对值不相等,就换方向,这个值取决于你在宏定义里面的设置,就像下面的一样
//#define UP 1
//#define DOWN -1
//#define LEFT 2
//#define RIGHT -2
void * changeDir()
{
while(1){
key =getch();
switch(key){
case KEY_DOWN:
turn(DOWN);
break;
case KEY_UP:
turn(UP);
break;
case KEY_RIGHT:
turn(RIGHT);
break;
case KEY_LEFT:
turn(LEFT);
break;
}
}
}
void * gamerefresh()
{
while(1){
moveSnake();
gamepic();
refresh();
usleep(100000);
}
}
int main()
{
pthread_t th1;
pthread_t th2;
initNcurse();
initSnake();
gamepic();
pthread_create(&th2,NULL,gamerefresh,NULL);
pthread_create(&th1,NULL,changeDir,NULL);
while(1);
getch();
endwin();
return 0;
}
相关文章:
c语言第一个小游戏:贪吃蛇小游戏06
实现贪吃蛇四方向的风骚走位 实现代码 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局变量 #define UP 1 //这个是宏定义&a…...
人工智能_大模型数据标注主要做什么_拉框_人工智能训练师_数据标准师介绍---人工智能工作笔记0244
随着大模型的快速发展,数据标注迅速成为比较热门的工作,那么 数据标注,具体干什么呢? 因为现在人工智能在某个领域如果理解,或者识别的越精准,那么 就需要越高质量的数据, 就是因为,模型的训练,大多还是有监督深度学习.给他足够高质量的数据才行有好的效果. 可以看到在AI领…...
工业4G路由器IR5000公交站台物联网应用解决方案
随着城市化进程的加速,公共交通是智慧城市的重要枢纽。城市公共交通由无数的公交站台作作为节点组合而成,其智能化升级成为提升城市出行效率与服务质量的关键。传统公交站台信息发布滞后、缺乏实时性,难以满足乘客对公交信息快速获取的需求&a…...
文件操作: File 类的用法和 InputStream, OutputStream 的用法
目录 1. File 概述 1.1 File的属性 1.2 File的构造方法 1.3 File的方法 2. 文件的基本操作 2.1 InputStream 2.2 OutputStream 2.3.字符流读取(Reader) 2.4 字符流写(Writer) 1. File 概述 Java 中通过 java.io.File 类来对⼀个文件…...
SQL 中 INSTR 函数简介及 截取地址应用
一、基本语法与参数解析 语法: INSTR(string1, string2 [, start_position [, nth_occurrence]]) 参数说明: a.string1:源字符串(必选)。 b.string2:需查找的子字符串&am…...
Oracle SYSTEM/UNDO表空间损坏的处理思路
Oracle SYSTEM/UNDO表空间损坏是比较棘手的故障,通常会导致数据库异常宕机进而无法打开数据库。数据库的打开故障处理起来相对比较麻烦,读者可以参考本书第5章进一步了解该类故障的处理过程。如果数据库没有备份,通常需要设置官方不推荐的隐含…...
【HarmonyOs鸿蒙】七种传参方式
一、页面间导航传参 使用场景:页面跳转时传递参数 实现方式:通过router模块的push方法传递参数 // 页面A传参 import router from ohos.router;router.pushUrl({url: pages/PageB,params: { id: 123, name: HarmonyOS } });// 页面B接收参数 Entry Co…...
微信小程序 密码框改为text后不可见,需要点击一下
这个问题是做项目的时候碰到的。 密码框常规写法: <view class"inputBox"><view class"input-container"><input type"{{inputType}}" placeholder"请输入密码" data-id"passwordValue" bindin…...
Gatsby知识框架
一、Gatsby 基础概念 1. 核心特性 基于React的静态站点生成器:使用React构建,输出静态HTML/CSS/JS GraphQL数据层:统一的数据查询接口 丰富的插件系统:超过2000个官方和社区插件 高性能优化:自动代码分割、预加载、…...
TCP协议十大核心特性深度解析:构建可靠传输的基石
TCP(传输控制协议)作为互联网的"交通指挥官",承载着全球80%以上的网络流量。本文将深入解析TCP协议的十大核心特性,通过原理剖析、流程图解和实战案例,揭示其如何实现高效可靠的数据传输。 一、面向连接的可…...
【架构】RUP统一软件过程:企业级软件开发的全面指南
一、RUP概述 RUP(Rational Unified Process,统一软件过程)是由Rational Software公司(后被IBM收购)开发的一种迭代式软件开发过程框架。它结合了传统瀑布模型的系统性和敏捷方法的灵活性,为中大型软件项目提供了全面的开发方法论。 RUP不仅仅是一种过程…...
基于智能家居项目 实现DHT11驱动源代码
DHT11 温湿度传感器的数据读取一般分为 四个步骤,下面详细介绍每个步骤的具体内容: 步骤一:主机发送起始信号 主机(如 MCU)主动向 DHT11 发送开始信号,方式为: 将数据线拉低 至少 18ms&…...
小程序的内置组件
一、Text文本组件 1.Text组件解析 Text组件用于显示文本, 类似于span标签, 是行内元素 user-select属性决定文本内容是否可以让用户选中 space有三个取值(了解) decode是否解码(了解) decode可以解析的有 < > & '    二、Butto…...
T-BOX硬件方案深度解析:STM32与SD NAND Flash存储的完美搭配
在智能网联汽车快速发展的当下,车载 T-BOX(Telematics Box)作为车辆与云端互联的核心枢纽,其性能和可靠性直接决定了用户体验的上限。米客方德(MK)推出的基于 STM32H7RX 主控芯片与 MKDV4GIL-AST࿰…...
hadoop3.x单机部署
jdk hadoop3.x需要jdk8以上的版本 hadoop3.x 从官网下载对应的tar.gz文件 配置环境变量 vim /etc/profile# 需要替换为自己的安装地址!!! export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH$PATH:$JAVA_HOME/bin expo…...
Hadoop的目录结构和组成
Hadoop 目录结构 bin 目录:包含了 Hadoop 的各种命令行工具,如hadoop、hdfs等,用于启动和管理 Hadoop 集群,以及执行各种数据处理任务。etc 目录:存放 Hadoop 的配置文件,包括core-site.xml、hdfs-site.xm…...
深度剖析 RTX 4090 GPU 算力租赁:从技术优势到生态价值的全维度解析
一、引言:当算力成为数字经济的 "新石油" 在 AI 大模型训练成本突破千万美元大关、元宇宙场景渲染需求呈指数级增长的 2025 年,算力已然成为驱动技术创新的核心生产要素。NVIDIA RTX 4090 显卡作为消费级 GPU 的性能天花板,正通…...
基于MATLAB的生物量数据拟合模型研究
一、研究背景 在现代科学研究与工程实践的广泛领域中,数据拟合扮演着举足轻重的角色。从物理学中对复杂物理现象的建模,到生物学里对生物生长规律的探究,数据拟合已成为揭示数据内在规律、构建有效数学模型的关键技术手段。其核心要义在于&am…...
VSCode设置SSH免密登录
引言 2025年05月13日20:21:14 原来一直用的PyCharn来完成代码在远程服务器上的运行,但是PyCharm时不时同步代码会有问题。因此,尝试用VSCode来完成代码SSH远程运行。由于VSCode每次进行SSH连接的时候都要手动输入密码,为了解决这个问题在本…...
微信小程序的开发及问题解决
HttpClient 测试例子 SpringBootTest public class HttpClientTest {/*** 测试通过httpclient发送get方式的请求*/Testpublic void testGET() throws IOException {//创建httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();//创建请求对象HttpGet ht…...
vscode百宝箱工具插件(devtools)
vscode百宝箱插件是一款结合JSON格式化, 正则表达式测试等工具为一体的插件, 直接嵌入到vscode里面, 省去了上网去找相应的工具 一、插件名称:devtools(TraesureBox) 目前插件上传到vscode插件市场, 搜索 devtools 看…...
3.5 统计初步
本章系统阐述统计推断理论基础,涵盖大数定律、抽样分布、参数估计与假设检验等核心内容。以下从六个核心考点系统梳理知识体系: 考点一:大数定律与中心极限定理 1. 大数定律 切比雪夫不等式: 设随机变量 X X X 的数学期望 E (…...
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡 在当今万物互联的时代,物联网设备的稳定运行已成为企业数字化转型的基石。优雅草星云智控系统作为新一代智能监控平台,其设备告警管理模块集成了先进的监控逻辑与人性…...
讯联云库项目开发日志(一)
1、设计数据库 2、写基本框架 entity、controller、service、exception、utils、mapper mapper层: 生成了一系列的CRUD方法 工具类:线程安全的日期工具类、 参数校验工具类 线程安全的日期工具类:主要用于 日期格式化&…...
UE5通过C++实现TcpSocket连接
在 Unreal Engine 5 的 C 项目中,实现一个具备消息监听、心跳检测和断线重连功能的 TCP 客户端,可以参考以下完整示例。 准备工作 1、模块依赖 在 YourModule.Build.cs 文件中,添加对 Sockets 和 Networking 模块的依赖: Publ…...
Spark的缓存
RDD缓存 Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。…...
Vue 3.5 :新特性全解析与开发实践指南
2025 年初,Vue 官方正式发布了 Vue 3.5 版本,为开发者带来了诸多令人期待的新特性和性能优化。本文将全面解析 Vue 3.5 的核心更新内容,帮助你快速上手并应用于实际项目中。 🌟 1. 服务器端渲染(SSR)增强 L…...
电能质量扰动信号信号通过hilbert变换得到瞬时频率
利用Hilbert变换从电能质量扰动信号中提取瞬时频率、瞬时幅值、Hilbert谱和边际谱的详细步骤及MATLAB代码实现。该流程适用于电压暂降、暂升、谐波、闪变等扰动分析。 1. Hilbert变换与特征提取流程 1.1 基本步骤 信号预处理:滤波去噪(如小波去噪&…...
跨境电商数据被入侵后的应急与防护策略
随着跨境电商的全球化发展,数据安全已成为企业运营的核心挑战。一旦数据被入侵,不仅会导致经济损失,还可能引发法律纠纷和品牌声誉危机。本文将从应急响应、技术防护、合规管理三个维度,结合实际案例,提供系统性解决方…...
日拱一卒 | RNA-seq质控分析(2)
之前对这些软件的认识通常是云里雾里的。知道要用哪个软件,从网上抄一些代码,然后改改,就直接用了,对软件的原理不甚了解。此为急需改变的现状。这个过程也许需要重复重复的进行,但是我庆幸自己在实践的过程中了。 1.…...
org.slf4j.MDC介绍-笔记
1. 功能简介 MDC(Mapped Diagnostic Context)是 SLF4J 提供的一个接口,用于在多线程环境中为每个线程存储上下文信息。这些信息通常用于日志记录,帮助开发者快速定位问题。MDC 是基于 ThreadLocal 实现的,这意味着每个…...
推荐几个常用免费的文本转语音工具
推荐几个常用免费的文本转语音工具 在数字内容创作的时代,文本转语音(TTS)技术已经成为内容创作者的得力助手。无论是制作视频配音、有声读物、还是为网站增加语音功能,这些工具都能大幅提高创作效率。今天,我将为大家推荐几款优质的免费文本…...
大白话解释联邦学习
数据孤岛:为何发生?有何危害?如何解决? 什么是数据孤岛? 企业或组织内部,数据因存储分散、标准不一、系统或部门壁垒,导致数据像一座座孤立的岛屿,无法自由流通与整合,…...
Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示
Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示 前言一、回顾SQL标签的内容1. 什么是JSTL SQL标签?2.为什么要用SQL标签?3.第一步:引入SQL标签库4. SQL标签的核心功能:连接数据库标签常用属性&…...
SQL、Oracle 和 SQL Server 的比较与分析
SQL、Oracle 和 SQL Server 的比较与分析 一、基础概念 1. SQL (Structured Query Language) 定义:结构化查询语言,用于管理关系型数据库的标准语言类型: DDL (数据定义语言):CREATE, ALTER, DROPDML (数据操作语言)࿱…...
Java大师成长计划之第21天:Spring Boot快速入门
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代Java开发中,Sprin…...
python_竞态条件
好的,我们通过一个具体的例子来说明在多线程环境中,可变对象和不可变对象的行为差异,以及不可变对象如何避免竞态条件(race condition)。 1. 竞态条件(Race Condition) 竞态条件是指在多线程环…...
【HBase整合Hive】HBase-1.4.8整合Hive-2.3.3过程
HBase-1.4.8整合Hive-2.3.3过程 一、摘要二、整合过程三、注意事项 一、摘要 HBase集成Hive,由Hive来编写SQL语句操作HBase有以下好处: 简化操作:Hive提供了类SQL的查询语言HiveQL,对于熟悉SQL的用户来说,无需学习HBas…...
AI智能分析网关V4助力工厂/工地/车间/能源矿山场景玩手机行为精准检测与安全生产智能化监管
一、方案概述 在数字化时代,智能手机的广泛使用给特定场景带来诸多管理挑战。在工业生产、教育教学、危化品作业等场所,人员玩手机易引发安全隐患。AI智能分析网关V4凭借先进的AI视频分析技术与强大的边缘计算能力,精准识别玩手机行为&…...
云手机服务器搭建
云手机服务器搭建的核心要点及实施指南: 一、硬件与网络基础要求 服务器硬件 需配置至少2核4GB内存的云服务器(推荐华为云、雨云等支持KVM虚拟化的服务商) 必须支持KVM虚拟化技术(需通过CPU虚拟化检测) 建议选择大…...
软考 系统架构设计师系列知识点之杂项集萃(58)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(57) 第95题 RIPv2对RIPv1协议的改进之一为路由器必须有选择地将路由表中的信息发送给邻居,而不是发送整个路由表。具体地说,一条路由信息不会被发送给该信息的…...
【Pandas】pandas DataFrame cumprod
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
Vue.js---分支切换与cleanup
4.2 分支切换与cleanup 1、分支切换 01 const data { ok: true, text: hello world } 02 const obj new Proxy(data, { /* ... */ }) 03 04 effect(function effectFn() { 05 document.body.innerText obj.ok ? obj.text : not 06 })什么是分支切换?就是 d…...
数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall
数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关项目:GitH…...
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
题目分析: 给一个数组,列出它的全排列 算法原理分析: 这里就是一个穷举/枚举的原理,就是罗列所有的可能情况 第一步:画决策树(越详细越好) 就是你如何暴力穷举每一种情况,把你的…...
1.3 不确定性分析
3.1 盈亏平衡分析 3.1.1 盈亏平衡分析的概念和分类 1.概念 销售收入总成本总成本固定成本可变成本(单位可变成本、单位税金及附加) 2.分类 线性盈亏平衡分析、非线性盈亏平衡分析通常只求线性盈亏平衡分析 3.1.2 线性盈亏平衡分析 1.前提条件 产量等于销售量、当年生产…...
端侧智能重构智能监控新路径 | 2025 高通边缘智能创新应用大赛第三场公开课来袭!
2025 高通边缘智能创新应用大赛初赛激战正酣,系列公开课持续输出硬核干货! 5月20日晚8点,第三场重磅课程《端侧智能如何重构下一代智能监控》将准时开启,广翼智联高级产品市场经理伍理化将聚焦智能监控领域的技术变革与产业落地&…...
SAP-12-1
1.描述列事务码的作用: su01:修改密码 se11:创建数据元素,数据表,域 se14:删除数据库的所有数据 se16:数据库查询,插入 se16n:数据删除 se21:创建包 se38:创建程序 se80:对象管理 2.解释下述ABAP基本数据类型的存储数据 I:整型 F:…...
【认知思维】过度自信效应:高估自我能力的认知偏差
什么是过度自信效应 过度自信效应(Overconfidence Effect)是指人们对自己的知识、能力和判断准确性的信心程度系统性地高于实际表现的心理现象。这种认知偏差表现为人们倾向于高估自己的知识水平、预测能力、决策质量和控制感,而低估任务难度…...
【图像处理基石】如何入门AI计算机视觉?
入门AI计算机视觉需要从基础理论、工具方法和实战项目三个维度逐步推进,以下是系统化的学习路径和建议: 一、夯实基础:核心知识储备 1. 数学基础(必备) 线性代数:矩阵运算、特征值分解、奇异值分解&…...