Python 贪吃蛇小游戏

最近学习了python,用python简单实现一个贪吃蛇小游戏。

使用了pygame。

目前的实现是可以穿墙,而且可以穿过自身。

import pygame,time,random,sys

class Snake:

    snake_x = 250
    snake_y = 250
    way_forward = "left" #0上 1下 2左 3右
    body_size = 10
    snake_color = (255,0,0)

    def __init__(self,snake_x = snake_x,snake_y = snake_y,way_forward=way_forward,speed=body_size):
        self.snake_x = snake_x
        self.snake_y = snake_y
        self.snake_wdith = Snake.body_size
        self.snake_hight = Snake.body_size
        self.color = Snake.snake_color
        self.way_forward = way_forward #0上 1下 2左 3右
        self.speed = speed
    def __str__(self):
        return "%d__%d" % (self.snake_x,self.snake_y)

def createSnakeByPerObj(perObj):
    new_body = Snake(perObj.snake_x,perObj.snake_y,perObj.way_forward)
    if perObj.way_forward == up:
        new_body.snake_y += Snake.body_size
    elif perObj.way_forward == down:
        new_body.snake_y -= Snake.body_size
    elif perObj.way_forward == left:
        new_body.snake_x += Snake.body_size
    else :
        new_body.snake_x -= Snake.body_size

    return new_body
# 颜色定义
RED = 255,0,0
ORANGE = 255,156,0
YELLOW = 255,255,0
GREEN = 0,255,0
GREENBLUE = 0,255,255
BLUE = 0,0,255
PURPLE = 255,0,255
# 蛇身的颜色组
colors = [RED,ORANGE,YELLOW,GREEN]
# 游戏窗口
game_window_x = 500
game_window_y = 500
# 初始果实坐标
fruit_x = random.randint(0,game_window_x/10)*10
fruit_y = random.randint(0,game_window_y/10)*10
# 是否吃了当前果实
get_fruit_flag = False
speed = 20
# 方向定义
left = "left"
right = "right"
up  = "up"
down = "down"
#一次循环之内只允许改变一次方向 方向改变标识
change_forward_flag = True

#初始化 游戏
pygame.init()
#定义一个蛇身空数组
snake_arr = []
#定义一个全局的方向变量 初始化为None
init_way_forward = None
#初始化蛇身为3个长度
while len(snake_arr) < 3:
    if len(snake_arr) == 0 :
        snake_arr.append(Snake())
    else :
        last_body = snake_arr[len(snake_arr)-1]
        snake_arr.append(createSnakeByPerObj(last_body))
#死循环刷新窗口
while True:
    # print("#"*50)
    event_list = pygame.event.get()
    for event in event_list:
        print(event)
        if event.type == pygame.QUIT:
            sys.exit(0);
        if event.type == pygame.KEYUP:
            if change_forward_flag :
                print(event.key)
                change_forward_flag = False
                if event.key == 273:
                    init_way_forward = up
                elif event.key == 274:
                    init_way_forward = down
                elif event.key == 275:
                    init_way_forward = right
                else:
                    init_way_forward = left
    # 创建一个窗口
    game_window = pygame.display.set_mode((game_window_x,game_window_y))
    # 默认还没吃到果实,迟到了果实则重新赋予果实一个随机坐标
    if get_fruit_flag :
        fruit_x = random.randint(0,game_window_x/10)*10
        fruit_y = random.randint(0,game_window_y/10)*10
        get_fruit_flag = False
    # 生成果实
    fruit = pygame.Rect(fruit_x,fruit_y,Snake.body_size,Snake.body_size)
    pygame.draw.rect(game_window,YELLOW,fruit,0)
    # 吃了果实
    if (snake_arr[0].way_forward == up and snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y+Snake.body_size) or\
            (snake_arr[0].way_forward == down and snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y-Snake.body_size) or \
            (snake_arr[0].way_forward == left and snake_arr[0].snake_x == fruit_x+Snake.body_size and snake_arr[0].snake_y == fruit_y) or \
            (snake_arr[0].way_forward == right and snake_arr[0].snake_x == fruit_x-Snake.body_size and snake_arr[0].snake_y == fruit_y):
        last_body = snake_arr[len(snake_arr)-1]
        snake_arr.append(createSnakeByPerObj(last_body))
        get_fruit_flag = True
    #改变方向
    if init_way_forward is not None:#snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y:
        if snake_arr[0].snake_x >= game_window_x or snake_arr[0].snake_x < 0 \
            or snake_arr[0].snake_y >= game_window_y or snake_arr[0].snake_y < 0:
            pass
        else:
            snake_arr[0].way_forward = init_way_forward
    # 判断边界可穿
    if snake_arr[0].snake_x <= 0 and snake_arr[0].way_forward == left:
        snake_arr[0].snake_x = game_window_x
    elif snake_arr[0].snake_x >= game_window_x-Snake.body_size and snake_arr[0].way_forward == right:
        snake_arr[0].snake_x = Snake.body_size*-1
    elif snake_arr[0].snake_y <= 0 and snake_arr[0].way_forward == up:
        snake_arr[0].snake_y = game_window_y
    elif snake_arr[0].snake_y >= game_window_y-Snake.body_size and snake_arr[0].way_forward == down:
        snake_arr[0].snake_y = Snake.body_size*-1

    for item in snake_arr[::-1]:
        if item.way_forward == up:
            item.snake_y -= Snake.body_size
        elif item.way_forward == down:
            item.snake_y += Snake.body_size
        elif item.way_forward == left:
            item.snake_x -= Snake.body_size
        else :
            item.snake_x += Snake.body_size
        part_index = snake_arr.index(item)
        curr_color = colors[part_index%4]
        item.color = curr_color
        snake_part = pygame.Rect(item.snake_x,item.snake_y,Snake.body_size,Snake.body_size)
        pygame.draw.rect(game_window,item.color,snake_part,0)

        if part_index != 0:
            item.way_forward = snake_arr[part_index-1].way_forward
            item.snake_x = snake_arr[part_index-1].snake_x
            item.snake_y = snake_arr[part_index-1].snake_y

    print(snake_arr[0])
    pygame.display.update()
    time.sleep(1)
    change_forward_flag = True
pygame.quit()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值