【Python开发实践】AI人机对战五子棋——部分主体功能

为了更好的在主函数中规划和控制整个游戏的代码,编写类Game,在里面调用之前写好的功能函数,然后分别绘制棋盘、按钮和判断获胜的一方。

Game的具体实现流程:

初始化函数处理

主要是设置按钮的内容和可用性

class Game:                             #pagame类,以下所有功能都是根据需要重写
    def __int__(self,caption):
        pygame.init()
        self.screen=pygame.display.set_mode([screen_w,screen_h])
        pygame.display.set_caption(caption)
        self.clock=pygame.time.Clock()
        self.buttons=[]
        self.buttons.append(WhiteStartButton(self.screen,'选择白棋',20,map_h))
        self.buttons.append(BlackStartButton(self.screen,'选择黑棋',190,map_h))
        self.buttons.append(GiveupButton(self.screen,'放弃',360,map_h))
        self.buttons.append(MultiStartButton(self.screen,'Multiple',530,map_h))
        self.is_play=False
        self.map=Map(web_broad,web_broad)
        self.player=map_enum.player1
        self.action=None
        self.AI=MyChessAI(web_broad)
        self.useAI=False
        self.winner=None
        self.multiple=False

“开始游戏”的功能实现

    def start(self):
        self.is_play=True
        self.player=map_enum.player1        #白棋先手
        self.map.get_init()

绘制出棋盘和按钮

    def play(self):
        #画底板
        self.clock.tick(60)
        wood_color=(210,180,140)
        pygame.draw.rect(self.screen,wood_color,pygame.Rect(0,0,map_w,screen_h))
        pygame.draw.rect(self.screen,(255,255,255),pygame.Rect(map_w,0,info_w,screen_h))
        #画按钮
        for button in self.buttons:
            button.draw()
        if self.is_play and not self.isOver():
            if self.useAI and not self.multiple:
                x,y=self.AI.findBestChess(self.map.map,self.player)
                self.checkClick(x,y,True)
                self.useAI=False
            if self.action is not None:
                self.checkClick(self.action[0],self.action[1])
                self.action=None
            if not self.isOver():
                self.changeMouseShow()
        if self.isOver():
            self.showWinner()
        self.map.drawBoard(self.screen)
        self.map.printChessPiece(self.screen)

把鼠标指针切换成棋子的样子

    def changeMouseShow(self):
        map_x,map_y=pygame.mouse.get_pos()
        x,y=self.map.getIndex(map_x,map_y)
        if self.map.isInside(map_x,map_y) and self.map.isEmpty(x,y):
            #在棋盘内且当前没有棋子
            pygame.mouse.set_visible(False)
            smoke_blue=(176,224,230)
            pos,radius=(map_x,map_y),chess_size
            pygame.draw.circle(self.screen,smoke_blue,pos,radius)
        else:
            pygame.mouse.set_visible(True)
    def checkClick(self,x,y,isAI=False):
        self.map.click(x,y,self.player)
        if self.AI.isWin(self.map.map,self.player):
            self.winner=self.player
            self.click_button(self.buttons[2])
        else:
            self.player=self.map.intoNextTurn(self.player)
            if not isAI:
                self.useAI=True

处理下棋的动作

    def mouseClick(self,map_x,map_y):
        if self.is_play and self.map.isInside(map_x,map_y) and not self.isOver():
            x,y=self.map.getIndex(map_x,map_y)
            if self.map.isEmpty(x,y):
                self.action=(x,y)

实现获胜时中断游戏的功能

    def isOver(self):
        return self.winner is not None

打印输出胜者

    def showWinner(self):
        def showFont(screen,text,location_x,location_y,height):
            font=pygame.font.SysFont(None,height)
            font_image=font.render(text,True,(255,215,0),(255,255,255))
            font_image_rect=font_image.get_rect()
            font_image_rect.x=location_x
            font_image_rect.y=location_y
            screen.blit(font_image,font_image_rect)
        if self.winner==map_enum.player1:
            set='白棋胜出'
        else:
            str='黑棋胜出'
        showFont(self.screen,str,map_w/5,screen_h/8,100)

  • 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、付费专栏及课程。

余额充值