pygame贪吃蛇

pygame贪吃蛇

之前也写过一个贪吃蛇,不过代码比较短(虽然这个也不长),页面也不好看,有些地方也不合理,,,,就又在原来的基础上改进了一下,之前那个在这里
可以看见之前的那个一点击运行就开始游戏了也没有提示啥的,这次其实主要就是加了一个欢迎页面。。。当然也加了背景音乐。先看看效果吧:
运行以后:
欢迎界面:
在这里插入图片描述
点击“begin”:
就到了游戏的主页面(按空格或者点击画面中的任一位置可暂停):
在这里插入图片描述
点击quit就直接退出了,页面也不多就不演示了直接上代码吧

class Point():
    row = 0
    col = 0
    def __init__(self, row, col):
        self.row = row
        self.col = col

    def copy(self):
        return Point(self.row,self.col)

import pygame
import random
import traceback

# 初始化
pygame.init()
W = 1134  # 屏幕的宽
H = 627 # 屏幕的高

ROW = 30  # 几行
COL = 40  # 几列  每个格有多大

size = (W, H)
window = pygame.display.set_mode(size)
pygame.display.set_caption('wlx贪吃蛇')

bakc_ground = pygame.image.load("snake_background.png").convert()

bg_color = (128, 128, 128)  # 背景颜色
snake_color = (150, 150, 150)  # 蛇身颜色

head = Point(int(ROW / 2), int(COL / 2))  # 蛇头
head_color = (20, 100, 100)
snakes = [
        Point(head.row, head.col + 1),
        Point(head.row, head.col + 2)
    ]

# 生成食物
def get_food():
    while True:
        pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))
        # 是否跟蛇碰上
        is_col = False
        if head.row == pos.row and head.col == pos.col:
            is_col = True
        for snake in snakes:
            if snake.row == pos.row and snake.col == pos.col:
                is_col = True
                break
        if not is_col:
            break
    return pos


# 设置帧频,根据游戏的进程逐渐变快
frequency = 5
score = 0

#标题颜色
greed_color = (128, 255, 128)

def rect(point, color):
    cell_width = W / COL  # 格子的宽度
    cell_height = H / ROW # 格子的高度

    left = point.col * cell_width
    top = point.row * cell_height
    pygame.draw.rect(window,color,(left,top,cell_width,cell_height))

# 游戏刚开始的页面加载的图片啥的
greed_snake_font = pygame.font.Font("font.ttf", 72)
greed_snake_begin_image = pygame.image.load("begin.png").convert()
greed_snake_begin_rect = greed_snake_begin_image.get_rect()
greed_snake_quit_image = pygame.image.load("quit.png").convert()
greed_snake_quit_rect = greed_snake_quit_image.get_rect()

# 游戏开始的音效
pygame.mixer.music.load("snake_playground.wav")
pygame.mixer.music.set_volume(0.2)
eat_sound = pygame.mixer.Sound("snake_eat.wav")
eat_sound.set_volume(0.2)
over_sound = pygame.mixer.Sound("snake_over.wav")
over_sound.set_volume(0.2)

