贪吃蛇游戏的实现

一.技术要点:

贪吃蛇需要掌握:

        c语言函数,枚举,结构体,动态内存管理,预处理指令,链表,Win32 API等

二.Win32 API

1.Win32 API简介

windows可以帮应用程序卡其视窗,描绘图案,使用周边设备,,Win32 API就是windows32位平台上的应用程序编程接口

2.控制台程序

(1).使用cmd命令设置控制台窗口的长宽

输入mode con cols=100 lines=30

(2.)可以通过命令设置控制台的窗口的名字

title xxx

(3.)C语言的system函数实现控制台的命令

#include<stdio.h>
#include<stdlib.h>
int main()
{
    system("mode con cols=50 lines=20");
    system("title 贪吃蛇");
    system("pause");

    return 0;
}

(4.)控制台屏幕上的坐标

COORD是windows API中定义的结构体,表示一个字符在控制台屏幕缓冲区上的坐标,坐标(0,0)位于缓冲区左上角

CORRD类型声明:

typedef struct _CORRD
{
    SHORT X;
    SHORT Y;
}CORRD, *PCORRD;

给结构体定坐标:

#include <windows.h>
CORRD pos = { 10,15 };

(5.)GetStdHandle获取设备

它也是一个windows API函数,用于从一个特定的标准设备(标准输入,标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备

函数的声明:

HANDLE GetStdHandle(DWORD nStdHandle);

eg.

HANDLE hOutput = NULL;

//获取标准输出的句柄
hOutput = GetStHandle(STD_OUTPUT_HANDLE);

(6.)GetConsoleCursorInfo获取光标信息

检索有关指定控制台屏幕缓冲区的光标大小和可见性信息(鼠标信息)

函数的声明:

BOOL WINAPI GetConsoleCursorInfo(
    HANDLE               hConsoleOutput 
    PCONSOLE_CURSOR_INFO lpConsoleCursorInfo 
);

 PCONSOLE_CURSOR_INFO是指向CONSOLE_CURSOR_INFO结构的指针,该结构接受有感主机游标(光标)的信息

eg.

#include <windows.h>
int main()
{
    CONSOLE_CURSOR_INFO cursor_info = { 0 };
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleCursorInfo(handle,&cursor_info);
    return 0;
}

CONSOLE_CURSOR_INFO是结构体,其中有两个成员,:bVisible和dwSize分别控制光标的可可见性和大小

(7.)SetConsoleCursorPosition设置光标位置

void SetPos(int x,int y)
{
    //获得设备句柄
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    //根据句柄设置光标位置
    CORRD pos = { x,y };
    SetConsoleCursorPosition(handle,pos);
}

(8.)GetAsyncKeyState获取按键情况

想要判断一个键是否被按,可以检测GetAsyncKeyState返回值的最低为是否为1

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)

eg.

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)
int main()
{
    while(1)
    {    
        if(KEY_PRESS(0x30))
            printf("0\n");
        else if(KEY_PRESS(0x31))
            printf("1\n");
        else if(KEY_PRESS(0x32))
            printf("2\n");
        else if(KEY_PRESS(0x33))
            printf("3\n");
        else if(KEY_PRESS(0x34))
            printf("4\n");
        ......
    }
}

这样可以在按下数字键是在屏幕上输出数字

三.贪吃蛇游戏的设计与分析

一.地图

1.<locale.h>本地化

<locale.h>提供的函数用于控制C标准库中对于不同地区会产生不一样的行为的部分

在标准中,依赖地区的部分有以下几项:

1.数字量的格式

2.货币量的格式

3.字符集

4.日期和时间的表示形式

2.类项

1.LC_COLLATE:影响字符串比较函数strcoll()和strxfrm()

2.LC_CTYPE:影响字符处理函数的行为

3.LC_MONCTARY:影响货币格式

4.LC_NUMERIC:影响printf()的数字格式

5.LC_TIME:影响时间格式strftime()和wcsfting()

6.LC_ALL:针对所有类项修改,将以上的多有类别设置为给定的语言环境

3.setlocale函数

该函数用于修改当前的地区,可以针对一个类项,也可以针对所有类项

函数声明:

char* setlocale(int category,const char* locale);

第一个参数是修改的类项,第二个为地区

C的标准给了第二个参数2种可能取值:1."C"(正常模式)  2.""(本地模式)

在任意程序执行开始时,会隐藏执行调用setlocale(LC_ALL,"C");

