前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python_不误正业之贪吃蛇

python_不误正业之贪吃蛇

作者头像
火星娃统计
发布2020-09-15 15:44:37
3490
发布2020-09-15 15:44:37
举报
文章被收录于专栏:火星娃统计

python贪吃蛇

概述

一直以来就想学这个,玩玩看 教程来自B站python学习者

备注:年前完成,20200818测试

代码

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import sys  # 系统交互的模块
import random  # 随机产生食物的位置
import pygame  # 开发游戏的模块,需要额外pip安装

screen_x = 600  # 界面大小
screen_y = 600  # 界面大小

# 添加类
# 蛇

class Snake(object): 
    #   属性 1.初始化蛇的长度
    #        2.蛇开始的位置
    def __init__(self):
        # 默认初始方向和长度
        self.direction = pygame.K_RIGHT  # 蛇的方向
        self.body = []  # 蛇的长度
        for x in range(5):
            self.addnode()

    #   行为:1.吃食物
    #         2.死亡
    #         3.移动
    #         4.方向

    def addnode(self):
        # 设置初始化蛇的位置
        left, top = (0, 0)
        if self.body:
            left, top = (self.body[0].left, self.body[0].top)
        node = pygame.Rect(left, top, 25, 25)
        if self.direction == pygame.K_LEFT:
            node.left -= 25
        if self.direction == pygame.K_RIGHT:
            node.left += 25
        elif self.direction == pygame.K_UP:
            node.top -= 25
        elif self.direction == pygame.K_DOWN:
            node.top += 25
        self.body.insert(0, node)

    # 移动后删除原始位置像素点
    def delnode(self):
        self.body.pop()

    # 死亡方法
    def isdead(self):
        # 撞墙
        if self.body[0].x not in range(screen_x):
            return True
        if self.body[0].y not in range(screen_y):
            return True
        # 撞自己
        if self.body[0] in self.body[1:]:
            return True
        return False

    # 移动
    def move(self):
        self.addnode()
        self.delnode()

    # 改变方向
    def changedirection(self, curkey):
        LR = [pygame.K_LEFT, pygame.K_RIGHT]
        UD = [pygame.K_UP, pygame.K_DOWN]

        if curkey in LR + UD:
            # 如果键盘为左右,蛇身子为左右则不执行
            if (curkey in LR) and (self.direction in LR):
                return
            # 如果键盘为上下,蛇身子为上下则不执行
            if (curkey in UD) and (self.direction in UD):
                return
            # 其他情况为键盘
            self.direction = curkey


# 食物
class Food:
    def __init__(self):
        # 初始化位置
        self.rect = pygame.Rect(-25, 0, 25, 25)

    def remove(self):
        self.rect.x = -25

    def set(self):
        if self.rect.x == -25:
            allpos = []
            # 不能靠墙太近
            for pos in range(25, screen_x-25, 25):
                allpos.append(pos)
            self.rect.left = random.choice(allpos)
            self.rect.top = random.choice(allpos)
            print(self.rect)


# 主函数核心
def main():
    pygame.init()  # 游戏初始化
    # 定义游戏界面大小
    screen_size = (screen_x, screen_y)
    # 返回到界面
    screen = pygame.display.set_mode(screen_size)
    pygame.display.set_caption("瞎的贪吃蛇")  # 窗口标题
    clock = pygame.time.Clock()  # 游戏的刷新频率
    scores = 0  # 初始成绩
    isdead = False  # 死亡
    snake = Snake()
    food = Food()
    while True:
        for event in pygame.event.get():
            # 如果退出
            if event.type == pygame.QUIT:
                sys.exit()
            # 如果键盘事件
            if event.type == pygame.KEYDOWN:
                snake.changedirection(event.key)
                # 如果没死和按空格返回游戏
                if event.key == pygame.K_SPACE and isdead:
                    return main()
        # 填充主板颜色
        screen.fill((255, 255, 255))

        # 画蛇身体
        if not isdead:
            snake.move()
        for rect in snake.body:
            pygame.draw.rect(screen, (20, 220, 39), rect, 0)

        # 显示死亡文字
        isdead = snake.isdead()
        if isdead:
            show_text(screen, (100, 100), "you dead!", (227, 29, 18), False, 100)
            show_text(
                screen, (150, 260), "press space to try again", (0, 0, 22), False, 30
            )
        # 食物处理,吃到+1
        # 如果蛇头和食物重叠,则运行
        if food.rect == snake.body[0]:
            scores += 50
            food.remove()
            snake.addnode()
        # 添加新的食物
        food.set()
        pygame.draw.rect(screen, (136, 0, 24), food.rect, 0)
        # 显示分数文字
        show_text(screen, (50, 500), "Scores: " + str(scores), (223, 223, 223))
        # 更新
        pygame.display.update()
        clock.tick(10)


def show_text(
    screen, pos, text, color, font_bold=False, font_size=60, font_italic=False):
    # 获取系统字体,设置大小
    cur_font = pygame.font.SysFont("宋体", font_size)
    # 设置粗体
    cur_font.set_bold(font_bold)
    # 设置斜体
    cur_font.set_italic(font_italic)
    # 设置文字内容
    text_fmt = cur_font.render(text, 1, color)
    # 绘制文字
    screen.blit(text_fmt, pos)
# 调用函数
main()

测试结果

游戏测试结果

运行测试

死亡测试

得分测试

结束语

这几天心情颇不宁静,静下心来写点东西总是很难,思来想去,幸福的生活是一样的,不幸福的生活各式各样。

北京,我又要回来了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python贪吃蛇
    • 概述
      • 代码
        • 测试结果
          • 结束语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档