欢迎关注我的公众号【次烦】
(这个程序注释很少,不要问为什么,问就是忘了写,当我想起来后又懒得写了)
主
import pygame
import sys
from pygame.sprite import Group
from snake import Snake, Body
from fruit import Fruit
import game_functions as gf
from time import sleep
def run_game():
pygame.init()
screen = pygame.display.set_mode((700,400))
pygame.display.set_caption("贪吃蛇")
bg_color = (230,230,230)
snake = Snake(screen)
bodys = Group()
body = Body(screen)
body.create(snake)
bodys.add(body)
fruits = Group()
gf.create_fruit(screen,fruits,snake)
while True:
gf.check_events(snake)
gf.update_screen(screen,snake, fruits, body,bodys)
sleep(0.01/snake.speed_factor)
run_game()
蛇头与蛇身
import pygame
from pygame.sprite import Sprite
class Snake(Sprite):
"""蛇头"""
def __init__(self, screen):
#屏幕中央创建一个蛇头
super(Snake, self).__init__()
self.screen = screen
#中央创建
self.rect = pygame.Rect(0,0,10,10)
self.rect.centerx = screen.get_rect().centerx
self.rect.centery = screen.get_rect().centery
self.color = (255,44,0)
#表示移动方向,1234上右下左
self.change = 2
self.x = float(self.rect.centerx)
self.y = float(self.rect.centery)
self.foot = []
self.length = 1
self.score = 0
# self.image = pygame.image.load('image\\head.png')
self.sleep = 0
self.speed_factor = 1
# def blitme(self):
# """在指定的位置绘制head""" #此方法根据self.rect指定的位置将图像绘制到屏幕上
# self.screen.blit(self.image,self.rect)
def draw_snake(self):
pygame.draw.rect(self.screen,self.color,self.rect)
class Body(Sprite):
"""docstring for Body"""
def __init__(self, screen):
super(Body, self).__init__()
self.screen = screen
self.rect = pygame.Rect(0,0,10,10)
self.color = (255,88,44)
self.change = 2
#图像
# self.image = pygame.image.load('image\\body.png')
# def blitme(self):
# """在指定的位置绘制body""" #此方法根据self.rect指定的位置将图像绘制到屏幕上
# self.screen.blit(self.image,self.rect)
def create(self,snake):
if snake.change == 1:
self.rect.top = snake.rect.bottom
self.rect.centerx = snake.rect.centerx
self.change = 1
elif snake.change == 2:
self.rect.right = snake.rect.left
self.rect.centery = snake.rect.centery
self.change = 2
elif snake.change == 3:
self.rect.bottom = snake.rect.top
self.rect.centerx = snake.rect.centerx
self.change = 3
elif snake.change == 4:
self.rect.left = snake.rect.right
self.rect.centery = snake.rect.centery
self.change = 4
# self.rect.right = snake.rect.left
# self.rect.centery = snake.rect.centery
self.x = float(self.rect.centerx)
self.y = float(self.rect.centery)
def draw_body(self):
pygame.draw.rect(self.screen,self.color,self.rect)
pass
食物/水果
import pygame
from pygame.sprite import Sprite
import random
class Fruit(Sprite):
"""果实"""
def __init__(self, screen):
super(Fruit, self).__init__()
self.screen = screen
self.color = (44,255,12)
self.rect = pygame.Rect(0,0,10,10)
def draw_fruit(self):
pygame.draw.rect(self.screen,self.color,self.rect)
pass
用到的函数
import sys
import pygame
import random
from pygame.sprite import Group
from snake import Snake, Body
from fruit import Fruit
from time import sleep
def update_screen(screen,snake,fruits,body,bodys):
screen.fill((230,230,230))
snake.draw_snake()
#snake.blitme()
update_fruit(screen,fruits, snake, bodys)
for body in bodys:
snake_go(body)
body.draw_body()
# body.blitme()
check_body(bodys, snake)
for fruit in fruits:
fruit.draw_fruit()
head_body(snake, bodys)
check_bdry(snake, bodys)
check_sleep(snake)
pygame.display.flip()
pass
def check_events(snake):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
# if snake.change == 1:
# snake.y = snake.y-snake.y%10
# elif snake.change == 2:
# snake.x = 10-snake.x%10+snake.x
# elif snake.change == 3:
# snake.y = 10-snake.y%10+snake.y
# elif snake.change == 4:
# snake.x = snake.x-snake.x%10
if event.key == pygame.K_UP and snake.change != 3:
snake.change = 1
elif event.key == pygame.K_RIGHT and snake.change != 4:
snake.change = 2
elif event.key == pygame.K_DOWN and snake.change != 1:
snake.change = 3
elif event.key == pygame.K_LEFT and snake.change != 2:
snake.change = 4
elif event.key == pygame.K_q:
sys.exit()
elif event.key == pygame.K_p:
snake.sleep = 1
snake.foot.append((snake.rect.centerx,snake.rect.centery,snake.change))
snake_go(snake)
def snake_go(snake):
if snake.change == 1:
snake.y -= 1#0
snake.rect.centery = snake.y
elif snake.change == 2:
snake.x += 1#0
snake.rect.centerx = snake.x
elif snake.change == 3:
snake.y += 1#0
snake.rect.centery = snake.y
elif snake.change == 4:
snake.x -= 1#0
snake.rect.centerx = snake.x
pass
def create_fruit(screen,fruits,snake):
new_fruit = Fruit(screen)
if snake.score > 170:
new_fruit.color = (255,0,0)
snake.speed_factor = 15
elif snake.score > 140:
new_fruit.color = (255,100,0)
snake.speed_factor = 10
elif snake.score > 110:
new_fruit.color = (255,200,0)
snake.speed_factor = 8
elif snake.score > 90:
new_fruit.color = (255,255,0)
snake.speed_factor = 5
elif snake.score > 60:
new_fruit.color = (200,255,0)
snake.speed_factor = 4
elif snake.score > 30:
new_fruit.color = (100,255,0)
snake.speed_factor = 2
new_fruit.rect.centerx = random.randint(5,695)#//10*10
new_fruit.rect.centery = random.randint(5,395)#//10*10
fruits.add(new_fruit)
def update_fruit(screen,fruits,snake,bodys):
boom = pygame.sprite.spritecollideany(snake,fruits)
if boom:
fruits.empty()
snake.score += 1
create_fruit(screen,fruits,snake)
num = 0
for bd in bodys:
num += 1
# print("you got",snake.length)
if num == snake.length :
body = Body(screen)
body.create(bd)
snake.length += 1
bodys.add(body)
# print(snake.length)
break
def check_body(bodys,snake):
num = 0
for bd in bodys:
num += 1
for i in snake.foot:
if (bd.rect.centerx == i[0]) and (bd.rect.centery == i[1]):
bd.change = i[2]
if num == snake.length :
if snake.foot:
snake.foot.pop(0)
pass
def head_body(snake,bodys):
check_bodys = Group()
num = 0
for body in bodys:
num += 1
if num == 1:
continue
check_bodys.add(body)
boom = pygame.sprite.spritecollideany(snake,check_bodys)
if boom:
print("Game Over!")
print("Your Score:",snake.score)
sys.exit()
def check_bdry(snake,bodys):
if snake.x > 700:
snake.x = 0
print(snake.x)
elif snake.x < 0:
snake.x = 700
snake.rect.centerx = snake.x
if snake.y > 400:
snake.y = 0
elif snake.y < 0:
snake.y = 400
snake.rect.centery = snake.y
for body in bodys:
if body.x > 700:
body.x = 0
elif body.x < 0:
body.x = 700
body.rect.centerx = body.x
if body.y > 400:
body.y = 0
elif body.y < 0:
body.y = 400
body.rect.centery = body.y
def check_sleep(snake):
while snake.sleep == 1:
sleep(1)
for event in pygame.event.get():
if event.key == pygame.K_p:
snake.sleep = 0
break
求解决
有个小问题,就是如果蛇头刚刚到边界正好转向,蛇身就会与蛇头分离…