python pyQt5简单的贪吃蛇

简单的贪吃蛇

学python时写的,包含了python、pyqt5的常用语法。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import random #随机数

class SnakeWidget(QWidget):
    #类局部变量
    row = 0     #行数
    column = 0  #列数
    bSnakeHead = False #是否生成 蛇头
    
    runDirection = 0 #蛇头方向
    
    #保存游戏开始时蛇头位置
    rowRand = 0        
    columnRand = 0
    mapList = []
    strSnakeHeadOne = '' #生成蛇身的位置
    def __init__(self, nrow = 30, ncolumn = 30):
        QWidget.__init__(self)
        self.setWindowTitle('贪吃蛇')
        self.setStyleSheet('background-color:#315e81')
        self.resize(600, 600)
        self.row = nrow
        self.column = ncolumn       
        self.ReSnake()
        
    def paintEvent(self, event): #重绘
        QWidget.paintEvent(self, event)
        painter = QPainter(self)          
        painter.setPen(QColor(255, 0, 0)) #设置画笔颜色
        rowSpace = self.height()/self.row #行间距
        columnSpace = self.width()/self.column #列间距
        #for n in range(self.row + 1): #画行
        #    painter.drawLine(QPointF(0, rowSpace*n), QPointF(self.width(), rowSpace*n))
        #for n in range(self.column + 1): #画列
        #    painter.drawLine(QPointF(columnSpace*n, 0), QPointF(columnSpace*n, self.height()))           
        
        
        #画蛇 
        num = 0
        for n in self.mapList:
            row = int(n[:n.find(':')])
            column = int(n[n.find(':') + 1:])   
            if num == 0: #蛇头            
                if self.runDirection == 0: #朝上
                    painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
                        QImage('pyqt5/top.png'))
                elif  self.runDirection == 1: #朝下
                    painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
                        QImage('pyqt5/bottom.png'))                
                elif  self.runDirection == 2: #朝左 
                    painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
                        QImage('pyqt5/left.png'))                
                elif  self.runDirection == 3: #朝右  
                    painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
                        QImage('pyqt5/right.png'))
