热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

C语言课程设计一海底世界一、实验内容海底有若干条鱼,其中若干条相同的鱼向一个方向游动,另一条来回随机游动,由玩家用键盘WASD控制另外

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


一、实验内容

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

要求如下:

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

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

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


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


二、实验代码


LessonX.h

/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include
#include
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 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
#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 &#61; CSystem::GetScreenLeft();m_fScreenRight &#61; CSystem::GetScreenRight();m_fScreenTop &#61; CSystem::GetScreenTop();m_fScreenBottom &#61; 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&#61;0; i<4; i&#43;&#43;){char szName[128];float fPosX, fPosY;float fSpeedX;
//将szName的值赋为”fish”加I,级循环因子sprintf(szName, "fish%d",i);CSprite* tmpSprite&#61;new CSprite(szName);tmpSprite->CloneSprite("yu1");//创建精灵fPosX &#61; CSystem::RandomRange(m_fScreenLeft&#43;10.f, m_fScreenRight-10.f);fPosY &#61; CSystem::RandomRange(m_fScreenTop&#43;10.f,m_fScreenBottom-10.f);tmpSprite->SetSpritePosition(fPosX, fPosY);tmpSprite->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-20.f, m_fScreenTop, m_fScreenRight&#43;20.f, m_fScreenBottom);fSpeedX &#61; CSystem::RandomRange(10, 20);tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0);m_vFish.push_back(tmpSprite);}}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{//m_pFish->SetSpriteLinearVelocity(30, 30);
}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}
void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{bool bFlip;float fSpeedX;if(strcmp(szName, "yu_0")&#61;&#61;0){if(iColSide &#61;&#61; 1) // 右边{bFlip &#61; true;fSpeedX &#61; -15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}else if(iColSide &#61;&#61; 0) // 左边{bFlip &#61; false;fSpeedX &#61; 15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}}}
CSprite* CGameMain::FindSpriteByName(const char* szName, const int iColSide)
{for(int i&#61;0; iGetName())&#61;&#61;0)return m_vFish[i];bool bFlip;float fSpeedX;float fPosY;if(strstr(szName,"fish2") !&#61; NULL){if(iColSide &#61;&#61; 1) // 右边{bFlip &#61; true;fSpeedX &#61; -CSystem::RandomRange(10, 20);}}else if(iColSide &#61;&#61; 0) // 左边{bFlip &#61; false;fSpeedX &#61; CSystem::RandomRange(10, 20);}CSprite* tmpSprite&#61;FindSpriteByName(szName,iColSide);tmpSprite->SetSpriteFlipX(bFlip);tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0);fPosY&#61;CSystem::RandomRange(m_fScreenTop&#43;10.f,m_fScreenBottom-10.f);//因为有不同的鱼&#xff0c;因此随机生成Y方向的速度后需要分配给不同的//鱼&#xff0c;这样多条鱼就不会重复了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 &#61; -10.f;break;case KEY_A:m_fSpeedLeft &#61; -15.f;break;case KEY_S:m_fSpeedBottom &#61; 10.f;break;case KEY_D:m_fSpeedRight &#61; 15.f;break;}Swimming();}void CGameMain::OnKeyUp( const int iKey )
{switch(iKey){case KEY_W:m_fSpeedTop &#61; 0.f;break;case KEY_A:m_fSpeedLeft &#61; 0.f;break;case KEY_S:m_fSpeedBottom &#61; 0.f;break;case KEY_D:m_fSpeedRight &#61; 0.f;break;}Swimming();
}
void CGameMain::Swimming()
{if((m_fSpeedLeft &#43; m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX(false);else if((m_fSpeedLeft &#43; m_fSpeedRight) <0)m_pMyFish->SetSpriteFlipX(true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft &#43; m_fSpeedRight, m_fSpeedTop &#43; 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");// 引擎主循环&#xff0c;处理屏幕图像刷新等工作while( CSystem::EngineMainLoop() ){// 获取两次调用之间的时间差&#xff0c;传递给游戏逻辑处理float fTimeDelta &#61; CSystem::GetTimeDelta();// 执行游戏主循环g_GameMain.GameMainLoop( fTimeDelta );};// 关闭游戏引擎CSystem::ShutdownGameEngine();return 0;
}//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉鼠标移动消息后&#xff0c;将调用到本函数
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉鼠标点击消息后&#xff0c;将调用到本函数
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉鼠标弹起消息后&#xff0c;将调用到本函数
void CSystem::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉键盘按下消息后&#xff0c;将调用到本函数
// bAltPress bShiftPress bCtrlPress 分别为判断Shift&#xff0c;Alt&#xff0c;Ctrl当前是否也处于按下状态。比如可以判断Ctrl&#43;E组合键
void CSystem::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress);}
//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉键盘弹起消息后&#xff0c;将调用到本函数
void CSystem::OnKeyUp( const int iKey )
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyUp(iKey);}//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉到精灵与精灵碰撞之后&#xff0c;调用此函数
void CSystem::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
}//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
//
// 引擎捕捉到精灵与世界边界碰撞之后&#xff0c;调用此函数.
// iColSide : 0 左边&#xff0c;1 右边&#xff0c;2 上边&#xff0c;3 下边
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{g_GameMain.OnSpriteColWorldLimit(szName,iColSide);
}

三、运行结果




&#xff08;下载地址&#xff1a;点击打开链接&#xff09;




推荐阅读
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
author-avatar
云沏-茶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有