挑战!贪吃蛇小游戏的实现(1)

引言

相信大家都玩过贪吃蛇这个游戏!

玩家控制一个不断移动的蛇形角色,在一个封闭空间内移动。随着时间推进,这个蛇形角色会逐渐增长,通常是通过吞食屏幕上出现的物品(如点或者其他标志)来实现。每当贪吃蛇吃掉一个物品时,它就会变得更长一些。

目标是尽可能地让蛇增长而不撞击墙壁、障碍物或自己的身体部分。如果发生了这样的碰撞,则游戏结束。难度主要来源于两方面:一方面是由于贪吃蛇长度不断增加导致操作空间越来越小;另一方面则是速度可能会逐步提升,对玩家反应能力和策略规划提出了更高要求。

那么,我们能否使用C语言在Windows环境的控制台中模拟实现贪吃蛇小游戏呢~

答案是可以!

由于本次实现贪吃蛇会使用一些Win32 API的知识,所以我们先来学习一下Win32 API!

Win32 API

什么是Win32 API

Win32 API(Application Programming Interface)是微软Windows操作系统提供的一套核心接口,用于开发32位和64位的应用程序。这些API为程序员提供了访问Windows系统底层服务的方法,包括窗口管理、文件操作、设备输入输出、内存管理和进程线程控制等。

Win32 API可以分为几个不同的类别:

1. 用户界面(User Interface)API:负责创建和管理窗口、对话框以及其他图形用户界面元素。例如CreateWindow()函数就是用来创建一个窗口。

2. 图形设备接口(Graphics Device Interface, GDI)API:GDI APIs允许应用程序在屏幕上绘制图形,并处理字体和打印机输出。例如LineTo()函数可以画一条直线。

3. 系统服务API:提供对系统级功能如注册表操作、事件日志记录等的访问。例如RegOpenKeyEx()函数可以打开注册表键值。

4. 文件与I/O API:允许读写文件系统中的数据,以及与外部设备进行通信。例如ReadFile() 和 WriteFile() 函数可用于文件读写。

5. 进程与线程管理API:控制进程和线程生命周期,实现多任务并发执行能力。CreateProcess() 可以启动新进程,而CreateThread() 会创建一个新线程。

6. 网络服务API:支持网络通信功能,如TCP/IP连接、数据发送接收等。WSAStartup(), socket(), connect(), send(), recv() 是常见网络编程相关函数。

7. 安全性API:涉及到身份验证、权限检查等安全相关功能。
8. 多媒体API: 提供音频视频播放录制等多媒体处理能力。

1.控制台程序

我们可以使用cmd命令来设置控制台窗口的长度:比如设置控制台窗口大小为30行 100列

mode con cols=100 lines=30

也可以通过命令来设置控制台窗口的名字

title 贪吃蛇

这些能在控制台窗口执行的命令,也可以调用C语言函数system来执行

#include <stdio.h>
#include <stdlib.h>
int main()
{system("mode con cols=100 lines=30");//设置控制台窗口大小 30行 100列system("title 贪吃蛇");//设置cmd窗口名称return 0;
}

2.控制台屏幕上的坐标COORD

COORD是Windows API中定义的一个结构体,表示一个字符在控制台屏幕上的坐标

typedef struct _COORD{SHORT x;SHORT Y;
}COORD,*PCOORD;

给坐标赋值(使用时要包含头文件windows.h)

COORD pos = {10,15};

3.GetStdHandle

句柄:这是一个抽象的概念,用于表示对资源或对象的引用,它通常是一个整数值或者指针,通过这个值可以访问到底层系统资源,如文件,窗口和数据库连接等。

GetStdHandle:是一个Windows API函数。它用于从一个特定的标准设备(标准输出,标准输入或标准错误)中获得一个句柄,使用这个句柄可以操作设备

HANDLE GetStdHandle(DWORD nstdHandle);

下列代码用于获取标准输出的句柄

HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);

4.GetConsoleCursorInfo

该函数检索有关控制台屏幕缓冲区的光标大小和可见性信息

BOOL WINAPI GetConsoleCursorInfo(

  HANDLE  hConsoleOutput,

  PCONSOLE_CURSOR_INFO  lpConsoleCursorInfo//是指向CONSOLE_CURSOR_INFO结构的指针,该结构接收有关主机游标的信息

);

HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(houtput,&CursorInfo);//获取控制台光标信息


5.CONSOLE_CURSOR_INFO

该结构体包含了有关控制台光标的信息,光标大小和可见性数据

typedef struct _CONSOLE_CURSOR_INFO{DWORN dwSize;BOOL  bVisible;
}CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;
  • dwSize 由光标填充的字符单元格的百分比。光标的外观会变化,从完全填充单元格到单元底部的水平线条。此值介于1-100之间。
  • bVisible 游标的可见性。如果光标可见,此值为TRUE。
CursorInfo.bVisible =false;//隐藏控制台光标

6.SetConsoleCursorInfo

设置制定控制台屏幕缓冲区的光标的大小和可见性。

