从零开始:用Python和PyQt5编写经典贪吃蛇游戏

这篇博客实现了一个简单的贪吃蛇游戏,使用PyQt5库来创建图形用户界面。游戏包括蛇的移动、食物的生成和得分的计算。

依赖库

  • random: 用于随机生成食物的位置。
  • sys: 提供对系统特定参数和函数的访问。
  • time: 用于跟踪游戏的开始时间。
  • PyQt5.QtCore, PyQt5.QtGui, PyQt5.QtWidgets: PyQt5模块,用于创建GUI、处理事件和绘制图形。

步骤

 第一步:导入库并设置游戏

import random
import sys
import time
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtWidgets import QApplication, QWidget

解释:

  • random:用于随机放置食物。
  • sys:提供对系统特定参数和函数的访问。
  • time:用于跟踪游戏的开始时间。
  • PyQt5.QtCore, PyQt5.QtGui, PyQt5.QtWidgets:PyQt5模块,用于创建GUI、处理事件和绘制图形。

第二步:初始化贪吃蛇游戏类

class SnakeGame(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

解释:

  • SnakeGame类继承自QWidget
  • __init__方法通过调用initUI来初始化游戏。

第三步:设置用户界面

def initUI(self):
    self.setGeometry(100, 100, 400, 400)
    self.setWindowTitle('贪吃蛇')
    self.timer = QTimer(self)
    self.timer.timeout.connect(self.updateGame)
    self.timer.start(100)
    self.snake = [(20, 20), (20, 21), (20, 22)]
    self.direction = Qt.Key_Right
    self.food = self.placeFood()
    self.score = 0
    self.start_time = time.time()
    self.show()

解释:

  • setGeometry:设置窗口大小和位置。
  • setWindowTitle:设置窗口标题。
  • QTimer:创建一个定时器,每100毫秒更新一次游戏。
  • self.snake:初始化蛇的位置。
  • self.direction:设置蛇的初始方向。
  • self.food:放置初始食物。
  • self.score:初始化得分。

好的,我将按照你的要求提供相关信息。

 完整代码

import random
import sys
import time
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtWidgets import QApplication, QWidget

class SnakeGame(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 400, 400)
        self.setWindowTitle('贪吃蛇')
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateGame)
        self.timer.start(100)
        self.snake = [(20, 20), (20, 21), (20, 22)]
        self.direction = Qt.Key_Right
        self.food = self.placeFood()
        self.score = 0
        self.start_time = time.time()
        self.show()

    def placeFood(self):
        while True:
            food = (random.randint(0, 39), random.randint(0, 39))
            if food not in self.snake:
                return food

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        self.drawGame(qp)
        qp.end()

    def drawGame(self, qp):
        self.setStyleSheet("background-color: #000033;")
        qp.setBrush(QColor(0, 0, 51))
        for i in range(0, 400, 10):
            for j in range(0, 400, 10):
                qp.drawRect(i, j, 10, 10)
        qp.setBrush(QColor(0, 255, 0))
        for pos in self.snake:
            qp.drawRect(pos[0] * 10, pos[1] * 10, 10, 10)
        qp.setBrush(QColor(255, 0, 0))
        qp.drawRect(self.food[0] * 10, self.food[1] * 10, 10, 10)
        qp.setPen(QColor(255, 255, 255))
        qp.drawText(10, 20, f"得分: {self.score}")

    def keyPressEvent(self, event):
        key = event.key()
        if key in (Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down):
            self.direction = key

    def updateGame(self):
        head = self.snake[0]
        if self.direction == Qt.Key_Left:
            newHead = (head[0] - 1, head[1])
        elif self.direction == Qt.Key_Right:
            newHead = (head[0] + 1, head[1])
        elif self.direction == Qt.Key_Up:
            newHead = (head[0], head[1] - 1)
        elif self.direction == Qt.Key_Down:
            newHead = (head[0], head[1] + 1)

        if newHead in self.snake or newHead[0] < 0 or newHead[0] >= 40 or newHead[1] < 0 or newHead[1] >= 40:
            self.timer.stop()
            return

        self.snake.insert(0, newHead)
        if newHead == self.food:
            self.food = self.placeFood()
            self.score += 10
        else:
            self.snake.pop()

        self.update()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    game = SnakeGame()
    sys.exit(app.exec_())

说明

这段代码实现了一个基本的贪吃蛇游戏,玩家可以通过方向键控制蛇的移动,吃到食物后得分增加,蛇的长度也会增加。

相关类型扩展

  1. 增加游戏难度:可以通过逐渐减少定时器的时间间隔来增加游戏难度。
  2. 增加障碍物:在游戏区域内随机生成障碍物,增加游戏的挑战性。
  3. 多玩家模式:允许多个玩家同时控制不同的蛇进行游戏。
  4. 保存最高分:在游戏结束时保存最高分,并在游戏开始时显示。

       爬虫项目推荐

    其他项目推荐

总结

通过这篇文章,我们学会了以下内容:

  1. 导入必要的库:了解了如何使用randomsystime和PyQt5库来创建游戏。
  2. 初始化游戏类:学习了如何创建一个继承自QWidget的游戏类,并在其中初始化游戏界面和元素。
  3. 设置用户界面:掌握了如何设置窗口大小、标题、定时器以及初始化蛇和食物的位置。
  4. 绘制游戏元素:了解了如何使用QPainter绘制蛇、食物和背景,并显示得分。
  5. 处理键盘事件:学习了如何通过键盘事件控制蛇的移动方向。
  6. 更新游戏状态:掌握了如何更新蛇的位置、检测碰撞和处理食物的生成。

通过这些步骤,我们成功地创建了一个基本的贪吃蛇游戏,并且可以通过进一步扩展来增加游戏的趣味性和挑战性。

运行结果

运行这段代码后,会出现一个400x400像素的窗口,显示一个贪吃蛇游戏。玩家可以使用方向键控制蛇的移动,吃到食物后得分增加,蛇的长度也会增加。

结论

这篇文章展示了如何使用Python和PyQt5库创建一个简单的贪吃蛇游戏。通过详细的代码片段解析,我们了解了如何设置游戏窗口、初始化蛇和食物的位置、处理键盘事件以及更新游戏状态。代码还展示了如何绘制游戏元素并显示得分。

欢迎在评论区留言。继续探索和学习,祝你在深度学习的旅程中取得更多的成果!🚀


希望这个博客对你有所帮助!如果你有任何问题需要进一步的指导,请随时提问。继续加油! 🚀

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIY若依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值