项目实践---贪吃蛇小游戏(下)

  • 对于贪吃蛇小游戏,最主要的还是主函数部分,这里就和大家一一列举出来,
  • 上一章已经写过头文件了,这里就不多介绍了。

  • 首先就是打印桌面,也就是背景,则对应的代码为:
void SetPos(short x, short y)
{//获取标准输出设备的句柄HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);//定位光标的位置COORD pos = { x,y };SetConsoleCursorPosition(houtput, pos);
}void WelcomeToGame()
{system("cls");SetPos(40, 14);wprintf(L"欢迎来到贪吃蛇小游戏\n");SetPos(42, 20);system("pause");system("cls");SetPos(35, 14);wprintf(L"用 w.s.a.d来控制蛇的移动,按q加速,e减速\n");SetPos(35, 15);wprintf(L"加速能够得到更高的分数\n");SetPos(42, 20);system("pause");system("cls");}

  • 然后就是打印墙体,在打印墙体之前,要先声明一下类型,用#define,来定义。则对应的代码为:
void CreateMap()
{//上int i = 0;SetPos(0, 0);for (i = 0; i < 58; i ++){wprintf(L"%lc", WALL);}//下SetPos(0, 26);for (i = 0; i < 58; i++) {wprintf(L"%lc", WALL);}//左for (i = 1; i <= 26; i++){SetPos(0, i);wprintf(L"%lc", WALL);}//右for (i = 1; i <= 26; i++){SetPos(56, i);wprintf(L"%lc",WALL);}
}

  • 然后就是创建蛇身(用链表来实现)和食物,则代码为:
    void InitSnake(pSnake ps)
    {int i = 0;pSnakeNode cur = NULL;for (i = 0; i < 6; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSnake()::malloc");return;}cur->next = NULL;cur->x = POS_X + 2 * i;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->_score = 0;ps->_food_weight = 10;ps->_sleep_time = 200;   //单位是msps->_status = OK;
    }void CreateFood(pSnake ps)
    {int x = 0;int y = 0;//生成2的倍数//x:2~53//y:1~25again:do{x = rand() % 53 + 2;y = rand() % 25 + 1;} while (x % 2 != 0);//x和y的坐标不能和蛇的身体坐标冲突pSnakeNode cur = ps->_pSnake;while(cur){if (x == cur->x && y == cur->y){goto again;}cur = cur->next;}//创建食物的节点pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (pFood == NULL){return;}pFood->x = x;pFood->y = y;pFood->next = NULL;SetPos(x, y);//定义位置wprintf(L"%lc", FOOD);ps->_pFood = pFood;
    }

    有点小多,请耐心看完哦。

  • 蛇的移步和游戏的初始化,则代码为:
    void GameStart(pSnake ps)
    {//1.先设置窗口得大小,再光标隐藏system("mode con cols = 100 lines = 30");system("title 贪吃蛇");HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);//隐藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(houtput, &CursorInfo);//获取控制台光标信息CursorInfo.bVisible = false; //隐藏控制台光标SetConsoleCursorInfo(houtput, &CursorInfo);  //设置控制台光标状态//2.打印环境界面和功能介绍WelcomeToGame();//3.绘制地图CreateMap();//4.创建蛇InitSnake(ps);//5.创建食物CreateFood(ps);
    }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);}
    }

  • 判断下一个坐标是否是食物和下一个位置是食物和下一个位置不是食物,就吃掉食物:则代码为:

    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);//把倒数第二个节点的地址置为NULLcur->next = NULL;
    }

    确实多,请耐心看完。

  • 游戏运行的逻辑,则代码为:
    void GameRun(pSnake ps)
    {//打印帮助信息PrintHelpInfo();do{//打印总分数和食物的分值SetPos(64, 10);printf("总分数:%d\n", ps->_score);SetPos(64, 11);printf("当前食物的分数:%d\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;}}else if (KEY_PRESS(VK_F4)){//减速if (ps->_food_weight > 2){ps->_sleep_time += 30;ps->_food_weight -= 2;}}SnakeMove(ps); //蛇走一步的过程Sleep(ps->_sleep_time);} while (ps->_status == OK);
    }

  • 暂停响应,检测蛇是否撞墙,检测是否撞到自己和结束游戏 - 善后工作,则代码为:
    void pause()
    {while (1){Sleep(200);if(KEY_PRESS(VK_SPACE)){break;}}
    }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 (cur->x == ps->_pSnake->x && cur->y == ps->_pSnake->y){ps->_status = KILL_BY_SELF;break;}cur = cur->next;}
    }void GameEnd(pSnake ps)
    {SetPos(24, 12);switch (ps->_status){case END_NORMAL:wprintf(L"你主动退出\n");break;case KILL_BY_WALL:wprintf(L"您撞上自己了 ,游戏结束!\n");break;case KILL_BY_SELF:wprintf(L"您撞墙了,游戏结束!\n");break;}//释放蛇身的链表pSnakeNode cur = ps->_pSnake;while (cur){pSnakeNode del = cur;cur = cur->next;free(del);}
    }

  • 这贪吃蛇的主函数代码确实多,但也是最重要一部分。请大家耐心看完哦。

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

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