第二个参数也可以传入NULL,通过传入NULL可以查询默认的本地信息

4.宽字符的打印

一个宽字符占领个字符的位置

int main()
{
    setlocale(LC_ALL,"");
    
    wchar_t ch = L'中国';

    wprintf(L"%lc",ch);

    return 0;
}

5.地图坐标

可以假设设计一个27行,58列的地图并围绕地图画出墙壁,如下

二.蛇身和食物

蛇身

可以初始化蛇身长度为5,在随机坐标出现蛇,连续五个节点代表蛇身

注意:为了防止社的一个节点的一半出现在墙体里,另一半在墙外,最好让蛇身的每一个节点的X坐标为2的倍数

食物

在墙体内随机生成一个坐标(x的坐标必须为2的倍数),同时坐标不能与蛇身重合

如图:

三.数据结构设计

一.蛇身节点

蛇身可以使用链表设计,需要存储的信息为当前节点的蛇身的坐标(x,y)和下一个节点

typedef struct snakenode
{
    int x;
    int y;//节点坐标
    struct snake* next;
}snakenode, * psnakenode;

二.贪吃蛇状态

enum GAME_STATUS
{
    OK = 1,
    ESC,
    KILL_BY_WALL,
    KILL_BY_SELF
};

enum DIRECTION
{
    UP = 1,
    DOWN,
    LEFT,
    RIGHT
};

typedef struct snake
{
    psnakenode psnake;//维护整条蛇的指针
    psnakenode pfood; //指向食物的指针
    int score;        //当前累计的分数
    int foodweight;   //一个食物的分数
    int sleeptime;    //蛇休眠的时间.休眠时间越短,蛇移动的速度越快
    enum GAME_STATUS status;
    //游戏当前的状态
    enum DIRECTION dir;
    //蛇的运动方向
}snake,psnake;

三.开始游戏

void gamestart(psnake ps)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在群晖中本地部署WPS Office并实现公网远程访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

最优化基础 - (最优化问题分类、凸集)

系统学习最优化理论 什么是最优化问题&#xff1f; 决策问题&#xff1a; &#xff08;1&#xff09;决策变量 &#xff08;2&#xff09;目标函数&#xff08;一个或多个&#xff09; &#xff08;3&#xff09;一个可由可行策略组成的集合&#xff08;等式约束或者不等式约束…

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实…

2024.1.29 GNSS 学习笔记

1.假设只对4颗卫星进行观测定位&#xff0c;卫星的截止高度角是15&#xff0c;那么如何布设这四颗卫星的位置&#xff0c;使其围成的四面体的体积得到最大&#xff0c;以获得最好定位精度&#xff1f; 答&#xff1a;3颗卫星均匀分布在最低仰角面上&#xff0c;第4颗卫星在测站…

live2D学习:表情的制作和给角色添加动作

表情的制作和给角色添加动作https://www.bilibili.com/video/BV1JE411Y7Te?p3&vd_source124076d7d88eee393a1d8bf6fc787efa 先把眼睛以外的部件进行锁定&#xff0c;可以长按鼠标左键&#xff0c;然进行框选左边的锁的部分&#xff0c;快速进行操作。 锁定的部件就没有办…

力扣712. 两个字符串的最小ASCII删除和

动态规划 思路&#xff1a; 假设 dp[i][j] 是 s1 长度 i 和 s2 长度 j 两个字符串的最小 ASCII 删除和&#xff1b;dp[i][j] 可以由&#xff1a; 如果 s1 的第 i 个字符&#xff08;s1[i - 1]&#xff09;和 s2 的第 j 个字符&#xff08;s2[j - 1]&#xff09;不相等&#xf…

这么复杂的刻度标签怎么绘制?超简单~~

今天我们开始「粉丝要求绘图系列」的第一篇推文 &#xff0c;这个系列我会筛选出需求较多的一类图进行绘制讲解&#xff0c;当然&#xff0c;绘图的数据我们尽可能的全部分享出来(即使涉及一些论文数据&#xff0c;我们也会根据情况进行虚构处理的)&#xff0c;本期的推文重要涉…

如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择

大多数WordPress站点首页默认都是显示最新发布的文章列表&#xff0c;不过有些站点比较特殊&#xff0c;只想显示某一篇文章的全部内容&#xff0c;那么应该怎么设置呢&#xff1f; 其实&#xff0c;WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…

