【游戲開發】貪吃蛇展示+源代碼
還記得時代的貪吃蛇游戲吧,兩只可愛的小蛇為了吃豆豆的冒險經歷,貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機等多平臺版本。既簡單又耐玩。該游戲通過控制蛇頭方向吃蛋,從而使得蛇變得越來越長。
今天小編整理了貪吃蛇的源碼,大家可以試著去做一下,看看能不能做出來。
【Python/PySide2】貪吃蛇展示:
【Python/PySide2】貪吃蛇源代碼:
import random
from enum import Enum
from sys import argv
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class DIRECTION(Enum) :
"""
方向
"""
UP = 0
DOWN = 1
LEFT = 2
RIGHT = 3
#常量
SCREEN_WIDTH = 600 #屏幕寬度
SCREEN_HEIGHT = 600 #屏幕高度
UNIT_SIZE = 50 #格子邊長
GAME_UNITS = int((SCREEN_WIDTH * SCREEN_HEIGHT) / UNIT_SIZE) #格子數量
DELAY = 150 #延遲
class GameThread(QThread) :
"""
游戲線程
"""
def __init__(self) - >None:
super(GameThread, self).__init__(None)
def run(self) - >None:
"""
游戲運行
"""
while w.running:
w.Move() #蛇移動
w.checkApple() #檢查蛇頭是否吃到蘋果
w.checkCollisions() #檢查蛇頭是否撞到墻 / 蛇身
w.repaint() #重繪
app.processEvents() #處理事件
self.msleep(DELAY) #等待
class GameFrame(QWidget) :
"""
游戲窗口
"""
running = False #游戲是否正在運行
bodyParts = 6 #身體長度
applesEaten = 0 #已吃蘋果數量
appleX = 0 #蘋果X坐標
appleY = 0 #蘋果Y坐標
direction = DIRECTION.RIGHT #蛇運動方向 (默認為右)
x = [0
for i in range(GAME_UNITS)] #蛇身x坐標
y = [0
for i in range(GAME_UNITS)] #蛇身y坐標
def __init__(self) - >None:
super(GameFrame, self).__init__()
self.gameThread = GameThread() #創建游戲線程
self.setWindowTitle(''''''''Snake'''''''') #設置窗口標題
self.setFixedSize(SCREEN_WIDTH, SCREEN_HEIGHT) #設置窗口固定大小
self.startGame() #開始游戲
def startGame(self) - >None:
"""
開始游戲
"""
self.running = True
self.newApple() #新建蘋果
self.gameThread.start() #開始線程
def paintEvent(self, event: QPaintEvent) - >None:
"""
窗口繪制
"""
p = QPainter(self)
#背景繪制
p.fillRect(0, 0, self.width(), self.height(), Qt.GlobalColor.black)
#游戲結束
if not self.running:
p.setPen(Qt.GlobalColor.red) #設置為紅色
p.setFont(QFont(''''''''微軟雅黑'''''''', 20)) #設置字體
p.drawText(0, 0, self.width(), self.height(), Qt.AlignCenter, ''''''''Game Over! (Score: %d)'''''''' % self.applesEaten)
return
#游戲網格線
for i in range(int(SCREEN_HEIGHT / UNIT_SIZE)) :
p.setPen(Qt.GlobalColor.white) #設置為白色
p.drawLine(i * UNIT_SIZE, 0, i * UNIT_SIZE, SCREEN_HEIGHT) #豎線
p.drawLine(0, i * UNIT_SIZE, SCREEN_WIDTH, i * UNIT_SIZE) #橫線
#蘋果
brush = QBrush()
brush.setStyle(Qt.SolidPattern)
brush.setColor(Qt.GlobalColor.red)
p.setBrush(brush)
p.drawEllipse(self.appleX, self.appleY, UNIT_SIZE, UNIT_SIZE)
#蛇
brush.setColor(Qt.GlobalColor.green)
p.setBrush(brush)
for i in range(0, self.bodyParts) :
p.drawRect(self.x[i], self.y[i], UNIT_SIZE, UNIT_SIZE)
brush.setColor(QColor(45, 180, 0))
p.setBrush(brush)
#分數繪制
p.setPen(Qt.GlobalColor.red)
p.setFont(QFont(''''''''微軟雅黑'''''''', 20))
p.drawText(0, 0, self.width(), self.height(), Qt.AlignHCenter, ''''''''Score: %d'''''''' % self.applesEaten)
def newApple(self) - >None:
"""
新建蘋果
"""
self.appleX = random.randint(0, int(SCREEN_WIDTH / UNIT_SIZE) - 1) * UNIT_SIZE #隨機產生坐標X
self.appleY = random.randint(0, int(SCREEN_HEIGHT / UNIT_SIZE) - 1) * UNIT_SIZE #隨機產生坐標Y
def Move(self) - >None:
"""
蛇移動
"""
for i in range(self.bodyParts, 0, -1) :
self.x[i] = self.x[i - 1]
self.y[i] = self.y[i - 1]
if self.direction == DIRECTION.UP:
self.y[0] -= UNIT_SIZE
elif self.direction == DIRECTION.DOWN:
self.y[0] = UNIT_SIZE
elif self.direction == DIRECTION.LEFT:
self.x[0] -= UNIT_SIZE
elif self.direction == DIRECTION.RIGHT:
self.x[0] = UNIT_SIZE
def checkApple(self) - >None:
"""
檢查蛇頭是否吃到蘋果
"""
if self.x[0] == self.appleX and self.y[0] == self.appleY:
self.bodyParts = 1
self.applesEaten = 1
self.newApple()
def checkCollisions(self) - >None:
"""
檢查蛇頭是否撞到墻/蛇身
"""
for i in range(self.bodyParts, 0, -1) :
if self.x[0] == self.x[i] and self.y[0] == self.y[i] :
self.running = False
return
if self.x[0] < 0 or self.x[0] > SCREEN_WIDTH or self.y[0] < 0 or self.y[0] > SCREEN_HEIGHT:
self.running = False
def keyPressEvent(self, event: QKeyEvent) - >None:
"""
捕獲鍵盤輸入
"""
if event.key() == Qt.Key_Up:
if self.direction != DIRECTION.DOWN:
self.direction = DIRECTION.UP
elif event.key() == Qt.Key_Down:
if self.direction != DIRECTION.UP:
self.direction = DIRECTION.DOWN
elif event.key() == Qt.Key_Left:
if self.direction != DIRECTION.RIGHT:
self.direction = DIRECTION.LEFT
elif event.key() == Qt.Key_Right:
if self.direction != DIRECTION.LEFT:
self.direction = DIRECTION.RIGHT
def closeEvent(self, event: QCloseEvent) - >None:
"""
關閉線程
"""
self.gameThread.terminate()
if __name__ == ''''''''__main__'''''''':
app = QApplication(argv)
w = GameFrame()
w.show()
exit(app.exec_())
轉載聲明:本文來源于網絡,不作任何商業用途

全部評論


暫無留言,趕緊搶占沙發
熱門資訊

繪學霸規則玩法大全

韓國畫師“pilyeon”的這組線稿,都把我看哭了!...

適合30歲女人的職業有哪些?

韓國藝術家 coco kim 的游戲角色設定參考

米哈游:新作《崩壞:星穹鐵道》,預計登錄移動和PC市場...

《星際戰甲》全新大版本4月1日上線,開啟8周年活動...

王氏教育王康慧受邀于《教育正能量》欄目解答什么是社會需要的人才?...

盤點UE4.27 的主要新功能,你都知道嗎?

適合初中女生讀的技校專業有哪些?