相关文章

MLLM | Mini-Gemini: 挖掘多模态视觉语言大模型的潜力

香港中文、SmartMore 论文标题&#xff1a;Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models Code and models are available at https://github.com/dvlab-research/MiniGemini 一、问题提出 通过更高分辨率的图像增加视觉标记的数量可以丰富…

Power BI 如何创建页面导航器?(添加目录按钮/切换页面按钮)

Power BI 中页导航是什么&#xff1f; 在Power BI中&#xff0c;页导航&#xff08;Page Navigation&#xff09;是指在报告中创建多个页面&#xff08;页&#xff09;&#xff0c;然后允许用户在这些页面之间进行导航的功能。 如下图所示&#xff0c;页导航的选项和报告中的…

嵌入式学习59-ARM8(中断,ADC,内核定时器和传感器)

什么是中断顶半部和底半部 &#xff1f; &#xff08;部分记忆&#xff09;背 上半部&#xff1a; …

Atlas Vector Search:借助语义搜索和 AI 针对任何类型的数据构建智能应用

Atlas Vector Search已正式上线&#xff01; Vector Search&#xff08;向量搜索&#xff09;现在支持生产工作负载&#xff0c;开发者可以继续构建由语义搜索和生成式人工智能驱动的智能应用&#xff0c;同时通过 Search Node&#xff08;搜索节点&#xff09;优化资源消耗并…

SpringCloud系列(12)--服务提供者(Service Provider)集群搭建

前言&#xff1a;在上一章节中我们成功把微服务注册进了Eureka集群&#xff0c;但这还不够&#xff0c;虽然注册服务中心Eureka已经是服务配置了&#xff0c;但服务提供者目前只有一个&#xff0c;如果服务提供者宕机了或者流量过大&#xff0c;都会影响到用户即服务使用者的使…

Oracle数据库的简单使用

Oracle简单使用 一、数据库的介绍二、Oracle介绍账号管理Oracle的安装Oracle服务的作用OracleRemExecService服务创建数据库 常用命令 三、SQL语言SQL分类实用的数据表添加注释数据操纵语言&#xff08;DML&#xff09;查询语句&#xff08;SELECT&#xff09;wherelikedistinc…

pycharm集成github项目,拉取项目并进行代码管理

首先你要有一个github项目&#xff0c;然后找到一个想要拉取github项目的本地路径&#xff0c;打开git命令行&#xff0c;执行git clone http…路径&#xff0c;可能会需要你输入git的用户名和密码&#xff1b;用pycharm打开该项目&#xff1b;添加python解释器&#xff0c;我用…

YOLOv8改进项目汇总-超全改进-ultralyticsPro介绍:订阅了《芒果YOLOv8原创改进专栏》的读者免费赠送,包括很多稀有改进

