python实现贪吃蛇小游戏

Python实现贪吃蛇小游戏是一个非常好的练手项目,通过这个项目,可以加深对Python编程基础的理解和掌握,同时也可以提升编程能力和逻辑思维能力。下面是完整攻略:

游戏规则

贪吃蛇是一款非常经典的小游戏,游戏规则如下:

  1. 蛇的身体由一个个方块组成,蛇头在最前面,蛇的初始长度为3个方块
  2. 当蛇头碰到了边界或者碰到了自己的身体时,游戏结束
  3. 蛇头碰到食物后,蛇的长度加1,并且在一个随机位置生成一个新的食物
  4. 蛇头每前进一步,身体向前移动一格,蛇头方向由玩家控制

实现步骤

  1. 安装Pygame库

首先需要安装Pygame库,可以使用pip命令安装:

pip install pygame
  1. 初始化Pygame库与游戏窗口

首先需要导入pygame库,并且初始化相关变量,例如游戏窗口的大小、颜色、标题等信息:

import pygame

# 初始化Pygame库
pygame.init()

# 定义窗口尺寸
WIDTH = 600
HEIGHT = 400
SIZE = 20

# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# 创建游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('贪吃蛇小游戏')
  1. 定义贪吃蛇的类

定义贪吃蛇的类,包含贪吃蛇的初始化、移动、吃食物等操作。

class Snake:
  def __init__(self):
    pass

  def update(self):
    pass

  def draw(self):
    pass

  def eat(self, food):
    pass
  1. 实现贪吃蛇的移动

在贪吃蛇的类中,实现贪吃蛇的移动,主要是更新贪吃蛇的坐标,通过键盘事件控制。

class Snake:
  def __init__(self):
    self.body = [(WIDTH/2, HEIGHT/2), (WIDTH/2-SIZE, HEIGHT/2), (WIDTH/2-2*SIZE, HEIGHT/2)]
    self.direction = "RIGHT"

  def update(self):
    if self.direction == "UP":
        self.body.insert(0, (self.body[0][0], self.body[0][1]-SIZE))
    elif self.direction == "DOWN":
        self.body.insert(0, (self.body[0][0], self.body[0][1]+SIZE))
    elif self.direction == "LEFT":
        self.body.insert(0, (self.body[0][0]-SIZE, self.body[0][1]))
    elif self.direction == "RIGHT":
        self.body.insert(0, (self.body[0][0]+SIZE, self.body[0][1]))
    self.body.pop()

  def draw(self):
    for block in self.body:
        pygame.draw.rect(screen, GREEN, (block[0], block[1], SIZE, SIZE))

  def eat(self, food):
    pass

# 处理键盘事件
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP and snake.direction != "DOWN":
            snake.direction = "UP"
        elif event.key == pygame.K_DOWN and snake.direction != "UP":
            snake.direction = "DOWN"
        elif event.key == pygame.K_LEFT and snake.direction != "RIGHT":
            snake.direction = "LEFT"
        elif event.key == pygame.K_RIGHT and snake.direction != "LEFT":
            snake.direction = "RIGHT"
  1. 实现贪吃蛇吃食物

在贪吃蛇的类中,实现贪吃蛇吃食物的逻辑,并且在画面上生成新的食物。

class Snake:
  def __init__(self):
    self.body = [(WIDTH/2, HEIGHT/2), (WIDTH/2-SIZE, HEIGHT/2), (WIDTH/2-2*SIZE, HEIGHT/2)]
    self.direction = "RIGHT"

  def update(self):
    if self.direction == "UP":
        self.body.insert(0, (self.body[0][0], self.body[0][1]-SIZE))
    elif self.direction == "DOWN":
        self.body.insert(0, (self.body[0][0], self.body[0][1]+SIZE))
    elif self.direction == "LEFT":
        self.body.insert(0, (self.body[0][0]-SIZE, self.body[0][1]))
    elif self.direction == "RIGHT":
        self.body.insert(0, (self.body[0][0]+SIZE, self.body[0][1]))
    self.body.pop()

  def draw(self):
    for block in self.body:
        pygame.draw.rect(screen, GREEN, (block[0], block[1], SIZE, SIZE))

  def eat(self, food):
    if self.body[0] == food.pos:
        self.body.append(food.pos)
        food.generate()
  1. 实现食物的类

定义食物的类,包含食物的初始化、生成等操作。

class Food:
  def __init__(self):
    self.pos = (0, 0)
    self.generate()

  def generate(self):
    self.pos = (random.randint(0, WIDTH//SIZE-1)*SIZE, random.randint(0, HEIGHT//SIZE-1)*SIZE)

  def draw(self):
    pygame.draw.rect(screen, RED, (self.pos[0], self.pos[1], SIZE, SIZE))
  1. 实现游戏主逻辑

在游戏主逻辑中,需要不断更新贪吃蛇的状态,判断游戏是否结束,并且在画面上显示当前的分数等信息。

snake = Snake()
food = Food()
score = 0
clock = pygame.time.Clock()

while True:
    # 处理退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 更新状态
    snake.update()
    snake.draw()
    food.draw()

    # 判断是否碰到墙壁或蛇身
    if snake.body[0][0] < 0 or snake.body[0][0] >= WIDTH or snake.body[0][1] < 0 or snake.body[0][1] >= HEIGHT:
        pygame.quit()
        sys.exit()
    for block in snake.body[1:]:
        if snake.body[0] == block:
            pygame.quit()
            sys.exit()

    # 判断是否吃到食物
    snake.eat(food)

    # 显示分数等信息
    score += 10
    font = pygame.font.SysFont(None, 24)
    score_text = font.render("Score: " + str(score), True, BLACK)
    screen.blit(score_text, (10, 10))

    # 刷新画面
    pygame.display.update()

    # 控制帧率
    clock.tick(10)

示例

下面是两个示例:

示例1:实现贪吃蛇的移动

实现贪吃蛇的移动,通过键盘事件控制贪吃蛇的运动。

import pygame

# 初始化Pygame库
pygame.init()

# 定义窗口尺寸
SIZE = 20
WIDTH = 640
HEIGHT = 480

# 创建游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('贪吃蛇小游戏')

# 定义贪吃蛇的类
class Snake:
    def __init__(self):
        self.body = [(100, 100), (80, 100), (60, 100)]
        self.direction = "RIGHT"

    def update(self):
        if self.direction == "UP":
            self.body.insert(0, (self.body[0][0], self.body[0][1]-SIZE))
        elif self.direction == "DOWN":
            self.body.insert(0, (self.body[0][0], self.body[0][1]+SIZE))
        elif self.direction == "LEFT":
            self.body.insert(0, (self.body[0][0]-SIZE, self.body[0][1]))
        elif self.direction == "RIGHT":
            self.body.insert(0, (self.body[0][0]+SIZE, self.body[0][1]))
        self.body.pop()

    def draw(self):
        for block in self.body:
            pygame.draw.rect(screen, (0, 255, 0), (block[0], block[1], SIZE, SIZE))

# 实例化贪吃蛇对象
snake = Snake()

# 游戏主循环
while True:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and snake.direction != "DOWN":
                snake.direction = "UP"
            elif event.key == pygame.K_DOWN and snake.direction != "UP":
                snake.direction = "DOWN"
            elif event.key == pygame.K_LEFT and snake.direction != "RIGHT":
                snake.direction = "LEFT"
            elif event.key == pygame.K_RIGHT and snake.direction != "LEFT":
                snake.direction = "RIGHT"

    # 更新状态
    snake.update()

    # 填充背景色
    screen.fill((255, 255, 255))

    # 画出贪吃蛇
    snake.draw()

    # 刷新画面
    pygame.display.update()

示例2:实现贪吃蛇吃食物

实现贪吃蛇吃食物的逻辑,并且在画面上生成新的食物。

import pygame
import random

# 初始化Pygame库
pygame.init()

# 定义窗口尺寸
SIZE = 20
WIDTH = 640
HEIGHT = 480

# 创建游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('贪吃蛇小游戏')

# 定义贪吃蛇的类
class Snake:
    def __init__(self):
        self.body = [(100, 100), (80, 100), (60, 100)]
        self.direction = "RIGHT"

    def update(self):
        if self.direction == "UP":
            self.body.insert(0, (self.body[0][0], self.body[0][1]-SIZE))
        elif self.direction == "DOWN":
            self.body.insert(0, (self.body[0][0], self.body[0][1]+SIZE))
        elif self.direction == "LEFT":
            self.body.insert(0, (self.body[0][0]-SIZE, self.body[0][1]))
        elif self.direction == "RIGHT":
            self.body.insert(0, (self.body[0][0]+SIZE, self.body[0][1]))
        self.body.pop()

    def draw(self):
        for block in self.body:
            pygame.draw.rect(screen, (0, 255, 0), (block[0], block[1], SIZE, SIZE))

    def eat(self, food):
        if self.body[0] == food.pos:
            self.body.append(food.pos)
            food.generate()

# 定义食物的类
class Food:
    def __init__(self):
        self.pos = (0, 0)
        self.generate()

    def generate(self):
        self.pos = (random.randint(0, WIDTH//SIZE-1)*SIZE, random.randint(0, HEIGHT//SIZE-1)*SIZE)

    def draw(self):
        pygame.draw.rect(screen, (255, 0, 0), (self.pos[0], self.pos[1], SIZE, SIZE))

# 实例化贪吃蛇对象与食物对象
snake = Snake()
food = Food()

# 游戏主循环
while True:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and snake.direction != "DOWN":
                snake.direction = "UP"
            elif event.key == pygame.K_DOWN and snake.direction != "UP":
                snake.direction = "DOWN"
            elif event.key == pygame.K_LEFT and snake.direction != "RIGHT":
                snake.direction = "LEFT"
            elif event.key == pygame.K_RIGHT and snake.direction != "LEFT":
                snake.direction = "RIGHT"

    # 更新状态
    snake.update()

    # 填充背景色
    screen.fill((255, 255, 255))

    # 画出贪吃蛇
    snake.draw()

    # 画出食物
    food.draw()

    # 判断是否吃到食物
    snake.eat(food)

    # 刷新画面
    pygame.display.update()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现贪吃蛇小游戏 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python实现自定义函数的5种常见形式分析

    Python实现自定义函数的5种常见形式分析 在Python中,自定义函数是非常常见的一种操作。Python提供了多种方式来定义函数,本文将介绍其中的5种常见形式。 1. 无参函数 无参函数不需要传入参数,直接执行函数体中的代码块。定义无参函数的代码如下: def function_name(): # 代码块 示例:实现一个简单的无参函数,输出“Hello …

    python 2023年6月5日
    00
  • Python logging模块写入中文出现乱码

    如果在Python中使用logging模块写入中文时出现了乱码,可以按照以下步骤解决: 设置编码 在Python文件中加入以下代码: import logging import codecs import sys # 设置编码为utf-8 sys.stdout = codecs.getwriter("utf-8")(sys.stdout.…

    python 2023年5月20日
    00
  • Python3显示当前时间、计算时间差及时间加减法示例代码

    下面我将针对“Python3显示当前时间、计算时间差及时间加减法示例代码”的完整攻略进行讲解。 显示当前时间 Python内置datetime模块可以用于处理日期和时间。可以使用以下代码获取当前时间并以指定格式进行显示: import datetime now = datetime.datetime.now() print(now.strftime(‘%Y-…

    python 2023年6月2日
    00
  • python如何调用字典的key

    调用 Python 字典的 key 实际上是通过其键(key)来获取对应的值(value)。 以下是使用 Python 语言调用 Python 字典 key 的步骤: 创建字典 首先,我们需要创建一个 Python 字典,可以通过以下方式创建一个包含两个元素的字典: my_dict = {‘name’: ‘Tom’, ‘age’: 20} 获取 key 对应…

    python 2023年5月13日
    00
  • 浅谈Python3多线程之间的执行顺序问题

    浅谈 Python3 多线程之间的执行顺序问题 引言 在编写多线程程序时,一个常见的问题是线程之间的执行顺序问题。Python3 中的多线程编程有两个主要的模块:_thread 和 threading。这两个模块都具有控制线程执行顺序的方法。在本文中,我们将讨论这些方法,并通过示例说明它们的使用。本文假设读者已经具有Python3多线程编程的一些基础知识。 …

    python 2023年5月18日
    00
  • Python转换itertools.chain对象为数组的方法

    首先,需要了解itertools.chain对象的概念。itertools.chain是一个迭代器工具,将多个迭代对象连接成一个序列,返回一个包含所有元素的迭代器。但是,如果想要将itertools.chain对象转换成数组,可以使用以下方式。 方法一:使用list构造函数 使用list构造函数可以将迭代器转换成数组,因此可以使用list函数将itertoo…

    python 2023年6月3日
    00
  • Python 组对序列元素

    当我们需要将多个数据集合在一起时,Python中提供的列表、元组和集合等数据类型可以很好地满足这种需求。但有时我们需要把多个数据结构合并成一个数据结构并且需要保持原来数据结构的不可变特性。 这时,Python中提供了一种新的数据结构——元组(tuple),元组是不可变的序列,它通过把一些对象按照一定的顺序组合而成。 组对序列元素使用方法可以包括以下几个方面:…

    python-answer 2023年3月25日
    00
  • Python参数解析器configparser简介

    Python参数解析器configparser简介 configparser是Python中一个非常有用的库,可以用于解析配置文件。本文将介绍configparser的基本用法,并提供两个示例。 安装configparser configparser是Python标准库的一部分,因此不需要额外安装。 解析配置文件 configparser可以用于解析INI格…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部