C/C++相关概念和易错知识点(14)(贪吃蛇初步实现、思路)

【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载) C++编写贪吃蛇小游戏快速入门 刚学完C++。一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能。希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整体规划+原理 image 大体上可以分为图上所示的几个类。不过……怎么看都有点强行面向对象的味道在里面。。[哭笑][哭笑][哭笑]。不管了……代码写得可能有点凌乱,下面我会为大家一一讲解... 阅读详情

思路和建议:想要自己实现贪吃蛇这种游戏,我们需要顺着游戏的逻辑来写代码。

首先我们就会想到要打印欢迎界面,它是所有游戏的开端,当然,它也很容易实现。

然后进入游戏主体,我们注意到贪吃蛇由几个重要元素组成:第一是地图,在学会控制光标位置后这个实现起来就很简单,后面具体实现时再讲述;

第二就是食物,食物是随机出现在地图中的,因此我们知道可以用随机数来生成食物。生成了坐标肯定还要打印,所以我们会考虑单独写一个打印函数,来打印地图、食物;

第三,也就是最重要的蛇,蛇要实现多个功能,包括初始化、转向操作、加速、减速、吃到食物后蛇身变长、撞到自己或墙后退出游戏。由于蛇的这些功能可以用一个链表来维护,所以我们可以考虑用单链表来实现这些功能。

要实现这样一个小游戏,我们需要掌握C语言并会熟练使用,Win32 API简单学习使用,链表的原理和使用,下面进行分步讲解:(讲解顺序和我写代码的逻辑顺序一致,代码内容和思路仅供参考)

一、设置控制台基本参数

system("mode con cols=192 lines=54");//设置控制台大小16/9格式

system("title 贪吃蛇游戏");

setlocale(LC_ALL, "");//设置成宽字符输出

HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台信息

CONSOLE_CURSOR_INFO Console_Cursor_Info;//创建结构体

GetConsoleCursorInfo(Handle, &Console_Cursor_Info);//获取结构体信息

Console_Cursor_Info.bVisible = false;//隐藏光标

SetConsoleCursorInfo(Handle, &Console_Cursor_Info);//设置控制台信息

这里主要用了Win32 API的知识,会用即可,思路也很简单,即获取光标信息,改变光标信息,再将光标信息传回控制台使其生效

二、接下来我们会想到打印菜单,这里面就介绍一些游戏规则,按键等要素,这些都是自己把握,可以按照自己的想法来写:


我们可以选择将它封装到一个函数里,如果后续要用到它,直接调用就行了


void Game_Menu()//192 * 54
{
	SetCursorPose(87, 20);

	wprintf(L"欢迎来到贪吃蛇游戏");

	SetCursorPose(87, 40);

	system("pause");

	system("cls");

	SetCursorPose(40, 20);

	wprintf(L"操作规则:玩家通过'W''S''A''D'操控一条蛇,蛇不可以撞到墙壁,也不可以撞到自身");

	SetCursorPose(40, 22);

	wprintf(L"得分规则:正常速度下蛇每吃掉一个食物,就能获得100分,同时蛇也会变长");

	SetCursorPose(40, 24);

	wprintf(L"玩家可以通过按'L'来减速,每次减速会降低得分10,最低降到10分。玩家也可通过按'P'来加速,每次加速会增加得分10,最高加至200分");

	SetCursorPose(40, 26);

	wprintf(L"其他按键:开始游戏后按空格键可以暂停游戏,暂停后你可以进一步选择重新开始一局新的游戏;按ESC键直接退出游戏");

	SetCursorPose(87, 40);

	system("pause");

	system("cls");

}

下面算是比较难的一步,因为进入游戏主体后有很多东西需要初始化和处理,很多人会不知道从哪开始,建议按照我博客开头的那种思维方法先自己捋一下逻辑

三、游戏初始化

1.打印地图

宽字符的特点,控制台坐标的概念理解是必须的。

首先我们要知道一个光标格子是矩形,水平方向x坐标间距离是竖直方向y的一半,因此要打印一个正方形的地图需要自己算清楚横坐标和纵坐标的界限,以及你打算打印的墙的层数,x轴建议都以偶数为基本单位,否则会出现错位的现象

这一部分我建议自己拿一张草稿纸,把墙的四个角的坐标,墙的边界坐标标注出来,这对后续很有帮助