#                painter.fillRect(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
#                    QColor(Qt.red))   #获取Qt枚举值  
            else: #蛇身
                painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
                    QImage('pyqt5/head.png'))               
            #    painter.fillRect(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
            #        QColor(Qt.black))   #获取Qt枚举值  
            num += 1
        #获取方块位置
        row = int(self.strSnakeHeadOne[:self.strSnakeHeadOne.find(':')])
        column = int(self.strSnakeHeadOne[self.strSnakeHeadOne.find(':') + 1:])   
        #画方块
        painter.drawImage(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
            QImage('pyqt5/head.png'))    
        #painter.fillRect(QRectF(column*columnSpace, row*rowSpace, columnSpace, rowSpace), \
        #        QColor(Qt.blue))
                        
    def keyPressEvent(self, event): #键盘事件
        QWidget.keyPressEvent(self, event)
        uKey = event.key()
        n = self.mapList[0]
        row = int(n[:n.find(':')])
        column = int(n[n.find(':') + 1:])        
        if uKey == Qt.Key_Up: #上
            row -= 1
            if row < 0 or row >= self.row:
                self.OverMessage(False)
                return
            self.CHeakMoveSnake(row, column)
            self.runDirection = 0
            self.update()        
        elif uKey == Qt.Key_Down: #下
            row += 1
            if row < 0 or row >= self.row:
                self.OverMessage(False)
                return
            self.CHeakMoveSnake(row, column)
            self.runDirection = 1
            self.update()
        elif uKey == Qt.Key_Left: #左
            column -= 1
            if column < 0 or column >= self.column:
                self.OverMessage(False)
                return
            self.CHeakMoveSnake(row, column)   
            self.runDirection = 2
            self.update()
        elif uKey == Qt.Key_Right: #右
            column += 1
            if column < 0 or column >= self.column:
                self.OverMessage(False)
                return
            self.CHeakMoveSnake(row, column) 
            self.runDirection = 3
            self.update()
            
    def CHeakMoveSnake(self, row, column): #检查移动的蛇,是否吃到方块
        strTmp = str(row) + ":" + str(column)      
        if self.strSnakeHeadOne == strTmp: #吃到方块
            self.mapList.insert(0, strTmp)            
            self.OneSnakeBody() #生成方块
        else: 
            if len(self.mapList) > 1 and self.mapList[1] == strTmp: #蛇头碰到蛇身
                self.OverMessage(False)
                return        
            #移动所有蛇身,反向遍历
            for n in range(len(self.mapList) - 1, 0, -1):                
                self.mapList[n] = self.mapList[n - 1]     
            if strTmp in self.mapList: #蛇头碰到蛇身
                self.OverMessage(False)
                return
            self.mapList[0] = strTmp #移动蛇头
        
    def OverMessage(self, bWin): #游戏结束,弹出提示框 bWin == True(通过);bWin == False(失败) 
        msgBox = QMessageBox()
        msgBox.setWindowTitle('提示')
        if not bWin:
            msgBox.setText("挑战失败");
        else:
            msgBox.setText("挑战成功");
        msgBox.exec();
        self.ReSnake()
        
    def ReSnake(self): #游戏开始,蛇头位置
        self.mapList.clear()
        self.rowRand = random.randint(0, self.row - 1)
        self.columnRand = random.randint(0, self.column - 1)
        self.mapList = [str(self.rowRand) + ":" + str(self.columnRand)]
        self.OneSnakeBody()
        self.runDirection = 0
        self.update()
        
    def OneSnakeBody(self):#生成蛇身位置
        while True:
            self.rowRand = random.randint(0, self.row - 1)
            self.columnRand = random.randint(0, self.column - 1)  
            strTmp = str(self.rowRand) + ":" + str(self.columnRand)
            if strTmp not in self.mapList:
                self.strSnakeHeadOne = strTmp
                return strTmp
    
app = QApplication(sys.argv)

widget = SnakeWidget() #窗口控件
widget.show()
    
sys.exit(app.exec_())
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Python PyQT5贪吃蛇是一个经典的游戏,玩家通过控制蛇的移动来吃食物并增长身体长度。在这个游戏中,蛇的移动策略通常是基于BFS算法来计算到达食物的最短路径长度。\[1\]游戏开始时,蛇很短,它会使用BFS算法计算每个位置到达食物的最短路径长度,而在没有蛇身阻挡的情况下,最短路径长度就是曼哈顿距离。然后,通过虚拟蛇进行探路,判断蛇的移动是否安全,只有在安全的情况下,真正的蛇才会跟随虚拟蛇的路径移动。\[1\] 在游戏中,安全的布局定义是指蛇能够追着蛇尾跑,并且在追逐蛇尾的过程中能够安全地吃到食物。当蛇的长度增长时,蛇尾后面会不断出现新的空间,这使得蛇能够继续追逐蛇尾。\[1\]然而,当蛇的长度增加到一定程度时,为了活下来,蛇只能追逐蛇尾。在追逐蛇尾的过程中,蛇会考虑是否能够安全地吃到食物。\[1\] 在游戏中,蛇每次移动一步后,布局会发生变化,因此可能存在更优解。因此,更好的策略是在蛇移动一步后重新进行BFS算法计算,并进行安全判断,然后再继续移动。这样可以确保蛇能够找到更好的路径来吃到食物。\[3\] 总结起来,Python PyQT5贪吃蛇游戏中,蛇的移动策略通常基于BFS算法来计算最短路径长度,并通过虚拟蛇进行探路来判断移动是否安全。安全的布局定义是指蛇能够追着蛇尾跑,并在追逐蛇尾的过程中安全地吃到食物。在移动过程中,蛇会重新计算最短路径,并进行安全判断,以找到更好的路径来吃到食物。\[1\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [惊了,用Python写了一个AI贪吃蛇,追着你跑的那种](https://blog.csdn.net/qq_42554007/article/details/108656621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值