【Python开发实践】AI人机对战五子棋——按钮功能的实现

在五子棋对战中,有以下按钮需要实现:

选择白棋:pick white

选择黑棋:pcik black

投降:surrender

下面是具体的实现:

按钮方法的父类

class Button:
    def __int__(self,screen,text,x,y,color,enable):
        self.screen=screen
        self.width=button_w
        self.height=button_h
        self.button_color=color
        self.text_color=(255,255,255)
        self.enable=enable
        self.font=pygame.font.SysFont(None,button_h*2//3)
        self.rect=pygame.Rect(0,0,self.width,self.height)
        self.rect.topleft=(x,y)
        self.text=text
        self.init_msg()
    #重写pygame函数,初始化按钮
    def init_msg(self):
        if self.enable:
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[0])
        else:
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[1])
        self.msg_iamge_rect=self.msg_iamge.get_rect()
        self.msg_iamge_rect.center=self.rect.center
    #根据按钮的enable状态填色,具体颜色在后续子类控制
    def draw(self):
        if self.enable:
            self.screen.fill(self.button_color[0],self.rect)
        else:
            self.screen.fill(self.button_color[1],self.rect)
        self.screen.blit(self.msg_iamge,self.msg_iamge_rect)

实现选择白棋的功能

class WhiteStartButton(Button):             #开始按钮(选择白棋)
    def __int__(self,screen,text,x,y):
        super().__int__(screen,text,x,y,[(26,173,25),(158,217,157)],True)
    def click(self,game):                   #点击,pygame内置方法
        if self.enable:
            game.start()
            game.winner=None
            game.multiple=False
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[1])
            self.enable=False
            return True
        return False
    def unclick(self):
        if not self.enable:
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[0])
            self.enable=True

实现选择黑棋的功能

class BlackStartButton(Button):             #开始按钮(选择黑棋)
    def __int__(self,screen,text,x,y):
        super().__int__(screen,text,x,y,[(26,173,25),(158,217,157)],True)
    def click(self,game):                   #点击,pygame内置方法
        if self.enable:
            game.start()
            game.winner=None
            game.multiple=False
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[1])
            self.enable=False
            return True
        return False
    def unclick(self):
        if not self.enable:
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[0])
            self.enable=True

实现投降的功能

class GiveupButton(Button):
    def __int__(self,screen,text,x,y):
        super().__int__(screen,text,x,y,[(230,67,64),(236,139,137)],False)
    def click(self,game):
        if self.enable:
            game.is_play=False
            if game.winner is None:
                game.winner=game.map.intoNextTurn(game.player)
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[1])
            self.enable=False
            return True
        return False
    def unclick(self):
        if not self.enable:
            self.msg_iamge=self.font.render(self.text,True,self.text_color,self.button_color[0])
            self.enable=True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简易的人机对战五子棋代码: ```python import random # 初始化棋盘 board = [['+' for i in range(15)] for j in range(15)] # 显示棋盘 def display_board(board): for i in range(len(board)): for j in range(len(board[i])): print(board[i][j], end=' ') print() # 判断胜负 def is_win(board, row, col, char): # 判断横向是否连续五个 for i in range(max(0, col - 4), min(11, col + 1)): if board[row][i:i+5] == [char]*5: return True # 判断竖向是否连续五个 for i in range(max(0, row - 4), min(11, row + 1)): if [board[j][col] for j in range(i, i+5)] == [char]*5: return True # 判断正斜向是否连续五个 for i in range(max(row - 4, 0), min(row + 1, 11)): for j in range(max(col - 4, 0), min(col + 1, 11)): if [board[i+k][j+k] for k in range(5)] == [char]*5: return True # 判断反斜向是否连续五个 for i in range(max(row - 4, 0), min(row + 1, 11)): for j in range(max(col - 4, 0), min(col + 1, 11)): if [board[i+4-k][j+k] for k in range(5)] == [char]*5: return True return False # 玩家下棋 def player_move(board): while True: row, col = map(int, input('请输入落子坐标(行 列,用空格隔开):').split()) if board[row][col] != '+': print('该位置已有棋子,请重新输入!') else: board[row][col] = 'o' break return row, col # AI下棋 def ai_move(board): while True: row, col = random.randint(0, 14), random.randint(0, 14) if board[row][col] == '+': board[row][col] = 'x' break return row, col # 主函数 def main(): display_board(board) while True: row, col = player_move(board) if is_win(board, row, col, 'o'): display_board(board) print('恭喜你,你赢了!') break row, col = ai_move(board) display_board(board) if is_win(board, row, col, 'x'): print('很遗憾,你输了!') break if __name__ == '__main__': main() ``` 该代码实现了简单的人机对战五子棋,玩家执黑先手,AI执白后手。玩家输入坐标落子,AI随机下棋。程序会实时判断胜负并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值