&#x1f525;&#x1f525;&#x1f525;专注于YOLOv8改进&#xff0c;NEW - YOLOv8 &#x1f680; in PyTorch >, Support to improve Backbone, Neck, Head, Loss, IoU, LA, NMS and other modules&#x1f680; Makes YOLOv8 improvements easy again 芒果出品 YOLOv8…

上汽大通:依托电子签网络,升级产业供应链协同

2023年12月&#xff0c;法大大发布了中国首部《汽车行业合同数智化白皮书》&#xff08;点击阅读及下载&#xff1a;中国首部&#xff01;《汽车行业合同数智化白皮书》重磅发布 | 附下载&#xff09;。该白皮书中基于法大大自身参与汽车行业合同数智化建设的实践和思考&#x…

防反接、防过压、缓启动电路相关

一、防反接电路 电源正确接入时 电流从 VIN 端流向负载&#xff0c;经由 Q3(NMOS) 通向地&#xff08;GND&#xff09;。在上电瞬间&#xff0c;由于 MOS 管的体二极管效应&#xff0c;地回路通过体二极管接通。接下来&#xff0c;由于 Vgs(门源电压)大于 Vgsth(门限电压)&…

【python】python新闻文本数据统计和聚类 (源码+文本)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Bentley二次开发教程02-开发环境搭建

1 Bentley 平台介绍 图 1 Bentley 平台介绍 Bentley 软件大致可分为四大平台&#xff0c;分别为用于设计的 Microstation 平台&#xff0c;用于协同的 ProjectWise 平台&#xff0c;用于对资产进行全生命周期管理的 AssetWise 平台和数据互联互通的 数字孪生平台 iTwin。 1.1 …

Linux文件系统与日志

一、inode和block 文件数据包括元信息与实际数据&#xff0c;文件存储在硬盘上&#xff0c;硬盘最小存储单位是扇区&#xff0c;每个扇区存储512字节 1.block(块)&#xff1a;文件系统中用于存储文件实际数据的最小单位&#xff0c;由文件系统进行分配和管理&#xff0c;并通…

【电子通识】什么是8D分析法?8D步骤及用法?

在问题分析时往往会听到8D报告这样的词汇。如在电源专题【电源专题】案例:电源芯片厂家怎么判断电源芯片端口是否损坏中我们使用的图片就来源于电源芯片厂家的8D报告。 什么是8D分析法? 8D问题分析由美国国防部于1974年创立,当时用于军用物资采购保障。目前在汽车产业、组装…

MapReduce案例-电影网站数据统计分析

本文适合大数据初学者学习MapReduce统计分析业务问题的步骤和基础的MapReduce编程方法&#xff0c;初步掌握Hadoop对计算任务的管理。 本文末尾有全部数据集和完整代码连接。 1.准备工作 安装Hadoop:Hadoop 3.3.2 离线安装-CSDN博客 按照好Hadoop之后要检查一下datanode运行情况…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下&#xff1a;GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

SRS服务接入华为云CDN

CDN简介: CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

SSH远程连接docker容器-Linux-SSH -L 打隧道

问题&#xff1a;在物理机上用podman创建了一个容器&#xff0c;想SSH直接远程连接docker容器 解决方式&#xff1a; 步骤1: 在本地terminal输入以下命令&#xff1a; ssh -L 容器端口号:localhost:容器端口号 物理机用户名物理机ip -p 物理机端口号 即可&#xff0c;可新打…

centos7+mysql57安装以及初始化

1、下载安装yum官方mysql源&#xff1a; http://repo.mysql.com/ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/061472a86e9e4548b76d4603d4614568.png rpm -ivh mysql57-community-release-el7.rpm2、yum安装mysql服务 yum install -y mysql-community-server…

423 世界读书日 和京东零售技术人一起读好书

我们正处于一个复杂、变化的世界&#xff0c;想要更好地理解、适应它&#xff0c;读书可能是最方便的方式之一。 4 月 23 日世界读书日&#xff0c;我们整理了 10 位零售技术人的书籍推荐给大家&#xff0c;欢迎大家一起来共读好书。愿大家在忙碌工作之余&#xff0c;都能够持…