亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言手把手教你實現貪吃蛇AI(中)

2020-01-26 13:46:49
字體:
來源:轉載
供稿:網友

手把手教你實現貪吃蛇AI,具體內容如下

1. 目標

        這一部分主要是講解編寫貪吃蛇AI所需要用到的算法基礎。

2. 問題分析

         貪吃蛇AI說白了就是尋找一條從蛇頭到食物的一條最短路徑,同時這條路徑需要避開障礙物,這里僅有的障礙就是蛇身。而A star 算法就是專門針對這一個問題的。在A star 算法中需要用到排序算法,這里采用堆排序(當然其他排序也可以),如果對堆排序不熟悉的朋友,請移步到這里――堆排序,先看看堆排序的內容。

3. A*算法

       A star(也稱A*)搜尋算法俗稱A星算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的算法。常用于游戲中對象的移動計算上。A* 算法是一種啟發式搜尋算法,有別于DFS, BFS搜索??梢赃@樣理解“啟發式”的涵義,比如從起點A到達目的地B的路線,并不是直接告訴你,從A出發,向東行駛200米,右轉進入XX路,直行500米到達B;而是從A出發,直行,直到遇到第一家肯德基,右轉直到看到B大廈。而A*算法中用來啟發的線索就是移動成本,也就是權重。

3.1 移動成本

        如下圖所示,從A點出發,可以有四個方向可走(由于貪吃蛇僅僅可以走上下左右四個方向,所以這里不考慮走斜線的情況),假設每個方向移動一格的成本為10,A*算法中采用的F值來評價移動成本,F=G+H。假設節點C是待考察的一個點,G代表的是從起點A到C的移動成本,如下圖的情況G=10。那么H代表的就是從C點到目標B點的移動代價的預估值,如下圖的情況H=50,那么F=60。為什么說是預估,因為現在對于從C點到B點的情況還不清楚,因為中間可能存在障礙物,那么實際的移動代價就會大于預估的情況。而對于待考察點D,其F=80,顯然在C 和D點中(當然這里待考察的點不止C和D點),A*算法會選擇C點。

3.2 算法流程圖

4. 源代碼

         代碼中假定起始點A(5,10),食物B(5,15),如下圖。其中‘X'代表障礙物,‘O'代表的就是尋找到的從A到B的路徑。

