贪吃蛇(python,PyQt5)

2 篇文章 0 订阅
2 篇文章 0 订阅

喜欢就顶一下,不喜欢就踩一下吐舌头

话不多说,直接上图:


import sys,random,time,win32event,pywintypes,win32api
from PyQt5.QtGui import QFont,QIcon
from PyQt5.QtCore import Qt,QSize,QTimer
from PyQt5.QtWidgets import (QApplication,QDesktopWidget,QWidget,QMessageBox,
                             QHBoxLayout,QGridLayout,QVBoxLayout,QLabel,QFrame,
                             QLCDNumber,QPushButton,QToolButton)


class APP(QWidget):
    def __init__(self):
        super(APP,self).__init__()
        self.variable()
        self.Interface()
        self.center()
        self.Preset()
        self.link()

    def Preset(self):#打开游戏预设
        self.Randomgeneration()
        self.timer=QTimer()#建立计时器
        
    def variable(self):#各种变量
        self.cell=dict()#储存全部像素点组件
        self.cells=list()#储存全部像素点
        self.snake=[(12,12)]#蛇所占的像素点
        self.fruit=tuple()#果实的位置
        self.direction=(0,0)#方向键位置
        self.startsuspend='suspend'
        self.speed=400#初始速度
        self.lock=0#键盘锁,防止快速连按
        
    def Interface(self):#界面
        self.setWindowTitle('贪吃蛇')#标题
        self.setFixedSize(425,325)#限制窗口大小
        self.grabKeyboard()#窗口接收键盘事件

        self.Floor=QHBoxLayout()

        self.Form1=QFrame()
        self.Form1.setFrameShape(QFrame.Panel|QFrame.Plain)
        self.Form1.setFixedSize(293,293)

        self.grid=QGridLayout()
        self.grid.setSpacing(1)
        self.Form1.setLayout(self.grid)

        self.Floor.addWidget(self.Form1)

        for row in range(25):
            for col in range(25):
                self.cell[(row,col)]=QLabel()
                self.cell[(row,col)].setStyleSheet('QLabel{background-color:white;border-width:1px;border-style:solid;border-color:LightSteelBlue;}')
                self.cell[(row,col)].setFixedSize(10,10)
                self.grid.addWidget(self.cell[(row,col)],row,col)

                self.cells.append((row,col))

        self.Form2=QFrame()
        self.Form2.setFrameShape(QFrame.Panel|QFrame.Plain)
        self.Form2.setFixedSize(100,293)

        self.box=QVBoxLayout()
        self.Form2.setLayout(self.box)

        self.Floor.addWidget(self.Form2)

        self.integral=QLCDNumber()
        self.integral.setFixedHeight(50)
        self.box.addWidget(self.integral)

        self.Speed=QLabel(str(int(100000/self.speed)/100)+'\n格/秒')
        self.Speed.setFont(QFont('宋体',24))
        self.box.addWidget(self.Speed)

        self.Button1=QPushButton('开始')
        self.Button1.setFixedHeight(50)
        self.Button1.setFont(QFont('宋体',25,75))
        self.Button1.setStyleSheet("QPushButton{color:white;background:LimeGreen;border-radius:20px;border:3px solid black;}")
        self.box.addWidget(self.Button1)

        self.Button2=QPushButton('重置')
        self.Button2.setFixedHeight(50)
        self.Button2.setFont(QFont('宋体',25,75))
        self.Button2.setStyleSheet("QPushButton{color:white;background:Orange;border-radius:20px;border:3px solid black;}")
        self.box.addWidget(self.Button2)
        
        self.setLayout(self.Floor)

    def StartSuspend(self):#开始或暂停游戏
        if self.startsuspend=='start':
            self.startsuspend='suspend'
            self.timer.stop()
            self.Button1.setText('继续')
            self.Button1.setStyleSheet("QPushButton{color:white;background:LimeGreen;border-radius:20px;border:3px solid black;}")
        else:
            self.startsuspend='start'
            self.speed=400-int((len(self.snake)-1)/25*10)
            self.timer.start(self.speed)
            self.Button1.setText('暂停')
            self.Button1.setStyleSheet("QPushButton{color:white;background:OrangeRed;border-radius:20px;border:3px solid black;}")

    def keyPressEvent(self,event):#响应键盘操作
        if event.key()==Qt.Key_Left:
            if self.direction!=(0,1) and self.lock==0:
                self.direction=(0,-1)
        if event.key()==Qt.Key_Right:
            if self.direction!=(0,-1) and self.lock==0:
                self.direction=(0,1)
        if event.key()==Qt.Key_Up:
            if self.direction!=(1,0) and self.lock==0:
                self.direction=(-1,0)
        if event.key()==Qt.Key_Down:
            if self.direction!=(-1,0) and self.lock==0:
                self.direction=(1,0)
        self.lock=1

    def Randomgeneration(self):#随机生成果子
        tempdict=self.cells.copy()
        for cell in self.snake:
            tempdict.remove(cell)
        self.fruit=random.choice(tempdict)

    def Refresh(self):#刷新界面
        self.cell[self.fruit].setStyleSheet('QLabel{background-color:red;border-width:1px;border-style:solid;border-color:LightSteelBlue;}')
        head=self.snake[0]
        head=(head[0]+self.direction[0],head[1]+self.direction[1])
        self.lock=0
        self.snake.insert(0,head)
        
        if head==self.fruit:#如果吃到果子,则再次随机产生新的果子
            self.Randomgeneration()
        else:#如果没有吃到果子,删除尾巴的像素点
            tail=self.snake.pop()
            self.cell[tail].setStyleSheet('QLabel{background-color:white;border-width:1px;border-style:solid;border-color:LightSteelBlue;}')
                
        
            
        temp=self.snake.copy()
        temp.remove(head)
        if head in temp:#咬到自己判负
            self.timer.stop()
            QMessageBox.warning(self,'信息','GAME OVER!',QMessageBox.Ok)
            self.Reset()
        elif (-1 in head) or (25 in head):#出边界判负
            self.timer.stop()
            QMessageBox.warning(self,'信息','GAME OVER!',QMessageBox.Ok)
            self.Reset()
        elif len(self.snake)==625:#占满屏幕获胜
            self.timer.stop()
            QMessageBox.warning(self,'信息','YOU WIN!',QMessageBox.Ok)
            self.Reset()
        else:#未分出结果时
            self.cell[head].setStyleSheet('QLabel{background-color:green;border-width:1px;border-style:solid;border-color:LightSteelBlue;}')
            self.integral.display(len(self.snake)-1)#显示分数
            
            if self.speed!=400-int((len(self.snake)-1)/25*10):#根据身长改变移动速度
                self.speed=400-int((len(self.snake)-1)/25*10)
                self.Speed.setText(str(int(100000/self.speed)/100)+'\n格/秒')
                self.timer.start(self.speed)

    def Reset(self):#重置游戏
        self.timer.stop()
        self.snake=[(12,12)]#蛇所占的像素点
        self.fruit=tuple()#果实的位置
        self.direction=(0,0)#方向键位置
        self.startsuspend='suspend'
        self.Button1.setText('开始')
        self.Button1.setStyleSheet("QPushButton{color:white;background:LimeGreen;border-radius:20px;border:3px solid black;}")
        self.speed=400#初始速度
        self.Speed.setText(str(int(100000/self.speed)/100)+'\n格/秒')
        self.lock=0#键盘锁,防止快速连按
        self.Randomgeneration()#随机产生果实
        for row in range(25):
            for col in range(25):
                self.cell[(row,col)].setStyleSheet('QLabel{background-color:white;border-width:1px;border-style:solid;border-color:LightSteelBlue;}')        
        
    def center(self):#窗口居中
        qr=self.frameGeometry()
        cp=QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def link(self):
        self.Button1.clicked.connect(self.StartSuspend)
        self.Button2.clicked.connect(self.Reset)
        self.timer.timeout.connect(self.Refresh)

    def closeEvent(self,event):
        self.timer.stop()#退出时结束计时器

if __name__=='__main__':
    ERROR_ALREADY_EXISTS=183 
    sz_mutex="test_mutex"
    hmutex=win32event.CreateMutex(None,pywintypes.FALSE,sz_mutex) 
    if win32api.GetLastError()==ERROR_ALREADY_EXISTS: 
        exit(0)
    else:
        app=QApplication(sys.argv)
        xianshi=APP()
        xianshi.show()
        sys.exit(app.exec_())


  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
回答: 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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值