void Game_Base_Scene(int Score_All, int Score_Per)
{
	int count = 0;//打印墙体的计数器

	//先打印列后打印墙,通过光标进行调整

	SetCursorPose(0, 2);

	for (count = 2; count <= 51; count++)//第一列和第二列一起打印,否则换行会出现覆盖的情况
	{
		wprintf(L"□□\n");
	}

	for (count = 2; count <= 51; count++)
	{
		SetCursorPose(104, count);//只能设置光标进行调整,换行会跳转到下一行的第一列,打印会出现覆盖

		wprintf(L"□");

		SetCursorPose(106, count);

		wprintf(L"□");

	}

	SetCursorPose(0, 0);

	for (count = 0; count < 54; count++)//第一行墙
	{
		wprintf(L"□");
	}

	SetCursorPose(0, 1);

	for (count = 0; count < 54; count++)//第二行墙
	{
		wprintf(L"□");
	}

	SetCursorPose(0, 52);

	for (count = 0; count < 54; count++)//倒数第二行墙
	{
		wprintf(L"□");
	}

	SetCursorPose(0, 53);

	for (count = 0; count < 54; count++)//倒数第一行墙
	{
		wprintf(L"□");
	}

	SetCursorPose(112, 16);

	wprintf(L"当前总得分:%-3d",Score_All);//总得分,对分数进行格式规范,更美观

	SetCursorPose(112, 26);

	wprintf(L"当前每个食物的分数:%-3d",Score_Per);//每个食物的得分

	SetCursorPose(112, 46);

	wprintf(L"通过'W''S''A''D'操控一条蛇,按'L'减速,按'P'加速,不可以撞到墙壁,不可以撞到自身");

	SetCursorPose(112, 48);

	wprintf(L"正常速度下蛇每吃掉一个食物,就能获得100分,同时蛇也会变长");

	SetCursorPose(112, 50);

	wprintf(L"每加一次速分数提高10,最多提至200分;每减一次速分数降低10,最低减至10分");

	SetCursorPose(112, 52);

	wprintf(L"按空格键停止游戏,按ESC退出游戏");

}

除去墙,我的地图是50 * 50,实际情况可以根据自己的进行修改。

同时,或许我们还会注意到我这个函数传了Score_All, Score_Per这两个参数,这是因为蛇可以加速或减速,针对不同的速度有不同的分数,传过来这两个参数并在地图上展示出来,让玩家能实时看到自己的单个食物得分、总分。

2.创建蛇的头部结点并打印蛇

其实我原本的思路是先创建食物、打印食物的,但我注意到食物不能在蛇的身体中创建,而我还没有创建蛇,所以第二步我就该为了创建蛇。自己写的时候难免会有遇到之前忽略的细节,见招拆招是最好的解决方法,因为大体逻辑已定,我们代码逻辑整体也不会被带偏。

typedef struct Snake_SLTNode
{
	int x;//横坐标

	int y;//纵坐标

	struct Snake_SLTNode* next;

}Snake_SLTNode;

在自己写这种项目时多用结构体,typedef来帮助自己的代码更易被理解

Snake_SLTNode* Create_Snake_SLTNode(int x, int y)
{
	Snake_SLTNode* NewNode = (Snake_SLTNode*)malloc(sizeof(Snake_SLTNode));

	assert(NewNode);
	
	NewNode->x = x;

	NewNode->y = y;

	NewNode->next = NULL;

	return NewNode;

}

Snake_SLTNode* Get_Snake_Head()
{

	int y = rand() % 50 + 2;//2到51

	int x = (rand() % 50 + 2) * 2;//4到102

	Snake_SLTNode* NewNode = Create_Snake_SLTNode(x, y);

	return NewNode;

}

这里我封装了两个函数,考虑到蛇的长度会变,会有新的结点添入进来,所以我将创建结点那一步单独封装了一个函数,后面可以直接调用。


void Game_Snake_Print(Snake_SLTNode* Head)
{
	assert(Head);//必须先创建头,再调用这个函数打印

	Snake_SLTNode* prev = Head;

	SetCursorPose(prev->x, prev->y);

	wprintf(L"○");//打印头部用空心圆,身体用实心圆

	prev = prev->next;

	while (prev)
	{
		SetCursorPose(prev->x, prev->y);

		wprintf(L"●");//打印头部用空心圆,身体用实心圆

		prev = prev->next;

	}

}

