【Pygame小游戏】来了来了它来了——这款五子棋小游戏超A的,分享给你的小伙伴儿一起pk吧~
生活随笔
收集整理的這篇文章主要介紹了
【Pygame小游戏】来了来了它来了——这款五子棋小游戏超A的,分享给你的小伙伴儿一起pk吧~
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
🚀 作者 :“程序員梨子”
🚀 **文章簡介 **:本篇文章主要是寫了pygame實(shí)現(xiàn)五子棋的小游戲!
🚀 **文章源碼免費(fèi)獲取 : 為了感謝每一個(gè)關(guān)注我的小可愛💓每篇文章的項(xiàng)目源碼都是無
償分享滴💓👇👇👇👇
點(diǎn)這里藍(lán)色這行字體自取,需要什么源碼記得說標(biāo)題名字哈!私信我也可!
🚀 歡迎小伙伴們 點(diǎn)贊👍、收藏?、留言💬
正文
五子棋的白色棋子有112枚,黑子有113枚,而圍棋白色棋子有180枚,黑色棋子181枚。
嘿嘿,我猜很多人都不清楚吧?!
今天小編帶大家深入了解五子棋,做一款代碼版本的五子棋小游戲給大家,不僅能對戰(zhàn)電腦人機(jī),
還能跟你的小伙伴兒一起聯(lián)機(jī)對抗哦~
?1)游戲界面
?代碼展示——
class gameStartUI(QWidget):def __init__(self, parent=None, **kwargs):super(gameStartUI, self).__init__(parent)self.setFixedSize(760, 650)self.setWindowTitle('五子棋游戲?qū)?zhàn)')self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))# 背景圖片palette = QPalette()palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_start'))))self.setPalette(palette)# 按鈕# --人機(jī)對戰(zhàn)self.ai_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('ai'), self)self.ai_button.move(250, 200)self.ai_button.show()self.ai_button.click_signal.connect(self.playWithAI)# --聯(lián)機(jī)對戰(zhàn)self.online_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('online'), self)self.online_button.move(250, 350)self.online_button.show()self.online_button.click_signal.connect(self.playOnline)'''人機(jī)對戰(zhàn)'''def playWithAI(self):self.close()self.gaming_ui = playWithAIUI(cfg)self.gaming_ui.exit_signal.connect(lambda: sys.exit())self.gaming_ui.back_signal.connect(self.show)self.gaming_ui.show()'''聯(lián)機(jī)對戰(zhàn)'''def playOnline(self):self.close()self.gaming_ui = playOnlineUI(cfg, self)self.gaming_ui.show()'''run''' if __name__ == '__main__':app = QApplication(sys.argv)handle = gameStartUI()font = QFont()font.setPointSize(12)handle.setFont(font)handle.show()sys.exit(app.exec_())2)人機(jī)對戰(zhàn)
?
代碼展示——
import pygame from ..misc import * from PyQt5 import QtCore from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from itertools import product from .aiGobang import aiGobang'''人機(jī)對戰(zhàn)''' class playWithAIUI(QWidget):back_signal = pyqtSignal()exit_signal = pyqtSignal()send_back_signal = Falsedef __init__(self, cfg, parent=None, **kwargs):super(playWithAIUI, self).__init__(parent)self.cfg = cfgself.setFixedSize(760, 650)self.setWindowTitle('五子棋人機(jī)對戰(zhàn)')self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))# 背景圖片palette = QPalette()palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_game'))))self.setPalette(palette)# 按鈕self.home_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('home'), self)self.home_button.click_signal.connect(self.goHome)self.home_button.move(680, 10)self.startgame_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('startgame'), self)self.startgame_button.click_signal.connect(self.startgame)self.startgame_button.move(640, 240)self.regret_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('regret'), self)self.regret_button.click_signal.connect(self.regret)self.regret_button.move(640, 310)self.givein_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('givein'), self)self.givein_button.click_signal.connect(self.givein)self.givein_button.move(640, 380)# 落子標(biāo)志self.chessman_sign = QLabel(self)sign = QPixmap(cfg.CHESSMAN_IMAGEPATHS.get('sign'))self.chessman_sign.setPixmap(sign)self.chessman_sign.setFixedSize(sign.size())self.chessman_sign.show()self.chessman_sign.hide()# 棋盤(19*19矩陣)self.chessboard = [[None for i in range(19)] for _ in range(19)]# 歷史記錄(悔棋用)self.history_record = []# 是否在游戲中self.is_gaming = True# 勝利方self.winner = Noneself.winner_info_label = None# 顏色分配and目前輪到誰落子self.player_color = 'white'self.ai_color = 'black'self.whoseround = self.player_color# 實(shí)例化aiself.ai_player = aiGobang(self.ai_color, self.player_color)# 落子聲音加載pygame.mixer.init()self.drop_sound = pygame.mixer.Sound(cfg.SOUNDS_PATHS.get('drop'))'''鼠標(biāo)左鍵點(diǎn)擊事件-玩家回合'''def mousePressEvent(self, event):if (event.buttons() != QtCore.Qt.LeftButton) or (self.winner is not None) or (self.whoseround != self.player_color) or (not self.is_gaming):return# 保證只在棋盤范圍內(nèi)響應(yīng)if event.x() >= 50 and event.x() <= 50 + 30 * 18 + 14 and event.y() >= 50 and event.y() <= 50 + 30 * 18 + 14:pos = Pixel2Chesspos(event)# 保證落子的地方本來沒有人落子if self.chessboard[pos[0]][pos[1]]:return# 實(shí)例化一個(gè)棋子并顯示c = Chessman(self.cfg.CHESSMAN_IMAGEPATHS.get(self.whoseround), self)c.move(event.pos())c.show()self.chessboard[pos[0]][pos[1]] = c# 落子聲音響起self.drop_sound.play()# 最后落子位置標(biāo)志對落子位置進(jìn)行跟隨self.chessman_sign.show()self.chessman_sign.move(c.pos())self.chessman_sign.raise_()# 記錄這次落子self.history_record.append([*pos, self.whoseround])# 是否勝利了self.winner = checkWin(self.chessboard)if self.winner:self.showGameEndInfo()return# 切換回合方(其實(shí)就是改顏色)self.nextRound()'''鼠標(biāo)左鍵釋放操作-調(diào)用電腦回合'''def mouseReleaseEvent(self, event):if (self.winner is not None) or (self.whoseround != self.ai_color) or (not self.is_gaming):returnself.aiAct()'''電腦自動下-AI回合'''def aiAct(self):if (self.winner is not None) or (self.whoseround == self.player_color) or (not self.is_gaming):returnnext_pos = self.ai_player.act(self.history_record)# 實(shí)例化一個(gè)棋子并顯示c = Chessman(self.cfg.CHESSMAN_IMAGEPATHS.get(self.whoseround), self)c.move(QPoint(*Chesspos2Pixel(next_pos)))c.show()self.chessboard[next_pos[0]][next_pos[1]] = c# 落子聲音響起self.drop_sound.play()# 最后落子位置標(biāo)志對落子位置進(jìn)行跟隨self.chessman_sign.show()self.chessman_sign.move(c.pos())self.chessman_sign.raise_()# 記錄這次落子self.history_record.append([*next_pos, self.whoseround])# 是否勝利了self.winner = checkWin(self.chessboard)if self.winner:self.showGameEndInfo()return# 切換回合方(其實(shí)就是改顏色)self.nextRound()'''改變落子方'''def nextRound(self):self.whoseround = self.player_color if self.whoseround == self.ai_color else self.ai_color'''顯示游戲結(jié)束結(jié)果'''def showGameEndInfo(self):self.is_gaming = Falseinfo_img = QPixmap(self.cfg.WIN_IMAGEPATHS.get(self.winner))self.winner_info_label = QLabel(self)self.winner_info_label.setPixmap(info_img)self.winner_info_label.resize(info_img.size())self.winner_info_label.move(50, 50)self.winner_info_label.show()'''認(rèn)輸'''def givein(self):if self.is_gaming and (self.winner is None) and (self.whoseround == self.player_color):self.winner = self.ai_colorself.showGameEndInfo()'''悔棋-只有我方回合的時(shí)候可以悔棋'''def regret(self):if (self.winner is not None) or (len(self.history_record) == 0) or (not self.is_gaming) and (self.whoseround != self.player_color):returnfor _ in range(2):pre_round = self.history_record.pop(-1)self.chessboard[pre_round[0]][pre_round[1]].close()self.chessboard[pre_round[0]][pre_round[1]] = Noneself.chessman_sign.hide()'''開始游戲-之前的對弈必須已經(jīng)結(jié)束才行'''def startgame(self):if self.is_gaming:returnself.is_gaming = Trueself.whoseround = self.player_colorfor i, j in product(range(19), range(19)):if self.chessboard[i][j]:self.chessboard[i][j].close()self.chessboard[i][j] = Noneself.winner = Noneself.winner_info_label.close()self.winner_info_label = Noneself.history_record.clear()self.chessman_sign.hide()'''關(guān)閉窗口事件'''def closeEvent(self, event):if not self.send_back_signal:self.exit_signal.emit()'''返回游戲主頁面'''def goHome(self):self.send_back_signal = Trueself.close()self.back_signal.emit()3)聯(lián)機(jī)對戰(zhàn)
?
代碼展示——
import sys import random from .server import * from .client import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import *'''聯(lián)機(jī)對戰(zhàn)''' class playOnlineUI(QWidget):def __init__(self, cfg, home_ui, parent=None, **kwargs):super(playOnlineUI, self).__init__(parent)self.cfg = cfgself.home_ui = home_uiself.setWindowTitle('聯(lián)機(jī)對戰(zhàn)')self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))self.setFixedSize(300, 200)# 昵稱self.nickname = random.choice(['杰尼龜', '皮卡丘', '小火龍', '小鋸鱷', '妙蛙種子', '菊草葉'])self.layout0 = QHBoxLayout()self.nickname_label = QLabel('游戲昵稱:', self)self.nickname_edit = QLineEdit(self)self.nickname_edit.setText(self.nickname)self.layout0.addWidget(self.nickname_label, 1)self.layout0.addWidget(self.nickname_edit, 3)# IPself.target_ip = '127.0.0.1'self.layout1 = QHBoxLayout()self.ip_label = QLabel('對方IP:', self)self.ip_edit = QLineEdit(self)self.ip_edit.setText(self.target_ip)self.layout1.addWidget(self.ip_label, 1)self.layout1.addWidget(self.ip_edit, 3)# 按鈕self.layout2 = QHBoxLayout()self.connect_button = QPushButton('作為客戶端', self)self.connect_button.clicked.connect(self.becomeClient)self.ashost_button = QPushButton('作為服務(wù)器', self)self.ashost_button.clicked.connect(self.becomeHost)self.layout2.addWidget(self.connect_button)self.layout2.addWidget(self.ashost_button)# 布局self.layout = QVBoxLayout()self.layout.addLayout(self.layout0)self.layout.addLayout(self.layout1)self.layout.addLayout(self.layout2)self.setLayout(self.layout)'''作為客戶端'''def becomeClient(self):self.close()self.nickname = self.nickname_edit.text()self.target_ip = self.ip_edit.text()self.client_ui = gobangClient(cfg=self.cfg, nickname=self.nickname, server_ip=self.target_ip)self.client_ui.exit_signal.connect(lambda: sys.exit())self.client_ui.back_signal.connect(self.home_ui.show)self.client_ui.show()'''作為服務(wù)器'''def becomeHost(self):self.close()self.nickname = self.nickname_edit.text()self.server_ui = gobangSever(cfg=self.cfg, nickname=self.nickname)self.server_ui.exit_signal.connect(lambda: sys.exit())self.server_ui.back_signal.connect(self.home_ui.show)self.server_ui.show()總結(jié)
安啦!文章就寫到這里,你們的支持是我最大的動力,記得三連哦~
關(guān)注小編獲取更多精彩內(nèi)容!記得點(diǎn)擊傳送門哈👇👇👇👇👇👇
記得三連哦! 如需打包好的完整源碼+素材免費(fèi)分享滴!傳送門
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【Pygame小游戏】来了来了它来了——这款五子棋小游戏超A的,分享给你的小伙伴儿一起pk吧~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pygame小游戏】这款经典的炸弹人超
- 下一篇: 【Pygame小游戏】别找了,休闲游戏专