【Python开发实践】AI人机对战五子棋——棋型变量设置&多人游戏类

棋型变量设置

之前的内容里,有写到棋型的设置,但在整个程序中,为了让计算机对棋型的数量、类型进行识别,需要设置一些棋型变量:

class SITUATION(IntEnum):  # 棋型
    NONE = 0,  # 无
    SLEEP_TWO = 1,  # 眠二
    LIVE_TWO = 2,  # 活二
    SLEEP_THREE = 3,  # 眠三
    LIVE_THREE = 4,  # 活三
    CHONG_FOUR = 5,  # 冲四
    LIVE_FOUR = 6,  # 活四
    LIVE_FIVE = 7,  # 活五


SITUATION_NUM = 8  # 长度

# 方便后续调用枚举内容
FIVE = SITUATION.LIVE_FIVE.value
L4, L3, L2 = SITUATION.LIVE_FOUR.value, SITUATION.LIVE_THREE.value, SITUATION.LIVE_TWO.value
S4, S3, S2 = SITUATION.CHONG_FOUR.value, SITUATION.SLEEP_THREE.value, SITUATION.SLEEP_TWO.value

多人游戏类设置

class MultiStartButton(Button):  # 开始按钮(多人游戏)
    def __init__(self, screen, text, x, y):  # 构造函数
        super().__init__(screen, text, x, y, [(153, 51, 250), (221, 160, 221)], True)  # 紫色

    def click(self, game):  # 点击,pygame内置方法
        if self.enable:  # 启动游戏并初始化,变换按钮颜色
            game.start()
            game.winner = None
            game.multiple=True
            self.msg_image = 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_image = self.font.render(self.text, True, self.text_color, self.button_color[0])
            self.enable = True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是代码实现: ```python import os # 初始化棋盘 def init_board(): board = [] for i in range(0, 15): row = ["+" for i in range(0, 15)] board.append(row) return board # 显示棋盘 def display_board(board): os.system("clear") print(" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15") for i in range(0, 15): print(chr(i+ord("a")), end=" ") for j in range(0, 15): print(board[i][j], end=" ") print() # 判断是否下在了棋盘内 def is_valid_location(board, row, col): if row < 0 or row >= len(board) or col < 0 or col >= len(board[0]): return False if board[row][col] != "+": return False return True # 下棋 def make_move(board, row, col, player): if is_valid_location(board, row, col): board[row][col] = player return True return False # 判断是否获胜 def check_win(board, player): for i in range(0, 15): for j in range(0, 11): if board[i][j:j+5] == [player]*5: return True for i in range(0, 11): for j in range(0, 15): if [board[i+k][j] for k in range(0, 5)] == [player]*5: return True for i in range(0, 11): for j in range(0, 11): if [board[i+k][j+k] for k in range(0, 5)] == [player]*5: return True for i in range(0, 11): for j in range(4, 15): if [board[i+k][j-k] for k in range(0, 5)] == [player]*5: return True return False # 人机对战 def play(): board = init_board() display_board(board) player = "X" while True: if player == "X": row = input("请落子(如a1):") row = ord(row[0]) - ord("a") col = int(row[1:]) - 1 else: row, col = get_computer_move(board) if make_move(board, row, col, player): display_board(board) if check_win(board, player): print("恭喜", player, "获胜!") break if player == "X": player = "O" else: player = "X" # 计算AI的落子位置 def get_computer_move(board): for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_win_by_location(board, i, j, "O"): return i, j for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_win_by_location(board, i, j, "X"): return i, j for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_live_three_by_location(board, i, j, "O"): return i, j for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_live_three_by_location(board, i, j, "X"): return i, j for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_live_two_by_location(board, i, j, "O"): return i, j for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": if check_live_two_by_location(board, i, j, "X"): return i, j while True: row, col = random.randint(0, 14), random.randint(0, 14) if board[row][col] == "+": return row, col # 判断在某个位置能否获胜 def check_win_by_location(board, row, col, player): board[row][col] = player win = check_win(board, player) board[row][col] = "+" return win # 判断在某个位置是否形成活三棋型 def check_live_three_by_location(board, row, col, player): board[row][col] = player live_three = False for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": board[i][j] = "O" if player == "X" else "X" if check_win_by_location(board, i, j, player): live_three = True board[i][j] = "+" board[row][col] = "+" return live_three # 判断在某个位置是否形成活二棋型 def check_live_two_by_location(board, row, col, player): board[row][col] = player live_two = False for i in range(0, 15): for j in range(0, 15): if board[i][j] == "+": board[i][j] = "O" if player == "X" else "X" if check_live_three_by_location(board, i, j, player): live_two = True board[i][j] = "+" board[row][col] = "+" return live_two play() ``` 这个程序使用了一些基本的算法来实现AI的落子位置计算,包括: 1. 判断在某个位置能否获胜 2. 判断在某个位置是否形成活三棋型 3. 判断在某个位置是否形成活二棋型 这些算法都是基于五子棋的规则和常识来实现的,当然也可以使用更加高级的算法来实现,比如蒙特卡罗树搜索等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值