⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a_and_list.txt

📁 利用人工智能的经典算法实现迷宫游戏;里面的A星(a*)算法可以很方便的移植到应用程序中
💻 TXT
📖 第 1 页 / 共 2 页
字号:
		temp=temp->son4;
		son_fn(temp,dg);
	}
	return NULL;
}
//======================================================================= 
// Description :  迷宫A*搜索算法程序
// Parameters  :链表定义,结合状态空间的定义等,已于上面完成
// Supplement  : 无 
//use======================================================================== 
void a_search(int a[][11],state_define2 s_n,state_define2 s_g)
{
   if(step==0)									/* 若是第一次扩展则将起始节点放入open表*/
   {
	   step++;
	   open_list = insert_node(open_list, s_n->s_row2,s_n->s_collum2,0);
	   open_list->next->f_n=abs(s_n->s_row2-s_g->s_row2)+ abs(s_n->s_collum2-s_g->s_collum2);	/* 计算起始节点的fn */ 
	   a_search(a,s_n, s_g);	   
   }
  if(isempty(open_list))									/* 若open表空或者不可能的步数出现失败退出*/
  {
	  printf("没有路径!:(\n");
	  return;
  }
  else
  { 
	   list_node best_node = find_fn(open_list);
	   if((best_node->row==s_g->s_row2)&&(best_node->collum==s_g->s_collum2))
		{	
			printf("找到路径!:)\n");						/* 找到路径打印路径 */
			while (!((best_node->row==s_n->s_row2)&&(best_node->collum==s_n->s_collum2)))
			{
				printf("%d  %d	%d\n ", best_node->row,best_node->collum,best_node->f_n);
				best_node = best_node->father;
			}
			printf("%d  %d	%d\n ", best_node->row,best_node->collum,best_node->f_n);
			return;
		}
//扩展节点bestnode生成全部子节点subnode 
//计算subnode的f(n),设置指向bestnode的指针
//子节点subnodes全部放入open表 
	   if(a[best_node->row][best_node->collum+1]==0)
		{  
		   list_node sub_node1= create_node(best_node->row,best_node->collum+1,0);
		   list_node temp=sub_node1;
		   sub_node1->g_n=best_node->g_n+1;
		   sub_node1->h_n=abs(sub_node1->row-s_g->s_row2)+ abs(sub_node1->collum-s_g->s_collum2);
		   sub_node1->f_n=sub_node1->g_n+sub_node1->h_n;
		   if((NULL==(find_closed(open_list,sub_node1->row,sub_node1->collum)))&&(NULL==(find_closed(closed_list,sub_node1->row,sub_node1->collum))))
		   {													/* 若节点不在closed或open表中设置sub-node指向best-node的指针 */
		     sub_node1->father=best_node;
			 best_node->son1=sub_node1;
		     open_list = insert_node2(open_list, sub_node1);	/* 放入open表 */
		   }
		   else													/* 若节点在closed或open表中比较gn谁小留谁 */
		   {
			   if(!(NULL==(find_closed(open_list,sub_node1->row,sub_node1->collum))))
			   {
				   temp=find_closed(open_list,sub_node1->row,sub_node1->collum);
			   }
			   else
			   {
				   temp=find_closed(closed_list,sub_node1->row,sub_node1->collum);
			   }
			   if(sub_node1->g_n<temp->g_n)						/* 若新的较小泽用新的替代旧的 */
			   {
				   temp->g_n=sub_node1->g_n<temp->g_n;
				   temp->father=best_node;
				   if(!(NULL==(temp=find_closed(closed_list,sub_node1->row,sub_node1->collum))))
				   {											/* 若在closed表中重新计算subnode的子孙节点的fn */
					   dg_n=temp->g_n-sub_node1->g_n;
					   son_fn(temp,dg_n);							/* 重新计算subnode的子孙节点的fn  */
				   }											/*从subnode中删除son即不宽展他*/ 
			   }
			   else											
			   {												/* 若原先的较小则放弃新的,即不扩展它 */
			   }
		   }
		}
	   if(a[best_node->row+1][best_node->collum]==0)
		{  
		   list_node sub_node2= create_node(best_node->row+1,best_node->collum,0);
		   list_node temp=sub_node2;
		   sub_node2->g_n=best_node->g_n+1;
		   sub_node2->h_n=abs(sub_node2->row-s_g->s_row2)+ abs(sub_node2->collum-s_g->s_collum2);
		   sub_node2->f_n=sub_node2->g_n+sub_node2->h_n;
		   if((NULL==(temp=find_closed(open_list,sub_node2->row,sub_node2->collum)))&&(NULL==(temp=find_closed(closed_list,sub_node2->row,sub_node2->collum))))
		   {													/* 若节点不在closed或open表中设置sub-node指向best-node的指针 */
		     sub_node2->father=best_node;
			 best_node->son2=sub_node2;
		     open_list = insert_node2(open_list, sub_node2);	/* 放入open表 */
		   }
		   else													/* 若节点在closed或open表中比较gn谁小留谁 */
		   {
			    if(!(NULL==(find_closed(open_list,sub_node2->row,sub_node2->collum))))
			   {
				   temp=find_closed(open_list,sub_node2->row,sub_node2->collum);
			   }
			   else
			   {
				   temp=find_closed(closed_list,sub_node2->row,sub_node2->collum);
			   }
			   if(sub_node2->g_n<temp->g_n)						/* 若新的较小泽用新的替代旧的 */
			   {
				   temp->g_n=sub_node2->g_n<temp->g_n;
				   temp->father=best_node;
				   if(!(NULL==(temp=find_closed(closed_list,sub_node2->row,sub_node2->collum))))
				   {											/* 若在closed表中重新计算subnode的子孙节点的fn */
					   dg_n=temp->g_n-sub_node2->g_n;
					   son_fn(temp,dg_n);							/* 重新计算subnode的子孙节点的fn  */
				   }											/*从subnode中删除son即不宽展他*/ 
			   }
			   else											
			   {												/* 若原先的较小则放弃新的,即不扩展它 */
			   }
		   }
		}
	   if(a[best_node->row][best_node->collum-1]==0)
		{  
		   list_node sub_node3= create_node(best_node->row,best_node->collum-1,0);
		   list_node temp=sub_node3;
		   sub_node3->g_n=best_node->g_n+1;
		   sub_node3->h_n=abs(sub_node3->row-s_g->s_row2)+ abs(sub_node3->collum-s_g->s_collum2);
		   sub_node3->f_n=sub_node3->g_n+sub_node3->h_n;
		   if((NULL==(temp=find_closed(open_list,sub_node3->row,sub_node3->collum)))&&(NULL==(temp=find_closed(closed_list,sub_node3->row,sub_node3->collum))))
		   {
			   /* 若节点不在closed或open表中设置sub-node指向best-node的指针 */
		     sub_node3->father=best_node;
			 best_node->son3=sub_node3;
		     open_list = insert_node2(open_list, sub_node3);	/* 放入open表 */
		   }
		   else													/* 若节点在closed或open表中比较gn谁小留谁 */
		   {
			    if(!(NULL==(find_closed(open_list,sub_node3->row,sub_node3->collum))))
			   {
				   temp=find_closed(open_list,sub_node3->row,sub_node3->collum);
			   }
			   else
			   {
				   temp=find_closed(closed_list,sub_node3->row,sub_node3->collum);
			   }
			   if(sub_node3->g_n<temp->g_n)						/* 若新的较小泽用新的替代旧的 */
			   {
				   temp->g_n=sub_node3->g_n<temp->g_n;
				   temp->father=best_node;
				   if(!(NULL==(temp=find_closed(closed_list,sub_node3->row,sub_node3->collum))))
				   {											/* 若在closed表中重新计算subnode的子孙节点的fn */
					   dg_n=temp->g_n-sub_node3->g_n;
					   son_fn(temp,dg_n);							/* 重新计算subnode的子孙节点的fn  */
				   }											/*从subnode中删除son即不宽展他*/ 
			   }
			   else											
			   {												/* 若原先的较小则放弃新的,即不扩展它 */
			   }
		   }
		}
	   if(a[best_node->row-1][best_node->collum]==0)
		{  
		   list_node sub_node4= create_node(best_node->row-1,best_node->collum,0);
		   list_node temp=sub_node4;
		   sub_node4->g_n=best_node->g_n+1;
		   sub_node4->h_n=abs(sub_node4->row-s_g->s_row2)+ abs(sub_node4->collum-s_g->s_collum2);
		   sub_node4->f_n=sub_node4->g_n+sub_node4->h_n;
		   if((NULL==(temp=find_closed(open_list,sub_node4->row,sub_node4->collum)))&&(NULL==(temp=find_closed(closed_list,sub_node4->row,sub_node4->collum))))
		   {													/* 若节点不在closed或open表中设置sub-node指向best-node的指针 */
		     sub_node4->father=best_node;
			 best_node->son4=sub_node4;
		     open_list = insert_node2(open_list, sub_node4);	/* 放入open表 */
		   }
		   else													/* 若节点在closed或open表中比较gn谁小留谁 */
		   {
			    if(!(NULL==(find_closed(open_list,sub_node4->row,sub_node4->collum))))
			   {
				   temp=find_closed(open_list,sub_node4->row,sub_node4->collum);
			   }
			   else
			   {
				   temp=find_closed(closed_list,sub_node4->row,sub_node4->collum);
			   }
			   if(sub_node4->g_n<temp->g_n)						/* 若新的较小泽用新的替代旧的 */
			   {
				   temp->g_n=sub_node4->g_n<temp->g_n;
				   temp->father=best_node;
				   if(!(NULL==(temp=find_closed(closed_list,sub_node4->row,sub_node4->collum))))
				   {											/* 若在closed表中重新计算subnode的子孙节点的fn */
					   dg_n=temp->g_n-sub_node4->g_n;
					   son_fn(temp,dg_n);							/* 重新计算subnode的子孙节点的fn  */
				   }											/*从subnode中删除son即不宽展他*/ 
			   }
			   else											
			   {												/* 若原先的较小则放弃新的,即不扩展它 */
			   }
		   }
		}
//	   open_list=link_list(open_list,sub_nodes);
//	   sub_node3->father=best_node;
//从open表中删除bestnode,放入closed表 
	   del_node2(open_list,best_node);
	   closed_list=insert_node2(closed_list,best_node);
	   step++;
//递归算法,回到第二步判断open表是否为空
	   a_search(a,s_n,s_g);
	   return;
  }
}
   open_list = create_list(-1,-1,0); 	/* 创建open表   */
   closed_list = create_list(-1,-1,0); 	/* 创建closed表 */
   sub_nodes = create_list(-1,-1,0); 	/* 创建closed表 */
   printf("生成的迷宫:\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -