【Python】贪吃蛇 —— 无聊必备的小项目

这篇具有很好参考价值的文章主要介绍了【Python】贪吃蛇 —— 无聊必备的小项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Python】贪吃蛇 —— 无聊必备的小项目

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,YOLO领域博主爱笑的男孩。擅长深度学习,活动,YOLO,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=collect个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

目录

前言

PyGame模块 

贪吃蛇源码


前言

        贪吃蛇是一款经典的单机游戏,最早于1976年问世,是由一位俄罗斯程序员创造的。游戏的主要设定是控制一条蛇在一个地图上移动,并不断吃食物。每吃到一颗食物,蛇的身体就会增长一节。游戏会随着时间的推移变得越来越难,需要玩家不断调整操作方式和思路,才能够在游戏中存活更久时间甚至创造高分记录。

        在游戏中,蛇可以通过键盘或手柄来控制移动方向。而地图上则会出现各种糖果或其他食物,蛇吃下这些食物的同时,也需要避免自己碰到自己的身体或碰到地图中的墙壁,否则就会导致游戏结束。

        贪吃蛇也成为了许多游戏公司甚至平台的必备元素之一,很多手机游戏和拼图游戏里都有它的身影。它不仅是一个经典的单机游戏,更是人们童年或者青年时期的美好回忆。

本篇文章主要使用了PyGame模块

PyGame模块 

        Pygame是一款为Python程序员封装的2D游戏开发库,它基于SDL库开发,并使得游戏开发变得简便易行。Pygame为游戏开发者提供了一组易于使用的API和工具,使得创建游戏变得愉快和简单。下面是Pygame中一些常用的模块和函数:

  • pygame.init(): 初始化Pygame模块。
  • pygame.quit(): 关闭Pygame模块。
  • pygame.display.set_mode(): 创建一个新的显示窗口。
  • pygame.display.update(): 更新显示。
  • pygame.time.Clock(): 创建一个新的时钟对象。
  • pygame.time.Clock().tick(): 控制游戏的帧率。
  • pygame.event.get(): 获取游戏中发生的所有事件。
  • pygame.event.get().type: 获取事件类型。
  • pygame.surface.blit(): 将一个表面绘制到另一个表面上。
  • pygame.image.load(); 加载一个图像文件。

        除了上述常用的模块以外,Pygame还提供了很多其他的模块来帮助游戏开发者构建自己的游戏,例如:

  • pygame.mouse: 用于获取鼠标的状态。
  • pygame.font: 用于使用字体。
  • pygame.mixer: 用于创建和播放声音或音频文件。
  • pygame.sprite: 用于管理游戏中的精灵。
  • pygame.transform: 用于转换图像的大小、旋转等。

        总体来说,Pygame是一款非常实用且易于使用的游戏开发库,可以帮助开发者快速开发出自己的2D游戏。

贪吃蛇源码

# -*- coding: utf-8 -*-

import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque


SCREEN_WIDTH = 600      # 屏幕宽度
SCREEN_HEIGHT = 480     # 屏幕高度
SIZE = 20               # 小方格大小
LINE_WIDTH = 1          # 网格线宽度

# 游戏区域的坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)

# 食物的分值及颜色
FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]

LIGHT = (100, 100, 100)
DARK = (200, 200, 200)      # 蛇的颜色
BLACK = (0, 0, 0)           # 网格线颜色
RED = (200, 30, 30)         # 红色,GAME OVER 的字体颜色
BGCOLOR = (40, 40, 60)      # 背景色


def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
    imgText = font.render(text, True, fcolor)
    screen.blit(imgText, (x, y))


# 初始化蛇
def init_snake():
    snake = deque()
    snake.append((2, SCOPE_Y[0]))
    snake.append((1, SCOPE_Y[0]))
    snake.append((0, SCOPE_Y[0]))
    return snake


def create_food(snake):
    food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
    food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
    while (food_x, food_y) in snake:
        # 如果食物出现在蛇身上,则重来
        food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
        food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
    return food_x, food_y


def get_food_style():
    return FOOD_STYLE_LIST[random.randint(0, 2)]


