贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾。
只是一个贪吃蛇只需要70行代码左右就可以了,后来又加了计分,失败后重新游戏,暂停功能····结果现在代码乱成渣了。。
重新游戏部分肯定有更好的方法,我写的太乱了。。求大神指教。由于没用网格,判断吃到的时候是用范围判断的,有时候有些偏差···
代码:
1 #-*- coding: utf-8 -*- 2 import pygame, sys, random, time 3 from pygame.locals import * 4 5 pygame.init() 6 font = pygame.font.Font(u"c:\windows\fonts\MSYH.ttf",30) 7 mainClock = pygame.time.Clock() 8 wsurface = pygame.display.set_mode((800,600),0,32) 9 pygame.display.set_caption("My_Snake~") 10 11 Len = 20 12 snakeRect = [] 13 for i in range(10,13): 14 snakeRect.append(pygame.Rect(i * (Len) , 50 , Len, Len)) 15 food = pygame.Rect(10 * (Len), 10 * (Len), Len, Len) 16 ml = False 17 mr = True 18 mu = False 19 md = False 20 score = 0 21 black = (0, 0, 0) 22 green = (0, 255, 0) 23 white = (255, 255, 255) 24 global FPSCLOCK 25 FPSCLOCK = pygame.time.Clock() 26 ##################################################### 27 def judge(): 28 if snakeRect[0].left - 15 <= food.left <= snakeRect[0].left + 15 and snakeRect[0].top - 15 <= food.top <= snakeRect[0].top + 15: 29 return True 30 def judge2(a, b): 31 if a.left - 15 <= b.left <= a.left + 15 and a.top - 15 <= b.top <= a.top + 15: 32 return True 33 def checkForKeyPress(): 34 #checkForQuit() 35 for event in pygame.event.get([KEYDOWN, KEYUP]): 36 if event.type == KEYUP: 37 continue 38 return event.key 39 return None 40 ####################################################### 41 flagg = True 42 speed = 8 43 while True: 44 for event in pygame.event.get(): 45 if event.type == QUIT: 46 pygame.QUIT() 47 sys.exit() 48 if event.type == KEYDOWN: 49 if event.key == K_r: 50 snakeRect = [] 51 for i in range(10,13): 52 snakeRect.append(pygame.Rect(i * (Len) , 50 , Len, Len)) 53 food = pygame.Rect(10 * (Len), 10 * (Len), Len, Len) 54 ml = False 55 mr = True 56 mu = False 57 md = False 58 score = 0 59 flagg = True 60 speed = 8 61 if event.key == K_p: 62 wsurface.fill(black) 63 text_surface1 = font.render('Pause!' , True, (0, 0, 255)) 64 wsurface.blit(text_surface1, (10, 50)) 65 while checkForKeyPress() == None: 66 pygame.display.update() 67 FPSCLOCK.tick() 68 if event.key == K_LEFT and mr == False: 69 ml = True 70 mr = False 71 mu = False 72 md = False 73 if event.key == K_RIGHT and ml == False: 74 ml = False 75 mr = True 76 mu = False 77 md = False 78 if event.key == K_UP and md == False: 79 ml = False 80 mr = False 81 mu = True 82 md = False 83 if event.key == K_DOWN and mu == False: 84 ml = False 85 mr = False 86 mu = False 87 md = True 88 head = pygame.Rect(snakeRect[0].left,snakeRect[0].top,snakeRect[0].width,snakeRect[0].height) 89 if flagg == False: 90 continue 91 if ml == True: 92 head.right = head.left - 1 93 if mr == True: 94 head.left = head.right + 1 95 if mu == True: 96 head.bottom = head.top - 1 97 if md == True: 98 head.top = head.bottom + 1 99 snakeRect.insert(0, head) 100 #判断失败和重新游戏 101 if head.right < 0 or head.left > 800 or head.bottom < 0 or head.top > 600 or snakeRect[0] in snakeRect[1:]: 102 wsurface.fill(white) 103 text_surface2 = font.render('Press R to restart!' , True, (0, 0, 255)) 104 wsurface.blit(text_surface2, (50, 80)) 105 pygame.display.update() 106 while checkForKeyPress() == None: 107 pygame.display.update() 108 FPSCLOCK.tick() 109 break 110 flagg = False 111 continue 112 flagg = True 113 if judge(): 114 score = score + 10 115 speed = speed + 1 116 while True: 117 flag = True 118 food.left = random.randrange(10,800) 119 food.top = random.randrange(10,600) 120 for temp in snakeRect: 121 if judge2(food, temp): 122 flag = False 123 if flag == True: 124 break 125 else: 126 snakeRect.pop() 127 wsurface.fill(black) 128 for i in range(len(snakeRect)): 129 pygame.draw.rect(wsurface,green,snakeRect[i]) 130 pygame.draw.rect(wsurface,white,food) 131 text_surface = font.render(u"分数: " + str(score), True, (0, 0, 255)) 132 wsurface.blit(text_surface, (10, 50)) 133 pygame.display.update() 134 mainClock.tick(speed) 135 136 137 138 139
截图: