Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?

导语

??今日游戏更新,大家好,我是木木子,每天都给大家更新最好玩的游戏!关注我,从此你再也不用去努力找游戏了!

最热门最好玩的Python游戏点击即玩!

今天推荐的游戏是五子棋小游戏——人机对战、联机对战皆可!

你是否还记得?中学时代和同桌下过的五子棋?

?这样下棋只怕是会被打!?!!!我怀疑他开挂了,并且找到了证据。

??

正文

首先准备好需要的图片等素材部分如下:

?

?好了!直接上代码吧——设置游戏开始界面:

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_())

效果如下:

?

?一个是五子棋规则设置的人机对战:

import pygamefrom ..misc import *from PyQt5 import QtCorefrom PyQt5.QtGui import *from PyQt5.QtCore import *from PyQt5.QtWidgets import *from itertools import productfrom .aiGobang import aiGobang'''人机对战'''class playWithAIUI(QWidget):    back_signal = pyqtSignal()    exit_signal = pyqtSignal()    send_back_signal = False    def __init__(self, cfg, parent=None, **kwargs):        super(playWithAIUI, self).__init__(parent)        self.cfg = cfg        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_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 = None        self.winner_info_label = None        # 颜色分配and目前轮到谁落子        self.player_color = 'white'        self.ai_color = 'black'        self.whoseround = self.player_color        # 实例化ai        self.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):            return        self.aiAct()    '''电脑自动下-AI回合'''    def aiAct(self):        if (self.winner is not None) or (self.whoseround == self.player_color) or (not self.is_gaming):            return        next_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 = False        info_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_color            self.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):            return        for _ 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]] = None        self.chessman_sign.hide()    '''开始游戏-之前的对弈必须已经结束才行'''    def startgame(self):        if self.is_gaming:            return        self.is_gaming = True        self.whoseround = self.player_color        for i, j in product(range(19), range(19)):            if self.chessboard[i][j]:                self.chessboard[i][j].close()                self.chessboard[i][j] = None        self.winner = None        self.winner_info_label.close()        self.winner_info_label = None        self.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 = True        self.close()        self.back_signal.emit()

如下:害!我这下了很久呢,有几次都没下赢人机!2333游戏废材

?另一个定义联机对战:

import sysimport randomfrom .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 = cfg        self.home_ui = home_ui        self.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)        # IP        self.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)        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年8月11日
下一篇 2021年8月11日

相关推荐