字符游戏-智能蛇   智能蛇是字符串版贪吃蛇的升级版。在这篇文章中,我将记录我的学习过程,起到同大家分享、交流的目的。   本次项目的任务是让蛇有一定的智能,能通过算法具有 “感知 - 决策 - 行动” 的能力。开发环境为Linux。
  在编写前,首先要掌握如何在终端上实现清屏。在字符终端上完成“清屏”“修改光标位置”“设置字符前景和背景色”等操作,是通过输出 esc序列实现的。对于 VT100 终端, printf(“\033[2J”) 就实现了清屏。详细内容参见, C语言与VT100控制码编程    其次,我们需要实现 kbhit()。这对我们初学者来说较难,好在老师给出了参考代码,我们只需将自己的代码融入其中就OK。代码来源:Linux下非阻塞地检测键盘输入的方法 (整理) 
  明确智能蛇程序设计框架(伪代码):
1 2 3 4 5 6 7 8 9 10 11 12 13 输出字符矩阵 WHILE not 游戏结束 DO     wait(time)     ch=whereGoNext(Hx,Hy,Fx,Fy)     CASE ch DO     ‘A’:左前进一步,break      ‘D’:右前进一步,break         ‘W’:上前进一步,break         ‘S’:下前进一步,break         END CASE     输出字符矩阵 END WHILE 输出 Game Over!!! 
 
  接下来,最重要的就是设计蛇智能运行的算法了。
伪代码: 1 2 3 4 5 6 7 8 9 10 11        function whereGoNext (Hx,Hy,Fx,Fy)   {                                } 
 
C语言实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 char  whereGoNext (int  Hx,int  Hy,int  Fx,int  Fy)  {    char  moveable[4 ] = { 'a' ,'d' ,'w' ,'s'  };     int  distance[4 ]={0 };     distance[0 ] = abs (Fy - Hy) + abs (Fx - Hx+1 );     if  (map [Hy][Hx-1 ] !=BLANK_CELL&&map [Hy][Hx-1 ] != SNAKE_FOOD)         distance[0 ] = 9999 ;     distance[1 ] = abs (Fy - Hy) + abs (Fx -Hx-1 ) ;     if  (map [Hy][Hx+1 ] != BLANK_CELL&&map [Hy][Hx+1 ] != SNAKE_FOOD)         distance[1 ] = 9999 ;     distance[2 ] = abs (Fy - Hy+1 ) + abs (Fx - Hx) ;     if  (map [Hy-1 ][Hx] != BLANK_CELL&&map [Hy-1 ][Hx]!=SNAKE_FOOD)         distance[2 ] = 9999 ;     distance[3 ] = abs (Fy - Hy-1 ) + abs (Fx -Hx) ;     if  (map [Hy+1 ][Hx] != BLANK_CELL&&map [Hy+1 ][Hx] != SNAKE_FOOD)         distance[3 ] = 9999 ;          int  min=0 ;     for  (int  i = 0 ; i <= 3 ; i++)     {         if  (distance[i] < distance[min] && distance[i] != 9999 )             min = i;     }     return  moveable[min]; } 
 
  这种算法的缺点是——没有考虑蛇尾、轨迹等位置,导致蛇会自己被自己走死。
效果动画 
  虽然这蛇经常把自己”走死”,但好歹是一条可以自己走的蛇。在今后的学习中,需要学习更好的算法,来让贪吃蛇更加智能。