软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)
生活随笔
收集整理的這篇文章主要介紹了
软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
軟件實習項目2——貪吃喵(貓吃魚版貪吃蛇)(代碼實現)
- 類變量的定義以及類的初始化__init__
- 一、游戲的邏輯
- 1、貓頭的生成
- 2、魚的生成
- 3、貓頭和魚骨的移動
- 4、按下鍵盤,改變方向
- 二、主窗口的繪制
- 三、游戲開始與結束界面,以及主窗口的按鈕
- 1、開始游戲
- 2、游戲速度設置
- 3、貓咪選項設置
- 4、結束游戲
- 5、窗口中的按鈕:暫停/開始、重來/退出
- 四、游戲背景音樂
類變量的定義以及類的初始化__init__
class CatWindow(QWidget):row = 0 # 行數column = 0 # 列數direction = 0 # 貓頭方向head_row = 0 # 貓頭的行head_column = 0 # 貓頭的列head_position = '' # 貓頭位置coordinate = [] # 貓頭和魚骨的位置列表fish_row = 0 # 魚的行fish_column = 0 # 魚的列fish_position = '' # 魚的位置score = 0 # 計分# 速度默認值為500speed = 500# 貓咪類型默認值是英短藍白head_pic = 'head.png'dead_pic = 'dead.png'# 設置幾個字體font1 = QtGui.QFont("Calibri", 20)font2 = QtGui.QFont("Calibri", 15)font3 = QtGui.QFont("Calibri", 13)font4 = QtGui.QFont("幼圓", 20)font5 = QtGui.QFont("幼圓", 13)# 所有按鈕都按照這個樣式buttons_style = "QPushButton{background-color: rgb(255, 255, 255); border-radius:10px}" \"QPushButton:hover{Background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 #cdced1, stop:1 #f6f7fa);}" \"QPushButton:pressed{Background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 #f6f7fa, stop:1 #cdced1);}"# 初始化def __init__(self):QWidget.__init__(self)self.setWindowTitle('貪吃喵') # 窗口標題self.setStyleSheet('background-color:#deebf7') # 游戲背景顏色self.setWindowIcon(QIcon('head.png')) # 設置窗口圖標ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid") # 任務欄圖標self.resize(850, 850) # 游戲窗口大小self.row = 12 # 行數self.column = 12 # 列數pygame.mixer.init() # 初始化背景音樂self.GameStart()self.windowButton()self.timer = QTimer() # 計時器self.timer.start(self.speed) # 開始計時self.timer.timeout.connect(self.moveCat) # 超時即調用moveCat方法一、游戲的邏輯
1、貓頭的生成
# 隨機生成貓頭位置def head(self):self.backgroundMuisc()self.score = 0 # 分數清零self.coordinate.clear() # 坐標清空self.head_row = random.randint(2, self.row - 2) # 隨機選取貓頭的行self.head_column = random.randint(1, self.column - 2) # 隨機選取貓頭的列self.coordinate = [str(self.head_row) + "," + str(self.head_column)] # 把貓頭位置寫入坐標列表中self.fish() # 調用生成魚的函數self.direction = random.randrange(0, 4) # 隨機選擇方向self.update()2、魚的生成
# 生成魚的位置def fish(self):while True:self.fish_row = random.randint(1, self.row - 1) # 隨機選取魚的行self.fish_column = random.randint(0, self.column - 1) # 隨機選取魚的列self.fish_position = str(self.fish_row) + "," + str(self.fish_column)# 若隨機生成的魚的位置不在貓頭和魚骨的坐標列表中,則返回魚的位置,否則重新生成if self.fish_position not in self.coordinate:return self.fish_position # 返回魚的位置3、貓頭和魚骨的移動
# QTimer的timeout觸發的方法def moveCat(self):if self.direction == 0:self.head_row -= 1 # 貓頭的行數-1elif self.direction == 1:self.head_row += 1 # 貓頭的行數+1elif self.direction == 2:self.head_column -= 1 # 貓頭的列數-1elif self.direction == 3:self.head_column += 1 # 貓頭的列數+1# 貓頭位置self.head_position = str(self.head_row) + "," + str(self.head_column)# 1、若吃到魚了if self.head_position == self.fish_position:self.coordinate.insert(0, self.head_position) # 魚骨位置不變,在列表最前面插入貓頭位置self.score += 10 # 每吃到一條魚就加10分self.fish() # 生成魚# 2、若沒吃到魚else:# 若貓頭和魚骨沒有相撞且貓頭沒有出界if 1 <= self.head_row < self.row and 0 <= self.head_column < self.column and self.head_position not in self.coordinate[1:]:# 1)移動所有魚骨for i in range(len(self.coordinate) - 1, 0, -1): # range函數的參數(start, stop, step)self.coordinate[i] = self.coordinate[i - 1] # 所有坐標等于它的前一個坐標(往前一個移動)# 2)更新貓頭位置self.coordinate[0] = self.head_position# 若貓頭和魚骨相撞或貓頭出界,則游戲結束else:self.GameOver(True)returnself.update()4、按下鍵盤,改變方向
# 按下鍵盤,改變方向def keyPressEvent(self, event):QWidget.keyPressEvent(self, event)key = event.key()# 1、按了↑if key == Qt.Key_W:self.direction = 0# 2、按了↓elif key == Qt.Key_S:self.direction = 1# 3、按了←elif key == Qt.Key_A:self.direction = 2# 4、按了→elif key == Qt.Key_D:self.direction = 3二、主窗口的繪制
# 繪制主窗口中的所有物體def paintEvent(self, event):QWidget.paintEvent(self, event)painter = QPainter(self)row_space = self.height() / self.row # 行間距column_space = self.width() / self.column # 列間距# 顯示背景圖片painter.drawImage(QRectF(0, 0, self.width(), self.height()), QImage('bg.jpg'))# 繪制行線和列線pen = QPen(QColor(255, 255, 255), 1, Qt.DotLine) # 畫筆顏色、粗細、線型painter.setPen(pen)for n in range(self.row + 1):painter.drawLine(QPointF(0, row_space * n), QPointF(self.width(), row_space * n))for n in range(self.column + 1):painter.drawLine(QPointF(column_space * n, column_space), QPointF(column_space * n, self.height()))# 顯示分數text_painter = QPainter(self)text_pen = QPen(QColor(0, 0, 0)) # 畫筆顏色、粗細、線型text_painter.setPen(text_pen)text_painter.setFont(self.font1)text_painter.drawText(350, 50, 'Score: ' + str(self.score))# 畫貓頭、魚骨、魚index = 0 # 記錄coordinate的索引,為0時畫貓頭,大于0時畫魚骨for n in self.coordinate:row = int(n[:n.find(',')])column = int(n[n.find(',') + 1:])# 若貓頭沒出界且沒有與魚骨相撞,畫貓頭和魚骨if 1 <= self.head_row < self.row and 0 <= self.head_column < self.column and self.head_position not in self.coordinate[1:]:# 貓頭if index == 0:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage(self.head_pic))# 畫魚骨else:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage('bone.png'))index += 1# 若貓頭出界了或與魚骨相撞,畫死亡貓頭和魚骨else:# 貓頭if index == 0:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage(self.dead_pic))# 畫魚骨else:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage('bone.png'))index += 1# 畫魚painter.drawImage(QRectF(self.fish_column * column_space, self.fish_row * row_space, column_space, row_space),QImage('fish.png'))三、游戲開始與結束界面,以及主窗口的按鈕
1、開始游戲
# 開始游戲def GameStart(self):# 消息框的大小和樣式message_box = QMessageBox()message_box.setStyleSheet('width: 500; height: 70')message_box.setWindowTitle('WELCOME')message_box.setFont(self.font4)message_box.setText("歡迎來到貪吃喵🐱")message_box.setWindowIcon(QIcon('head.png')) # 設置消息框圖標message_box.setStyleSheet('background-color:#deebf7')# click to start按鈕message_box.setStandardButtons(QMessageBox.Yes)yes = message_box.button(QMessageBox.Yes)yes.setText("Click to Start")yes.setFont(self.font2)yes.setStyleSheet(self.buttons_style)# 下拉框速度選項items = ['Speed:', 'Low', 'Middle', 'High']cb = QComboBox(message_box)cb.addItems(items) # 添加下拉框選項cb.setGeometry(400, 5, 120, 40)cb.setFont(self.font3)cb.setStyleSheet('background-color: rgb(255, 255, 255); border-radius:10px')cb.currentIndexChanged.connect(self.speedChanging) # 下拉框選項改變即觸發self.speedChanging(cb.currentIndex()) # 將下拉框此時的選項索引傳遞給speedChanging函數# 下拉框貓咪選項items = ['喵喵:', '英短藍白', '銀漸層', '橘貓', '奶牛貓', '三花貓']cb1 = QComboBox(message_box)cb1.addItems(items) # 添加下拉框選項cb1.setGeometry(400, 50, 120, 40)cb1.setFont(self.font5)cb1.setStyleSheet('background-color: rgb(255, 255, 255); border-radius:10px')cb1.currentIndexChanged.connect(self.catChoosing) # 下拉框選項改變即觸發self.catChoosing(cb1.currentIndex()) # 將下拉框此時的選項索引傳遞給speedChanging函數# 退出游戲開始消息框,進入游戲主界面message_box.exec()self.show()self.backgroundMuisc() # 調出背景音樂self.head()2、游戲速度設置
# GameStart方法中下拉框選項改變時調用的槽函數,用來設置速度def speedChanging(self, index):if index == 1:self.speed = 500elif index == 2:self.speed = 300elif index == 3:self.speed = 2003、貓咪選項設置
# GameStart方法中貓咪下拉框選項改變時調用的槽函數,用來選擇自己喜歡的貓咪def catChoosing(self, index):if index == 1:self.head_pic = 'head.png'self.dead_pic = 'dead.png'elif index == 2:self.head_pic = 'head1.png'self.dead_pic = 'dead1.png'elif index == 3:self.head_pic = 'head2.png'self.dead_pic = 'dead2.png'elif index == 4:self.head_pic = 'head3.png'self.dead_pic = 'dead3.png'elif index == 5:self.head_pic = 'head4.png'self.dead_pic = 'dead4.png'4、結束游戲
# 結束游戲def GameOver(self, gameover):pygame.mixer.music.stop()message_box = QMessageBox()message_box.setStyleSheet('width: 300; height: 70')message_box.setWindowTitle('END')message_box.setFont(self.font1)message_box.setWindowIcon(QIcon('head.png')) # 設置消息框圖標message_box.setWindowOpacity(0.75) # 透明度if gameover:message_box.setText("Game Over! Your Score: " + str(self.score))else:message_box.setText("YOU WIN! Your Score: " + str(self.score))# 設置游戲結束消息框的兩個按鈕message_box.setStandardButtons(QMessageBox.Retry | QMessageBox.Abort)retry = message_box.button(QMessageBox.Retry)retry.setText("Retry")retry.setFont(self.font2)retry.setStyleSheet(self.buttons_style)abort = message_box.button(QMessageBox.Abort)abort.setText("Exit")abort.setFont(self.font2)abort.setStyleSheet(self.buttons_style)abort.clicked.connect(QCoreApplication.instance().quit) # 點擊此按鈕則退出程序message_box.exec()self.head()5、窗口中的按鈕:暫停/開始、重來/退出
# 窗口中的按鈕:暫停/開始、重來/退出def windowButton(self):# 暫停pause = QPushButton(self)pause.setGeometry(10, 10, 100, 50)pause.setText('Pause')pause.setFont(self.font3)pause.setStyleSheet(self.buttons_style)pause.show()pause.clicked.connect(self.windowPause) # 點擊暫停按鈕則觸發windowPause方法# 繼續start = QPushButton(self)start.setGeometry(120, 10, 120, 50)start.setText('Continue')start.setFont(self.font3)start.setStyleSheet(self.buttons_style)start.show()start.clicked.connect(self.windowContinue) # 點擊繼續按鈕則觸發windowContinue方法# 退出exit_button = QPushButton(self)exit_button.setGeometry(740, 10, 100, 50)exit_button.setText('Exit')exit_button.setFont(self.font3)exit_button.setStyleSheet(self.buttons_style)exit_button.show()exit_button.clicked.connect(QCoreApplication.instance().quit) # 點擊退出按鈕則退出程序# 重新開始restart_button = QPushButton(self)restart_button.setGeometry(630, 10, 100, 50)restart_button.setText('Restart')restart_button.setFont(self.font3)restart_button.setStyleSheet(self.buttons_style)restart_button.show()restart_button.clicked.connect(self.head) # 點擊重新開始則重新生成貓頭,游戲重新開始# 按下暫停按鈕后調用的方法def windowPause(self):self.timer.stop() # 計時器暫停計時pygame.mixer.music.pause() # 暫停播放音樂self.update()# 按下繼續按鈕后調用的方法def windowContinue(self):self.timer.start() # 計時器重新開始計時pygame.mixer.music.unpause()self.update()四、游戲背景音樂
# 背景音樂def backgroundMuisc(self):pygame.mixer.music.load("bgmusic.mp3")pygame.mixer.music.set_volume(0.3) # 設置音量pygame.mixer.music.play(-1) # 循環播放——2020/12/16(殷越)
總結
以上是生活随笔為你收集整理的软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么apt-get update 要与
- 下一篇: 【中科院】分子生物学-朱玉贤第四版-笔记