Funcode实现打飞虫1

article/2025/9/3 4:20:00

简介:

        “拍飞蝇”是一款非常受欢迎的小游戏,这个游戏的玩法非常简单,玩家需要控制一个拍子来打飞来的苍蝇。每次打死一只苍蝇,就能够获得一定的分数。同时,也会有不同种类的苍蝇出现,它们的移动速度和得分也不尽相同,需要玩家根据实际情况来进行打击。游戏时间有限,所以玩家需要尽可能多地打死苍蝇来获取高分。

前言:

        1、相较于文档给出的,优化了单身二十年手速所造成的问题(包括中心点问题)

        2、优化了连续点击拍子的效果不佳的问题

效果图:

精灵总览

背景图层数设置为0

空格开始

倒计时

拍子

 分数

 时间

 蚊子

 名字

 代码:

Main.cpp

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include "CommonClass.h"
#include "LessonX.h"///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{// 初始化游戏引擎if( !CSystem::InitGameEngine( hInstance, lpCmdLine ) )return 0;// To do : 在此使用API更改窗口标题CSystem::SetWindowTitle("LessonX");// 引擎主循环,处理屏幕图像刷新等工作while( CSystem::EngineMainLoop() ){// 获取两次调用之间的时间差,传递给游戏逻辑处理float	fTimeDelta	=	CSystem::GetTimeDelta();// 执行游戏主循环g_GameMain.GameMainLoop( fTimeDelta );};// 关闭游戏引擎CSystem::ShutdownGameEngine();return 0;
}//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnMouseMove(fMouseX, fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnMouseClick(iMouseType, fMouseX, fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void CSystem::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnMouseUp(iMouseType, fMouseX, fMouseY);
}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
//
void CSystem::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyDown(iKey, bAltPress, bShiftPress, bCtrlPress);
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
//
void CSystem::OnKeyUp( const int iKey )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyUp(iKey);
}//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
//
void CSystem::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnSpriteColSprite(szSrcName, szTarName);
}//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵的世界边界限制
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
//
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnSpriteColWorldLimit(szName, iColSide);
}

LessonX.h


#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include <vector>
using namespace std;
/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class	CGameMain
{
private:int				m_iGameState;				// 游戏状态,0:结束或者等待开始;1:初始化;2表示未开始(此时拍子不随鼠标移动),3 表示倒计时阶段, 4表示开始拍子可以随鼠标移动并拍打public:CGameMain();            //构造函数~CGameMain();           //析构函数float	m_fRotateTime;		// 拍子拍下后距离复位还差多少时间float	m_fOldRotation;		// 拍子的初始角度CSprite	 *paizi;
//    int m_iGameState;int				countdownTime ;	//倒计时时间float			countPassedTime;	//倒计时经过的时间CTextSprite		*countdown;		//倒计时的文字精灵CSprite			*kaishi;			//“空格开始”精灵vector< CSprite *>  m_mosquitos;vector< CSprite *>  m_names;int		m_iMosquitoCount;int					m_iGameScore;		//当前得分CTextSprite			*score;			//score精灵float			m_fGameTime;		//游戏时间CTextSprite		*gameTime;		//游戏时间精灵int index = 1;// Get方法int				GetGameState()											{ return m_iGameState; }// Set方法void			SetGameState( const int iState )				{ m_iGameState	=	iState; }// 游戏主循环等void			GameMainLoop( float	fDeltaTime );void			GameInit();void			GameRun( float fDeltaTime );void			GameEnd();void 			OnMouseMove( const float fMouseX, const float fMouseY );void 			OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );void 			OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY );void 			OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress );void 			OnKeyUp( const int iKey );void 			OnSpriteColSprite( const char *szSrcName, const char *szTarName );void 			OnSpriteColWorldLimit( const char *szName, const int iColSide );
};/
//
extern CGameMain	g_GameMain;#endif // _LESSON_X_H_

LessonX.Cpp

#include <Stdio.h>
#include "CommonClass.h"
#include "LessonX.h"
#include <iostream>
using namespace std;//
//
CGameMain		g_GameMain;//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{m_iGameState =	1;paizi = new CSprite("paizi");countdown = new CTextSprite("countdown");kaishi = new CSprite("kaishi");score = new CTextSprite("score");//实例化得分gameTime = new CTextSprite("gameTime");
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
}//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop( float	fDeltaTime )
{switch( GetGameState() ){// 初始化游戏,清空上一局相关数据case 1:{GameInit();SetGameState(2); // 初始化之后,将游戏状态设置为进行中}break;// 游戏进行中,处理各种游戏逻辑case 2:{// TODO 修改此处游戏循环条件,完成正确游戏逻辑if( true ){GameRun( fDeltaTime );}else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态{SetGameState(0);GameEnd();}}break;case 3:case 4:{// TODO 修改此处游戏循环条件,完成正确游戏逻辑if( true ){GameRun( fDeltaTime );}else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态{SetGameState(0);GameEnd();}}// 游戏结束/等待按空格键开始case 0:default:break;};
}
//=============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void CGameMain::GameInit()
{CSystem::ShowCursor(false);	//隐藏鼠标m_fRotateTime = 0.f;//旋转时间m_fOldRotation = paizi->GetSpriteRotation();		//获取拍子的初始角度countdownTime = 5;		//倒计时时间为5scountPassedTime = 0.f;countdown->SetSpriteVisible(false);		//设置倒计时不可见m_iMosquitoCount = 15;//蚊子的数量m_iGameScore = 0;//将得分设置为0
}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{/*if(m_fRotateTime > 0)	{m_fRotateTime -= fDeltaTime;	//每经过fDeltaTime,拍子旋转的时间也少了fDeltaTimeif(m_fRotateTime <= 0){	//经过了0.2s以后paizi->SetSpriteRotation(m_fOldRotation);	//恢复拍子的初始旋转角}}*/if(m_iGameState==3){	//m_iGameState 为3时才执行countPassedTime += fDeltaTime;	//统计经过的时间,并存储到countPassedTime//思考:countPassedTime 是浮点数,那么为什么countdown -countPassedTime可以显示整数的时间?countdown->SetTextValue(countdownTime -countPassedTime);if(countPassedTime >= countdownTime){	//经过的时间超过countdownTimecountdown->SetSpriteVisible(false);	//隐藏countdowncountPassedTime = 0;		//重置经过的时间,为下一轮游戏做准备m_iGameState = 4;		//切换g_iGameState 3->4//蚊子的生成是在此处//获取最大边界int minX		=	CSystem::GetScreenLeft() + 5;int maxX		=	CSystem::GetScreenRight() - 5;int minY		=	CSystem::GetScreenBottom() - 5;int maxY		=	CSystem::GetScreenTop() + 5;int	iPosX = 0, iPosY = 0;		//随机产生的横纵坐标位置int iLoop;	//循环控制变量for( iLoop = 0; iLoop < m_iMosquitoCount; iLoop++ ){//利用iLoop产生不同的蚊子名char *szName = CSystem::MakeSpriteName("wenzi",iLoop);CSprite *wenzi = new CSprite(szName);wenzi->CloneSprite("wenziTemplate");	//复制wenziTemplateiPosX	=	CSystem::RandomRange(minX, maxX);		//随机产生X坐标iPosY	=	CSystem::RandomRange(minY, maxY);		//随机产生Y坐标wenzi->SetSpritePosition(iPosX,iPosY);  //设置产生蚊子的位置if(iLoop%3==0){wenzi->SetSpriteWidth(3.7f);wenzi->SetSpriteHeight(3.7f);}else if(iLoop%3==1){wenzi->SetSpriteWidth(5.7f);wenzi->SetSpriteHeight(5.7f);}else{wenzi->SetSpriteWidth(7.7f);wenzi->SetSpriteHeight(7.7f);}m_mosquitos.push_back(wenzi);		//压入vector中集中管理}}} else if(m_iGameState==4){m_fGameTime -= fDeltaTime;if(m_fGameTime > 0){gameTime->SetTextValue(m_fGameTime);	//若游戏时间未结束,则显示剩余的游戏时间}else{m_iGameState = 2;		//若游戏时间结束,完成g_iGameState 2->0的转换kaishi->SetSpriteVisible(true);	//显示“空格开始”m_fGameTime = 0;paizi->SetSpritePositionX(-0.852f);paizi->SetSpritePositionY(-1.000f);gameTime->SetTextValue(m_fGameTime);}}
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}
//==========================================================================
//
// 鼠标移动
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseMove( const float fMouseX, const float fMouseY )
{if(m_iGameState==4){paizi->SetSpritePosition(fMouseX, fMouseY);	//使拍子的位置和鼠标一致}}
//==========================================================================
//
// 鼠标点击
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{if(iMouseType == MOUSE_LEFT && m_iGameState == 4)	//鼠标左键按下{paizi->SetSpriteRotation(m_fOldRotation - 10);		//设置拍子的旋转角,为初始值-10m_fRotateTime	=	0.2f;	//拍打的时间间隔 0.2s,即0.2s后恢复拍子初始角度//遍历判定蚊子是否被击中float fX,fY;int flag = -1;for(int i=0;i<m_mosquitos.size();i++){		//遍历vector中的蚊子fX = m_mosquitos[i]->GetSpritePositionX();	//获取蚊子所的纵坐标fY = m_mosquitos[i]->GetSpritePositionY();	//获取蚊子所在if(paizi->IsPointInSprite(fX,fY))			//判断蚊子是否在拍子的范围内{int h = m_mosquitos[i]->GetSpriteHeight();int w = m_mosquitos[i]->GetSpriteWidth();char *myName = CSystem::MakeSpriteName("names",i);CSprite *myNames = new CSprite(myName);myNames->CloneSprite("myName");myNames->SetSpritePosition(fX,fY);myNames->SetSpriteWidth(w+2);myNames->SetSpriteHeight(h);m_names.push_back(myNames);m_mosquitos[i]->DeleteSprite();	//删除该蚊子vector<CSprite*>::iterator it = m_mosquitos.erase(m_mosquitos.begin()+i,m_mosquitos.begin()+i+1);m_iGameScore++;							//每打一只蚊子加一分score->SetTextValue(m_iGameScore);break;}}}
}
//==========================================================================
//
// 鼠标弹起
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{paizi->SetSpriteRotation(m_fOldRotation);
}
//==========================================================================
//
// 键盘按下
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress ){if( KEY_SPACE == iKey && 2 ==  m_iGameState )	//按下空格且游戏状态为2时{m_iGameState =	3;	//设置游戏状态进入倒计时,即3countdown->SetSpriteVisible(true);	//显示倒计时文本框kaishi->SetSpriteVisible(false);		//隐藏“空格开始”m_iGameScore = 0.f;		//初始化新一轮游戏分数m_fGameTime = 10.f;		//初始化新一轮游戏时间score->SetTextValue(m_iGameScore);gameTime->SetTextValue(m_fGameTime);for(int i=0;i<m_mosquitos.size();i++){	//删除上一轮游戏中剩余的蚊子m_mosquitos[i]->DeleteSprite();}for(int i=0;i<m_names.size();i++){m_names[i]->DeleteSprite();}m_mosquitos.clear();	//清空vectorm_names.clear();}
}
//==========================================================================
//
// 键盘弹起
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
void CGameMain::OnKeyUp( const int iKey )
{}
//===========================================================================
//
// 精灵与精灵碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
void CGameMain::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{}
//===========================================================================
//
// 精灵与世界边界碰撞
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{}


http://chatgpt.dhexx.cn/article/o3a0ny4P.shtml

相关文章

进击系列2.0:进击的骑士-----用funcode与C语言实现射击游戏制作

funcode实现射击游戏----进击的骑士 相关程序&#xff1a;https://download.csdn.net/download/hidden_sword/86237168 制作软件funcode funcode为一款可以进行二维游戏制作的软件&#xff0c;可以兼容vc6.0及codeblocks等C语言编译器。funcode可实现动画制作&#xff0c;地…

Funcode实现黄金矿工

前言&#xff1a; 一步步按照下面的步骤走&#xff0c;肯定是可以运行的。 此文优化了文档中的一些Bug 代码不是很重要&#xff0c;最重要的还是学习编程的思想。毕竟funcode并不是一个常用的软件 如果有问题&#xff0c;欢迎在下面留言&#xff0c;我会竭尽所能进行解答 一、准…

Funcode学习笔记:完成Run、Jump、Idle等动作【后续更新Roll、Attack动作的实现】【By Myself】

先来实现Run和Idle动作吧&#xff1b; 【以下是本菜在写游戏时犯下的一些错误&#xff0c;以及一些灵感&#xff0c;即如何解决逻辑错误的&#xff1b;】 首先&#xff0c;先大概说一下我们的愿景是什么&#xff0c;当我们按下A键时&#xff0c;人物向左边运动&#xff0c;且…

funcode小游戏暑假大作业,开源,新颖,游戏名:凿空,免费。

Funcode小游戏暑期大作业新颖制作 &#x1f601;里面有五个关卡&#xff0c;每个关卡玩法不同&#xff0c;虽然技术含量不高&#xff0c;但是绝对够新颖。 &#x1f602;本款游戏名叫凿空&#xff0c;小组合作制品&#xff0c;当时对代码没那么了解&#xff0c;所以写起来比较乱…

手把手教你做多重线性逐步回归

1.案例背景与分析策略 1.1 案例背景介绍 某研究收集到美国50个州关于犯罪率的一组数据&#xff0c;包括人口、面积、收入、文盲率、高中毕业率、霜冻天数、犯罪率共7个指标&#xff0c;现在我们想考察一下州犯罪率和哪些指标有关。数据上传SPSSAU后&#xff0c;在 “我的数据…

讲讲逐步回归

总第178篇/张俊红 01.前言 前面我们讲过了多元线性回归。这一篇我们来讲讲逐步回归。什么是逐步回归呢&#xff1f;就是字面意思&#xff0c;一步一步进行回归。 我们知道多元回归中的元是指自变量&#xff0c;多元就是多个自变量&#xff0c;即多个x。这多个x中有一个问题需要…

多重共线性产生原因及处理办法+R语言+糖尿病数据案例分析+逐步回归法

1、多重共线性 多重共线性一般是在&#xff08;1&#xff09;时间序列数据和&#xff08;2&#xff09;横截面数据中会发生。 产生的影响 &#xff08;1&#xff09;OLS得到的回归参数估计值很不稳定 &#xff08;2&#xff09;回归系数的方差随共线性强度增加而增长 &#…

SPSS多元线性回归及逐步回归教程

点击分析->回归->线性会出来如图 选择自变量&#xff0c;因变量。点击左侧然后点击即可选择变量并将它添加到自变量、因变量。 点击统计&#xff0c;需要额外勾选共线性诊断和然后点击继续&#xff0c;点击 设置成如图 。 解释&#xff1a;---------------------------…

Python OLS 双向逐步回归

算法基本思路&#xff1a;首先需要确定一个因变量y以此构建一元回归方程&#xff0c;再找到已通过显著性检验的一元线性回归方程中F值最大的解释变量x0&#xff0c;将其并入回归方程中&#xff0c;再分别将剩余的解释变量与解释变量x0作为OLS函数的自变量集拟合回归方程&#x…

逐步回归分析

逐步回归分析 在实际问题中,首先碰到的问题是如何确定自变量。通常是根据所研究的问题,结合经济理论,罗列出对因变量可能有影响的一些因素作为自变量。 因此,我们需要挑选出对因变量有显著影响的自变量,构造最优的回归方程。 逐步回归的基本思想是:将变量一个一个引入,…

向前逐步回归

向前逐步回归 我们在进行拟合的时候&#xff0c;没有必要将所有变量都引入到我们的函数之中&#xff0c;这种操作往往会导致过拟合&#xff0c;而过拟合带来的致命影响就是泛化能力差&#xff0c;最小二乘法估计参数的时候无法终止学习的过程。向前逐步回归的引入则可以控制学…

SPSSAU中逐步回归法——探索分析单支股票数据(实践)

数据说明&#xff1a; 还是选择万兴科技的股票数据来做回归分析&#xff0c;和《股票时序分析和时序模型&#xff08;实践&#xff09;》这篇文章使用数据一致。需要说明由于spssau免费账号最多输入50项数据&#xff0c;所以使用的都是近50期数据。 spssau上的相关分析图 pyth…

多元逐步回归算法

先谈一下个人对多元逐步回归的理解&#xff1a;多元逐步回归的最本质的核心是最小二乘原理&#xff0c;本方法中调用smf方法。# encoding: utf-8""" 功能&#xff1a;多元逐步回归 描述&#xff1a;基于python实现多元逐步回归的功能 作者&#xff1a;CHEN_C_W …

【模型开发】逐步回归

1.定义 当变量中含有对被解释变量影响不大的解释变量时&#xff0c;可能因为误差平方和的自由度减小而使方差的估计增大&#xff0c;从而影响回归预测的精度&#xff0c;适当的选择一个变量建立一个最优的回归方程十分重要。 逐步回归&#xff08;Stepwise Regression&#xff…

matlab逐步回归分析法,天大matlab大作业逐步回归分析方法.doc

天大matlab大作业逐步回归分析方法.doc 逐步回归分析方法在实际中&#xff0c;影响Y的因素很多&#xff0c;这些因素可能存在多重共线性(相关性)&#xff0c;这就对系数的估计带来不合理的解释&#xff0c;从而影响对Y的分析和预测。“最优”的回归方程就是包含所有对Y有影响的…

【R语言数据科学】(十九):变量选择(一)逐步回归法

【R语言数据科学】 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可视化、R…

4.1程序控制流图

程序控制流图&#xff0c;简称流图&#xff0c;是对程序流程图进行简化后得到的&#xff0c;它可以更加突出的表示程序控制流的结构。 控制流图中包括两种图形符号&#xff1a; 节点控制流线 复合条件要分解为简单条件 判定节点&#xff08;谓词节点&#xff09; 由判定节点发…

流程控制(上)

大家好&#xff0c;我是Python领域的博主。 如果你是编程爱好者可以小编一起学习&#xff0c;在这里我每天都会发Python的基础知识&#xff0c;以及相关的代码。 如果文章有什么错误的地方&#xff0c;请不吝赐教。 觉得博主文章写的还错的话&#xff0c;请三连支持一下博主哦 …

使用soot和graphviz画Java的控制流图

辛苦两天了&#xff0c;啥也不说&#xff0c;先来张图&#xff1a; 看着可真漂亮&#xff0c;O(∩_∩)O哈哈~ 实验环境是Ubuntu。 1.JDK的版本必须是1.7或者以下&#xff0c;JDK1.8不行&#xff0c;总会报错&#xff0c; 2.下载sootclasses-2.5.0.jar包&#xff1a;http://d…

软件测试----------------- 控制流图 圈复杂度 独立路径 测试用例

最近在学软件测试&#xff0c;学到了画&#xff0c;控制流图 圈复杂度 独立路径 测试用例&#xff0c;这里&#xff0c;有些不理解&#xff0c;就网上查了下&#xff0c;发现好多老哥写错了&#xff0c;大佬写的甚至收费79。 我试着写写&#xff0c;如果有不足的&#xff0c;大…