import traceback
import pygame
from pygame.locals import *
import sys
import random
pygame.init()
PINK = (255, 182, 193) # 蛇头颜色
WHITE = (255,255,255) # 蛇身颜色
bg_image = pygame.image.load("bg.jpg") # 导入背景图片
bg_size = width, height = 640 , 544 # 背景尺寸
def main():
# 绘制背景图
bg_image_rect = bg_image.get_rect()
# 将贪吃蛇创建在正中央,初始长度为4
x = bg_image_rect.centerx
y = bg_image_rect.centery - 12
# 蛇头位置
snakeHeader = [x, y]
# print(x,y)
snakeState = [[x, y], [x - 10, y], [x - 20, y], [x - 30, y]]
# 生成背景图
screen = pygame.display.set_mode(bg_size)
# 控制贪吃蛇移动的速度
clock = pygame.time.Clock()
running = True
# 记录蛇的开始朝向 , 如果朝那个方向, 那个方向就是True , 默认开始的朝向为右
left = False
up = False
down = False
right = True
is_food = True # 判断食物是否存在
# 初始的食物 , 防止出现对不起的现象
food = x1, y1 = random.randint(0, 31) * 20, random.randint(0, 25) * 20
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key ==K_w:
if not down: # 防止方向移动,同下
up = True
left = False
right = False
down = False
elif event.key ==K_s:
if not up:
down = True
left = False
up = False
right = False
elif event.key == K_d:
if not left:
right = True
left = False
up = False
down = False
elif event.key == K_a:
if not right:
left = True
right = False
up = False
down = False
# 贪吃蛇移动
if right:
snakeHeader[0]+=20
if left:
snakeHeader[0]-=20
if up:
snakeHeader[1]-=20
if down:
snakeHeader[1]+=20
screen.blit(bg_image, bg_image_rect)
# screen.fill((0,0,0))
snakeState.insert(0,list(snakeHeader))
# 判断贪吃蛇是否吃到食物
if ((food[0] == snakeHeader[0]) and (food[1] == snakeHeader[1])):
is_food = False
else:
snakeState.pop()
if not is_food:
# 生成 食物
food = x1, y1 = random.randint(0, 31) * 20, random.randint(0, 25) * 20
is_food = True
# 绘制食物
pygame.draw.rect(screen, (255, 0, 255), Rect(food[0], food[1], 20, 20))
for position in snakeState:
# 蛇身
pygame.draw.rect(screen, WHITE, Rect(position[0], position[1], 20, 20))
# 蛇头
pygame.draw.rect(screen, PINK, Rect(snakeHeader[0], snakeHeader[1], 20, 20))
# 游戏死亡条件
# 1.碰撞边界死亡
if not (snakeHeader[0]>=0 and snakeHeader[0]+20<640):
pygame.quit()
sys.exit()
if not (snakeHeader[1]>=0 and snakeHeader[1]+20<544):
pygame.quit()
sys.exit()
# 2.碰撞自身死亡
num = 0
for position in snakeState:
if ((position[0] == snakeHeader[0]) and (position[1] == snakeHeader[1])):
num = num +1
if num >1:
pygame.quit()
sys.exit()
else:
num = 0
clock.tick(5)
pygame.display.flip()
pass
if __name__ == '__main__':
# 防止程序一闪而过
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()