【游戲開發(fā)】貪吃蛇展示+源代碼
還記得時代的貪吃蛇游戲吧,兩只可愛的小蛇為了吃豆豆的冒險經(jīng)歷,貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有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) #格子數(shù)量
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 #已吃蘋果數(shù)量
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() #創(chuàng)建游戲線程
self.setWindowTitle(''''''''Snake'''''''') #設(shè)置窗口標題
self.setFixedSize(SCREEN_WIDTH, SCREEN_HEIGHT) #設(shè)置窗口固定大小
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)
#游戲結(jié)束
if not self.running:
p.setPen(Qt.GlobalColor.red) #設(shè)置為紅色
p.setFont(QFont(''''''''微軟雅黑'''''''', 20)) #設(shè)置字體
p.drawText(0, 0, self.width(), self.height(), Qt.AlignCenter, ''''''''Game Over! (Score: %d)'''''''' % self.applesEaten)
return
#游戲網(wǎng)格線
for i in range(int(SCREEN_HEIGHT / UNIT_SIZE)) :
p.setPen(Qt.GlobalColor.white) #設(shè)置為白色
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)
#分數(shù)繪制
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 #隨機產(chǎn)生坐標X
self.appleY = random.randint(0, int(SCREEN_HEIGHT / UNIT_SIZE) - 1) * UNIT_SIZE #隨機產(chǎn)生坐標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:
"""
關(guān)閉線程
"""
self.gameThread.terminate()
if __name__ == ''''''''__main__'''''''':
app = QApplication(argv)
w = GameFrame()
w.show()
exit(app.exec_())
轉(zhuǎn)載聲明:本文來源于網(wǎng)絡(luò),不作任何商業(yè)用途

全部評論


暫無留言,趕緊搶占沙發(fā)
熱門資訊

【游戲開發(fā)】UE4渲染引擎模塊講解

教程 | 新手小白怎么畫獸人的畫法技巧

王座杯參賽者看過來,這有張終稿待確認~

王座杯獲獎采訪集合

《口袋奇兵》海外月流水居然超2億?

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

轉(zhuǎn)行做什么工作比較好?

王座杯比賽答疑,快來GET正確交稿姿勢!

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