这里借助链表就可以将蛇打印出来,但是蛇是会动的,蛇每动一次先前打印的结点应该全部被清理掉,不然会发现打印会混乱。但是我们如果使用system("cls")就会发现地图也会被清理掉,如果反复打印会出现地图闪烁的情况,所以我们要在后面处理这个情况。

3.创建食物并打印

typedef struct Food_Position
{
    int x;//横坐标

    int y;//纵坐标

}Food_Position;

食物用坐标来表示


Food_Position* Get_Food_Pose(Snake_SLTNode* Head)
{
	assert(Head);

	int count = 0;//用来判断和蛇的结点是否有重合

	Snake_SLTNode* prev = Head;

	while (1)
	{
		int y = rand() % 50 + 2;//2到51

		int x = (rand() % 50 + 2) * 2;//4到102

		while (prev)
		{
			if (prev->x == x && prev->y == y)
			{
				count = 1;

				break;
			}

			prev = prev->next;

		}

		if (!count)
		{
			Food_Position* NewFood = (Food_Position*)malloc(sizeof(Food_Position));

			assert(NewFood);

			NewFood->x = x;

			NewFood->y = y;

			return NewFood;

		}

	}

}
void Game_Food_Print(Food_Position* Food_Position)
{
	assert(Food_Position);

	SetCursorPose(Food_Position->x, Food_Position->y);

	wprintf(L"★");//用★代表食物

}

四、处理按键情况

这里会用到另一个Win32 API函数,用于检测按键的点按情况,这个会用即可。在这里我选择用宏替换使代码更易读


//判断short类型最低位是不是1来判断是不是被按过,用&操作获取最低位信息,1是按过,0是没按过

#define PRESS_W (GetAsyncKeyState(0x57) & 0x1)//W键,上行

#define PRESS_S (GetAsyncKeyState(0x53) & 0x1)//S键,下行

#define PRESS_A (GetAsyncKeyState(0x41) & 0x1)//A键,左行

#define PRESS_D (GetAsyncKeyState(0x44) & 0x1)//D键,右行

#define PRESS_L (GetAsyncKeyState(0x4C) & 0x1)//减速

#define PRESS_P (GetAsyncKeyState(0x50) & 0x1)//加速

#define PRESS_SPACE (GetAsyncKeyState(VK_SPACE) & 0x1)//空格键,暂停游戏

#define PRESS_ESC (GetAsyncKeyState(VK_ESCAPE) & 0x1)//ESC键,退出游戏

#define PRESS_ONE ((GetAsyncKeyState(VK_NUMPAD1) & 0x1) | (GetAsyncKeyState(0x31) & 0x1))//按到了键盘的1,对数字键盘和横着的键盘都进行检测,二者有其一即可

#define PRESS_ZERO ((GetAsyncKeyState(VK_NUMPAD0) & 0x1) | (GetAsyncKeyState(0x30) & 0x1))//按到了键盘0

设置完毕后,我们就可以开始对蛇进行操作了

五、蛇的移动和加减速

在这里,我们发现我们要给蛇移动的属性,就是要让链表的坐标时刻保持变化,在按下下一个改变方向的键之前,蛇要保持之前的移动状态,因此我定义了一个枚举变量

typedef enum Game_State
{
	wait,

	up = 1, down, left, right,

	die_self, die_wall,

	Pause, Exit

}Game_State;

在相应状态下,蛇进行相应的操作,只有按下改变方向的按键,蛇的状态就会被改变。我们同时要知道,蛇的结点的坐标每变换一次,相当于蛇前进一步,要控制蛇的速度,我们需要控制坐标变换的速度。我们知道计算机是很快的,要控制它的速度应用Sleep进行调节。

在理解上面的处理方法后,我们就可以针对上下左右进行不同的处理了:

1.先封装一个函数,专门处理蛇的运动状态,同时要注意蛇在向左运动时不能调头向右运动,蛇在判定为死亡后也不能运动,要注意if要把这些情况涵盖全面,否则程序会有Bug。

这里注意,我还定义了蛇死亡的两种状态,但我们还没有针对蛇撞墙和撞自身做出判定,但也不影响这块的代码实现


