SimpleCG小游戏开发系列(2)--贪吃蛇

一、前言

        在之前的C语言小游戏开发系列我们已经介绍了扫雷游戏的开发,本篇我们继续此系列第二篇,同样是比较简单但好玩的一个游戏--贪吃蛇。因为有了之前的游戏框架,我们只需要直接搬来原来的框架即可,可以省去不少活。

先看看游戏效果预览

下面进行详细的逻辑介绍。

二、玩法介绍

        贪吃蛇是一款经典的游戏,玩家需要控制一条蛇在屏幕上移动,不断吃掉食物并成长,同时要避免碰到墙壁或自己的身体。蛇在移动过程中会遇到食物,玩家需要让蛇的头部碰到食物,蛇就会自动将食物吞下,并且蛇的长度会相应增加。碰到墙壁或自己的身体就游戏结束。

三、主要逻辑及难点说明

        贪吃蛇游戏的核心逻辑在于蛇的移动和食物的生成。蛇的移动需要精确控制,避免蛇的头部碰到自己的身体或者墙壁,食物的生成需要有一定的随机性,使得游戏有一定的变化性。

        我们首先将游戏分三个场景进行绘制,分别是开始前的菜单显示、游戏进行中的场景显示、以及游戏结束界面的显示。我们可以直接用一个全局整型变量g_nGameState来区分场景。在游戏进行时我们主要绘制蛇行走的地图,这个在前面扫雷游戏中有所介绍,大同小异,主要就是一个一维数组实现的二维平面。

int		g_nMap[ C_MAP_WIDTH * C_MAP_HEIGHT]		= {0};

然后是蛇的表示,我们用一个坐标数组来表示蛇身体所处地图位置。

POINT	g_ptSnake[C_SNAKE_MAXLEN];

 地图绘制就是根据地图表示的地形绘制出相应内容

for(j=0;j<C_MAP_HEIGHT;++j){for(i=0;i<C_MAP_WIDTH;++i){switch( g_nMap[j*C_MAP_WIDTH+i] ){case enumMAPTYPE_STONE:solidrectangle( i*C_IMAGE_BLOCK, j*C_IMAGE_BLOCK, i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);break;case enumMAPTYPE_FOOD:setfillcolor(RGB(0xAA,0x0,0x0));solidcircle( i*C_IMAGE_BLOCK+10, j*C_IMAGE_BLOCK+10, 5);setfillcolor(RGB(0xAA,0xAA,0xAA));break;}}}

蛇的行走就只需要根据当前方向进行坐标移动就可以了

switch( g_nSnakDir ){case enumDIR_LEFT:SnakeMoveTo(g_ptSnake[0].x-1,g_ptSnake[0].y);break;case enumDIR_RIGHT:SnakeMoveTo(g_ptSnake[0].x+1,g_ptSnake[0].y);break;case enumDIR_UP:SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y-1);break;case enumDIR_DOWN:SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y+1);break;}

以上就是贪吃蛇涉及的主要设计难点,都比较容易理解,就不展开讨论了。

 四、主体逻辑的所有源代码

        以下就是贪吃蛇的全部主要代码,只是示例程序,所以只设置了一关、有兴趣的同学可以自行扩展代码。

// GameSnake.cpp : 定义控制台应用程序的入口点。
//#include "../import/include/SimpleCG.h"
#include "GameUI.h"#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#ifdef _WIN64
#pragma comment(lib,"../import/lib/x64/MTRelease/SimpleCG_MT64.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MT.lib")
#endif
#endif#define C_SNAK_VERSION			1001#define C_IMAGE_WIDTH			640
#define C_IMAGE_HEIGHT			480
#define C_IMAGE_BLOCK			20
#define C_MAP_WIDTH				C_IMAGE_WIDTH/C_IMAGE_BLOCK
#define C_MAP_HEIGHT			C_IMAGE_HEIGHT/C_IMAGE_BLOCK
#define C_SNAKE_MAXLEN			50
enum ENUM_GAMESTATE
{enumGS_MENU, enumGS_RUNNING, enumGS_GAMEOVER
};
enum ENUM_MAPTYPE
{enumMAPTYPE_NULL, enumMAPTYPE_STONE, enumMAPTYPE_FOOD
};
enum ENUM_DIRECTION
{enumDIR_LEFT, enumDIR_RIGHT, enumDIR_UP, enumDIR_DOWN
};
int		g_nMap[ C_MAP_WIDTH * C_MAP_HEIGHT]		= {0};
int		g_nSnakDir								= enumDIR_LEFT;
POINT	g_ptSnake[C_SNAKE_MAXLEN];
int		g_nSnakLen								= 2;
int		g_nGameState							= enumGS_MENU;
char	g_nTitle[] = { 0x4f,0x49,0x49,0x79,0x0,0x7f,0xe,0x30,0x7f,0x0,0x7e,0x9,0x9,0x7e,0x0,0x7f,0x8,0x14,0x63,0x0,0x7f,0x49,0x49,0x49 };
char	g_pGame[] = { 0x7f,0x41,0x5d,0x49,0x7b,0x0,0x7c,0x12,0x11,0x12,0x7c,0x0,0x7f,0x2,0x4,0x2,0x7f,0x0,0x7f,0x49,0x49,0x49,0x49 };
char	g_pOver[] = { 0x7f,0x41,0x41,0x41,0x7f,0x0,0x1f,0x20,0x40,0x20,0x1f,0x0,0x7f,0x49,0x49,0x49,0x49,0x0,0x7f,0x9,0x19,0x29,0x46 };
int		g_nMenu = 0;
int		g_nScore = 0;
int		g_nSpeed = 1;
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY );
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY );
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY );
//绘制标题
void DrawTitle( int nX, int nY, char *pTitle, int nSize);
void MakeFood()
{bool bFoodSet = false;int nRand = 0;while(!bFoodSet){nRand=rand()%(C_MAP_WIDTH*C_MAP_HEIGHT);if(g_nMap[nRand] == enumMAPTYPE_NULL ){g_nMap[nRand] = enumMAPTYPE_FOOD;bFoodSet = true;}}
}
//初始化游戏
void InitGame(HWND hWnd)
{int i=0;int j=0;for(j=0;j<C_MAP_HEIGHT;++j){for(i=0;i<C_MAP_WIDTH;++i){if(i==0||i==C_MAP_WIDTH-1||j==0||j==C_MAP_HEIGHT-1){g_nMap[j*C_MAP_WIDTH+i] = enumMAPTYPE_STONE;}else{g_nMap[j*C_MAP_WIDTH+i] = enumMAPTYPE_NULL;}}}g_nSpeed = 1;g_nSnakLen = 2;g_ptSnake[0].x = 10;g_ptSnake[0].y = 10;g_ptSnake[1].x = 11;g_ptSnake[1].y = 10;g_nSnakDir = enumDIR_LEFT;srand(GetTickCount());MakeFood();//按键处理初始化//SetKeyboardProcess( enumINMSG_KEYDOWN, OnKeyDown );GetKeyboardInput()->onKeyDown		= OnKeyDown;GetMouseInput()->onMouseDownLeft	= OnLButtonDown;GetMouseInput()->onMouseDownRight	= OnRButtonDown;GetMouseInput()->onMouseMove		= OnMouseMove;g_nGameState = enumGS_MENU;
}
//移动蛇
void SnakeMoveTo(int x, int y)
{int i=0;if(x<0 || y<0 || x>=C_MAP_WIDTH || y>=C_MAP_HEIGHT )return;//GetFoodif(g_nMap[y*C_MAP_WIDTH+x]==enumMAPTYPE_FOOD){g_nMap[y*C_MAP_WIDTH+x]=enumMAPTYPE_NULL;g_ptSnake[g_nSnakLen].x = g_ptSnake[g_nSnakLen-1].x;g_ptSnake[g_nSnakLen].y = g_ptSnake[g_nSnakLen-1].y;if( g_nSnakLen<C_SNAKE_MAXLEN-1)g_nSnakLen++;g_nScore += 10 * g_nSpeed;g_nSpeed = g_nSnakLen / 5 + 1;MakeFood();}else if(g_nMap[y*C_MAP_WIDTH+x]==enumMAPTYPE_STONE )//dead{g_nGameState = enumGS_GAMEOVER;return;}for(i=g_nSnakLen-1;i>0;--i){if( g_ptSnake[i].x==x && g_ptSnake[i].y==y ){g_nGameState = enumGS_GAMEOVER;return;}g_ptSnake[i].x = g_ptSnake[i-1].x;g_ptSnake[i].y = g_ptSnake[i-1].y;}g_ptSnake[0].x = x;g_ptSnake[0].y = y;
}
//按方向移动
void MoveFoward()
{switch( g_nSnakDir ){case enumDIR_LEFT:SnakeMoveTo(g_ptSnake[0].x-1,g_ptSnake[0].y);break;case enumDIR_RIGHT:SnakeMoveTo(g_ptSnake[0].x+1,g_ptSnake[0].y);break;case enumDIR_UP:SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y-1);break;case enumDIR_DOWN:SnakeMoveTo(g_ptSnake[0].x,g_ptSnake[0].y+1);break;}
}
//更新游戏状态
void UpdateGame( UINT nElapse )
{static int s_nLastTick = 0;int nWait = 9-g_nSpeed;if(nWait<0)nWait = 1;if( ( nElapse - s_nLastTick )<nWait*50 )return;switch(g_nGameState){case enumGS_MENU:break;case enumGS_RUNNING:s_nLastTick = nElapse;MoveFoward();break;case enumGS_GAMEOVER:break;}}
//绘制地图
void DrawMap()
{int i=0;int j=0;setfillcolor(RGB(0xAA,0xAA,0xAA));for(j=0;j<C_MAP_HEIGHT;++j){for(i=0;i<C_MAP_WIDTH;++i){switch( g_nMap[j*C_MAP_WIDTH+i] ){case enumMAPTYPE_STONE:solidrectangle( i*C_IMAGE_BLOCK, j*C_IMAGE_BLOCK, i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);break;case enumMAPTYPE_FOOD:setfillcolor(RGB(0xAA,0x0,0x0));solidcircle( i*C_IMAGE_BLOCK+10, j*C_IMAGE_BLOCK+10, 5);setfillcolor(RGB(0xAA,0xAA,0xAA));break;}}}
}
//绘制标题
void DrawTitle( int nX, int nY, char *pTitle, int nSize)
{int i=0;int j=0;for(i=0;i<nSize;++i){int nNum = pTitle[i];for(j=0;j<8;++j){if(nNum&0x1){solidrectangle( nX+i*C_IMAGE_BLOCK, nY+j*C_IMAGE_BLOCK, nX+i*C_IMAGE_BLOCK+C_IMAGE_BLOCK, nY+j*C_IMAGE_BLOCK+C_IMAGE_BLOCK);}nNum>>=1;}}                                                                                                                                                                               
}
//绘制蛇
void DrawSnake()
{int i=0;setfillcolor(RGB(0x0,0xAA,0x0));for(i=0; i<g_nSnakLen; ++i){solidrectangle( g_ptSnake[i].x*C_IMAGE_BLOCK, g_ptSnake[i].y*C_IMAGE_BLOCK, g_ptSnake[i].x*C_IMAGE_BLOCK+C_IMAGE_BLOCK, g_ptSnake[i].y*C_IMAGE_BLOCK+C_IMAGE_BLOCK);}
}
void DrawMenu()
{setfillcolor(RGB(0x0,0xAA,0x0));DrawTitle( 60, 60, g_nTitle, sizeof(g_nTitle)/sizeof(g_nTitle[0]));DrawButton( 200, 260, 120, 30, RGB(0x0,0xDD,0x0), 0, _T("开始游戏"));DrawButton( 200, 300, 120, 30, RGB(0x0,0xDD,0x0), 0, _T("退出游戏"));setlinecolor(0);fillcircle( 180, g_nMenu * 40 + 260 + 15, 10 );
}
//绘制游戏
void RenderGame()
{clearrectangle(0,0,C_IMAGE_WIDTH, C_IMAGE_HEIGHT);switch(g_nGameState){case enumGS_MENU:DrawMenu();break;case enumGS_RUNNING:DrawMap();DrawSnake();RenderUI();break;case enumGS_GAMEOVER:DrawTitle( 100, 60, g_pGame, sizeof(g_pGame)/sizeof(g_pGame[0]));DrawTitle( 100, 220, g_pOver, sizeof(g_pOver)/sizeof(g_pOver[0]));settextcolor(0);printfRectEx( 0, 380, C_IMAGE_WIDTH, 20, SCG_TEXT_MIDDLE, _T("分数: %d"), g_nScore );//outtextRectEx( 0, 400, C_IMAGE_WIDTH, 100, _T("Press any key to continue..."), SCG_TEXT_MIDDLE);outtextRectEx( 0, 400, C_IMAGE_WIDTH, 100, _T("按任意键继续..."), SCG_TEXT_MIDDLE);break;}
}
//按键消息响应函数
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{switch( g_nGameState ){case enumGS_MENU:switch( wParam ){case VK_DOWN:if( g_nMenu<1 )++g_nMenu;break;case VK_UP:if( g_nMenu> 0 )--g_nMenu;break;case VK_SPACE:case VK_RETURN:if( g_nMenu == 1)PostQuitMessage(0);elseg_nGameState = enumGS_RUNNING;break;}break;case enumGS_RUNNING:switch( wParam ){case VK_DOWN:if(g_nSnakDir == enumDIR_LEFT || g_nSnakDir == enumDIR_RIGHT){g_nSnakDir = enumDIR_DOWN;MoveFoward();}return 1;break;case VK_UP:if(g_nSnakDir == enumDIR_LEFT || g_nSnakDir == enumDIR_RIGHT){g_nSnakDir = enumDIR_UP;MoveFoward();}return 1;break;case VK_LEFT:if(g_nSnakDir == enumDIR_UP || g_nSnakDir == enumDIR_DOWN){g_nSnakDir = enumDIR_LEFT;MoveFoward();}return 1;break;case VK_RIGHT:if(g_nSnakDir == enumDIR_UP || g_nSnakDir == enumDIR_DOWN){g_nSnakDir = enumDIR_RIGHT;MoveFoward();}return 1;break;}break;case enumGS_GAMEOVER:InitGame(NULL);break;}return 0;
}LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{switch( g_nGameState ){case enumGS_MENU:if( g_nMenu == 1)PostQuitMessage(0);elseg_nGameState = enumGS_RUNNING;break;case enumGS_RUNNING:switch(g_nSnakDir ){case enumDIR_LEFT:g_nSnakDir = enumDIR_DOWN;break;case enumDIR_RIGHT:g_nSnakDir = enumDIR_UP;break;case enumDIR_UP:g_nSnakDir = enumDIR_LEFT;break;case enumDIR_DOWN:g_nSnakDir = enumDIR_RIGHT;break;}break;case enumGS_GAMEOVER:InitGame(NULL);break;}return false;
}
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( g_nGameState == enumGS_RUNNING){switch(g_nSnakDir ){case enumDIR_LEFT:g_nSnakDir = enumDIR_UP;break;case enumDIR_RIGHT:g_nSnakDir = enumDIR_DOWN;break;case enumDIR_UP:g_nSnakDir = enumDIR_RIGHT;break;case enumDIR_DOWN:g_nSnakDir = enumDIR_LEFT;break;}}return false;
}
LRESULT OnMouseMove( HWND hWnd, WPARAM wParam, int nX, int nY )
{if( g_nGameState == enumGS_MENU){if( nY>=300)g_nMenu = 1;elseg_nMenu = 0;}return false;
}
int _tmain(int argc, _TCHAR* argv[])
{SCG_GameLoopInfo info;info.nFPS				= 60;info.nHeight			= C_IMAGE_HEIGHT;info.nWidth				= C_IMAGE_WIDTH;info.pFunDrawProcess	= RenderGame;info.pFunFrameUpdate	= UpdateGame;info.pFunInitGame		= InitGame;info.pFunInput			= NULL;if( !StartGameLoopEx( &info ))return 1;return 0;
}

