Funcode海底世界c++(vc6)

article/2025/9/3 4:21:03

海底有五条鱼,其中四条来回随机游动,由玩家用键盘W A S D控制另外一条游动。

要求如下:

  1. 游戏初始界面如下图。
  2. 来回游动的四条鱼,从屏幕左边游进来,均已一个随机速度水平游动。从屏幕右侧游出去,很快又从屏幕右侧游出来,就这样来回游动。
  3. 玩家用WASD键控制一条鱼向上、左、下、右方向游动。松开按键时,玩家的鱼就停止游动。
  4. 玩家的鱼游到屏幕边界时,不能继续往前游。

 代码如下:

LessonX.h

#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include <vector>
using namespace std;/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class	CGameMain
{CSprite* m_pFish;CSprite* m_pMyFish;private:int				m_iGameState;				// 游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中vector<CSprite*>	m_vFish;//float m_fScreenLeft;       //屏幕左边界值float m_fScreenRight;      //右float m_fScreenTop;        //上float m_fScreenBottom;     //底float		m_fSpeedLeft	;// 鱼4个方向的速度float		m_fSpeedRight	;float		m_fSpeedTop		;float		m_fSpeedBottom	;public:CGameMain();            //构造函数~CGameMain();           //析构函数  void OnKeyUp(const int ikey);void OnKeyDown(const int ikey,const int iAltPress,const int ishiftpress,const int iCtrlPress);CSprite* FindSpriteByName(const char*szName,const int iColSide);void			Swimming();// 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            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"//
//
CGameMain		g_GameMain;//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{//m_pFish = new CSprite("yu_0");m_pMyFish=new CSprite("yu_3");m_iGameState = 1;   //游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中m_fScreenBottom			=	0.f;m_fScreenLeft			=	0.f;m_fScreenRight			=	0.f;m_fScreenTop			=	0.f;m_fSpeedBottom=	0.f;m_fSpeedLeft=	0.f;m_fSpeedRight=	0.f;m_fSpeedTop=	0.f;
}
//==============================================================================
//
// 析构函数
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 0:default:break;};
}
//=============================================================================
//void CGameMain::GameInit()
{//在GameInit获取世界边界的值,同时设置  鱼的边界限制  和初始速度://获取屏幕边界值m_fScreenLeft = CSystem::GetScreenLeft();m_fScreenRight = CSystem::GetScreenRight();m_fScreenTop = CSystem::GetScreenTop();m_fScreenBottom = CSystem::GetScreenBottom();//设置精灵世界的边界值m_pFish->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft, m_fScreenTop, m_fScreenRight, m_fScreenBottom);//m_pFish->SetSpriteLinearVelocity(0, 0);//m_pMyFish->SetSpriteLinearVelocity(50, 0);m_pFish->SetSpriteLinearVelocity(30, 0);//这个函数是用来设置精灵的线性速度for(int i=0;i<4;i++){char szName[128];float fPosX,fPosY;float fSpeedX;//将szName的值赋为“fish”加I级循环因子sprintf(szName, "fish%d" ,i);CSprite*tmpSprite=new CSprite(szName);tmpSprite->CloneSprite( "yu_1" );fPosX=CSystem::RandomRange(m_fScreenLeft+10.f,m_fScreenRight-10.f);fPosY=CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);tmpSprite->SetSpritePosition(fPosX,fPosY);tmpSprite->SetSpriteWorldLimit(WORLD_LIMIT_NULL,m_fScreenLeft-20.f,m_fScreenTop,m_fScreenRight+20.f,m_fScreenBottom);fSpeedX=CSystem::RandomRange(10,20);tmpSprite->SetSpriteLinearVelocity(fSpeedX,0);m_vFish.push_back(tmpSprite);}}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun(float fDeltaTime)
{
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}//
void CGameMain::OnSpriteColWorldLimit(const char* szName, const int iColSide)
{bool	bFlip;float	fSpeedX;if(strcmp(szName, "yu_0")==0){if(iColSide == 1)  // 右边{bFlip = true;fSpeedX = -15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}else if(iColSide == 0)   // 左边{bFlip = false;fSpeedX = 15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}}if(strstr(szName,"fish") != NULL){float fPosY;if(iColSide == 1)  // 右边{bFlip = true;fSpeedX = -CSystem::RandomRange(10, 20);}else if(iColSide == 0)   // 左边{bFlip = false;fSpeedX = CSystem::RandomRange(10, 20);}CSprite* tmpSprite=FindSpriteByName(szName,iColSide);FindSpriteByName(szName,iColSide)->SetSpriteFlipX(bFlip);FindSpriteByName(szName,iColSide)->SetSpriteLinearVelocity(fSpeedX, 0);fPosY=CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);//因为有不同的鱼,因此随机生成Y方向的速度后需要分配给不同的//鱼,这样多条鱼就不会重复了FindSpriteByName(szName,iColSide)->SetSpritePositionY(fPosY);}/*tmpSprite->SetSpriteFlipX(bFlip);/*tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0);
*/}CSprite* CGameMain::FindSpriteByName(const char* szName, const int iColSide)
{for(int i=0;i<m_vFish.size();i++)if(strcmp(szName,m_vFish[i]->GetName())==0)return m_vFish[i];return 0;
}void CGameMain::OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{/*	float	fPosX=0.f, fPosY=0.f;switch(iKey){case KEY_W:		fPosY = -10.f; //向上的时候Y方向速度为负的break;case KEY_A:fPosX = -15.f;	//向左的时候X方向的速度为负值break;case KEY_S:	fPosY = 10.f; //向下的时候Y方向的速度为正值break;case KEY_D:fPosX = 15.f;//向右的时候X方向的速度为正值break;}*/switch(iKey){case KEY_W:		m_fSpeedTop = -10.f;break;case KEY_A:m_fSpeedLeft = -15.f;		break;case KEY_S:	m_fSpeedBottom = 10.f;break;case KEY_D:m_fSpeedRight = 15.f;		break;}/*if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX( false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX( true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);*/Swimming();
}
void CGameMain::OnKeyUp( const int iKey )
{/*	float	fSpeedX, fSpeedY;switch(iKey){case KEY_W:case KEY_A:case KEY_S:case KEY_D:fSpeedX = 0.f;fSpeedY = 0.f;}m_pMyFish->SetSpriteLinearVelocity(fSpeedX, fSpeedY);*/switch(iKey){case KEY_W:		m_fSpeedTop = 0.f;break;case KEY_A:m_fSpeedLeft = 0.f;		break;case KEY_S:	m_fSpeedBottom = 0.f;break;case KEY_D:m_fSpeedRight = 0.f;		break;}/*if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX( false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX( true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);*/Swimming();
}
void CGameMain::Swimming()
{if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX(false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX(true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);
}

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;
}//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void CSystem::OnMouseMove(const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void CSystem::OnMouseClick(const int iMouseType, const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void CSystem::OnMouseUp(const int iMouseType, const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// bAltPress bShiftPress bCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void CSystem::OnKeyDown(const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress)
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress);
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
void CSystem::OnKeyUp(const int iKey)
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyUp(iKey);
}//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void CSystem::OnSpriteColSprite(const char* szSrcName, const char* szTarName)
{
}//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边//iColSide 该变量的类型为整型,它用来表示精灵与世界边界碰撞的方位。
void CSystem::OnSpriteColWorldLimit(const char* szName, const int iColSide)
{//g_:		全局变量(global)g_GameMain.OnSpriteColWorldLimit(szName, iColSide);}


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

相关文章

Funcode实现打飞虫1

简介&#xff1a; “拍飞蝇”是一款非常受欢迎的小游戏&#xff0c;这个游戏的玩法非常简单&#xff0c;玩家需要控制一个拍子来打飞来的苍蝇。每次打死一只苍蝇&#xff0c;就能够获得一定的分数。同时&#xff0c;也会有不同种类的苍蝇出现&#xff0c;它们的移动速度和得分也…

进击系列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…