当前位置:首页 > 07 C++程序设计_打飞碟
{ }
m_pHead = pTemp;
5) 如果链表不为空,则使用一个while循环遍历到链表最后添加新的节点,因为
链表中的结构体里面有一个pNext指针指向下一个的节点,链表最后一个节点则指向NULL,所以链表遍历的时候只要判断当前节点的pNext指针是否为空,如果为空则表明到了链表最后的位置,这是只要把当前节点的pNext指针指向插入的节点即可:
else{ }
// 循环读到链表的最后一个节点 while(pNode->pNext != NULL) { }
pNode->pNext = pTemp;
pNode = pNode->pNext;
5、 根据精灵名称,从链表中删除节点。
1) 进入LessonX.h中添加自定义函数DeleteNode的声明:
void
DeleteNode(char* szName);
2) 在LessonX.cpp中添加该函数的定义:
void CGameMain::DeleteNode(char* szName)
{ }
3) 首先判断链表是否为空,只有不为空的链表才能删除节点,在该函数的定义里
面添加如下代码:
UFO* pNode = NULL;
UFO* pTemp = NULL;
// 如果链表不为空 if(m_pHead != NULL) { }
4) 判断表头是否是要找的节点,如果是则将保存当前节点,将表头节点移到当前
节点的pNext指向的节点位置,使用free函数删除保存下来的节点:
if(strcmp(m_pHead->szName, szName)==0) // 如果表头就是要找的节点
{ }
pTemp = m_pHead;
m_pHead = m_pHead->pNext; free(pTemp);
5) 如果表头不是要找的节点,则使用一个while循环遍历链表,判断当前节点的下一个节点是否是要找的节点,如果不是继续遍历链表,如果是则结束while循环。用pTemp保存当前节点的下一个节点(即我们要找的节点),然后将当前节点的pNext指针指向我们要找的节点的pNext指针指向的节点,最后调用
free函数删除保存下来的节点:
else
{
pNode = m_pHead;
// 该节点的下一个节点不是要找的节点 while(strcmp(pNode->pNext->szName, szName)) { }
//保存当前节点的下一个节点(即我们要找的节点) pTemp = pNode->pNext;
//将当前节点的pNext指针指向我们要找的节点的pNext指针指//向的节点
}
pNode->pNext = pNode->pNext->pNext; free(pTemp);
pNode = pNode->pNext;
free函数的原型:是void free(void *ptr),功能是释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。
实验六射击飞碟
【实验内容】
步骤一、处理炮弹精灵和飞碟精灵的碰撞 步骤二、记录本局分数
步骤三、根据精灵名称在链表中查找某个节点
【实验思路】
系统检测到两个炮弹精灵和飞碟精灵的碰撞之后,通过FindPaoDanSpriteByName函数找到该炮弹精灵,通过FindUfoSpriteByName函数找到飞碟精灵,同时将两个精灵删除。同时根据飞碟精灵的名称在链表中找到对应的节点,获取该击中该飞碟精灵所能得到的分数显示在游戏界面上。
利用FindNode函数查找对应的精灵数据,使用while循环,判断传入的精灵名称与链表中的节点保存的精灵名称相同的节点,读取它的分数信息即可。具体见实验操作。
【实验指导】
1、 进入LessonX.h中添加如下的成员变量声明:
int
m_iShootScore
;
// 一局游戏得分
2、 在LessonX.cpp中的构造函数添加该变量的定义:
m_iShootScore =0;
3、 判断精灵的碰撞过程中需要设置精灵的碰撞属性,在创建飞碟精灵的时候需要调用SetSpriteCollisionReceive函数设置飞碟精灵可以接收碰撞,在创建炮弹精灵的时候需要调用SetSpriteCollisionSend函数设置炮弹精灵可以发送碰撞:
1) 在GameRun函数里面的设置飞碟世界边界的函数SetSpriteWorldLimit位置下面
添加下面一行代码:
tmpSprite->SetSpriteCollisionReceive(true);
2) 在OnMouseClick函数里面设置炮弹精灵边界的函数SetSpriteWorldLimit位置下
面添加下面一行代码: tmpSprite->SetSpriteCollisionSend(true); 4、 判断飞碟精灵和炮弹精灵的碰撞,我们需要自定义一个函数OnSpriteColSprite来处理系统检测到精灵碰撞获得的精灵名称数据。 1) 进入LessonX.h中添加该函数的声明:
void OnSpriteColSprite( const char *szSrcName, const char *szTarName );
2) 进入LessonX.cpp中添加该函数的定义:
void CGameMain::OnSpriteColSprite( const char *szSrcName, const char *szTarName ) { }
3) 首先需要判断系统检测发生碰撞的精灵的名称是否是炮弹精灵,在上面的函数定义添加下面的代码:
char szUfo[128]; UFO* pNode = NULL; if(m_iGameState) {
{ } }
if(strstr(szSrcName, \如果szSrcName是炮弹
4) 如果是则找到相应的炮弹精灵实体和飞碟精灵实体并删除,在上面的
if(strstr(szSrcName, \判断里面添加如下的代码:
CSprite* tmpPaodan=FindPaoDanSpriteByName(szSrcName);
tmpPaodan->DeleteSprite();
CSprite* tmpUfo=FindUfoSpriteByName(szTarName);
tmpUfo->DeleteSprite();
5) 删除两个碰撞的精灵之后,再在链表中查找与该飞碟精灵对应的节点并获取分数值显示在游戏界面上,最后在链表中删除该节点:
strcpy(szUfo, szTarName);
pNode = FindNode(szUfo); m_iGameScore += pNode->iScore; m_pScore->SetTextValue(m_iGameScore); DeleteNode(szUfo);
6) 在Main.cpp中的OnSpriteColSprite函数里面添加对该自定义函数的调用代码: g_GameMain.OnSpriteColSprite(szSrcName,szTarName); 5、 根据精灵名称,从链表中找到相应节点:
1) 首先需要添加一个自定义函数FindNode来查找节点,进入LessonX.h中添加该
函数的声明: UFO* FindNode(char*);
2) 进入LessonX.cpp中添加该函数的定义:
UFO* CGameMain::FindNode(char* szName) {
}
3) 首先判断该链表是否为空,只要不为空的链表才能实现查找操作:
UFO* pNode = NULL; if(m_pHead != NULL) { }
4) 使用一个while循环遍历链表,查找到与给定的精灵名称对应的节点:
pNode = m_pHead;
while(strcmp(pNode->szName, szName)) // 不是要找的节点 { }
pNode = pNode->pNext;
5) 最后返回该节点保存的分值:
return pNode;
6、 游戏结束后需要将链表中的没有释放的飞碟对应的节点删除,同时也需要将对应生
成的飞碟精灵实体删除。使用while循环遍历链表,将所有存在的节点对应的飞碟精灵实体删除,同时也将该节点删除。在GameEnd函数里面添加如下的代码:
UFO* pNode = NULL;
while(m_pHead != NULL) { }
pNode = m_pHead;
m_pHead = m_pHead->pNext;
CSprite* tmpSprite=FindUfoSpriteByName(pNode->szName); tmpSprite->DeleteSprite(); free(pNode);
实验七显示分值最高的五个分数
【实验内容】
步骤、游戏界面下方显示分值最高的五个分数
【实验思路】
将本局得分m_iGameScore与保存在m_iHighScore[5]数组中的5个值比较,由于m_iHighScore[5]数组中的值是按下标从大到小排列的,首先判断本局得分m_iGameScore与m_iHighScore[4]比较,如果小于该数,则无需继续与数组的其他值比较,否则,将m_iHighScore[4]的值替换为m_iGameScore,再利用一个for循环逆序遍历m_iHighScore数组,判断与其他数组的值的大小,如果大于它,则与数组该值进行交换,继续判断,否则结束循环,最后得到一个重新排序了的m_iHighScore[5]数组。
【实验指导】
1、 进入LessonX.h中添加以下的成员变量:
static int m_iHighScore[5] ;
CTextSprite* m_vScoreText[5];//游戏下方的文字显示精灵
2、 进入LessonX.cpp中的构造函数里面添加上面的成员变量的初始化代码:
共分享92篇相关文档