五、代码及相关图形库下载

贪吃蛇完整VS2010工程可在以下地址下载。

gamesnake · master · b2b160 / SimpleCG_Demo · GitCode

编译此程序需安装SimpleCG库,安装方法如下: 

SimpleCG库安装方法

如果只想执行程序可在如下地址下载 

贪吃蛇执行程序

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

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

相关文章

java数据结构与算法刷题-----LeetCode 680. 验证回文串 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 思路&#xff1a;双指针 详情见代码注释 class Solution {//贪心双指针&a…

什么是工厂方法模式,工厂方法模式解决了什么问题?

工厂方法模式是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;但将实际的实例化过程延迟到子类中。这样&#xff0c;客户端代码在不同的子类中实例化具体对象&#xff0c;而不是直接实例化具体类。工厂方法模式允许一个类的实例化延迟到其子类&…

Springboot实现登录注册

功能&#xff1a;1、实现用户的登录 2、实现用户的注册以及重名的判断 LoginControl&#xff1a; package com.example.demo.controls;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; imp…

CEC2017(Python):五种算法(HHO、RFO、OOA、PSO、GWO)求解CEC2017

一、5种算法简介 1、哈里斯鹰优化算法HHO 2、红狐优化算法RFO 3、鱼鹰优化算法OOA 4、粒子群优化算法PSO 5、灰狼优化算法GWO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem d…

resnet18

ResNet18的基本含义是&#xff0c;网络的基本架构是ResNet&#xff0c;网络的深度是18层。但是这里的网络深度指的是网络的权重层&#xff0c;也就是包括池化&#xff0c;激活&#xff0c;线性层。而不包括批量化归一层&#xff0c;池化层。 transforms.RandomCrop(32, pa…

RabbitMQ 核心概念(交换机、队列、路由键),队列类型等介绍

RabbitMQ 核心概念(交换机、队列、路由键)&#xff0c;队列类型等介绍 RabbitMQ 是一个消息队列系统&#xff0c;它的核心概念包括交换机&#xff08;Exchange&#xff09;、队列&#xff08;Queue&#xff09;和路由键&#xff08;Routing Key&#xff09;&#xff0c;它们一起…

Apache Flink连载(二十):Flink On Yarn运行 - Yarn Per-Job模式(弃用)

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 任务提交命令 2. 任务…

OCP NVME SSD规范解读-4.NVMe IO命令-2

NVMe-IO-3&#xff1a; 由于设备具有掉电保护功能&#xff08;如Power Loss Protection&#xff0c;PLP&#xff09;&#xff0c;因此在以下情况下&#xff0c;性能不应降低&#xff1a; FUA&#xff08;Force Unit Access&#xff09;&#xff1a;是计算机存储设备中的一种命…

Grafana告警发送至飞书配置指定at某人或所有人

1.问题描述 通过webhook向飞书机器人发送消息&#xff0c;根据飞书机器人官方文档&#xff0c;始终无法指定某个人或者所有人通知&#xff0c;后来发现是文档参数有问题。 文档地址&#xff1a;https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot 官方文档给…

谷达冠楠:抖店怎么运营提升销量

随着电商行业的快速发展&#xff0c;抖店作为抖音平台上的一种新型电商模式&#xff0c;越来越受到商家和消费者的青睐。然而&#xff0c;如何在众多的抖店中脱颖而出&#xff0c;提升销量呢?本文将从以下几个方面为大家分享一些运营技巧。 选品策略&#xff1a;选对产品是提升…

day3双指针

输入一字符串&#xff0c;然后将该字符串中的单词分割开来 #include <iostream> #include <string.h> using namespace std; int main() {char str[1000];gets(str);int nstrlen(str);for(int i0;i<n;i){int ji;while(str[j]! &&j<n) j;for(int ki;k…

Gooxi受邀出席2023松山湖软件和信息服务业高质量发展大会

为推动粤港澳大湾区的软件和先进制造产业的融合发展&#xff0c;“2023松山湖软件和信息服务业高质量发展大会”于今日在松山湖畔隆重举办&#xff0c;会议以“推动软件和制造业深度融合发展&#xff0c;打造软件和信息服务业集聚高地”为主题&#xff0c;聚焦工业软件应用、智…

JavaScript(简写js)常用事件举例演示

目录 1.窗口事件onblur :失去焦点onfocus:获得焦点onload:窗口加载事件onresize:窗口大小缩放事件 二、表单事件oninput &#xff1a;当文本框内容改变时 &#xff0c;立即将改变内容 输出在控制台onchange&#xff1a; 内容改变事件onclick&#xff1a;鼠标单击时触发此事件 三…

Arduino串口发送接收和串口中断事件

目录 一、硬件介绍 1、控制器 2、TTL转USB串口 二、软件程序 1、单片机发送字符串 &#xff08;1&#xff09;每个串口对应的类名称介绍 &#xff08;2&#xff09;发送功能 &#xff08;3&#xff09;代码 &#xff08;4&#xff09;测试 2、单片机接收字符串 &…

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

《Spring Cloud学习笔记:分布式事务Seata》

1.分布式事务理论基础 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务&#xff0c;在传统的数据库事务中&#xff0c;必须要满足ACID四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下产生的事务。 分布式事务是…

状态模式-举例

在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c; 这些状态在某些情况下能够相互转换&#xff0c; 而且对象在不同的状态下也将具有不同的行为。 参考日志来设置状态。 如何判断一个设计模式是行为模式还是什么其他模式&#xff1f; 什么叫行为模式&#…

蓝桥圣诞树(C++)

问题描述 输入样例&#xff1a; 1 3 101 1 2 2 3 输出样例&#xff1a; YES 思路&#xff1a; 这道题还是比较好想的&#xff0c;因为它构造的二叉树是用边连接起来的&#xff0c;不是像之前一样从上到下从左到右按编号构造的&#xff0c;所以可以用邻接表来存每个点还有边&am…

腾讯云价格计算器,一键计算精准报价,好用!

腾讯云价格计算器&#xff1a;可以计算腾讯云服务器不同CVM实例规格、CPU内存、公网带宽和系统盘费用明细表&#xff0c;可以一键计算出精准报价明细表&#xff0c;腾讯云服务器网txyfwq.com分享大家腾讯云服务器价格计算器入口链接、使用方法及限制说明&#xff1a; 腾讯云服…