#include<stdio.h> #include<stdlib.h> #define N 32 #define W 10  typedef struct STARNODE{  int x;//節點的x,y坐標  int y;  int G;//該節點的G, H值  int H;  int is_snakebody;//是否為蛇身,是為1,否則為0;  int in_open_table;//是否在open_table中,是為1,否則為0;  int in_close_table;//是否在close_table中,是為1,否則為0;  struct STARNODE* ParentNode;//該節點的父節點 } starnode, *pstarnode;  starnode mapnode[N/2+2][N+4];  pstarnode opentable[N*N/2]; pstarnode closetable[N*N/2];  int opennode_count=0; int closenode_count=0; starnode food;  //根據指針所指向的節點的F值,按大頂堆進行調整 void heapadjust(pstarnode a[], int m, int n) {  int i;  pstarnode temp=a[m];  for(i=2*m;i<=n;i*=2)  {   if(i+1<=n && (a[i+1]->G+a[i+1]->H)>(a[i]->G+a[i]->H) )   {    i++;   }   if((temp->G+temp->H)>(a[i]->G+a[i]->H))   {    break;   }   a[m]=a[i];   m=i;  }  a[m]=temp; }  void swap(pstarnode a[],int m, int n) {  pstarnode temp;  temp=a[m];  a[m]=a[n];  a[n]=temp; }   void crtheap(pstarnode a[], int n) {  int i;  for(i=n/2;i>0;i--)  {   heapadjust(a, i, n);  } }  void heapsort(pstarnode a[], int n) {  int i;  crtheap(a,n);  for(i=n;i>1;i--)  {   swap(a,1,i);   heapadjust(a, 1,i-1);  } }  //x1, y1是鄰域點坐標 //curtnode是當前點坐標 void insert_opentable(int x1, int y1, pstarnode pcurtnode) {  int i;  if(!mapnode[x1][y1].is_snakebody && !mapnode[x1][y1].in_close_table)//如果不是蛇身也不在closetable中  {   if(mapnode[x1][y1].in_open_table && mapnode[x1][y1].G>pcurtnode->G+W)//如果已經在opentable中,但是不是最優路徑   {    mapnode[x1][y1].G=pcurtnode->G+W;//把G值更新    mapnode[x1][y1].ParentNode=pcurtnode;//把該鄰點的雙親節點更新    //由于改變了opentable中一個點的F值,需要對opentable中的點的順序進行調整,以滿足有序    for(i=1;i<=opennode_count;i++)    {     if(opentable[i]->x==x1 && opentable[i]->y==y1)     {      break;     }     heapsort(opentable, i);    }   }   else//把該點加入opentable中   {    opentable[++opennode_count]=&mapnode[x1][y1];     mapnode[x1][y1].G=pcurtnode->G+W;    mapnode[x1][y1].H=(abs(food.x-x1)+abs(food.y-y1))*W;    mapnode[x1][y1].in_open_table=1;    mapnode[x1][y1].ParentNode=pcurtnode;    heapsort(opentable, opennode_count);   }  } }  //尋找當前點的四鄰域點,把符合條件的點加入opentable中 void find_neighbor(pstarnode pcurtnode) {  int x=pcurtnode->x;  int y=pcurtnode->y;   if(x+1<=N/2)  {   insert_opentable(x+1, y, pcurtnode);  }  if(x-1>=1)  {   insert_opentable(x-1, y, pcurtnode);  }  if(y+1<=N+1)  {   insert_opentable(x,y+1, pcurtnode);  }  if(y-1>=2)  {   insert_opentable(x,y-1, pcurtnode);  } }  int search_road(pstarnode startnode, pstarnode endnode) {  int is_search_road=0;  opennode_count=0;  closenode_count=0;  pstarnode pcurtnode;   opentable[++opennode_count]=startnode;//起始點加入opentable中  startnode->in_open_table=1;  startnode->ParentNode=NULL;  startnode->G=0;  startnode->H=(abs(endnode->x-startnode->x)+abs(endnode->y-startnode->y))*W;   if(startnode->x==endnode->x && startnode->y==endnode->y)//如果起點和終點重合  {   is_search_road=1;   return is_search_road;  }   while(1)  {   //取出opentable中第1個節點加入closetable中   pcurtnode=opentable[1];   opentable[1]=opentable[opennode_count--];    closetable[++closenode_count]=pcurtnode;   pcurtnode->in_open_table=0;   pcurtnode->in_close_table=1;    if(pcurtnode->x==endnode->x && pcurtnode->y==endnode->y)   {    is_search_road=1;    break;   }    find_neighbor(pcurtnode);    if(!opennode_count)//如果opentable已經為空,即沒有找到路徑   {    break;   }  }   return is_search_road; }  int main(void) {  int i, j;  pstarnode startnode;   for(i=0;i<N/2+2;i++)   for(j=0;j<N+4;j++)   {    mapnode[i][j].G=0;    mapnode[i][j].H=0;    mapnode[i][j].in_close_table=0;    mapnode[i][j].in_open_table=0;    mapnode[i][j].is_snakebody=0;    mapnode[i][j].ParentNode=NULL;    mapnode[i][j].x=i;    mapnode[i][j].y=j;   }   startnode=&mapnode[5][10];  food.x=5;  food.y=15;  mapnode[5][13].is_snakebody=1;  mapnode[6][13].is_snakebody=1;  mapnode[4][13].is_snakebody=1;  mapnode[4][12].is_snakebody=1;  mapnode[6][12].is_snakebody=1;   int flag;  flag=search_road(startnode, &food);  pstarnode temp=&mapnode[5][15];   do{   printf("%d %d/n",temp->x, temp->y);   temp=temp->ParentNode;  }while(temp);   return 0; }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品看片资源| 国产精品丝袜高跟| 一区二区三区久久精品| 亚洲美女又黄又爽在线观看| 欧美精品亚州精品| 欧美成人一区二区三区电影| 亚洲最大在线视频| 日韩精品亚洲视频| 日韩成人av一区| 韩国19禁主播vip福利视频| 亚洲国产精品视频在线观看| 国产精品流白浆视频| 狠狠躁夜夜躁人人爽天天天天97| 亚洲最新av在线| 成人高清视频观看www| 欧美日韩国产黄| 搡老女人一区二区三区视频tv| 亚洲一区亚洲二区亚洲三区| 欧美综合第一页| 欧美成人精品在线观看| 日韩av在线一区二区| 欧美肥臀大乳一区二区免费视频| 95av在线视频| 91成人天堂久久成人| 亚洲区免费影片| 久久久www成人免费精品| 精品国产区一区二区三区在线观看| 久久精品一偷一偷国产| 欧美一级片在线播放| 精品久久久久久久久中文字幕| 亚洲欧美日韩精品久久| 亚洲缚视频在线观看| 久久久人成影片一区二区三区| 日韩美女免费视频| 91精品国产综合久久男男| 国产精品日韩欧美大师| 国产亚洲精品久久久| 菠萝蜜影院一区二区免费| 欧美影院久久久| 欧美色xxxx| 亚洲美女免费精品视频在线观看| 欧洲成人午夜免费大片| 亚洲美女喷白浆| 97在线精品国自产拍中文| 亚洲女人天堂视频| 欧美视频免费在线| 欧美综合国产精品久久丁香| 精品国产精品三级精品av网址| 亚洲日本欧美中文幕| 欧美wwwxxxx| 色综合老司机第九色激情| 国产精品爱啪在线线免费观看| 亚洲变态欧美另类捆绑| 亚洲男人的天堂在线| 狠狠躁夜夜躁人人躁婷婷91| 色午夜这里只有精品| 裸体女人亚洲精品一区| 日本精品va在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 中文字幕不卡av| 欧美另类高清videos| 粉嫩老牛aⅴ一区二区三区| 一区二区三区天堂av| 91精品国产自产在线| 中文字幕久热精品在线视频| 亚洲成人免费网站| 欧美二区乱c黑人| 欧美尺度大的性做爰视频| 久热精品视频在线免费观看| 国语自产精品视频在线看| 亚洲最大的成人网| 亚洲日本aⅴ片在线观看香蕉| 日韩欧美国产骚| 精品亚洲一区二区三区四区五区| 亚洲免费av网址| 国产成人福利夜色影视| 欧美在线视频免费观看| 亚洲国产毛片完整版| 欧美成人全部免费| 日av在线播放中文不卡| www.欧美精品| 欧美主播福利视频| 日韩亚洲国产中文字幕| 性色av一区二区三区| 国产亚洲欧美日韩精品| 国产日韩欧美在线播放| 色无极影院亚洲| 一区二区三区无码高清视频| 精品国产一区二区三区久久狼黑人| 日韩美女写真福利在线观看| 亚洲男女自偷自拍图片另类| 精品日本美女福利在线观看| 亚洲free性xxxx护士白浆| 亚洲一区二区久久久久久| 亚洲偷熟乱区亚洲香蕉av| 不卡伊人av在线播放| 久久久久久成人精品| 精品久久中文字幕| 国产精品久久久久久久天堂| 成人444kkkk在线观看| 亚洲级视频在线观看免费1级| 久久久久久久色| 欧美成人免费va影院高清| 国产精品扒开腿做| 日韩av在线免费观看一区| 日韩久久免费电影| 中文字幕亚洲一区二区三区五十路| 欧美国产日产韩国视频| 91亚洲国产成人精品性色| 亚洲一区www| 欧美性xxxxx极品娇小| 国产精品三级网站| 国产精品爱啪在线线免费观看| 欧美国产日本高清在线| 欧美日韩成人在线播放| 欧美视频一区二区三区…| 欧美一区二区三区四区在线| 欧美激情网站在线观看| 亚洲黄色成人网| 日韩欧美在线视频免费观看| 国产精品久久久久久亚洲影视| 日韩在线视频网站| 欧美一级淫片丝袜脚交| 成人免费在线视频网站| 日韩亚洲欧美中文在线| 久久这里只有精品视频首页| 日韩av理论片| 韩日欧美一区二区| 91国内精品久久| 77777少妇光屁股久久一区| 欧美床上激情在线观看| 成人久久久久爱| 国产美女直播视频一区| 亚洲毛片在线观看| 亚洲视频一区二区三区| 一本久久综合亚洲鲁鲁| 精品国产鲁一鲁一区二区张丽| 国产香蕉97碰碰久久人人| 97色在线观看免费视频| 欧美最猛黑人xxxx黑人猛叫黄| 成人xvideos免费视频| 亚洲丝袜一区在线| 18一19gay欧美视频网站| 中文字幕av一区二区三区谷原希美| 黄色成人av网| 久久精品人人做人人爽| 亚洲91精品在线观看| 午夜剧场成人观在线视频免费观看| 欧美在线精品免播放器视频| 亚洲国内高清视频| 在线观看成人黄色| 一区二区三区视频在线| 亚洲欧美第一页| 欧美国产在线视频| 国产精品爽爽爽| 自拍偷拍亚洲精品| 精品久久久久久亚洲国产300| 日韩在线欧美在线| 一道本无吗dⅴd在线播放一区| 亚洲日本欧美中文幕| 亚洲福利在线观看| 午夜欧美不卡精品aaaaa| 欧美一区二区三区精品电影| 国产日韩欧美在线观看|