funcode实验--海底世界(c++实现)

article/2025/9/2 23:15:53

C++语言课程设计一海底世界

一、实验内容

海底有若干条鱼,其中若干条相同的鱼向一个方向游动,另一条来回随机游动,由玩家用键盘W A S D控制另外一条游动。

要求如下:

1、 来回游动的鱼,从屏幕左边游进来,均已一个随机速度水平游动。从屏幕右侧游出去,很快又从屏幕右侧游出来,就这样来回游动。

2、 玩家用WASD键控制一条鱼向上、左、下、右方向游动。松开按键时,玩家的鱼就停止游动。

3、 玩家的鱼游到屏幕边界时,不能继续往前游。

(下载地址:点击打开链接)

二、实验代码

LessonX.h

/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include<vector>
using namespace std;/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class	CGameMain
{
private:CSprite*	m_pMyFish;CSprite*	yu1;int				m_iGameState;				// 游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中CSprite*		m_pFish;float		m_fScreenLeft	;	// 屏幕左边界值float		m_fScreenRight	;	// 屏幕右边界值float		m_fScreenTop	;	// 屏幕上边界值float		m_fScreenBottom	;	// 屏幕下边界值vector<CSprite*>	m_vFish;float		m_fSpeedLeft	;// 鱼4个方向的速度float		m_fSpeedRight	;float		m_fSpeedTop		;float		m_fSpeedBottom;void			Swimming();public: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);CGameMain();            //构造函数~CGameMain();           //析构函数// 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");yu1=new CSprite("yu1");m_iGameState			=	1;m_pMyFish=new CSprite("kongzhiyu");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()
{// 获取屏幕的边界值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( 15, 0);yu1->SetSpriteLinearVelocity( 15, 0);yu1->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft, m_fScreenTop, m_fScreenRight, m_fScreenBottom);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("yu1");//创建精灵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 )
{//m_pFish->SetSpriteLinearVelocity(30, 30);
}
//=============================================================================
//
// 本局游戏结束
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);}}}
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];bool	bFlip;float	fSpeedX;float fPosY;if(strstr(szName,"fish2") != NULL){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);tmpSprite->SetSpriteFlipX(bFlip);tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0);fPosY=CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);//因为有不同的鱼,因此随机生成Y方向的速度后需要分配给不同的//鱼,这样多条鱼就不会重复了tmpSprite->SetSpritePositionY(fPosY);}
void CGameMain::OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{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;}Swimming();}void CGameMain::OnKeyUp( const int iKey )
{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;}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 下边
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{g_GameMain.OnSpriteColWorldLimit(szName,iColSide);
}

三、运行结果


(下载地址:点击打开链接)



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

相关文章

FunCode太空战机C++实现

仅供交流学习使用&#xff0c;因博主水平有限&#xff0c;有错误欢迎批评指正 作者&#xff08;即博主本人&#xff09;&#xff1a; Akame Qixisi / Excel Bloonow IDE&#xff1a;Code::Blocks 17.12 编译器需要支持C14或以上标准&#xff08;Code::Blocks如何设置见附录Ⅰ&…

基于funcode的闯关小游戏(山东省齐鲁软件设计大赛三等奖)给自己留个纪念

背景&#xff1a; &#xff08;链接文档在最后&#xff09; 19年的暑假&#xff0c;同学喊我参加山东省齐鲁软件设计大赛&#xff0c;报上名之后有这个funcode课题。d但是从来没有接触过funcode&#xff0c;网上的参考资料也不多&#xff0c;靠着自己摸索和同学交流半懂半做了这…

基于Funcode设计C语言游戏–迷你高尔夫

Funcode设计 文章目录 Funcode设计前言一、Funcode下载地址二、C语言课程设计--迷你高尔夫1.效果图2.部分代码 总结 前言 基于Funcode设计的C语言游戏。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Funcode下载地址 Win10版本 提取码&#xf…

2021年Funcode游戏制作二等奖作品

之前发的有关funcode游戏更多的则是对游戏流程有一个大概的了解&#xff0c;以及如何编写游戏循环&#xff0c;判定游戏的各种触发条件&#xff0c;较为简陋。 这一次看到有人问funcode游戏的制作&#xff0c;就把搁置了许久的 项目拿给大家作为参考建议。 素材来源&#xff1a…

【致敬童年】Funcode实现坦克大战

【2023年5月26日】 带10个需求的资源已上传至Funcode实现坦克大战&#xff08;十个需求&#xff09; 【效果图】 【写在前面的话】 1、虚函数哪里很难受&#xff0c;最后在Commclass里面加了一个无参构造才搞定 2、bug很多&#xff0c;比如世界边界&#xff0c;子弹都有问题。…

Funcode游戏设计C语言小飞虫

Funcode游戏制作 文章目录 Funcode游戏制作前言一、基于Funcode的小飞虫二、使用步骤1.游戏效果图2.游戏代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&…

【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)

一、前言 大一暑假参加了山东省软件设计大赛&#xff0c;基于FunCode平台使用C语言编写了大鱼吃小鱼游戏&#xff0c;其美名曰小鲨鱼历险记&#xff0c;哈哈。比赛成绩惨烈&#xff0c;只拿了一个省三&#xff0c;赛后也进行了分析总结&#xff0c;主要还是太不重视比赛&#…

Funcode实现坦克大战(十个需求)

【写在前言】 1、操作 先按数字&#xff08;1~0&#xff09;10个 表示选择某一需求&#xff08;对应文件的需求&#xff09; 再按K 表示执行该需求&#xff08;控制台有输出&#xff09; 2、写此文为方便大家的学习&#xff0c;希望不要一抄了事&#xff0c;真心希望&#xff0…

Funcode海底世界c++(vc6)

海底有五条鱼&#xff0c;其中四条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 游戏初始界面如下图。来回游动的四条鱼&#xff0c;从屏幕左边游进来&#xff0c;均已一个随机速度水平游动。从屏幕右侧游出去&#xff0c;很快又从屏…

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…