funcode拍飞虫C语言报告,【逻辑游戏面试题】面试问题:funcode… - 看准网
C++语言课程设计一拍飞虫
一、实验内容
玩家通过控制拍子拍打飞虫获取分数。
要求如下:
1、 单击空格键即可进入游戏。进入游戏后左上角有两个记录游戏数据标示。上面一个是记录游戏剩余时间,下面一个是记录本局的游戏分数。下面也有五个记录游戏数据的标示,从左到右分别是记录各局游戏分数分数最高的前五个。
2、 移动鼠标可以控制拍子的移动,单击鼠标左键可以控制拍子拍打动作。
3、 游戏开始的时候,系统随机生成12个虫子,其中大虫子5个,小虫子7个,每打死一个大虫子获得1分,打死一个小虫子获得2分。游戏的分数会实时的显示在左上角。
4、 附加:姓名随拍子一块运动。
二、实验代码
LessonX.h/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include
/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
classCGameMain
{
private:
intm_iGameState;// 游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中
CSprite*m_pPaizi;//拍子精灵
CSprite*m_pKaishi;//空格开始精灵
floatm_fGameTime;// 本局游戏剩余时间
CTextSprite*m_pTime; //显示时间文字编辑精灵
CTextSprite*m_pScore;//显示分数文件编辑精灵
floatm_fPosX;//拍子精灵的x坐标
floatm_fPosY;//拍子精灵的y坐标
intm_iGameScore;// 本局游戏当前积分值
floatm_fRotateTime;// 拍子拍下后距离复位还差多少时间
floatm_fOldRotation;// 拍子的初始角度
floatm_fScreenLeft;// 屏幕的4个边界值:上下左右
floatm_fScreenRight;
floatm_fScreenTop;
floatm_fScreenBottom;
// CSprite*m_pFeichong;//飞虫精灵
CSprite*m_pFeichong[15];//飞虫精灵
intm_iScore[15];//拍中对应飞虫精灵的得分
intm_iCount;// 记录游戏中一共创建多少只飞虫
intm_iHighScore[5] ;// 最高的5局分数
CTextSprite*m_pScoreNum[5];//地图下方的5个文字显示精灵数组
CSprite* m_pMyName;
public:
CGameMain(); //构造函数
~CGameMain(); //析构函数
// Get方法
intGetGameState(){ return m_iGameState; }
// Set方法
voidSetGameState( const int iState ){ m_iGameState=iState; }
// 游戏主循环等
voidGameMainLoop( floatfDeltaTime );
voidGameInit();
voidGameRun( float fDeltaTime );
voidGameEnd();
voidOnKeyDown( const int iKey, const int bAltPress, const int bShiftPress, const int bCtrlPress );
voidOnMouseMove( const float fMouseX, const float fMouseY );
voidOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );
voidFlying(const char* szName); //参数为设置飞虫飞行的名字
voidOnSpriteColWorldLimit( const char *szName, const int iColSide );
voidAddFlyBugs();// 添加飞虫
CSprite*FindSpriteByName(const char* szName);//找到飞虫的名字
CTextSprite*FindTextSpriteByName(const char* szName);
};
/
//
extern CGameMaing_GameMain;
#endif // _LESSON_X_H_
LessonX.cpp/
//
//
//
//
/
#include
#include "CommonClass.h"
#include "LessonX.h"
//
//
CGameMaing_GameMain;
//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{
m_iGameState=0;
m_fGameTime=0.f;
m_iGameScore=0;
m_fPosX=0.f;
m_fPosY=0.f;
m_pKaishi=new CSprite("kaishi");
m_pPaizi=new CSprite("paizi");
m_pTime=new CTextSprite("Time");
m_pScore=new CTextSprite("Score");
m_fRotateTime=0.f;
m_fOldRotation=0.f;
//屏幕的4个边界值:上下左右
m_fScreenBottom=0.f;
m_fScreenLeft=0.f;
m_fScreenRight=0.f;
m_fScreenTop=0.f;
//m_pFeichong=new CSprite("feichong_0");
m_iCount=0;
for(int i=0;i<5;i++)
{
m_iHighScore[i]=0;
m_pScoreNum[i]=new CTextSprite(CSystem::MakeSpriteName("Score",i));
}
m_pMyName=new CSprite("MyName");
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
}
//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop( floatfDeltaTime )
{
switch( GetGameState())
{
// 初始化游戏,清空上一局相关数据
case 1:
{
GameInit();
SetGameState(2); // 初始化之后,将游戏状态设置为进行中
}
break;
// 游戏进行中,处理各种游戏逻辑
case 2:
{
// TODO 修改此处游戏循环条件,完成正确游戏逻辑
if(m_fGameTime>0)
{
GameRun( fDeltaTime );
}
else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
}
}
break;
// 游戏结束/等待按空格键开始
case 0:
default:
break;
};
}
//=============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void CGameMain::GameInit()
{
m_fPosX=m_pPaizi->GetSpritePositionX();
m_fPosY=m_pPaizi->GetSpritePositionY();
m_fOldRotation=m_pPaizi->GetSpriteRotation();
/*
//获取世界边界的值
m_fScreenLeft = CSystem::GetScreenLeft();
m_fScreenRight = CSystem::GetScreenRight();
m_fScreenTop = CSystem::GetScreenTop();
m_fScreenBottom = CSystem::GetScreenBottom();
// 设置该精灵的世界边界
m_pFeichong->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-10.f, m_fScreenTop-10.f, m_fScreenRight+10.f, m_fScreenBottom+10.f);
*/
}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{
m_fGameTime -= fDeltaTime;
m_pTime->SetTextValue((int)m_fGameTime);
//在游戏中判断拍子拍下后,动作时间是否达到了0,是的话恢复拍子的角度
if(m_fRotateTime > 0)
{
m_fRotateTime -= fDeltaTime;
if(m_fRotateTime <= 0)
{
m_pPaizi->SetSpriteRotation(m_fOldRotation);
}
}
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
m_iGameState = 0;
m_pKaishi->SetSpriteVisible(true);
m_fGameTime = 0.f;
//m_pScore->SetTextValue((int)m_fGameTime);
m_pTime->SetTextValue((int)m_fGameTime);
CSystem::ShowCursor(true);
m_pPaizi->SetSpritePosition(m_fPosX,m_fPosY);
//m_pFeichong->DeleteSprite();
for(int i=0; i
{
m_pFeichong[i]->DeleteSprite();
}
m_iCount = 0;
// 把本局分数与历史最高的5次分数比较
if(m_iGameScore> m_iHighScore[4])
{
m_iHighScore[4] = m_iGameScore;
int temp = 0;
for(int i=4; i>0; i--)
{
if(m_iHighScore[i] > m_iHighScore[i-1])
{
temp = m_iHighScore[i];
m_iHighScore[i] = m_iHighScore[i-1];
m_iHighScore[i-1] = temp;
}
else
{
break;
}
}
}
char szName[256];
for(int i=0; i<5; i++)
{
sprintf(szName, "Score%d", i);
CTextSprite* tmpSprite=FindTextSpriteByName(szName);
tmpSprite->SetTextValue(m_iHighScore[i]);
}
}
//按键监听
void CGameMain::OnKeyDown( const int iKey, const int bAltPress, const int bShiftPress, const int bCtrlPress )
{
if( KEY_SPACE == iKey && 0 == m_iGameState )
{
m_iGameState =1;
m_iGameScore=0;
m_fGameTime=30.f; //游戏总共的时间
// 更新当前游戏积分显示(清零上一局积分显示值)
m_pScore->SetTextValue(m_iGameScore);
// 更新当前游戏剩余时间显示, 由于游戏刚开始,所以直接设置为g_fMaxGameTime
m_pTime->SetTextValue(m_fGameTime);
// 隐藏 "按空格开始游戏" 这个提示图片
m_pKaishi->SetSpriteVisible(false);
// 隐藏鼠标
CSystem::ShowCursor(false);
// 从精灵模板中复制出一只精灵
//m_pFeichong->CloneSprite("feichong_muban1");
//创建飞虫精灵
AddFlyBugs();
// 调用函数,设置飞虫飞行轨迹
//Flying("feichong_0");
}
}
//监听拍子的移动
void CGameMain::OnMouseMove( const float fMouseX, const float fMouseY )
{
if(m_iGameState==1||m_iGameState==2)
{
m_pPaizi->SetSpritePosition(fMouseX, fMouseY);
m_pMyName->SetSpritePosition(fMouseX, fMouseY+10.0f);
}
}
void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
if(m_iGameState==1||m_iGameState==2)
{
m_pPaizi->SetSpriteRotation(m_fOldRotation - 10);
m_fRotateTime=0.2f;
}
float fPosX, fPosY;
/*
fPosX = m_pFeichong->GetSpritePositionX();
fPosY = m_pFeichong->GetSpritePositionY();
// 飞虫中心点在拍子范围内,说明拍子打中飞虫
if(m_pPaizi->IsPointInSprite(fPosX, fPosY))
{
Flying("feichong_0");
}
*/
for(int i=0; i
{
fPosX = m_pFeichong[i]->GetSpritePositionX();
fPosY = m_pFeichong[i]->GetSpritePositionY();
// 飞虫中心点在拍子范围内,说明拍子打中飞虫
if(m_pPaizi->IsPointInSprite(fPosX, fPosY))
{
Flying(m_pFeichong[i]->GetName());
m_iGameScore += m_iScore[i];
}
}
m_pScore->SetTextValue(m_iGameScore);//更改游戏分数显示
}
//创建所有的飞虫
void CGameMain::AddFlyBugs()
{
for(int i=0; i<5; i++)
{
m_pFeichong[m_iCount]=new
CSprite(CSystem::MakeSpriteName("feichong_",m_iCount));
m_iScore[m_iCount]=1;
m_iCount++;
}
for(int i=0; i<7; i++)
{
m_pFeichong[m_iCount]=new
CSprite(CSystem::MakeSpriteName("feichong_",m_iCount));
m_iScore[m_iCount]=2;
m_iCount++;
}
for(int i=0; i
{
// 从精灵模板中复制出一只精灵
if(m_iScore[i] == 1)
{
m_pFeichong[i]->CloneSprite("feichong_muban1");
}
else
{
m_pFeichong[i]->CloneSprite("feichong_muban2");
}
// 获取屏幕边界值
m_fScreenLeft = CSystem::GetScreenLeft();
m_fScreenRight = CSystem::GetScreenRight();
m_fScreenTop = CSystem::GetScreenTop();
m_fScreenBottom = CSystem::GetScreenBottom();
// 设置该精灵的世界边界
m_pFeichong[i]->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-10.f, m_fScreenTop-10.f, m_fScreenRight+10.f, m_fScreenBottom+10.f);
Flying(m_pFeichong[i]->GetName());
}
}
//随机生成飞虫的飞行轨迹
void CGameMain::Flying(const char* szName)
{
int iDir = 0;
float fPosX, fPosY, fPosX1, fPosY1;
float fSpeed;
iDir = CSystem::RandomRange(0,3);//随机生成飞虫出现的方向
switch(iDir)
{
case 0: // 左方
fPosX = CSystem::RandomRange(m_fScreenLeft-5.f, m_fScreenLeft);
fPosY=CSystem::RandomRange(m_fScreenTop-5.f,m_fScreenBottom+5.f);
break;
case 1: // 下方
fPosX= CSystem::RandomRange(m_fScreenLeft-5.f, m_fScreenRight+5.f);
fPosY=CSystem::RandomRange(m_fScreenBottom,m_fScreenBottom+5.f);
break;
case 2: // 右方
fPosX = CSystem::RandomRange(m_fScreenRight, m_fScreenRight+5.f);
fPosY=CSystem::RandomRange(m_fScreenTop-5.f,m_fScreenBottom+5.f);
break;
case 3: // 上方m
fPosX= CSystem::RandomRange(m_fScreenLeft-5.f, m_fScreenRight+5.f);
fPosY = CSystem::RandomRange(m_fScreenTop-5.f, m_fScreenTop-5.f);
}
fSpeed = CSystem::RandomRange(10, 40);//随机生成飞虫飞行速度
//飞虫飞行的终点位置
fPosX1 = CSystem::RandomRange(m_fScreenLeft+15.f, m_fScreenRight-15.f);
fPosY1=CSystem::RandomRange(m_fScreenTop+15.f, m_fScreenBottom-15.f);
CSprite* tmpSprite=FindSpriteByName(szName);
tmpSprite->SetSpritePosition(fPosX, fPosY);
tmpSprite->SpriteMoveTo(fPosX1, fPosY1, fSpeed, false);
}
//飞虫与世界边界的碰撞
void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{
/*
if(strcmp(szName, m_pFeichong->GetName())==0)
{
Flying("feichong_0");
}
*/
if(strstr(szName, "feichong")!=NULL)//判断是否是飞虫精灵
{
//遍历飞虫精灵判断是哪个飞虫
for(int i=0; i
{
if(strcmp(szName, m_pFeichong[i]->GetName())==0)
{
Flying( m_pFeichong[i]->GetName());//重新设置飞虫的飞行动作
}
}
}
}
CSprite* CGameMain::FindSpriteByName(const char* szName)
{
for(int i=0;i
if(strcmp(szName,m_pFeichong[i]->GetName())==0)
return m_pFeichong[i];
return NULL;
}
CTextSprite* CGameMain::FindTextSpriteByName(const char* szName)
{
for(int i=0;i<5;i++)
if(strcmp(szName,m_pScoreNum[i]->GetName())==0)
return m_pScoreNum[i];
return NULL;
}
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() )
{
// 获取两次调用之间的时间差,传递给游戏逻辑处理
floatfTimeDelta=CSystem::GetTimeDelta();
// 执行游戏主循环
g_GameMain.GameMainLoop( fTimeDelta );
};
// 关闭游戏引擎
CSystem::ShutdownGameEngine();
return 0;
}
//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
g_GameMain.OnMouseMove(fMouseX,fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
g_GameMain.OnMouseClick(iMouseType,fMouseX,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 )
{
// 可以在此添加游戏需要的响应函数
}
//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
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);
}
三、运行截图
funcode拍飞虫C语言报告,【逻辑游戏面试题】面试问题:funcode… - 看准网相关推荐
- 天上友嘉不用c语言吗,【天上友嘉怎么样?】-看准网
匿名用户 u3d程序员 ·成都 感觉靠谱 笔试题只是面向无经验实习生,笔试题基本是算法 5道题: 1.排序算法: 2.判断是否是2的阶次方: 3.日期算法: 4.数组打乱顺序: 5.面向对象思想实现篮 ...
- 游戏直播软件测试工程师,【斗鱼TV软件测试工程师面试】斗鱼软件测试面试经验。-看准网...
基本数据类型和引用数据类型的区别2 静态成员变量和非静态成员变量的区别3 Java的接口,抽象类,和普通类的区别.4 字节流和字符流有什么区别,分别用哪个接口5 忘了6 两个线程A,B.A要等待B运行 ...
- c语言拍飞虫课程设计报告,C++语言课程计一拍飞虫.doc
C语言课程计一拍飞虫 C++语言课程设计一拍飞虫 一.实验内容 玩家通过控制拍子拍打飞虫获取分数. 要求如下: 游戏的初始界面如图一,单击空格键即可进入游戏.进入游戏后的界面如图二.左上角有两个记录游 ...
- c语言拍飞虫课程设计报告,c语言课程设计_拍飞虫提高篇.doc
c语言课程设计_拍飞虫提高篇 C语言课程设计二 拍飞虫 一.游戏介绍 拍飞虫游戏是玩家用鼠标控制拍子,拍飞虫.飞虫每次从不同的位置.以不同的速度飞来飞去.玩家拍的飞虫越多,分数越高. 二.实验目的 综 ...
- 贪吃蛇项目面试C语言,【游戏数组面试题】面试问题:c语言版贪吃蛇… - 看准网...
主要运用了光标的移动-.- 教程会在一个月内发布-.-最近考试好多...... 看代码应该能看懂.... 3.1 规则模块与动画模块 1)函数原型:void gui( );void dong( ); ...
- 贪吃蛇项目面试C语言,【游戏数组面试题】面试问题:C语言贪吃蛇(… - 看准网...
// 贪吃蛇.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include #include #include "iostream& ...
- 查找学生链表c语言,【查找链表面试题】面试问题:C语言实现学生… - 看准网...
趁着放假无事,开始用C语言开发一些小的项目,巩固基础知识的同时学习新的知识. 学生成绩管理系统实现的功能有:成绩录入.学生成绩查询.删除.修改.通过文件保存等. 开发这样一个系统需要具备的知识:线性表 ...
- C语言单链成绩表,【查找链表面试题】面试问题:C语言基于单链… - 看准网
传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给大家总结下为什么你们学习C语言会觉得难,尤其是对于单链表这块,主要原因得是因为一下两 ...
- 多线程可以使用计算机多核那,【多线程逻辑面试题】面试问题:异步操作的优缺… - 看准网...
我曾经提到异步操作能提高系统的吞吐能力,正确使用异步操作来校正滥用异步的错误做法,那异步究竟有何优点值得我们使用?而又有什么缺点需要我们使用的时候小心呢?诚如老赵所说, 异步并不一定能提高系统性能,甚 ...
- 多线程面试题c Linux,【多线程Linux面试题】面试问题:小伙用C语言熬… - 看准网...
记得聊天室可是大学的热门开发小项目啊,只要是老师布置的小组项目开发,那么其中肯定有聊天室,O(∩_∩)O哈哈哈~ 小编今天介绍的这个项目课程呢,就是教你开发一款聊天室,正在学习C语言的小伙伴一定不要错 ...
最新文章
- 使用javascript开发2048
- CNN模型之SqueezeNet
- 【Java】“异常”详解
- 全球Top5互联网巨头崛起秘诀,真相竟然是?
- java 对象拷贝属性_使用Java对两个对象的属性进行拷贝
- 如何构建积木式Web应用
- 主键字母自动生成函数
- LeetCode-203:移除链表元素
- 网页设计中JS与Java的区别
- Eclipse的Servers视图中无法添加Tomcat6/Tomcat7
- 陀螺世界进度条一天进度多少_陀螺世界满级要多久?
- win10开机启动ps1脚本
- 丁火生于未月命理分析_丁火生于未月的性格特征
- 洛谷P4315 月下“毛景树”(树剖+线段树)
- html特效代码 枫叶,经典FLASH特效代码
- expect 自动输入密码
- 2020知到计算机文化基础答案,2021知到网课 创业十步 单元测试答案
- NumPy库的入门使用
- 视频教程-2020年软考系统分析师--综合知识视频培训课程-软考
- TP,TN,FP,FN,F1,TPR,FPR (一图看懂)