void Game_Branch(int* Sleep_Time, int* Score_Per, Game_State* state)
{
	assert(state);

	if (PRESS_W && *state != down && *state != die_self && *state != die_wall)
	
		*state = up;
	

	if (PRESS_S && *state != up && *state != die_self && *state != die_wall)
	
		*state = down;

	
	if (PRESS_A && *state != right && *state != die_self && *state != die_wall)
	
		*state = left;
	

	if (PRESS_D && *state != left && *state != die_self && *state != die_wall)

		*state = right;

	if (PRESS_L)
	{
		if (*Score_Per > 10)
		{
			*Score_Per -= 10;

			*Sleep_Time += 15;

		}
	}
	if (PRESS_P)
	{
		if (*Score_Per < 200 && *Sleep_Time >= 10)
		{
			*Score_Per += 10;

			*Sleep_Time -= 15;

		}

	}
	if (PRESS_SPACE)
	{
		*state = Pause;
	}
	if (PRESS_ESC)
	{
		*state = Exit;
	}

}

然后针对每种状态进行处理:中间插入switch语句使逻辑更清晰


void Game_Move(Snake_SLTNode* phead, Game_State state, int* plast_x, int* plast_y)
{
	assert(phead);

	switch (state)
	{
	case up:

		Game_Snake_Up(phead, plast_x, plast_y);

		break;
	case down:

		Game_Snake_Down(phead, plast_x, plast_y);

		break;

	case left:

		Game_Snake_Left(phead, plast_x, plast_y);

		break;

	case right:

		Game_Snake_Right(phead, plast_x, plast_y);

		break;

	default:

		break;

	}
}

void Snake_Body_Move(Snake_SLTNode* phead, int tmp_x, int tmp_y, int* plast_x, int* plast_y)
{
    assert(phead);

    Snake_SLTNode* prev = phead;

    while (prev->next)//将蛇身全部移动
    {
        prev = prev->next;

        prev->x = prev->x ^ tmp_x;//将prev->x和tmp_x进行交换

        tmp_x = prev->x ^ tmp_x;

        prev->x = prev->x ^ tmp_x;

        prev->y = prev->y ^ tmp_y;//将prev->y和tmp_y进行交换

        tmp_y = prev->y ^ tmp_y;

        prev->y = prev->y ^ tmp_y;

    }

    SetCursorPose(tmp_x, tmp_y);//移动的时候将末尾的字符删掉

    printf("  ");

    *plast_x = tmp_x;

    *plast_y = tmp_y;

}

void Game_Snake_Up(Snake_SLTNode* phead, int* plast_x, int* plast_y)
{
    assert(phead);

    int tmp_x = phead->x;//存储上一个结点

    int tmp_y = phead->y;

    phead->y--;//往上走

    Snake_Body_Move(phead, tmp_x, tmp_y, plast_x, plast_y);

}

void Game_Snake_Down(Snake_SLTNode* phead, int* plast_x, int* plast_y)
{
    assert(phead);

    int tmp_x = phead->x;//存储上一个结点

    int tmp_y = phead->y;

    phead->y++;//往下走

    Snake_Body_Move(phead, tmp_x, tmp_y, plast_x, plast_y);

}

void Game_Snake_Left(Snake_SLTNode* phead, int* plast_x, int* plast_y)
{
    assert(phead);

    int tmp_x = phead->x;//存储上一个结点

    int tmp_y = phead->y;

    phead->x -= 2;//向左走

    Snake_Body_Move(phead, tmp_x, tmp_y, plast_x, plast_y);

}

void Game_Snake_Right(Snake_SLTNode* phead, int* plast_x, int* plast_y)
{
    assert(phead);

    int tmp_x = phead->x;//存储上一个结点

    int tmp_y = phead->y;

    phead->x += 2;//向右走

    Snake_Body_Move(phead, tmp_x, tmp_y, plast_x, plast_y);

}


注意,在Snake_Body_Move这个函数里我就顺便处理了蛇的打印覆盖的情况,因为每次移动结点是在这个函数里进行的,可以非常容易接触到要覆盖掉的结点的坐标。我把那个要覆盖的坐标对应的区域用空格来打印,视觉上没有瑕疵,也不用每次都用system("cls")来处理了。当然,每个人都有自己的处理办法,这里只是提供一种思路。

六、蛇吃到食物后的处理

蛇吃到食物后,尾部会增加一个结点,原本食物的结点应该被销毁,创建一个新的食物结点并打印,可以用一个函数来进行处理


