贪吃蛇小游戏(python实现)

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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值