挑战!贪吃蛇小游戏的实现(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.hqwc.cn/news/453218.html

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

相关文章

【C/C++ 12】C++98特性

目录 一、命名空间 二、缺省参数 三、函数重载 四、引用 五、内联函数 六、异常处理 一、命名空间 在C/C项目中&#xff0c;存在着大量的变量、函数和类&#xff0c;这些变量、函数和类都存在于全局作用域中&#xff0c;可能会导致命名冲突。 使用命名空间的目的就是对…

RK Camera hal 图像处理

soc&#xff1a;RK3568 system:Android12 今天发现外接的USBCamera用Camera 2API打开显示颠倒&#xff0c;如果在APP 里使用Camera1处理这块接口较少&#xff0c;调整起来比较麻烦 RK Camera hal位置&#xff1a;hardware/interfaces/camera 核心的文件在&#xff1a; 开机…

zabbix监控mariadb数据库

zabbix监控mariadb数据库 1.创建监控用户及授权 [rootchang ~]# mysql -uroot -p123qqq.A MariaDB [(none)]> CREATE USER monitor% IDENTIFIED BY 123qqq.A; MariaDB [(none)]> GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO monitor%; Maria…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数&#xff0c;不论是算法竞赛还是找工作面试笔试&#xff0c;对…

DevOps落地笔记-14|部署流水线:打造一站式部署的关键平台

上一课时我主要介绍了实现自动化测试的范围、流程和结构图&#xff0c;自动化测试是持续集成实践不可或缺的一部分&#xff0c;从而使得软件向高效率和高质量迈进了一大步。持续集成主要关注的是代码是否可以编译成功、是否可以通过单元测试和验收测试等。但持续集成并不能实现…

【C#】Json转资源并加载

Json文件如下 右键修改json文件属性 【代码】读取Json文件内容 string sTemplate string.Empty; Assembly assembly Assembly.GetExecutingAssembly(); string resourceName assembly.GetName().Name.ToString() ".Json.test.json"; using (Stream stream asse…

【Python之Git使用教程001】Git简介与安装

一、简介 Git其实就是一个分布式版本的控制系统&#xff0c;在分布式版本的控制系统&#xff0c;大家都拥有一个完整的版本库&#xff0c;不需要联网也可以提交修改&#xff0c;所以中心服务器就显得不那么重要。由于大家都拥有一个完整的版本库&#xff0c;所有只需要把各自的…

目标检测:2如何生成自己的数据集

目录 1. 数据采集 2. 图像标注 3. 开源已标记数据集 4. 数据集划分 参考&#xff1a; 1. 数据采集 数据采集是深度学习和人工智能任务中至关重要的一步&#xff0c;它为模型提供了必要的训练样本和测试数据。在实际应用中&#xff0c;数据采集的方法多种多样&#xff0c;每…

Python||五城P.M.2.5数据分析与可视化_使用复式柱状图分析各个城市的P.M.2.5月度差异情况(中)

目录 4.上海市空气质量月度差异 5.沈阳市空气质量月度差异 五城P.M.2.5数据分析与可视化_使用复式柱状图分析各个城市的P.M.2.5月度差异情况 4.上海市空气质量月度差异 import numpy as np import pandas as pd import matplotlib.pyplot as plt#读入文件 sh pd.read_csv(./S…

chisel RegInit/UInt/U

val reg RegInit(0.U(8.W)) //ok val reg RegInit(0.UInt(8.W)) //errU 使用在数字 . 后边50.U UInt 使用在IO(new Bundle val a Input(UInt(8.W)) 或者 def counter(max:UInt, a1:UInt) package emptyimport chisel3._ import chisel3.util._class MyCounter extends …

26.云原生ArgoCD高级之ApplicationSet

云原生专栏大纲 文章目录 ApplicationSet介绍ApplicationSet 特性ApplicationSet 安装ApplicationSet 工作原理ApplicationSet 生成器列表类型生成器集群生成器基础使用方法Label Selector 指定集群Values 字段传递额外的参数 git生成器git目录生成参数排除目录git文件生成器矩…

山西电力市场日前价格预测【2024-02-03】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-03&#xff09;山西电力市场全天平均日前电价为442.47元/MWh。其中&#xff0c;最高日前电价为633.60元/MWh&#xff0c;预计出现在09:30。最低日前电价为367.07元/MWh&#xff0c;预计…