void Game_Eat(Snake_SLTNode* phead, Food_Position** ppfood, int last_x, int last_y, int* Score_All, int Score_Per)
{
	assert(phead && *ppfood && ppfood);

	int count = 0;

	Snake_SLTNode* new = phead;

	if (phead->x == (*ppfood)->x && phead->y == (*ppfood)->y)//只会是头吃到食物,此时食物已经被吃掉了
	{

		free(*ppfood);

		*Score_All += Score_Per;//按规则加分

		Snake_SLTNode* NewNode = Create_Snake_SLTNode(last_x, last_y);//函数中已经检查过是不是空指针了,下面就不需要断言了

		while (new->next)
		{
			new = new->next;
		}
		new->next = NewNode;//在尾巴处生成一个新的结点

		*ppfood = Get_Food_Pose(phead);//创建一个新的食物

		assert(*ppfood);
	
	}
}

七、蛇的死亡判定


void Game_Die(Snake_SLTNode* phead, Game_State* state)
{
	assert(phead);

	Snake_SLTNode* prev = phead;

	while (prev->next)
	{
		prev = prev->next;//先找到除头以外的下一个结点

		if (phead->x == prev->x && phead->y == prev->y)//说明撞到自己了
		{
			*state = die_self;

			return;//接下来就不要判断撞没撞到墙了,没意义
		}
	}

	if (phead->x < 4 || phead->x > 102 || phead->y < 2 || phead->y > 51)//头一定最先撞到墙
	{
		*state = die_wall;
	}

}

截至目前贪吃蛇的基本实现就完成了,我展示的是核心代码,中间还有很多逻辑没有给出。这样一个小游戏能够很好地训练逻辑能力,代码能力,我这样一个游戏写完差不多有700多行代码,其中C语言的语法几乎接触了个遍,也训练了链表的使用。如果希望提高自己的综合实力,尝试运用已有知识做一些小项目是很有帮助的。