def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('贪吃蛇')

    font1 = pygame.font.SysFont('SimHei', 24)  # 得分的字体
    font2 = pygame.font.Font(None, 72)  # GAME OVER 的字体
    fwidth, fheight = font2.size('GAME OVER')

    # 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
    # b 变量就是用于防止这种情况的发生
    b = True

    # 蛇
    snake = init_snake()
    # 食物
    food = create_food(snake)
    food_style = get_food_style()
    # 方向
    pos = (1, 0)

    game_over = True
    start = False       # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
    score = 0           # 得分
    orispeed = 0.5      # 原始速度
    speed = orispeed
    last_move_time = None
    pause = False       # 暂停

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_RETURN:
                    if game_over:
                        start = True
                        game_over = False
                        b = True
                        snake = init_snake()
                        food = create_food(snake)
                        food_style = get_food_style()
                        pos = (1, 0)
                        # 得分
                        score = 0
                        last_move_time = time.time()
                elif event.key == K_SPACE:
                    if not game_over:
                        pause = not pause
                elif event.key in (K_w, K_UP):
                    # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
                    if b and not pos[1]:
                        pos = (0, -1)
                        b = False
                elif event.key in (K_s, K_DOWN):
                    if b and not pos[1]:
                        pos = (0, 1)
                        b = False
                elif event.key in (K_a, K_LEFT):
                    if b and not pos[0]:
                        pos = (-1, 0)
                        b = False
                elif event.key in (K_d, K_RIGHT):
                    if b and not pos[0]:
                        pos = (1, 0)
                        b = False

        # 填充背景色
        screen.fill(BGCOLOR)
        # 画网格线 竖线
        for x in range(SIZE, SCREEN_WIDTH, SIZE):
            pygame.draw.line(screen, BLACK, (x, SCOPE_Y[0] * SIZE), (x, SCREEN_HEIGHT), LINE_WIDTH)
        # 画网格线 横线
        for y in range(SCOPE_Y[0] * SIZE, SCREEN_HEIGHT, SIZE):
            pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y), LINE_WIDTH)

        if not game_over:
            curTime = time.time()
            if curTime - last_move_time > speed:
                if not pause:
                    b = True
                    last_move_time = curTime
                    next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
                    if next_s == food:
                        # 吃到了食物
                        snake.appendleft(next_s)
                        score += food_style[0]
                        speed = orispeed - 0.03 * (score // 100)
                        food = create_food(snake)
                        food_style = get_food_style()
                    else:
                        if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] \
                                and next_s not in snake:
                            snake.appendleft(next_s)
                            snake.pop()
                        else:
                            game_over = True

        # 画食物
        if not game_over:
            # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
            pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

        # 画蛇
        for s in snake:
            pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
                                            SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)

        print_text(screen, font1, 30, 7, f'速度: {score//100}')
        print_text(screen, font1, 450, 7, f'得分: {score}')

        if game_over:
            if start:
                print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)

        pygame.display.update()


if __name__ == '__main__':
    main()

 文章来源地址https://www.toymoban.com/news/detail-435496.html

【Python】贪吃蛇 —— 无聊必备的小项目

 

到了这里,关于【Python】贪吃蛇 —— 无聊必备的小项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目

    贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎。今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 所有的游戏最主要的内容都是程序的内循环,这才是保证一个游戏能够正常运行的前提。 以下是编写贪吃

    2024年01月17日
    浏览(52)
  • 有点无聊,来用Python制作代码雨

    刚刚有人找我要流星雨的代码 可惜了,我没有这个,所以我就来搞个代码雨吧 应该很多人都看过这个的 也是无聊就拿出来发发 模块准备 源码.点击领取即可 初始化参数设计 创建窗口及文本设计

    2024年02月12日
    浏览(31)
  • 用 Python 自动化处理无聊的事情

    “编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利;它让无聊变得有趣。” Hilary Mason,数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣,并且记得将一组说明

    2024年02月21日
    浏览(45)
  • 创宇区块链|无聊猿项目“又 双 叒 叕” 遭受钓鱼攻击,网络钓鱼究竟是何方神圣

    北京时间2022年6月5日,知道创宇区块链安全实验室 监测到著名NFT项目(无聊猿)的 Discord 社群再次遭受了网络钓鱼攻击,造成约 200 枚以太币的损失。在此之前,著名歌手周杰伦在愚人节当天就曾遭受网络钓鱼攻击,导致其库存中的无聊猿 NFT 被黑客转移。 近年来,我们发现

    2023年04月24日
    浏览(50)
  • 【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)

    web 效果预览: 先去质量查询地址:https://www.csdn.net/qc 输入任意一篇文章地址进行查询,同时检查页面,在Network选项下即可看到调用的API的请求地址、请求方法、请求头、请求体等内容: 请求头里面很多参数是不需要的,我们用 ApiPost 这个软件来测试哪些是必要参数。 经过

    2024年02月13日
    浏览(41)
  • SpringBoot项目登录与主页面(从建项目开始详细教程)

    application.properties 前端需要的静态配置文件 代码生成器使用的前提: 1.配置有mp代码生成器的依赖 2.配置有swagger文件 3.连接了数据库 CodeGenerator controller层 service层 PermissionServiceImpl mapper层 PermissionMapper.xml

    2024年02月03日
    浏览(75)
  • SpringBoot登陆+6套前端主页-【JSB项目实战】

    SpringBoot知识范围-学习步骤【JSB系列之000】 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知! 韩顺平说:学习JAVA的人有两大难 第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥 第二

    2024年02月15日
    浏览(47)
  • C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)

    文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 码文不易,给个免费的小星星和免费的赞吧,关注也行呀(⑅•͈ᴗ•͈).:*♡  不要白嫖哇(⁍̥̥̥᷄д⁍̥̥̥᷅ ू )伤心 目录 1

    2024年02月12日
    浏览(47)
  • 如何添加github项目合作者,用自己的github账号加入项目

    最近需要部署一套文档去公司的gtihub,记录一下如何用自己的github往别人的github中上传文档,第一步就是要添加自己为该项目的合作者。 1. 首先登陆项目仓库存在的github账号。 2. 点击settings-Repositories。就能看到现有的仓库,最右边会有collaorators的字样显示目前有几个合作者

    2024年02月11日
    浏览(51)
  • PHP注册、登陆、6套主页-带Thinkphp目录解析-【白嫖项目】

    强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知! PHP无类 PHP类写法 ThinkPHP框架 其它框架 *5.0 环境 PHP版本 mysql版本

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包