def main():
    head = Point(int(ROW / 2), int(COL / 2))  # 蛇头
    head_color = (20, 100, 100)
    snakes = [
        Point(head.row, head.col + 1),
        Point(head.row, head.col + 2)
    ]

    pygame.mixer.music.play(-1)
    direct = 'left'  # 蛇移动方向  left, right, up, down

    paused = False

    # 游戏循环
    quit = True
    clock = pygame.time.Clock()

    # 定义坐标
    food = get_food()
    food_color = (255, 255, 0)

    while quit :
        # 处理事件
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                pygame.mixer.music.stop()
                pygame.mixer.stop()
                quit = False
            elif event.type == pygame.KEYDOWN:  # 按键  上下左右  对应键值可以通过print(event)打出来
                if event.key == 273 or event.key == 119:
                    if direct == 'left' or direct == 'right':
                        direct = 'up'
                elif event.key == 274 or event.key == 115:
                    if direct == 'left' or direct == 'right':
                        direct = 'down'
                elif event.key == 276 or event.key == 97:
                    if direct == 'up' or direct == 'down':
                        direct = 'left'
                elif event.key == 275 or event.key == 100:
                    if direct == 'up' or direct == 'down':
                        direct = 'right'
                elif event.key == pygame.K_SPACE:
                    paused = not paused
                    if paused:
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1 :
                    paused = not paused
                    if paused:
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()



        # 做自己的事

        if not paused:
            # 吃东西
            eat = head.row == food.row and head.col == food.col

            if eat:
                eat_sound.play()
                food = get_food()
            # 处理身子
            # 1、把原来的头插入到snakes的头上
            snakes.insert(0, head.copy())
            # 2、把snakes的最后一个格子删掉
            if not eat:
                snakes.pop()
            # 移动
            if direct == 'left':
                head.col -= 1
            elif direct == 'right':
                head.col += 1
            elif direct == 'up':
                head.row -= 1
            else:
                head.row += 1

            # 检测
            dead = False
            # 1、撞墙
            if head.col < 0 or head.row < 0 or head.col >= COL or head.row >= ROW:
                over_sound.play()
                pygame.mixer.music.stop()
                pygame.mixer.stop()
                dead = True
            # 2、撞自己
            for snake in snakes:
                if head.col == snake.col and head.row == snake.row:
                    over_sound.play()
                    pygame.mixer.music.stop()
                    pygame.mixer.stop()
                    dead = True
                    break
            if dead:
                print("游戏结束")
                quit = False

            window.blit(bakc_ground, (0, 0))
            # 渲染--画出来
            # 屏幕背景颜色绘制

            # 画蛇头
            for snake in snakes:
                rect(snake, snake_color)
            rect(head, head_color)

            # 画食物
            rect(food, food_color)

            pygame.display.flip()  # 更新整个待显示的Surface 对象到屏幕上

            # 设置帧频
            clock.tick(frequency)  # sleep(1000/60)



def begin_snake():
    colck = pygame.time.Clock()

    quit = True
    while quit:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                quit = False;

        # 背景
        pygame.draw.rect(window, bg_color, (0, 0, W, H))

        # 设置游戏标题
        greed_snake_text = greed_snake_font.render("wlx_GreedySnake", True, greed_color)
        # 标题位置
        title_pos = (280, 40)
        # 显示
        window.blit(greed_snake_text, title_pos)

        greed_snake_begin_rect.left = (W - greed_snake_begin_rect.width) //2
        greed_snake_begin_rect.top = 250
        window.blit(greed_snake_begin_image, greed_snake_begin_rect)

        greed_snake_quit_rect.left = (W - greed_snake_quit_rect.width) // 2
        greed_snake_quit_rect.top = 400
        window.blit(greed_snake_quit_image, greed_snake_quit_rect)

        # 检查用户的鼠标操作
        # 如果用户按下了鼠标左键
        if pygame.mouse.get_pressed()[0]:
            # 获取鼠标坐标
            pos = pygame.mouse.get_pos()
            # 用户点击“begin”
            if greed_snake_begin_rect.left < pos[0] < greed_snake_begin_rect.right and \
                greed_snake_begin_rect.top < pos[1] < greed_snake_begin_rect.bottom:
                main()

            # 用户点击“quit”
            elif greed_snake_quit_rect.left < pos[0] < greed_snake_quit_rect.right and \
                greed_snake_quit_rect.top < pos[1] < greed_snake_quit_rect.bottom:
                quit = False
                pygame.quit()


        pygame.display.flip()

        colck.tick(frequency)


if __name__ == '__main__':
    try:
        begin_snake()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input()

其实和之前那个代码相比只是用函数封装了一下(太久没写pygame了,光改一下都弄了好久。。。还是要多练啊。。。),不过现在这个看起来舒服多啦哈哈哈

发布了8 篇原创文章 · 获赞 12 · 访问量 3447

猜你喜欢

转载自blog.csdn.net/weixin_44620183/article/details/104862516