【参赛作品】分享Qt下人工智能的演示
通过子窗口的控制选项,我们可以设置我们的初音ミク、镜音リン和镜音レン的控制方法,可以选择人工控制也可以选择AI控制。如果选择人工控制,那么可以通过按下“上下左右”键控制角色的移动,如果选择AI控制,那么角色会沿着场景作顺时针移动。
整个项目的代码量较多,我将选择有关人工智能的内容进行讲解,也希望大家沿着我的思路思考下去。
首先如何让角色沿着窗口作顺时针旋转?一个简单的想法就是:当角色将要达到窗口顶端那么角色将往右移动;角色将要到达窗口右端那么角色将往下移动,以此类推。按照这样的思路,我写了这样的AI代码:
if ( m_pCharacter->pos( ).y( ) > 20.0 &&
m_pCharacter->m_Direction != Character::_Down_ )
{
qDebug( "AI go Up." );
m_pCharacter->SetAnimation( Character::_Up_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).x( ) < 608.0 &&
m_pCharacter->m_Direction != Character::_Left_ )
{
qDebug( "AI go Right." );
m_pCharacter->SetAnimation( Character::_Right_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).y( ) < 340.0 &&
m_pCharacter->m_Direction != Character::_Up_ )
{
qDebug( "AI go Down." );
m_pCharacter->SetAnimation( Character::_Down_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).x( ) > 0.0 &&
m_pCharacter->m_Direction != Character::_Right_ )
{
qDebug( "AI go Left." );
m_pCharacter->SetAnimation( Character::_Left_ );
emit TriggerTransition( );
}
if ( m_pCharacter->pos( ).y( ) > 20.0 &&
m_pCharacter->m_Direction != Character::_Down_ &&
m_pCharacter->m_Direction != Character::_Left_ )
{
qDebug( "AI go Up." );
m_pCharacter->SetAnimation( Character::_Up_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).x( ) < 608.0 &&
m_pCharacter->m_Direction != Character::_Left_ )
{
qDebug( "AI go Right." );
m_pCharacter->SetAnimation( Character::_Right_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).y( ) < 340.0 )
{
qDebug( "AI go Down." );
m_pCharacter->SetAnimation( Character::_Down_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).x( ) > 0.0 )
{
qDebug( "AI go Left." );
m_pCharacter->SetAnimation( Character::_Left_ );
emit TriggerTransition( );
}
else if ( m_pCharacter->pos( ).x( ) == 0.0 )// 为防止角色在左下角卡死设立的判断
{
m_pCharacter->SetDirection( Character::_Up_ );
}
class Clause: public QObject
{
public:
Clause( Character* pParent = 0 ):
QObject( pParent ), m_pCharacter( pParent ){ }
virtual bool JudgeSentence( void ) = 0;
virtual void Statement( void ) = 0;
protected:
Character* m_pCharacter;
};
QQueue<Clause*> m_Clauses;
class DirUpClause: public Clause
{
public:
DirUpClause( Character* pParent = 0 ): Clause( pParent )
{
}
bool JudgeSentence( void )
{
return m_pCharacter->pos( ).y( ) > 20.0;
}
void Statement( void )
{
qDebug( "AI go Up." );
m_pCharacter->SetAnimation( Character::_Up_ );
}
};
class DirDownClause: public Clause
{
public:
DirDownClause( Character* pParent = 0 ): Clause( pParent )
{
}
bool JudgeSentence( void )
{
return m_pCharacter->pos( ).y( ) < 340.0;
}
void Statement( void )
{
qDebug( "AI go Down." );
m_pCharacter->SetAnimation( Character::_Down_ );
}
};
class DirLeftClause: public Clause
{
public:
DirLeftClause( Character* pParent = 0 ): Clause( pParent )
{
}
bool JudgeSentence( void )
{
return m_pCharacter->pos( ).x( ) > 0.0;
}
void Statement( void )
{
qDebug( "AI go Left." );
m_pCharacter->SetAnimation( Character::_Left_ );
}
};
class DirRightClause: public Clause
{
public:
DirRightClause( Character* pParent = 0 ): Clause( pParent )
{
}
bool JudgeSentence( void )
{
return m_pCharacter->pos( ).x( ) < 608.0;
}
void Statement( void )
{
qDebug( "AI go Right." );
m_pCharacter->SetAnimation( Character::_Right_ );
}
};
[解决办法]
顶一个!
以后发一个60分的。
[解决办法]
挺好的,自己实践的东西才是自己的,看起来不错……
[解决办法]
楼主貌似很强大,没有毕业就学的如此之深
[解决办法]
学习了。。。qt很强大
[解决办法]
雨天和撒发饿
[解决办法]
挺好的,看起来不错。
[解决办法]
[解决办法]
迷糊了,这就是人工智能 ?
[解决办法]
顶楼主 曾经迷恋的AI,离我越来越远。。
[解决办法]
学习了,了解了什么是人工智能!
[解决办法]
[解决办法]
又长见识了。。Good
[解决办法]
看了这么lz的文章和这么多评论,我觉得首先lz的文章通俗易懂,那些说简单的,要是直接给你看源代码,不添加任何提示,你还愿意看吗?能让读者感到简单的文章也正说明lz的文章是好文章。
此外lz的资源制作得也很到位,我也下载了其它人的代码,不是写得乱七八糟的就是从老外那儿扒来的,lz的代码规范,感觉很舒服。
最后我觉得lz的创新能力很强,想当年我毕业的时候就会一点C语言,结合生产制作出软件完全不行。lz的博客让我感到自愧不如。
最后我希望lz继续努力,发布更多更好的原创文章。