Java规则引擎:实现高效SQL变量数据处理的关键

SQL变量加工 SQL加工背景&#xff0c;在决策配置过程中&#xff0c;一些复杂的逻辑或模型可通过自定义SQL脚本编写创建数据变量&#xff0c;通过SQL脚本可以便捷的从数据库中取数&#xff0c;并且自定义SQL支持传参&#xff0c;可满足更复杂多变的数据加工处理。 注意&#x…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树

文章目录 第5章 决策树5.1 决策树模型与学习5.1.1 决策树模型5.1.2 决策树与if-then规则5.1.3 决策树与条件概率分布5.1.4 决策树学习5.2 特征选择5.2.1 特征选择问题5.2.2 信息增益5.2.3 信息增益比5.3.1 ID3算法5.3.2 C4.5的生成算法5.4 决策树的剪枝5.5 CART算法5.5.1 CART生…

步进伺服控制芯片TMC4361

TMC4361A 数据手册 步进电机运动控制器&#xff0c;支持 S 型斜坡和 sixPoint 六点式斜坡&#xff0c;进行了高速优化&#xff0c;支持动态修改运动参数。TMC4361A 包含 SPI 接口、Step/Dir 接口及闭环所需的编码器接口。 特征  简单易用的与微处理器通讯的 SPI 接口。  与…

操作系统基础:处理机调度【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 处理机调度&#xff08;上&#xff09;1.1 基本概念1.1.1 总览1.1.2 什么是调度1.1.3 调度的三个层次1.1.4 七状态模型1.1.5 三层调度的联系与对比1.1.6 总结 1.2 方式与…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

linux批量查询python进程,批量关闭

我使用bash脚本启动了一个多进程的python代码&#xff0c;但是由于遗忘的问题&#xff0c;查看队列发现进程还在&#xff0c;但是我并不是使用linux的screen后台启动的&#xff0c;启动的进程丢失了&#xff0c;找不到启动这个的主进程了。我想能不能通过查询python启动命令&am…

HBuilderX插件

HBuilderX>工具插件安装 安装新插件 前往插件市场安装 1.DCloud插件市场 https://ext.dcloud.net.cn/ 2.GitHub官网 插件项目(下载zip) 本地离线包 离线安装插件 https://hx.dcloud.net.cn/Tutorial/OfflineInstall open /Applications/HBuilderX.app/Contents/HBuilderX/p…

【Linux】—— 信号的产生

本期&#xff0c;我们今天要将的是信号的第二个知识&#xff0c;即信号的产生。 目录 &#xff08;一&#xff09;通过终端按键产生信号 &#xff08;二&#xff09;调用系统函数向进程发信号 &#xff08;三&#xff09;由软件条件产生信号 &#xff08;四&#xff09;硬件…

硬件知识(2) 手机的传感器-sensor

#灵感# 看看小米在干啥 手机型号&#xff1a;Redmi Note 13 Pro&#xff0c;解读一下它宣传的手机卖点。 目录 宣传1&#xff1a;1/1.4" 大底&#xff0c;f/1.65 大光圈&#xff0c; 宣传2&#xff1a;支持 2 亿像素超清直出&#xff0c;分辨率高达 16320 x 12240 宣…

SeaTunnel Web安装 一把成

安装相关jar包&#xff0c;以及SeaTunnel 和Web 打成的包&#xff0c;可以直接使用&#xff0c;但是需要安装MySQL客户端的分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1qrt1RAX38SgIpNklbQJ7pA 提取码&#xff1a;0kmf 1. 环境准备 环境名称版本系统环境C…

叙永微公益开展“暖冬童梦·妙想之旅”未成年关爱活动第一天

为了丰富未成年人的寒假生活&#xff0c;让他们在轻松愉快的氛围中发挥创意、锻炼动手能力&#xff0c;同时也能得到学习的辅导。叙永县微公益协会组织大学生志愿者在叙永县新时代文明实践中心、叙永县社工总站、叙永县一品城小区、古寨社区开展为期一周的未成年关爱陪伴活动。…

使用plotly dash 画3d圆柱(Python)

plotly3D &#xff08;3d charts in Python&#xff09;可以画3维图形 在做圆柱的3D装箱项目&#xff0c;需要装箱的可视化&#xff0c;但是Mesh &#xff08;3d mesh plots in Python&#xff09;只能画三角形&#xff0c;所以需要用多个三角形拼成一个圆柱&#xff08;想做立…