鱼C论坛

 找回密码
 立即注册
查看: 1074|回复: 4

[技术交流] 贪吃蛇AI寻路的讨论

[复制链接]
发表于 2018-3-11 21:38:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于贪吃蛇的优化寻路实现有没有好的思路,我很想它能贴着蛇身走,避免过早把自己困死,
却没有很好地思路,代码我发出来,有兴趣大家可以试着玩下,不需要什么模块,然后提下
寻路优化建议
  1. import random
  2. import time

  3. class snake():
  4.    
  5.     def __init__(self,ite):
  6.         self.ite = ite
  7.         self.snk = ['o','o','O']
  8.         self.way = [[5,4],[5,5],[5,6]]
  9.         self.tail = [0,0]
  10.         self.ite[5][4],self.ite[5][5],self.ite[5][6]='o','o','O'
  11.             
  12.     def move(self,a,b):
  13.         self.way.append([a,b])
  14.         self.tail = self.way.pop(0)
  15.         for c,(i,j) in enumerate(self.way):
  16.             self.ite[i][j] = self.snk[c]
  17.         self.ite[self.tail[0]][self.tail[1]] = ' '
  18.         return self.ite

  19. class food():

  20.     def __init__(self,ite):
  21.         self.ite = ite

  22.     def prod(self,way):
  23.         while True:
  24.             a,b = random.randint(0,9),random.randint(0,9)
  25.             if [a,b] not in way:
  26.                 self.ite[a][b] = 'Q'
  27.                 break
  28.         return [a,b]
  29.    
  30. def show(ite):
  31.     #print(' ','--'*10)
  32.     for i in ite:
  33.         print('|',end='')
  34.         for j in i:
  35.             print(j,end=' ')
  36.         print('|')
  37.     #print(' ','--'*10)
  38.     print()   

  39. def find(c,d):  #寻路函数,每一步找的都是最靠近食物的点,然后横竖上,哪一方距离
  40.     f = []      #离远,走哪一边,但这个优化很不理想。
  41.     [a,b] = visit.pop(0)
  42.     if a == c and b == d:
  43.         return True
  44.     cot = 0
  45.     for ste in step:
  46.         a1 = a + ste[0]
  47.         b1 = b + ste[1]
  48.         if 0<=a1<10 and 0<=b1<10 and [a1,b1] not in S.way:
  49.             cot  = abs(a1-c)+abs(b1-d)
  50.             f.append([cot,[a1,b1],ste])
  51.     cot = min(f)[0]
  52.     for i in f:
  53.         if i[0] == cot:
  54.             if abs(a-c) >= abs(b-d) and i[2][1] == 0:
  55.                 visit.append(i[1])
  56.                 temp = i[1]
  57.                 break
  58.             elif abs(b-d) > abs(a-c) and i[2][0] == 0:
  59.                 visit.append(i[1])
  60.                 temp = i[1]
  61.                 break
  62.     if not len(visit):
  63.         visit.append(min(f)[1])
  64.         temp=min(f)[1]
  65.     S.move(temp[0],temp[1])
  66.     if temp[0] == c and temp[1] == d:
  67.         S.snk.insert(0,'o')
  68.         S.way.insert(0,S.tail)
  69.         ite[S.tail[0]][S.tail[1]] = 'o'
  70.         return 0
  71.     show(ite)
  72.    
  73. ite = [[' ']*10 for i in range(10)]            
  74. S = snake(ite)
  75. F = food(ite)
  76. step = [(1,0),(-1,0),(0,1),(0,-1)]
  77. a,b = F.prod(S.way)
  78. visit = [[5,6]]
  79. right = {}

  80. while True:
  81.     if [a,b] == S.way[-1] :
  82.         a,b = F.prod(S.way)
  83.     show(ite)
  84.     visit = [S.way[-1]]
  85.     while True:
  86.         if find(a,b):
  87.             break
  88.     time.sleep(0.5)
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 13:45:58 | 显示全部楼层
前期贪吃蛇比较短的情况下可以采用最短路劲,后期应该需求其他策略
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-3-12 14:37:06 | 显示全部楼层
bbjx 发表于 2018-3-12 13:45
前期贪吃蛇比较短的情况下可以采用最短路劲,后期应该需求其他策略

不知道怎么写策略,越写越复杂,都删掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-13 13:34:37 | 显示全部楼层
我倒是觉得可以采用每走一步计算一次BFS
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-13 18:28:19 | 显示全部楼层
bbjx 发表于 2018-3-13 13:34
我倒是觉得可以采用每走一步计算一次BFS

已经新写了一个,每走一步就用食物反过来找蛇头,然后选择路径最短的,然而,关于每一步的安全性还是没法确定,我看看资料。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表