当前位置: 首页 > news >正文

《贪吃蛇小游戏 1.0》源码

好久不见!

终于搞好了简易版贪吃蛇小游戏(C语言版),邀请你来玩一下~

目录

Snake.h

Snake.c

test.c


Snake.h

#include<stdio.h>
#include<windows.h>
#include<stdbool.h>
#include<stdlib.h>
#include<time.h>#define POS_X 24
#define POS_Y 5#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'//类型的声明//蛇的方向
enum DIRECTION
{UP,DOWN,LEFT,RIGHT
};//蛇的状态
//正常,撞墙,撞到自己,正常退出
enum GAME_STATUS
{OK,KILL_BY_WALL,KILL_BY_SELF,END_NORMAL
};//蛇身的节点类型
typedef struct SnakeNode
{//坐标int x;int y;//指向蛇身体下一个节点的指针struct SnakeNode* next;
}SnakeNode, * pSnakeNode;//贪吃蛇
typedef struct Snake
{pSnakeNode _pSnake;//指向蛇头的指针pSnakeNode _pFood;//指向食物的指针enum DIRECTION _dir;//蛇的方向enum GAME_STATUS _status;//蛇的状态int _food_weight;//一个食物的分数int _score;//总分数int _sleep_time;//休息时间,时间越短,速度越快,时间越长,速度越慢
}Snake, * pSnake;//函数的声明//定位光标的位置
void SetPos(short x, short y);//游戏的初始化
void GameStart(pSnake ps);//打印欢迎界面
void WelcomeToGame();//打印地图
void CreateMap();//初始化蛇身
void InitSnake(pSnake ps);//创建食物
void CreateFood(pSnake ps);//游戏运行的逻辑
void GameRun(pSnake ps);//蛇移动,走一步
void SnakeMove(pSnake ps);//判断下一个坐标是否是食物
int NextIsFood(pSnakeNode pn, pSnake ps);//下一个位置是食物,就吃掉食物
void EatFood(pSnakeNode pn, pSnake ps);//下一个位置不是食物
void NoFood(pSnakeNode pn, pSnake ps);//检测蛇是否撞墙
void KillByWall(pSnake ps);//检测蛇是否撞到自己
void KillBySelf(pSnake ps);//游戏善后的工作
void GameEnd(pSnake ps);

Snake.c

#include"Snake.h"//定位光标的位置
void SetPos(short x, short y)
{//获取标准输出设备的句柄HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);//定位控制台里面光标的位置COORD pos = { x,y };SetConsoleCursorPosition(houtput, pos);
}//打印欢迎界面
void WelcomeToGame()
{SetPos(46, 14);wprintf(L"欢迎来到贪吃蛇小游戏\n");SetPos(50, 20);//让“按任意位置继续”的位置好看些system("pause");system("cls");SetPos(30, 14);wprintf(L"用 ↑ . ↓ . ← . → 分别控制蛇的移动, F3为加速,F4为减速\n");SetPos(44, 16);wprintf(L"加速将能得到更高的分数\n");SetPos(48, 20);system("pause");system("cls");}//打印地图
void CreateMap()
{int i = 0;//上for (i = 0; i < 29; i++){wprintf(L"%c", WALL);}//下SetPos(0, 26);for (i = 0; i < 29; i++){wprintf(L"%c", WALL);}//左for (i = 1; i < 26; i++){SetPos(0, i);wprintf(L"%c", WALL);}//右for (i = 1; i < 26; i++){SetPos(56, i);wprintf(L"%c", WALL);}}//初始化蛇身
void InitSnake(pSnake ps)
{int i = 0;pSnakeNode cur = NULL;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSnake()::malloc()");return;}cur->next = NULL;cur->x = POS_X + i * 2;cur->y = POS_Y;//头插法插入链表if (ps->_pSnake == NULL)//指向蛇头的指针为空,空链表{ps->_pSnake = cur;}else//非空链表{cur->next = ps->_pSnake;ps->_pSnake = cur;}}//此时五个节点的链表已创建好,开始打印蛇身cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//设置贪吃蛇的属性ps->_dir = RIGHT;//蛇的方向ps->_status = OK;//蛇的状态ps->_food_weight = 10;//一个食物的分数ps->_score = 0;//总分数ps->_sleep_time = 200; //单位是毫秒}//创建食物
void CreateFood(pSnake ps)
{int x = 0;int y = 0;//x生成是2的倍数//x:2~54//y:1~25
again:do{x = rand() % 53 + 2;y = rand() % 25 + 1;} while (x % 2 != 0);//食物的坐标和蛇身结点的坐标不能冲突pSnakeNode cur = ps->_pSnake;while (cur){if (cur->x == x && cur->y == y){goto again;}cur = cur->next;}//创建食物的节点pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (pFood == NULL){perror("CreateFood()::malloc()");return;}pFood->x = x;pFood->y = y;pFood->next = NULL;SetPos(x, y);wprintf(L"%lc", FOOD);ps->_pFood = pFood;
}void GameStart(pSnake ps)
{//0.先设置窗口大小,再光标隐藏system("mode con cols=115 lines=30");system("title 贪吃蛇");HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息CursorInfo.bVisible = false; //隐藏控制台光标SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态//1.打印游戏界面 + 功能介绍WelcomeToGame();//2.绘制地图CreateMap();//3.创建蛇InitSnake(ps);//4.创建食物CreateFood(ps);
}//右侧提示信息的打印
void PrintHelpInfo()
{SetPos(67, 12);wprintf(L"%ls", L"提示信息如下:");SetPos(67, 14);wprintf(L"%ls", L"1.不能穿墙,不能咬到自己");SetPos(67, 15);wprintf(L"%ls", L"2.用 ↑ . ↓ . ← . → 分别控制蛇的移动");SetPos(67, 16);wprintf(L"%ls", L"3.按F3加速,按F4减速");SetPos(67, 20);wprintf(L"%ls", L"云边有个稻草人@版权");
}#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)&1)?1:0)//暂停游戏
void Pause()
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)){break;}}
}//判断下一个节点是否是食物
int NextIsFood(pSnakeNode pn, pSnake ps)
{return (ps->_pFood->x == pn->x && ps->_pFood->y == pn->y);
}//吃食物
void EatFood(pSnakeNode pn, pSnake ps)
{//头插法将食物插入链表ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;//释放下一个位置的节点free(pn);pn = NULL;pSnakeNode cur = ps->_pSnake;//打印蛇while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_score += ps->_food_weight;//重新创建食物CreateFood(ps);}void NoFood(pSnakeNode pn, pSnake ps)
{//头插pn->next = ps->_pSnake;ps->_pSnake = pn;//打印蛇身pSnakeNode cur = ps->_pSnake;while (cur->next->next != NULL){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//将最后一个节点打印成空白字符SetPos(cur->next->x, cur->next->y);printf("  ");//释放最后一个节点free(cur->next);//将倒数第二个节点的地址置为空cur->next = NULL;
}void KillByWall(pSnake ps)
{if (ps->_pSnake->x == 0 || ps->_pSnake->x == 56 || ps->_pSnake->y == 0 || ps->_pSnake->y == 26){ps->_status = KILL_BY_WALL;}
}void KillBySelf(pSnake ps)
{pSnakeNode cur = ps->_pSnake->next;while (cur){if (ps->_pSnake->x == cur->x && ps->_pSnake->y == cur->y){ps->_status = KILL_BY_SELF;break;}cur = cur->next;}
}void SnakeMove(pSnake ps)
{//创建一个节点,表示蛇即将到达的下一个节点pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (pNextNode == NULL){perror("SnakeMove()::malloc()");return;}switch (ps->_dir){case UP:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y - 1;break;case DOWN:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y + 1;break;case LEFT:pNextNode->x = ps->_pSnake->x - 2;pNextNode->y = ps->_pSnake->y;break;case RIGHT:pNextNode->x = ps->_pSnake->x + 2;pNextNode->y = ps->_pSnake->y;break;}//检测下一个坐标处是否是食物if (NextIsFood(pNextNode, ps)){EatFood(pNextNode, ps);}else{NoFood(pNextNode, ps);}//检测蛇是否撞墙KillByWall(ps);//检测蛇是否撞到自己KillBySelf(ps);
}//运行游戏
void GameRun(pSnake ps)
{//打印帮助信息PrintHelpInfo();do{//打印总分数和食物的分值SetPos(64, 10);printf("总分数:%d\n", ps->_score);SetPos(64, 11);printf("每个食物得分:%2d\n", ps->_food_weight);if (KEY_PRESS(VK_UP) && ps->_dir != DOWN){ps->_dir = UP;}else if (KEY_PRESS(VK_DOWN) && ps->_dir != UP){ps->_dir = DOWN;}else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT){ps->_dir = LEFT;}else if (KEY_PRESS(VK_RIGHT) && ps->_dir != LEFT){ps->_dir = RIGHT;}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){ps->_status = END_NORMAL;}else if (KEY_PRESS(VK_F3)){if (ps->_sleep_time > 80){ps->_sleep_time -= 30;ps->_food_weight += 2;//⼀个⻝物分数最⾼是20分}}else if (KEY_PRESS(VK_F4)){if (ps->_sleep_time > 2){ps->_sleep_time += 30;ps->_food_weight -= 2;//⼀个⻝物分数最低是2分}}//蛇每次⼀定之间要休眠的时间,时间短,蛇移动速度就快Sleep(ps->_sleep_time);SnakeMove(ps);} while (ps->_status == OK);
}//游戏善后工作
void GameEnd(pSnake ps)
{SetPos(44, 12);switch (ps->_status){case END_NORMAL:printf("您主动退出游戏\n");break;case KILL_BY_WALL:printf("撞到墙上了,游戏结束\n");break;case KILL_BY_SELF:printf("撞到自己了,游戏结束\n");break;}//释放蛇身的链表pSnakeNode cur = ps->_pSnake;while (cur){pSnakeNode del = cur;cur = cur->next;free(del);}
}

test.c

#include<locale.h>
#include "Snake.h"//完成的是游戏的测试逻辑
void test()
{int ch = 0;do{system("cls");//创建贪吃蛇Snake snake = { 0 };//初始化游戏//1.打印游戏界面//2.功能介绍//3.绘制地图//4.创建蛇//5.创建食物//6.设置游戏的相关信息GameStart(&snake);//运行游戏GameRun(&snake);//结束游戏GameEnd(&snake);SetPos(30, 15);printf("再来一局吗? Y/N");ch = getchar();while (getchar() != '\n');} while (ch == 'Y' || ch == 'y');SetPos(0, 27);
}int main()
{setlocale(LC_ALL, "");srand((unsigned int)time(NULL));test();return 0;
}


分享一首宝藏歌曲 

Not Angry_Chris James_高音质在线试听_Not Angry歌词|歌曲下载_酷狗音乐

如有不正确的地方不妨大胆的提出来哦~

我是云边有个稻草人

期待与你的下一次相遇

相关文章:

《贪吃蛇小游戏 1.0》源码

好久不见&#xff01; 终于搞好了简易版贪吃蛇小游戏&#xff08;C语言版&#xff09;&#xff0c;邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…...

初入网络学习第一篇

引言 不磨磨唧唧&#xff0c;跟着学就好了&#xff0c;这个是我个人整理的学习内容梳理&#xff0c;学完百分百有收获。 1、使用的网络平台:eNSP 下载方法以及内容参考这篇文章 华为 eNSP 模拟器安装教程&#xff08;内含下载地址&#xff09;_ensp下载-CSDN博客https://b…...

(项目管理系列课程)项目规划阶段:项目范围管理-收集需求

在项目管理中&#xff0c;“规划过程组”是指一系列旨在定义和细化项目目标、规划如何达到这些目标并管理项目工作的过程。在这个过程中&#xff0c;“收集需求”是一个至关重要的活动&#xff0c;它涉及到识别和记录项目干系人的需求&#xff0c;以确保项目最终能够满足干系人…...

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时&#xff0c;表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时&#xff0c;表示限制mysqld只能在/tmp目录中执行导入导出&#xff0c;其他目录不能导出导入。 secure_fil…...

想成为月薪过万的软件测试工程师?快看过来!

软件测试人员的工作主要是检测软件系统中的存在的BUG&#xff0c;但并不是毫无逻辑的盲目抓瞎。学会运用测试思维去完成测试工作&#xff0c;会使你的工作事半功倍。 01 软件测试的前提假设 测试人员进行软件测试的基本假设是“有罪推断”。即&#xff1a;认为被测程序一定是…...

找生网站方案———未来之窗行业应用跨平台架构

1&#xff09;网站设计方面的考虑 主色调采用于公司深蓝色颜色&#xff0c;网页整体色彩明快、大气、简洁&#xff0c;每个细节均经过精心处 理&#xff0c;网页浏览快速&#xff0c;导航明确清晰。 网页设计要充分考虑网页的整体感觉&#xff0c;每个页面的图片与网站色调的过…...

全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!

博客主页&#xff1a;长风清留扬-CSDN博客系列专栏&#xff1a;Python基础专栏每天更新大数据相关方面的技术&#xff0c;分享自己的实战工作经验和学习总结&#xff0c;尽量帮助大家解决更多问题和学习更多新知识&#xff0c;欢迎评论区分享自己的看法感谢大家点赞&#x1f44…...

插入排序,希尔排序,和归并排序

每一本数据结构和算法的教科书中&#xff0c;都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗&#xff1f;当然用不到。那么为什么全世界的教科书都这么写呢&#xff1f;显然是醉翁之意不在酒。 数组&#xff0c;是每个编…...

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…...

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker&#xff0c;负责整个kafka集群的…...

吉如一线段树:区间最值和历史最值

区间最值和历史最值 问题一 给定一个长度为 n n n 的数组 a a a , 实现以下三种操作 : 0 l r x : 将 a r r [ l ∼ r ] arr[l\sim r] arr[l∼r] 范围的每个数 v v v , 更新为 min ⁡ ( v , x ) \min (v, x) min(v,x) 1 l r : 查询 max ⁡ i l r a r r i \max_{il}^r ar…...

数据库常见的安全特性有哪些

数据库的安全特性主要包括以下几个方面&#xff0c;以确保数据的机密性、完整性和可用性&#xff1a; 1. 身份验证&#xff08;Authentication&#xff09; 数据库系统会通过身份验证来确定用户的身份&#xff0c;常见的方式有用户名/密码验证、基于证书的验证、多因素验证&a…...

Debezium日常分享系列之:Debezium 3.0.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标 MariaDB连接器的更改版本 11.4.3 支持 MongoDB连接器的更改MongoDB sink connector MySQL连接器的改变MySQL 9MySQL…...

MVCC(多版本并发控制)

目录 1.MVCC的工作原理2.MVCC的优点3.例子 MVCC&#xff08;多版本并发控制&#xff09;是一种用于数据库管理系统中实现并发控制的技术。它允许多个事务同时对数据库进行读写操作&#xff0c;而不会相互干扰&#xff0c;从而提高数据库系统的性能和可用性。MVCC通过为每个事务…...

低代码可视化-uniapp响应式数据data-代码生成器

在uniapp框架中&#xff0c;data 是一个核心的概念&#xff0c;它代表了组件或uniapp实例中的响应式数据。这些数据是组件状态的基础&#xff0c;uniapp会根据这些数据的变化来更新DOM&#xff0c;从而保持视图与数据的同步。 data 的特点 响应式&#xff1a;uniapp使用一种称…...

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…...

基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和

这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决&#xff0c;但其实不能&#xff0c;因为 nums 中的元素可能存在负数&#xff0c;就不能保证其单调性的性质。 用前缀和求也不易想到&#xff0c;…...

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…...

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言&#xff1a; 人类居住环境通常是高度动态的&#xff0c;人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作&#xff0c;仅仅建立一…...

一个迷茫的25岁前端程序员的自述

作者&#xff1a;一尾流莺 一直听说程序员的危机在 35 岁&#xff0c;没想到我的危机从 25 岁就开始了。 我甚至不知道自己是不是 25 岁&#xff0c;也可能是 26 岁&#xff0c;或者 27 岁&#xff0c;1998 年的生日&#xff0c;按照 2023 - 1998 的算法就是 25&#xff0c;按…...

2026年SSL证书市场便宜且安全的SSL证书调研

随着互联网安全标准的不断升级&#xff0c;HTTPS加密已成为网站和各类数字应用的“标配”。然而&#xff0c;对于广大的中小企业、个人开发者以及初创团队而言&#xff0c;如何在控制成本的前提下&#xff0c;获取一张既便宜又足够安全的SSL证书&#xff0c;始终是一道棘手的难…...

告别手动下载:用CNKI-download轻松实现知网文献批量获取

告别手动下载&#xff1a;用CNKI-download轻松实现知网文献批量获取 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 还在为毕业论文的文献收…...

上海AI实验室发布WildClawBench:AI智能体究竟能走多远?

这项由上海人工智能实验室联合香港中文大学、复旦大学、中国科学技术大学、上海交通大学、清华大学、浙江大学及南洋理工大学等多所顶尖机构共同完成的研究&#xff0c;于2026年5月11日以预印本形式发布&#xff0c;论文编号为arXiv:2605.10912v1。感兴趣的读者可通过该编号在a…...

向量库+RAG+大模型在医疗AI中为何常显不足?揭秘图谱如何重塑医疗知识系统信任度!

文章指出&#xff0c;在医疗AI领域&#xff0c;单纯依赖向量库RAG大模型的经典路线已显不足。医疗场景对知识系统的要求远超“语义相似度”&#xff0c;涉及适应症、禁忌症、证据等级等严格约束。知识图谱在医疗AI中的重要性日益凸显&#xff0c;它不仅能够构建知识间的关系网络…...

IPBan服务器防护解决方案:智能拦截恶意IP的实战指南

IPBan服务器防护解决方案&#xff1a;智能拦截恶意IP的实战指南 【免费下载链接】IPBan Since 2011, IPBan is the worlds most trusted, free security software to block hackers and botnets. With both Windows and Linux support, IPBan has your dedicated or cloud serv…...

Transformers 模型推理

Transformers 系列文章目录 第一章 Transformers 简介&#xff1b; 第二章 Transformers 模型推理 文章目录Transformers 系列文章目录前言Transformers模型推理一、Transformers读取预训练模型1.Transformers读取预训练模型&#xff0c;都是已经预训练好的&#xff0c;拿来即…...

网关端口映射和路由器端口转发有什么区别?配置要点全解析

一、什么是网关端口映射网关端口映射是指通过路由器、防火墙等网关设备&#xff0c;建立“公网IP:外部端口”与“内网设备IP:内部端口”之间的一对一映射通道&#xff0c;让外网用户能够访问内网中的特定服务。‍形象理解&#xff1a;网关相当于“小区保安”&#xff0c;公网IP…...

2026年5月19日OpenBSD 7.9发布:多架构更新、内核创新,安全与性能双提升!

2026年5月19日&#xff0c;开源操作系统OpenBSD 7.9正式发布&#xff0c;作为第60个版本&#xff0c;它带来内核与用户空间多层面更新&#xff0c;预计在开源社区持续发挥重要作用。平台支持全面扩展arm64架构新增Rockchip RK3588与RK3576芯片支持&#xff0c;amd64平台MAXCPUs…...

3步掌握Jellyfin智能字幕插件:新手快速上手指南

3步掌握Jellyfin智能字幕插件&#xff1a;新手快速上手指南 【免费下载链接】jellyfin-plugin-maxsubtitle 一个 Jellyfin 中文字幕插件&#xff08;未来可以不局限中文&#xff09; 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-maxsubtitle MaxSubti…...

夜色 galgame官方正版2026最新版pc免费下载(看到请立即转存 资源随时失效)手机版通用

下载链接、 解压密码&#xff1a;WWW.FZGAMER.COM 《夜色》&#xff08;Muse&#xff1a;Night Out&#xff09;&#xff1a;基于图像解密与非对称博弈的独立派对游戏解析 在第一人称射击、硬核动作或竞技音游占据主流市场的当下&#xff0c;专注于“非对称信息传递”与“图像…...