前言
🚀 作者 :“程序员梨子”
🚀 **文章简介 **:本篇文章主要是写了pygame实现五子棋的小游戏!
🚀 **文章源码免费获取 : 为了感谢每一个关注我的小可爱💓每篇文章的项目源码都是无
偿分享滴💓👇👇👇👇
点这里蓝色这行字体自取,需要什么源码记得说标题名字哈!私信我也可!
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
正文
五子棋的白色棋子有112枚,黑子有113枚,而围棋白色棋子有180枚,黑色棋子181枚。
嘿嘿,我猜很多人都不清楚吧?!
今天小编带大家深入了解五子棋,做一款代码版本的五子棋小游戏给大家,不仅能对战电脑人机,
还能跟你的小伙伴儿一起联机对抗哦~

1)游戏界面

代码展示——
class gameStartUI(QWidget):def __init__(self, parent=None, **kwargs):super(gameStartUI, self).__init__(parent)self.setFixedSize(760, 650)self.setWindowTitle('五子棋游戏对战')self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))# 背景图片palette = QPalette()palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_start'))))self.setPalette(palette)# 按钮# --人机对战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)# --联机对战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)'''人机对战'''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()'''联机对战'''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)人机对战

代码展示——
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'''人机对战'''
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('五子棋人机对战')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)# 落子标志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# 实例化aiself.ai_player = aiGobang(self.ai_color, self.player_color)# 落子声音加载pygame.mixer.init()self.drop_sound = pygame.mixer.Sound(cfg.SOUNDS_PATHS.get('drop'))'''鼠标左键点击事件-玩家回合'''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# 保证只在棋盘范围内响应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# 实例化一个棋子并显示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()# 最后落子位置标志对落子位置进行跟随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# 切换回合方(其实就是改颜色)self.nextRound()'''鼠标左键释放操作-调用电脑回合'''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)# 实例化一个棋子并显示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()# 最后落子位置标志对落子位置进行跟随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# 切换回合方(其实就是改颜色)self.nextRound()'''改变落子方'''def nextRound(self):self.whoseround = self.player_color if self.whoseround == self.ai_color else self.ai_color'''显示游戏结束结果'''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()'''认输'''def givein(self):if self.is_gaming and (self.winner is None) and (self.whoseround == self.player_color):self.winner = self.ai_colorself.showGameEndInfo()'''悔棋-只有我方回合的时候可以悔棋'''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()'''开始游戏-之前的对弈必须已经结束才行'''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()'''关闭窗口事件'''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)联机对战

代码展示——
import sys
import random
from .server import *
from .client import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *'''联机对战'''
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('联机对战')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('作为服务器', 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()'''作为服务器'''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()
总结
安啦!文章就写到这里,你们的支持是我最大的动力,记得三连哦~
关注小编获取更多精彩内容!记得点击传送门哈👇👇👇👇👇👇
记得三连哦! 如需打包好的完整源码+素材免费分享滴!传送门

