📄 算法改进简要.txt
字号:
数据结构与主要算法:
(1)老鼠个数的设定
别人工作
在辅助教材中,通过宏定义#define RATMAX 5来定义老鼠个数,个数不可以改变.
通过一维数组: bool m_bRatLive[RATMAX]; int m_nRatDirection[RATMAX],
int m_nRatx[RATMAX],m_nRaty[RATMAX];等来定义老鼠.
自已工作
我们小组为实现鼠数与关数的可选项性改进的算法是:
1.用一个变量int RATMAX来标志老鼠个数.
2.将有关老鼠的数组定义为指针: bool*m_bRatLive; int *m_nRatDirection, int *m_nRatx,*m_nRaty;等
3.待用户在选择对话中输入老鼠个数(m_RatMount)时,再通过RATMAX=m_RatMount来定义鼠数;
4.并通过new来生成处理老鼠的数组.
m_bRatLive=new bool[RATMAX];
m_nRatDirection=new int[RATMAX];
m_nRatx=new int[RATMAX];
m_nRaty=new int[RATMAX];
m_rectRat=new CRect[RATMAX];
(2)关数的设定.
别人工作
在辅助教材中,通过只有三关(OnEasy,OnNomal,OnHard),并且玩一关后,游戏就结束,需重新选择.
自已工作
我们小组改进的算法是,在游戏开始可以选定起始关数(SetGameLevel()),在游戏玩的过程中也可以随意选择关数与老鼠个数(SetGameLevel()),玩完一关胜利后,难度可以自增一关,接着玩(LevelIncrease()).有很多很多关,并且关数的增加的算法是:随关度的增加,猫的速度越来越比老鼠的速度慢.
void CCatCatchRatView::SetGameLevel()
{
RATMAX= m_RatMount;
m_nDifficulty= m_GameLevel;
m_nCatSpeed+=m_nDifficulty;
m_nRatSpeed+=(m_nDifficulty*4);
}
void CCatCatchRatView::LevelIncrease()
{
m_GameLevel++;
m_nDifficulty++;
m_nCatSpeed++;
m_nRatSpeed+=4;
}
(3)老鼠的灵活度
别人工作
在辅助教材中,每个老鼠碰见猫都是不会躲闪的,并且会自已送上口给猫.
每个老鼠,不管是猫的侧身还是后身,只要一碰猫就算是被猫吃看.
我们小组的工作是:
使一部分老鼠见接近猫时,会改变方向,躲开猫.
老鼠只的碰上猫的口才算是被猫吃掉,碰上猫的其它地方吃不掉.
算法实现与数据结构如下:
游戏中,猫的方向的标志值与老鼠的方向的标志值如下.
m_nCatDirection=0猫向上运动 m_nCatDirection=1猫向下运动
m_nCatDirection=2猫向左运动 m_nCatDirection=3猫向右运动
m_nRatDirection=0鼠向上运动 m_nRatDirection=1鼠向下运动
m_nRatDirection=2鼠向左运动 m_nRatDirection=3鼠向右运动
在OnTimer()改进if(鼠接近猫){鼠改变方向}
void CCatCatchRatView::OnTimer(UINT nIDEvent)
{ …………
if((abs(m_nRatx[i]-m_nCatx)<3*m_nRatw) || (abs(m_nRaty[i]-m_nCaty)<3*m_nRath))
{ //如果老鼠靠近了猫就改变方向
//m_nRatDirection[i]=rand()%4;
m_nRatDirection[i]=(m_nCatDirection+rand())%4;
}
………………
}这样部分老鼠在接近猫时就能躲开猫而改变运动方向了.
每个老鼠,不管是猫的侧身还是后身,只要一碰猫就算是被猫吃看.
if((abs(m_nRatx[i]-m_nCatx)<m_nRatw)&&(abs(m_nRaty[i]-m_nCaty)<m_nRath))
{
m_nRat--;
m_bRatLive[i]=FALSE;
}
只需将算法改为如下,便可实现只有接近嘴巴时才被吃掉.
If(在老鼠接猫时,再判断老鼠接的是猫的嘴巴,){吃掉}
即是,
若老鼠在猫的左边接近猫,且猫的方向需向右(m_nCatDirection==2)才能吃掉老鼠.
若老鼠在猫的右边接近猫,且猫的方向需向左(m_nCatDirection==3)才能吃掉老鼠.
若老鼠在猫的上边接近猫,且猫的方向需向下(m_nCatDirection==1)才能吃掉老鼠.
若老鼠在猫的下边接近猫,且猫的方向需向上(m_nCatDirection==0)才能吃掉老鼠.
以老鼠在猫的左边接近猫为例:
if((abs(m_nRatx[i]-m_nCatx)<m_nRatw)&&(abs(m_nRaty[i]-m_nCaty)<m_nRath)
&&((m_nRatx[i]<m_nCatx)&&m_nCatDirection==2))
{
m_nRat--;
m_bRatLive[i]=FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -