Board logo

标题: [问题求助] 给看看我这贪吃蛇Python程序,全局变量不会处理,还有点毛病找不出原因 [打印本页]

作者: 普大喜奔    时间: 2014-9-30 22:25     标题: 给看看我这贪吃蛇Python程序,全局变量不会处理,还有点毛病找不出原因

  1. import os
  2. import time
  3. import random
  4. import copy
  5. global FIND
  6. global WAYPOINT
  7. global WAYPOINT2
  8. global APPLE
  9. global SNAKE
  10. global GRID
  11. global BACKUP
  12. global SCREEN
  13. global NEW
  14. cols=22
  15. rows=22
  16. #蛇标志是4,头在列表尾部
  17. SNAKE=[(9,10),(9,11),(9,12)]
  18. GRID=[[0 for x in range(cols)] for y in range(rows)]
  19. BACKUP=[[0 for x in range(cols)] for y in range(rows)]
  20. SCREEN=[[' ' for x in range(cols)] for y in range(rows)]
  21. NEW=1
  22.         
  23. def game():
  24.     global FIND
  25.     global WAYPOINT
  26.     global WAYPOINT2
  27.     global APPLE
  28.     global SNAKE
  29.     global GRID
  30.     global BACKUP
  31.     global SCREEN
  32.     global NEW
  33.     while True:
  34.         if NEW==1:
  35.             #随机生成苹果的位置,标志是5
  36.             while True:
  37.                 APPLE=(random.randint(2,20),random.randint(2,20))
  38.                 if GRID[APPLE[0]][APPLE[1]]==0:break
  39.         ##########################################
  40.         #这的被#括住的代码反复用到,本来要写成函数的,在函数内也用global声明了,可还是会报名称未定义的错误
  41.         GRID=[[0 for x in range(cols)] for y in range(rows)]
  42.         for x in range(cols):
  43.             GRID[0][x]=1
  44.             GRID[rows-1][x]=1
  45.         for y in range(rows):
  46.             GRID[y][0]=1
  47.             GRID[y][cols-1]=1
  48.         GRID[APPLE[0]][APPLE[1]]=5
  49.         for body in SNAKE:
  50.             GRID[body[0]][body[1]]=4
  51.         ##########################################
  52.         show()
  53.         
  54.         backupGrid()
  55.         WAYPOINT=[]
  56.         FIND=0
  57.         search(SNAKE[-1][0],SNAKE[-1][1])
  58.         sk=copy.deepcopy(SNAKE)
  59.         restoreGrid()
  60.         for point in WAYPOINT:
  61.             SNAKE.append((point[0],point[1]))
  62.             del SNAKE[0]
  63.         ##########################################
  64.         GRID=[[0 for x in range(cols)] for y in range(rows)]
  65.         for x in range(cols):
  66.             GRID[0][x]=1
  67.             GRID[rows-1][x]=1
  68.         for y in range(rows):
  69.             GRID[y][0]=1
  70.             GRID[y][cols-1]=1
  71.         GRID[APPLE[0]][APPLE[1]]=5
  72.         for body in SNAKE:
  73.             GRID[body[0]][body[1]]=4
  74.         ##########################################
  75.         
  76.         WAYPOINT2=[]
  77.         FIND=0
  78.         GRID[SNAKE[0][0]][SNAKE[0][1]]=2
  79.         searchTail(SNAKE[-1][0],SNAKE[-1][1])
  80.         restoreGrid()
  81.         SNAKE=copy.deepcopy(sk)
  82.       
  83.         if FIND==1: #这块表示吃完苹果能活着回来,于是去吃
  84.             for point in WAYPOINT:
  85.                 SNAKE.append((point[0],point[1]))
  86.                 del SNAKE[0]
  87.                
  88.                 ##########################################
  89.                 GRID=[[0 for x in range(cols)] for y in range(rows)]
  90.                 for x in range(cols):
  91.                     GRID[0][x]=1
  92.                     GRID[rows-1][x]=1
  93.                 for y in range(rows):
  94.                     GRID[y][0]=1
  95.                     GRID[y][cols-1]=1
  96.                 GRID[APPLE[0]][APPLE[1]]=5
  97.                 for body in SNAKE:
  98.                     GRID[body[0]][body[1]]=4
  99.                 ##########################################
  100.                 show()
  101.                
  102.             if SNAKE[0][0]>SNAKE[1][0]:
  103.                 SNAKE.insert(0,(SNAKE[0][0]+1,SNAKE[0][1]))
  104.             if SNAKE[0][1]>SNAKE[1][1]:
  105.                 SNAKE.insert(0,(SNAKE[0][0],SNAKE[0][1]+1))
  106.             if SNAKE[0][1]<SNAKE[1][1]:
  107.                 SNAKE.insert(0,(SNAKE[0][0],SNAKE[0][1]-1))
  108.             if SNAKE[0][0]<SNAKE[1][0]:
  109.                 SNAKE.insert(0,(SNAKE[0][0]-1,SNAKE[0][1]))
  110.             NEW=1
  111.             ##########################################
  112.             GRID=[[0 for x in range(cols)] for y in range(rows)]
  113.             for x in range(cols):
  114.                 GRID[0][x]=1
  115.                 GRID[rows-1][x]=1
  116.             for y in range(rows):
  117.                 GRID[y][0]=1
  118.                 GRID[y][cols-1]=1
  119.             GRID[APPLE[0]][APPLE[1]]=5
  120.             for body in SNAKE:
  121.                 GRID[body[0]][body[1]]=4
  122.             ##########################################
  123.             
  124.         else: #没找到安全路线就去追自己尾巴
  125.             NEW=0 #下次循环不产生新苹果
  126.             WAYPOINT2=[]
  127.             FIND=0
  128.             GRID[SNAKE[0][0]][SNAKE[0][1]]=2
  129.             searchTail(SNAKE[-1][0],SNAKE[-1][1])
  130.             restoreGrid()
  131.             if FIND==1:
  132.                 for point in WAYPOINT2:
  133.                     SNAKE.append((point[0],point[1]))
  134.                     del SNAKE[0]
  135.                     ##########################################
  136.                     GRID=[[0 for x in range(cols)] for y in range(rows)]
  137.                     for x in range(cols):
  138.                         GRID[0][x]=1
  139.                         GRID[rows-1][x]=1
  140.                     for y in range(rows):
  141.                         GRID[y][0]=1
  142.                         GRID[y][cols-1]=1
  143.                     GRID[APPLE[0]][APPLE[1]]=5
  144.                     for body in SNAKE:
  145.                         GRID[body[0]][body[1]]=4
  146.                     ##########################################
  147.                     show()
  148.             else:
  149.                 print('analog need improve...')
  150.                 os.system('pause >nul')
  151.                 exit()
  152.         
  153. def show():
  154.     global FIND
  155.     global WAYPOINT
  156.     global WAYPOINT2
  157.     global APPLE
  158.     global SNAKE
  159.     global GRID
  160.     global BACKUP
  161.     global SCREEN
  162.     SCREEN=[[' ' for x in range(cols)] for y in range(rows)]
  163.     for y in range(rows):
  164.         for x in range(cols):
  165.             if GRID[y][x]==0:SCREEN[y][x]=' '
  166.             if GRID[y][x]==1:SCREEN[y][x]='*'
  167.             if GRID[y][x]==4:SCREEN[y][x]='.'
  168.             if GRID[y][x]==5:SCREEN[y][x]='o'
  169.     os.system('cls')
  170.     for y in SCREEN:print(' '.join(y))
  171.     time.sleep(0.05)
  172. def backupGrid():
  173.     global FIND
  174.     global WAYPOINT
  175.     global WAYPOINT2
  176.     global APPLE
  177.     global SNAKE
  178.     global GRID
  179.     global BACKUP
  180.     global SCREEN
  181.     for y in range(rows):
  182.         for x in range(cols):
  183.             BACKUP[y][x]=GRID[y][x]
  184.             
  185. def restoreGrid():
  186.     global FIND
  187.     global WAYPOINT
  188.     global WAYPOINT2
  189.     global APPLE
  190.     global SNAKE
  191.     global GRID
  192.     global BACKUP
  193.     global SCREEN
  194.     for y in range(rows):
  195.         for x in range(cols):
  196.             GRID[y][x]=BACKUP[y][x]
  197. def searchTail(y,x):
  198.     global FIND
  199.     global WAYPOINT
  200.     global WAYPOINT2
  201.     global APPLE
  202.     global SNAKE
  203.     global GRID
  204.     global BACKUP
  205.     global SCREEN
  206.     WAYPOINT2.append((y,x))
  207.     if GRID[y][x]==2:
  208.         FIND=1
  209.         del WAYPOINT2[0]
  210.         return
  211.     GRID[y][x]=3
  212.     if SNAKE[0][1]>x:
  213.         if (GRID[y][x+1]==0 or GRID[y][x+1]==2)and FIND==0:searchTail(y,x+1)
  214.         if (GRID[y+1][x]==0 or GRID[y+1][x]==2)and FIND==0:searchTail(y+1,x)
  215.         if (GRID[y][x-1]==0 or GRID[y][x-1]==2)and FIND==0:searchTail(y,x-1)
  216.         if (GRID[y-1][x]==0 or GRID[y-1][x]==2)and FIND==0:searchTail(y-1,x)
  217.     if SNAKE[0][0]>y:
  218.         if (GRID[y+1][x]==0 or GRID[y+1][x]==2)and FIND==0:searchTail(y+1,x)
  219.         if (GRID[y][x-1]==0 or GRID[y][x-1]==2)and FIND==0:searchTail(y,x-1)
  220.         if (GRID[y-1][x]==0 or GRID[y-1][x]==2)and FIND==0:searchTail(y-1,x)
  221.         if (GRID[y][x+1]==0 or GRID[y][x+1]==2)and FIND==0:searchTail(y,x+1)
  222.     if SNAKE[0][1]<x:
  223.         if (GRID[y][x-1]==0 or GRID[y][x-1]==2)and FIND==0:searchTail(y,x-1)
  224.         if (GRID[y-1][x]==0 or GRID[y-1][x]==2)and FIND==0:searchTail(y-1,x)
  225.         if (GRID[y][x+1]==0 or GRID[y][x+1]==2)and FIND==0:searchTail(y,x+1)
  226.         if (GRID[y+1][x]==0 or GRID[y+1][x]==2)and FIND==0:searchTail(y+1,x)
  227.     if SNAKE[0][0]<y:
  228.         if (GRID[y-1][x]==0 or GRID[y-1][x]==2)and FIND==0:searchTail(y-1,x)
  229.         if (GRID[y][x+1]==0 or GRID[y][x+1]==2)and FIND==0:searchTail(y,x+1)
  230.         if (GRID[y+1][x]==0 or GRID[y+1][x]==2)and FIND==0:searchTail(y+1,x)
  231.         if (GRID[y][x-1]==0 or GRID[y][x-1]==2)and FIND==0:searchTail(y,x-1)
  232.     if FIND==0:
  233.         try:
  234.             del WAYPOINT2[-1]
  235.         except:return
  236. def search(y,x):
  237.     global FIND
  238.     global WAYPOINT
  239.     global WAYPOINT2
  240.     global APPLE
  241.     global SNAKE
  242.     global GRID
  243.     global BACKUP
  244.     global SCREEN
  245.     WAYPOINT.append((y,x))
  246.     if GRID[y][x]==5:
  247.         FIND=1
  248.         del WAYPOINT[0]
  249.         return
  250.     GRID[y][x]=3
  251.     #顺时针搜索
  252.     if APPLE[1]>x:
  253.         if (GRID[y][x+1]==0 or GRID[y][x+1]==5)and FIND==0:search(y,x+1)
  254.         if (GRID[y+1][x]==0 or GRID[y+1][x]==5)and FIND==0:search(y+1,x)
  255.         if (GRID[y][x-1]==0 or GRID[y][x-1]==5)and FIND==0:search(y,x-1)
  256.         if (GRID[y-1][x]==0 or GRID[y-1][x]==5)and FIND==0:search(y-1,x)
  257.     if APPLE[0]>y:
  258.         if (GRID[y+1][x]==0 or GRID[y+1][x]==5)and FIND==0:search(y+1,x)
  259.         if (GRID[y][x-1]==0 or GRID[y][x-1]==5)and FIND==0:search(y,x-1)
  260.         if (GRID[y-1][x]==0 or GRID[y-1][x]==5)and FIND==0:search(y-1,x)
  261.         if (GRID[y][x+1]==0 or GRID[y][x+1]==5)and FIND==0:search(y,x+1)
  262.     if APPLE[1]<x:
  263.         if (GRID[y][x-1]==0 or GRID[y][x-1]==5)and FIND==0:search(y,x-1)
  264.         if (GRID[y-1][x]==0 or GRID[y-1][x]==5)and FIND==0:search(y-1,x)
  265.         if (GRID[y][x+1]==0 or GRID[y][x+1]==5)and FIND==0:search(y,x+1)
  266.         if (GRID[y+1][x]==0 or GRID[y+1][x]==5)and FIND==0:search(y+1,x)
  267.     if APPLE[0]<y:
  268.         if (GRID[y-1][x]==0 or GRID[y-1][x]==5)and FIND==0:search(y-1,x)
  269.         if (GRID[y][x+1]==0 or GRID[y][x+1]==5)and FIND==0:search(y,x+1)
  270.         if (GRID[y+1][x]==0 or GRID[y+1][x]==5)and FIND==0:search(y+1,x)
  271.         if (GRID[y][x-1]==0 or GRID[y][x-1]==5)and FIND==0:search(y,x-1)
  272.     if FIND==0:
  273.         try:
  274.             del WAYPOINT[-1]
  275.         except:
  276.             print('SNAKE can not catch APPLE!')
  277.             os.system('pause >nul')
  278.             exit()
  279. game()
复制代码
全局变量太多了,特别能报错,用“#”括住的本来是个函数的,而且全局变量我都在函数内部用global声明了一遍可仍然会报"name not defined"错。
还有代码本身的问题,我用变量NEW表示game()的该次循环是否产生新的苹果,在代码后面FIND==0的情况我也对NEW进行了操作,可程序运行到后期出现了蛇还没吃到苹果,苹果就满屏幕跳来跳去的情况,望大神慷慨指教!
作者: 普大喜奔    时间: 2014-9-30 23:04

全局变量的问题好像解决了
第二个问题比较头疼




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2