C++贪吃蛇 最简单实现 目的就是实现贪吃????程序。按照面向过程的思想来想的话,搭建边框—>开辟蛇的数组并画出蛇—>随机生成第一个食物—>保持读取更改蛇头方向指令,同时每隔一段时间让蛇按照某方向前进(通过蛇所在的坐标更新实现),同时更新显示食物位置,同时检查:蛇头是否碰到边界、碰到自己(这样游戏结束);是否碰到食物(这样就更新蛇长—>加分—>判断加等级、酌情加快蛇前进速度。) 按照面向对象(OO... 阅读详情

相关推荐

C语言 单链表 贪吃蛇小游戏 (控制台)

C语言实现单链表控制台贪吃蛇小游戏 编译环境:vs2019 需求: 统计游戏开始后的时间,控制贪吃蛇;吃到食物蛇身加长,得分加一;碰墙或蛇头碰到身体减一条生命;生命消耗完则结束游戏。 思路: 使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏。 做法: 使用单链表控制贪吃蛇移动的核心思想就是:链表...

qq_46239972的博客 1840

用c语言写贪吃蛇(简易)(适用初学者)(保姆级)

用c语言写带出贪吃蛇的代码,你上你也行!!

Lu_shen_的博客 3万+

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

C语言程序实现贪吃蛇小游戏入门版

【代码】C语言程序实现贪吃蛇小游戏入门版。

青枫浦上不胜愁 679

附录B:Standard Delay Format(SDF)(上)

本附录将介绍标准延迟标注格式,并说明了如何在仿真中执行反标。 延迟格式描述了设计网表的单元延迟和互连走线延迟,无论设计是用两种主要硬件描述语言(VHDL或Verilog HDL)中的哪一种所描述的。 本章还会介绍仿真的反标(backannotation),STA的反标其实是一个简单直接的过程,其中DUA中的时序弧将由SDF所指定的延迟进行标注。

To the beyond and infinity! 5410

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

「汽车电子助手」的博客 696

C语言贪吃蛇游戏(进阶版)

C语言实验小蛇

weixin_73223854的博客 3616

雨雾天YOLOv8检测拉胯?暗通道去雾+上下文注意力双优化,mAP从58%飙到79%,暴雨也能看清车牌

室外交通监控:高速、省道的雨雾天检测,重点解决小车、货车漏检;车载ADAS系统:雨天行车时的前方车辆、行人识别,需实时性(<40ms);隧道出入口:明暗交界+雾天的复杂场景,暗通道能平衡亮度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1380

贪吃蛇游戏--C语言版

C语言版贪吃蛇游戏

weixin_46653651的博客 1766

主题045:四足机器人的运动仿真

四足机器人(Quadruped Robot)是模仿哺乳动物四肢运动设计的机器人系统,具有优异的地形适应性和运动稳定性。与双足机器人相比,四足机器人在静态和动态稳定性方面具有天然优势,能够在复杂地形(如楼梯、斜坡、碎石地面)上稳定行走,因此在野外探索、救援任务、军事应用等领域具有广阔的应用前景。本教程将介绍四足机器人的运动学建模、步态规划、稳定性分析和控制策略,并通过Python仿真验证相关理论。典型的四足机器人每条腿包含3个关节:常见的腿部构型包括:对于单腿,足部位置 pfoot\mathbf{p}_{fo

kkchenjj的博客 679

【教程4>第6章>第3节】LS信道估计与均衡系统MATLAB仿真实现

1]姬国伟,葛利嘉,龙秀虹.基于LS信道估计的SC-FDE系统性能研究[J].军事通信技术, 2010(1):6.DOI:CNKI:SUN:JSTY.0.2010-01-013.在无线通信中,信号在空间传播时,随着传输距离增加,能量会逐渐扩散,导致信号幅度减小,即发生衰减。第四个图表示的是提取的信道估计值,可以看到,在不插值的前提下,得到的信道估计值基本接近真实的信道h。从第五个图可知,通过信道估计,对接收信号进行了校正和补偿。信道模型,先通过awgn加入噪声,然后乘以hreal,模拟通过信道。

FPGA/MATLAB学习教程/源码/项目合作开发 389

C语言实现贪吃蛇(详细版)

以上就是贪吃蛇的基本内容啦,完结撒花~下面有一些想说的话:这篇文章的完成时间是2023.5.12,我现在是一名大一下的计科学生,其实C语言在去年十月份的中旬就看完了翁恺老师的网课,那个时候其实就有能力完成这个贪吃蛇的编写了,但是知道现在才写完,其实是走了很多弯路,耽误了不少时间北哥,在加入北哥的知识星球”编程指北“后才回正了自己的学习方向,也希望大家都能在正确的道路上越走越远~

m0_73906588的博客 4万+

C#上位机+YOLOv8实战:摄像头/视频流实时目标检测(工业级优化+完整可运行源码)

纯C#实现,无Python依赖,适配工业工控机部署;工业级优化:解决帧率、内存、鲁棒性三大核心问题;代码完整可复用,支持摄像头/视频流/RTSP多源检测;避坑指南覆盖开发中90%的常见问题,降低落地成本。相较于传统方案,该方案兼顾实时性与易用性,成本仅为商用视觉库的1/10,可快速落地到工业质检、安防、物流等场景。后续可拓展方向包括:自定义数据集训练、GPU加速推理、工业通信(PLC/串口)对接等。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 731

C/C++实现贪吃蛇游戏

文章目录前言一、游戏效果展示二、具体项目实现1.游戏欢迎界面 welcome( )2.游戏背景 initGameScreen( )3.方块表示 int block[ ][ ][ ]总结 前言 俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。 一、游戏效果展示 二、具体项目实现

Brenda_Bestow的博客 2万+

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 328

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

经典游戏---贪吃蛇从C++代码实现

小时候都玩过贪吃蛇这个经典的小游戏,在我们的普通手机里似乎都是必备的。它伴随着我们的童年,经历了好多好多时光。它带给我们了许多的乐趣。 学习了c++这门编程语言后,我就想着能不能把它做出来,在我查看了相关知识后,明白了其中的道理,就尝试着自己写出这个小游戏来,而且加入了许多可玩性的东西,包括等级选择,暂停/继续和分数制。整个程序采用了类和数组的相关知识实现。 //=====================================

Shawn Hou 18万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

用C++实现经典的贪吃蛇游戏

六一儿童节到了,无论是大朋友还是小朋友,相信大家心里都藏有一颗向往浪漫的童真的心。贪吃蛇是一款经典的单机小游戏,大家在小时候应该都接触过。今天,我将用C++来复刻这款游戏,并祝福所有大朋友小朋友六一儿童节快乐,永远童心未泯。我们需要定义游戏整个场景的大小,蛇的朝向所代表的数值,蛇的速度,蛇的每一个结点大小,食物的大小。//定义场景大小//定义食物以及蛇的大小//定义蛇的朝向//蛇的速度(用在睡眠函数里面)如果您觉得本篇文章不错的话,不如将它分享出去吧!让更多的人感受这份童真快乐。

记录了个人在学习生活中的所思所想,在反思自己的同时希望也能够帮到你 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c/c++实现简单的贪吃蛇可视化游戏

前言 在Visual Studio 2019开发环境上以C/C++为编程语言,运用easyx库实现贪吃蛇游戏逻辑的编写与可视化。 实验要求与目标 实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏结束界面; 进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。 实

weixin_44242313的博客 3958

c语言课程设计之贪吃蛇代码及思路 c语言课程设计报告之贪吃蛇

原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8846529.html 注:本文档需与c语言课程设计之贪吃蛇文档配套使用。c语言实现贪吃蛇代码可随意下载 c语言课程设计报告也可随意下载1.本代码在VS2013下可正常运行,其他版本需根据版本需要进行调试。2.代码在Csnake-Csnake里,想直接打开整个工程直接进入Cnak...

weixin_30776273的博客 4713

C++代码实现贪吃蛇游戏,非常适合C++初学者入门的项目!

这是一款容易上手的游戏,我相信大家都不会陌生,至少这款游戏是我曾经的回忆。 直到今天。。。。。 下面是小编整理好的一套C/C++系统性学习的资料,加小编C/C++学习群(825414254)获取C/C++一整套学习教程哦! 我用C++开发了一个简单的自动寻路贪吃蛇游戏:功能和界面比较的单一 功能: 1.自动寻路:开始游戏后小蛇无需人工操作,小蛇自动寻路,吃掉食物 小蛇起始位置10*10坐标(3...

1万+

贪吃蛇小游戏的代码实现

在上一篇文章中我们已经对于需要用到的知识点进行了讲解,那么本篇文章不说废话,直接带着大家实现贪吃蛇小游戏!(巨详细,文章末尾有完整代码)

m0_74950144的博客 1780

C语言与C++基础编写贪吃蛇项目1

C语言与C++基础编写贪吃蛇项目1 第一阶段: 简单的移动的贪吃蛇编写。 小白编写,勿喷。 一.总体项目功能: 1.添加背景音乐或者动作音效 2.有欢迎界面,游戏选项等界面 3.地图范围内有障碍物,可随机生成食物,随机障碍物 4.蛇可以在地图范围内随意移动 (添加了蛇的抑制反方向功能) 5.游戏可暂停,可中途退出 6.具有简单的计分功能 7.撞上障碍物后会结束本局游戏 (自己撞上自己也会结束游戏) 8. 判断碰撞,区分边界,障碍物以及食物 9.有专门的自定义地图编辑功能,可以让玩家自定义地图 10.游戏状态

WH371312165的博客 724

c语言贪吃蛇 MSDN,c++制作贪吃蛇的案例代码

c++制作贪吃蛇的案例代码发布时间:2020-08-24 14:58:32来源:亿速云阅读:129作者:小新c++制作贪吃蛇的案例代码?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!c++贪吃蛇代码是【snake_position position[(N-2)*(N-2)+1],void snake_position...

weixin_28871885的博客 409

C语言项目:贪吃蛇游戏

这篇文章是一个贪吃蛇游戏的项目案例,400+行的代码完全开源,附带win32API、本地化的知识讲解和项目思路分析

2301_80404926的博客 1316

视频教程-一学就会——c语言0基础实现贪吃蛇项目-C/C++

一学就会——c语言0基础实现贪吃蛇项目 我是谢昆明,有8年研发经验,在云计算...

weixin_34661510的博客 346

C/C++贪吃蛇项目实战:从数据结构到游戏循环的完整实现

在编程入门阶段,数据结构与算法是构建程序逻辑的核心基础。通过理解队列、数组等数据结构在状态管理中的应用,开发者能够掌握如何将现实问题抽象为计算机模型。这一原理在游戏开发中尤为关键,游戏循环(Game Loop)作为实时应用的核心驱动机制,通过处理输入、更新逻辑和渲染输出的循环,实现了程序的动态交互。其技术价值在于将复杂的实时系统分解为可控的模块,是培养工程思维和问题解决能力的高效实践。在应用场景上,控制台游戏项目如贪吃蛇,完美融合了数据结构选型、状态机设计和跨平台处理等关键技术点,为初学者提供了串联C/C+

weixin_28718755的博客 268
上一篇: C/C++相关概念和易错知识点(8)(预处理、编译、链接)
下一篇: C/C++相关概念和易错知识点(9)(C语言易错语法总结)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值