admin管理员组文章数量:1621918
简单的贪吃蛇
学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_())
版权声明:本文标题:python pyQt5简单的贪吃蛇 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728850696a1176638.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论