C语言实现贪吃蛇项目(1)

接下面我们来完成贪吃蛇项目,要完成这个项目要先对功能进行了解,主要对C语言的语法进行巩固串联到一起,其实还是思路的学习,代码也还好,这篇文章主要是对一些功能是如何做到的进行分析,贪吃蛇的完成我会放在下一篇文章中去实现

1.实现基本的功能:

• 贪吃蛇地图绘制
• 蛇吃⻝物的功能(上、下、左、右⽅向键控制蛇的动作)
• 蛇撞墙死亡
• 蛇撞⾃⾝死亡
• 计算得分
• 蛇⾝加速、减速
• 暂停游戏

2.Win32API介绍

2.1Win32API

概念: Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤
的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启
视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便
称之为ApplicationProgrammingInterface,简称API函数。WIN32API也就是MicrosoftWindows
32位平台的应⽤程序编程接⼝

2.2控制台程序

首先是打开:我们Win+R键输入cmd打开命令提示符
在这里插入图片描述
然后我们可以用命令来更改窗口的大小
具体语法如下:
在这里插入图片描述
按下Enter键就更改了窗口的大小
在这里插入图片描述
然后更改窗口命名:
在这里插入图片描述

接下来我们进入vs进行更改,我们要使用的是Windows控制台而不是终端,所以先来更改运行窗口:
在这里插入图片描述在这里插入图片描述
这里可以选择让windows决定,如果没有变化就选Windows控制台主机即可

2.3控制台程序(代码进行更改)

使用system函数对命令台进行更改
在这里插入图片描述
在这里插入图片描述
但此时标题没有变化,原因是程序结束了,我们让程序不结束即可,这里有两种方式:
1.getchar方法在这里插入图片描述
2.向命令提示符中输入pause命令
在这里插入图片描述
在按时就会结束程序

2.24控制台屏幕上的坐标COORD

官方介绍:https://learn.microsoft.com/zh-cn/windows/console/coord-str
概念:COORD是WindowsAPI中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0) 的原点位于缓冲区的顶部左侧单元格
在这里插入图片描述
在这里插入图片描述
语法定义就比较简单了,注意要有头文件<Windows.h>

2.5GetStdHandle函数

官方链接:https://learn.microsoft.com/zh-cn/windows/console/getstdhandle
概念:GetStdHandle是⼀个WindowsAPI函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备
在这里插入图片描述
简单来说就是:就是获得屏幕的使用权
在这里插入图片描述

2.6GetConsoleCursorInfo、SetConsoleCursorInfo函数

接下来时用来获取光标信息的函数
官方链接:
https://learn.microsoft.com/zh-cn/windows/console/getconsolecursorinfo

https://learn.microsoft.com/zh-cn/windows/console/setconsolecursorinfo
检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
在这里插入图片描述
然后是修改光标函数:
在这里插入图片描述
两个传参是一样的,但是结构体需要自己构建
在这里插入图片描述
在这里插入图片描述
这样修改就完成了,如果想让光标隐藏可以将bVisible修改为false,要包含头文件<stdbool.h>
在这里插入图片描述

2.7SetConsoleCursorPosition函数

官方链接:https://learn.microsoft.com/zh-cn/windows/console/setconsolecursorposition
设置光标位置
在这里插入图片描述
我们将其封装成函数:
在这里插入图片描述
测试:
在这里插入图片描述

2.8 GetAsyncKeyState函数

官方链接:https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getasynckeystate
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态
GetAsyncKeyState的返回值是short类型,在上⼀次调用GetAsyncKeyState函数后,如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

虚拟按键位:https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
举个例子:
在这里插入图片描述

判断数字键盘5是否按下
在这里插入图片描述
封装成宏:
在这里插入图片描述
结果是1表示按过,0则为没按过
测试:
在这里插入图片描述
这里的按哪个数字键就会打印哪个键
在这里插入图片描述

这篇文章就先到这里吧,接下来就要进入游戏的设计了,为了让内容更加连贯,就全部放到下一篇文章中了
大家加油!!!

本文代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdbool.h>

//int main()
//{
//	system("mode con cols=100 lines=30");
//	system("title 贪吃蛇");
//	getchar();
//	system("pause");
//	return 0;
//}

//int main()
//{
//	COORD pos1 = { 0,0 };
//	COORD pos2 = { 10,20 };
//	return 0;
//}

//int main()
//{
//	//获得标准输出设备
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//
//	//创建光标信息结构体
//	CONSOLE_CURSOR_INFO cursor_info = { 0 };
//
//	//获取光标的信息,放在cursor_info中
//	GetConsoleCursorInfo(houtput, &cursor_info);
//
//	//修改光标占比
//	//cursor_info.dwSize = 100;
//	cursor_info.bVisible = false;
//
//	//设置光标信息
//	SetConsoleCursorInfo(houtput, &cursor_info);
//	
//	system("pause");
//	return 0;
//}

//int main()
//{
//	//获得标准输出设备
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//
//	COORD pos = { 10,20 };
//	SetConsoleCursorPosition(houtput, pos);
//
//	getchar();
//	return 0;
//}

//void set_pos(short x, short y)
//{
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//
//	COORD pos = { x,y };
//	SetConsoleCursorPosition(houtput, pos);
//}
//
//int main()
//{
//	set_pos(10, 20);
//	printf("hello\n");
//	set_pos(10, 10);
//	printf("world");
//	return 0;
//}

//int main()
//{
//	short ret = GetAsyncKeyState(0x65);
//	if ((ret & 1) == 1)
//		printf("按过");
//	else
//		printf("没有按过\n");
//	return 0;
//}

#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)&1)?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");
        }
        else if (KEY_PRESS(0x35))
        {
            printf("5\n");
        }
        else if (KEY_PRESS(0x36))
        {
            printf("6\n");
        }
        else if (KEY_PRESS(0x37))
        {
            printf("7\n");
        }
        else if (KEY_PRESS(0x38))
        {
            printf("8\n");
        }
        else if (KEY_PRESS(0x39))
        {
            printf("9\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值