c语言实现贪吃蛇小游戏

源码

/** * FileName: snakec* Author:PowerKing    * Version:V1.0* Date:2024.6.28* Description:  贪吃蛇小游戏*/#include <curses.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>/*贪吃蛇游戏
*/#define UP     1
#define DOWN   -1
#define LEFT   2
#define RIGHT  -2
struct Snake
{//蛇身子节点int row;int col;struct Snake *next;
};struct Snake food;void initFood()
{int x = rand()%20;int y = rand()%20;food.row = x;food.col = y;
}struct Snake *head = NULL;
struct Snake *tail = NULL;
int key;
int dir;
void initNcurse()
{initscr();keypad(stdscr,1);noecho();//防止地图乱。
}int hasSnakeNode(int i, int j)
{struct Snake *p;p = head;while(p !=NULL){if(p->row == i && p->col == j){return 1;}p = p->next;}return 0;
}int hasFood(int i, int j)
{if(food.row == i && food.col ==j){return 1;}return 0;
}void gamePic()
{ int row;int col;//移动光标,目的,覆盖原地图位置move(0,0);for(row = 0; row < 20; row++){if(row == 0){for(col = 0; col < 20; col++){printw("--");}printw("\n");            }if(row >=0 && row <=19 ){for(col = 0; col <= 20; col++){if(col == 0 || col == 20){printw("|");}else if(hasSnakeNode(row,col)){printw("[]");}else if(hasFood(row,col)){printw("##");}else{printw("  ");}} printw("\n");}if(row == 19){for(col = 0; col < 20; col++){printw("--");}   printw("\n");printw("By PowerKing,key=%d,food x = %d,y=%d\n",key,food.row,food.col);  }}
}
void addNode()
{struct Snake *new  = (struct Snake *)malloc(sizeof(struct Snake));new->next = NULL;switch(dir){case UP:new->row = tail->row-1;  new->col = tail->col;break;case DOWN:new->row = tail->row+1;new->col = tail->col;break;case LEFT://左的逻辑,跟刷新速度有关,刷新够快,同一行左键已经刷新了好几个,就感官上看着正常了new->row = tail->row;new->col = tail->col-1;break;case RIGHT:new->row = tail->row;new->col = tail->col+1;break;}tail->next = new;tail = new;
}
void initSnake()
{struct Snake *p = NULL;//初始方向dir = RIGHT;//撞墙会重新开局,重新开局需要把原来的蛇给释放掉while(head !=NULL){p = head;head = head->next;free(p);}head = (struct Snake *)malloc(sizeof(struct Snake));head->row = 2;head->col = 2;head->next= NULL;tail = head;addNode();addNode();
}
void deleNode(){struct Snake *p;p = head;head = head->next;free(p);
}int ifSnakeDie()
{struct Snake *p;p = head;//判断是否撞墙if(tail->row < 0 || tail->row == 20 ||  tail->col == 0 || tail->col == 20){return 1;}//判断是否自己头碰到身子while(p->next != NULL){if(p->row == tail->row && p->col == tail->col){return 1;}p = p->next;}return 0;
}void moveSnake(){addNode();//如果吃到食物,重新生成一个食物,不必删除节点if(hasFood(tail->row,tail->col)){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();initFood();gamePic();pthread_create(&t1,NULL,refreshJieMian,NULL);//两个线程之间加个时延,这样不会同时瞬间操作,造成地图紊乱信息出现。usleep(1000);pthread_create(&t2,NULL,changeDir,NULL);while(1);getch();endwin();return 0; 
}

运行

安装有gcc编译器。
执行编译命令:

gcc snake.c -o snake -lcurses -lpthread
./snake

结果截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ 递归

递归函数是指在函数定义中调用自身的函数。C语言也支持递归函数。 下面是一个使用递归函数计算阶乘的例子&#xff1a; #include <iostream> using namespace std;int factorial(int n) {// 基本情况&#xff0c;当 n 等于 0 或 1 时&#xff0c;阶乘为 1if (n 0 || n…

S32K3 工具篇2:如何在S32DS中使用Segger JLINK下载

S32K3 工具篇2&#xff1a;如何在S32DS中使用Segger JLINK下载 一&#xff0c; S32DS中JLINK下载1.1 Segger JLINK 驱动1.2 S32DS JLINK驱动路径配置1.3 S32DS JLINK debug configuration1.4 S32DS JLINK debug S32K3板子结果 二&#xff0c; JLINK驱动实现S32K344代码下载2.1 …

mysql数据库备份-使用自带工具mysqldump备份工具,mysqlimport/source导入工具

MysqlLimport介绍 MySCLimport是MysQL数据库中的一个命令行工具&#xff0c;用于将数据从外部文件导入MySQL数据库中的表中。它可以导入多种格式的数据&#xff0c;包括CSV、TXT、XML和SQL文件等。本文将介绍MySQLimport的用法&#xff0c;并通过代码示例演示如何使用它来导入…

高考落幕,暑期西北行,甘肃美食等你来尝

高考结束&#xff0c;暑期来临&#xff0c;西北之旅成为许多人的热门选择。而来到甘肃&#xff0c;除了领略壮丽的自然风光和深厚的历史文化&#xff0c;甘肃特产和传统面点以其独特的风味和传统的制作工艺也为游客们带来了一场地道的甘肃美食体验。 平凉的美食&#x…

c++ try 函数

在C中&#xff0c;try函数用于捕获和处理异常。以下是一个演示try函数的示例&#xff1a; #include <iostream> #include <stdexcept>double division(int x, int y) {if (y 0) {throw std::runtime_error("Divide by zero error");}return x / y; }in…

005-GeoGebra基础篇-GeoGebra的点

新手刚开始操作GeoGebra的时候一般都会恨之入骨&#xff0c;因为有些操作不进行学习确实有些难以凭自己发现。 目录 一、点的基本操作1. 通过工具界面添加点2. 关于点的选择&#xff08;对象选择通用方法&#xff09;&#xff08;1&#xff09;选择工具法&#xff08;2&#xf…

Vue3使用jsbarcode生成条形码,以及循环生成条形码

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享Vue3使用jsbarcode生成条形码&#xff0c;以及循环生成条形码&#xff0c;介绍了JsBarcode插件的详细使用方法&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻…

【Docker】集群容器监控和统计 CAdvisor+lnfluxDB+Granfana的基本用法

集群容器监控和统计组合&#xff1a;CAdvisorlnfluxDBGranfana介绍 CAdvisor&#xff1a;数据收集lnfluxDB&#xff1a;数据存储Granfana&#xff1a;数据展示 ‘三剑客’ 安装 通过使用compose容器编排&#xff0c;进行安装。特定目录下新建文件docker-compose.yml文件&am…

日志分析-windows系统日志分析

日志分析-windows系统日志分析 使用事件查看器分析Windows系统日志 cmd命令 eventvwr 筛选 清除日志、注销并重新登陆&#xff0c;查看日志情况 Windows7和Windowserver2008R2的主机日志保存在C:\Windows\System32\winevt\Logs文件夹下&#xff0c;Security.evtx即为W…

【OCPP】ocpp1.6协议第4.8章节Start Transaction的介绍及翻译

目录 4.8、开始交易Start Transaction-概述 Start Transaction StartTransaction.req 请求消息 StartTransaction.conf 确认消息 交易管理流程 小结 4.8、开始交易Start Transaction-应用场景 1. 公共充电站 场景要点: 2. 商业充电设施 场景要点: 3. 住宅充电桩 …

【51单片机】串口通信(发送与接收)

文章目录 前言串口通信简介串口通信的原理串口通信的作用串口编程的一些概念仿真图如何使用串口初始化串口串口模式波特率配置 发送与接收发送接收 示例代码 总结 前言 在嵌入式系统的开发中&#xff0c;串口通信是一种常见且重要的通信方式。它以其简单、稳定的特性在各种应用…

使用c++回旋打印二叉树的节点

设计一个算法来回旋打印二叉树的节点。这个算法的基本思想是使用层序遍历&#xff08;广度优先搜索&#xff09;来访问树的节点&#xff0c;但是在打印时交替改变方向。下面是用C实现的代码 #include <iostream> #include <queue> #include <vector> #inclu…

[小试牛刀-习题练]《计算机组成原理》之计算机系统概述【详解过程】

【计算机系统概述】 1、【冯诺伊曼结构】计算机中数据采用二进制编码表示&#xff0c;其主要原因是&#xff08;D&#xff09; I、二进制运算规则简单II、制造两个稳态的物理器件较为容易III、便于逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I、Ⅲ C.仅Ⅱ、Ⅲ D. I、Ⅱ、Ⅲ I…

基于 Spring Boot 的健康咨询系统

1 项目介绍 1.1 摘要 本项目旨在通过构建一个对用户更加友好的健康咨询平台&#xff0c;帮助用户方便、快捷地获取专业并且准确的健康咨询服务&#xff0c;同时为医疗机构提供一个高效易用的可以提供信息管理的服务平台。 项目采用了Spring Boot框架作为主要的开发平台。本系…

论文阅读_基于嵌入的Facebook搜索

英文名称&#xff1a;Embedding-based Retrieval in Facebook Search 中文名称&#xff1a;基于嵌入式检索的Facebook搜索 时间&#xff1a;Wed, 29 Jul 2020 (v2) 地址&#xff1a;https://arxiv.org/abs/2006.11632 作者&#xff1a;Jui-Ting Huang, Ashish Sharma, Shuying …

Postman设置请求间自动保存返回参数,方便后续请求调用,减少复制粘贴

postman中常常出现&#xff1a;有两个请求&#xff0c;一个请求首先获取验证码或者token&#xff0c;再由得到的验证码或token编写body发送另一个请求。如何设置两个请求间自动关联相关数据呢&#xff1f; 通过环境存储全局变量 现在有两个请求如下图&#xff0c;生成验证码是…

如何将Hive表的分区字段插入PG表对应的时间戳字段?

文章目录 1、背景描述2、场景分析 1、背景描述 数据仓库的建设通常是为业务和决策服务的。在数仓开发的应用层阶段&#xff0c;BI可以直接从主题层/业务层取数&#xff0c;而前端需要根据具体的作图需求通过后端查询数据库 作图的指标需要根据主题层/业务层做查询计算&#xf…

保姆教程教你如何使用数据集运行ORB-SLAM3

链接: 自学SLAM&#xff08;2&#xff09;—保姆教程教你如何使用自己的视频运行ORB-SLAM2 这篇文章是详细教怎么运行ORB-SLAM2的&#xff0c;那么下来我们就看看怎么运行ORB-SLAM3 理论上ORB-SLAM2的环境也是可以跑ORB-SLAM3的&#xff0c;因为我之前试过&#xff0c;编译成功…

最佳学习率和Batch Size缩放中的激增现象

前言 《Surge Phenomenon in Optimal Learning Rate and Batch Size Scaling》原文地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了中文翻译。还有部分最佳示例教程。如果有帮助到大家&a…

24/06/29(21.1205)程序的编译和链接

源文件 ---> 可执行文件,这一过程要执行的流程: 预处理 编译 汇编 链接 组成每一个程序的每个源文件通过编译过程分别转换成目标代码;每个目标代码由链接器捆绑在一起,形成一个单一而完整的可执行程序;链接器同时也会引入标准函数库中任何被该程序所用到的函数,而且它可以…