BOOL WINAPI SetConsoleCursorInfo{HANDLE hconsoleoutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
};
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(houtput,&CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false;//隐藏控制台光标
SetConsoleCursorInfo(houtput,&CursorInfo);//设置控制台光标状态

7.SetConsoleCursorPosition

设置制定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用该函数将光标位置设定到指定位置

BOOL WINAPI SetConsoleCursorPosition(HANDLE  hconsoleoutput,COORD pos);
COORD pos = {10,5};
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄
SetConsoleCursorPosition(houtput,pos);//设置标准输出上光标位置为pos

由此,我们可以封装一个设置光标位置的函数SetPos

void SetPos(short x,short y)
{COORD pos ={x,y};HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄SetConsoleCursorPosition(houtput,pos);//设置光标位置
}

8.GetAsyncKeyState

该函数用于获取按键情况,GetAsyncKeyState的函数原型如下

SHORT GetAsyncKeyState(

  int vKey;

);

将按键上的每个键的虚拟键值传递给函数,函数通过返回值来分辨按键状态。

GetAsyncKeyState的返回值为short类型,在上一次调用该函数后,如果返回的16位short数据中,最高位是1,说明按键的状态是按下,如果最高位是0,说明按键的状态是抬起;如果最低位被设置成1说明该按键被按过,否则为0

所以要判断一个按键是否被按过,我们可以检测该函数返回值的最低位是否为1

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

好啦!关于WIN32 API及相关函数的介绍就到这里啦,在下一篇博客中,我将详细实现贪吃蛇小游戏!防止迷路ovo请点赞收藏加关注哦~

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

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

相关文章

《低功耗方法学》翻译——附录B:UPF命令语法

附录B&#xff1a;UPF命令语法 本章介绍了文本中引用的所选UPF命令的语法。 节选自“统一电源格式&#xff08;UPF&#xff09;标准&#xff0c;1.0版”&#xff0c;经该Accellera许可复制。版权所有&#xff1a;(c)2006-2007。Accellera不声明或代表摘录材料的准确性或内容&…

monaco-editor布局篇(二)-自动换行

monaco-editor的换行方式&#xff0c;主要分为3种情况&#xff1a; 不换行按照编辑器宽度换行按照制定列数换行 主要受wordwrap和wordwrapcolumn控制&#xff0c;具体如下&#xff1a; 取值含义off不换行&#xff0c;会一直滚动on换行&#xff0c;文本将在视区宽度内自动换行…

Linux命令:traceroute命令

目录 traceroute1、简介2、探测原理3、traceroute说明4、实例设置每跳探测数设置跳数探测包使用的基本UDP端口设置6789把对外发探测包的等待响应时间设置为3秒 总结 traceroute 1、简介 traceroute的主要功能是跟踪从IP网络发送到指定主机经过的网关的工具。它利用IP协议的生…

5 分钟让你了解什么是搜索引擎

文章目录 搜索引擎概述基于业务模式分类垂直搜索&#xff08;垂搜&#xff09;通用搜索&#xff08;通搜&#xff09;本地搜索引擎 基于技术实现分类基于关键词的搜索引擎&#xff08;Keyword-based Search Engine&#xff09;语义搜索引擎&#xff08;Semantic Search Engine&…

幻兽帕鲁mac可以玩吗?

《幻兽帕鲁》&#xff08;英文&#xff1a;Palworld&#xff09;是一款近期在 Steam 爆红的动作冒险生存游戏&#xff0c;游戏设置在一个居住着「帕鲁」的开放世界中&#xff0c;玩家可以战斗并捕捉帕鲁&#xff0c;也能用它们来建造基地、骑乘和战斗。 不过目前《幻兽帕鲁》仅…

C语言内存函数:memcpy、memcat、memmove介绍和模拟实现(实用性高,建议三连收藏)

目录 1.memcpy函数 1.1函数介绍 1.2函数示范使用 1.3函数的模拟实现 1.4补充 2.memmove函数 2.1函数介绍 2.2函数的使用示范 2.3函数的模拟实现 3.memcmp(内存比较函数&#xff09; 3.1函数介绍 3.2函数的示范使用&#xff0c;有趣的例子 4.函数补充memset(内存…

【靶场实战】Pikachu靶场RCE漏洞关卡详解

Nx01 系统介绍 Pikachu是一个带有漏洞的Web应用系统&#xff0c;在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习&#xff0c;那么Pikachu可能正合你意。 Nx02 RCE漏洞概述 RCE漏洞&#xff0c;可以让攻击者直接向后台…

【Jenkins】配置及使用|参数化|邮件|源码|报表|乱码

目录 一、Jenkins 二、Jenkins环境搭建 1、下载所需的软件包 2、部署步骤 3、其他 三、Jenkins全局设置 &#xff08;一&#xff09;Manage Jenkins——Tools系统管理->全局工具配置分别配置JDK、Maven、Allure、Git&#xff0c;可以配置路径或者直接选择版本安装 1…

解决zabbix图像中文乱码

使用zabbix查看监控图像信息&#xff0c;发现会有中文乱码现象。 解决方法如下&#xff1a; 1.拷贝windows文字文件到服务器上 C:\Windows\Fonts目录下拷贝自己需要的中文语言文件 2.修改配置文件 vim /usr/share/zabbix/include/defines.inc.php 81行 define(ZBX_GRAPH_F…

zookeeper搭建(单机模式和集群模式)

目录 单机模式&#xff1a; 集群搭建&#xff1a; 单机模式&#xff1a; 1.新建data和logs目录(data目录用来存放数据库快照&#xff0c;logs目录用来存放日志文件) [rootmaster dev]# mkdir -p /home/apps/zookeeper/data [rootmaster dev]# mkdir -p /home/apps/zookeeper/…

新数据不影响原来的数据

问题描述 新数据修改时&#xff0c;原来的数据也会受影响 const obj1 ref({ name: slx, age: 20 })const obj2 obj1obj2.value.name hhhhconsole.log(obj1, obj1.value)console.log(obj2, obj2.value)解决方法 (仅适用于对象 在这段代码中&#xff0c;obj1 和 obj2 指向同…

【Python基础】文件详解(文件基础、csv文件、时间处理、目录处理、excel文件、jsonpicke、ini配置文件)

文章目录 &#xff08;一&#xff09;文件详解1 快速入门文件操作1.1 快速实现文件读取1.2 快速实现文件写入 2 文件打开方式详解2.1 open方法2.2 打开方式2.3 文件读写操作2.3.1 基本读写2.3.2 读写方式打开2.3.3 实现重复读取 3 文件编码问题4 文件读写方法4.1 文件读取方式4…

【PTA编程题】7-1 保持链表有序

对于输入的若干学生的信息&#xff0c;按学号顺序从小到大建立有序链表&#xff0c;最后遍历链表&#xff0c;并按顺序输出学生信息。 输入格式: 首先输入一个正整数T&#xff0c;表示测试数据的组数&#xff0c;然后是T组测试数据。每组测试数据首先输入一个正整数n&#xf…

IT行业证书的获取与价值:提升职业竞争力的关键

目录 IT行业证书的价值和作用 1. Cisco&#xff08;思科&#xff09;认证&#xff08;如CCNA、CCNP、CCIE&#xff09;&#xff1a; 2. 微软认证&#xff08;如MCSA、MCSE、MCSD&#xff09;&#xff1a; 3. 计算机网络技术&#xff08;CompTIA Network、CompTIA Security&a…

《汇编语言》- 读书笔记 - 各章检测点归档

《汇编语言》- 读书笔记 - 各章检测点归档 检测点 1.1检测点 2.1检测点 2.2检测点 2.3检测点 3.1检测点 3.2检测点 6.1检测点 9.1 检测点 1.1 1个CPU 的寻址能力为8KB&#xff0c;那么它的地址总线的宽度为 13 。 解&#xff1a;8KB 8192B 213 1KB的存储器有 10…

构建高效直播美颜系统:美颜SDK集成与性能优化指南

如今&#xff0c;美颜技术的广泛应用成为各类直播平台的标配之一。今天&#xff0c;小编将与大家进一步讨论如何构建高效的直播美颜系统&#xff0c;重点关注美颜SDK的集成和性能优化方面。 一、美颜SDK的选择与集成 选择合适的美颜SDK是构建高效直播美颜系统的第一步。不同的…

MATLAB频域分析(附完整代码)

1. MATLAB进行频域分析举例 以下是一个使用MATLAB进行频域分析的例子。在这个例子中&#xff0c;我们将生成一个含有两个不同频率分量的信号&#xff0c;然后使用快速傅里叶变换&#xff08;FFT&#xff09;来分析其频域特性。 main.m文件 clc;close all;clear all;warning of…

12. onnx转为rknn测试时有很多重叠框的修改(python)

我们下载rknn-toolkit2-master后并进行前面的处理后&#xff0c;进入到rknn-toolkit2-master\examples\onnx\yolov5文件夹&#xff0c;里面有个test.py文件&#xff0c;打开该文件&#xff0c;其代码如下&#xff1a; # -*- coding: utf-8 -*- # coding:utf-8import os import…

msvcp120.dll丢失如何解决/找不到msvcp120.dll的5种有效的解决方法

在计算机系统运行过程中&#xff0c;如果遇到“找不到msvcp120.dll”的提示信息&#xff0c;这代表了何种具体状况呢&#xff1f;首先&#xff0c;我们需要明确msvcp120.dll文件的重要性。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;这是一…

工作与生活平衡:在生活中寻找和谐

工作和生活是我们生活中不断交织的两个重要方面。对许多人来说&#xff0c;找到两者之间的完美平衡已经成为一个持久的挑战。然而&#xff0c;与其专注于平衡&#xff0c;更重要的是要认识到工作和生活并不是可以相互平衡的两个分离实体&#xff0c;而是一个相互影响的循环。正…