Python写一个创意五子棋游戏

前言

在本教程中,我们将使用Python写一个创意五子棋游戏

📝个人主页→ 数据挖掘博主ZTLJQ的主页

个人推荐python学习系列:

☄️爬虫****JS逆向****系列专栏 - 爬虫逆向教学

☄️python系列专栏 - 从零开始学python


首先

GomokuGame 类的构造函数 __init__ 初始化游戏。board_size 参数默认为 15,表示棋盘大小。board 是一个二维列表,代表棋盘上的状态。current_player 记录当前玩家,初始为 'X'。winner 记录胜利者,初始为 None。

python 复制代码
class GomokuGame:
    def __init__(self, board_size=15):
        self.board_size = board_size
        self.board = [[' ' for _ in range(board_size)] for _ in range(board_size)]
        self.current_player = 'X'
        self.winner = None

print_board 方法用于打印当前棋盘的状态。首先,它打印列索引。然后,遍历每一行打印出当前行的棋子状态。

python 复制代码
    def print_board(self):
        print("  " + " ".join(str(i) for i in range(self.board_size)))
        for i in range(self.board_size):
            print(str(i) + " " + " ".join(self.board[i]))
        print()

make_move 方法用于玩家落子。如果指定位置为空,将当前玩家的标记放置在该位置。然后调用 check_winner 方法检查是否有胜利者。最后,切换当前玩家。

python 复制代码
    def make_move(self, row, col):
        if self.board[row][col] == ' ':
            self.board[row][col] = self.current_player
            if self.check_winner(row, col):
                self.winner = self.current_player
            self.current_player = 'X' if self.current_player == 'O' else 'O'
            return True
        return False

check_winner 方法用于检查是否有玩家获胜。它通过检查当前位置的四个方向来判断是否有五个连续相同的棋子。如果存在,则返回 True,表示有玩家获胜。

python 复制代码
    def check_winner(self, row, col):
        directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
        for dr, dc in directions:
            count = 1
            for i in range(1, 5):
                r, c = row + i * dr, col + i * dc
                if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                    count += 1
                else:
                    break
            for i in range(1, 5):
                r, c = row - i * dr, col - i * dc
                if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                    count += 1
                else:
                    break
            if count >= 5:
                return True
        return False

play 方法是游戏的主循环。它持续运行直到有玩家获胜。在每一轮中,它打印当前棋盘,然后获取玩家输入的行和列,进行落子操作。如果落子无效,则要求玩家重新输入。如果有玩家获胜,则打印胜利信息并结束游戏。

python 复制代码
    def play(self):
        while not self.winner:
            self.print_board()
            try:
                row = int(input("玩家{}的回合,请输入你要下的行数: ".format(self.current_player)))
                col = int(input("请输入你要下的列数: "))
                if 0 <= row < self.board_size and 0 <= col < self.board_size:
                    if self.make_move(row, col):
                        if self.winner:
                            self.print_board()
                            print("玩家{},你赢了".format(self.winner))
                            break
                    else:
                        print("无效移动。再试一次。")
                else:
                    print("输入无效。再试一次。")
            except ValueError:
                print("输入无效。输入一个数字。")

在代码的末尾,通过这个条件判断,确保仅在直接运行该脚本时才会执行创建游戏对象并开始游戏。

python 复制代码
if __name__ == "__main__":
    game = GomokuGame()
    game.play()

下面是完全代码,可以直接复制运行

python 复制代码
class GomokuGame:
    def __init__(self, board_size=15):
        self.board_size = board_size
        self.board = [[' ' for _ in range(board_size)] for _ in range(board_size)]
        self.current_player = 'X'
        self.winner = None

    def print_board(self):
        print("  " + " ".join(str(i) for i in range(self.board_size)))
        for i in range(self.board_size):
            print(str(i) + " " + " ".join(self.board[i]))
        print()

    def make_move(self, row, col):
        if self.board[row][col] == ' ':
            self.board[row][col] = self.current_player
            if self.check_winner(row, col):
                self.winner = self.current_player
            self.current_player = 'X' if self.current_player == 'O' else 'O'
            return True
        return False

    def check_winner(self, row, col):
        directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
        for dr, dc in directions:
            count = 1
            for i in range(1, 5):
                r, c = row + i * dr, col + i * dc
                if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                    count += 1
                else:
                    break
            for i in range(1, 5):
                r, c = row - i * dr, col - i * dc
                if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                    count += 1
                else:
                    break
            if count >= 5:
                return True
        return False

    def play(self):
        while not self.winner:
            self.print_board()
            try:
                row = int(input("玩家{}的回合,请输入你要下的行数: ".format(self.current_player)))
                col = int(input("请输入你要下的列数: "))
                if 0 <= row < self.board_size and 0 <= col < self.board_size:
                    if self.make_move(row, col):
                        if self.winner:
                            self.print_board()
                            print("玩家{},你赢了".format(self.winner))
                            break
                    else:
                        print("无效移动。再试一次。")
                else:
                    print("输入无效。再试一次。")
            except ValueError:
                print("输入无效。输入一个数字。")

if __name__ == "__main__":
    game = GomokuGame()
    game.play()
相关推荐
Inori_3336 分钟前
Windows11暂停自动更新
windows·win11·暂停更新·windows update·windows更新
earthzhang20217 分钟前
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
开发语言·网络·python·https·1024程序员节
明月清了个风11 分钟前
数据结构与算法学习笔记----容斥原理
笔记·学习·算法
HilariousDog15 分钟前
clean code阅读笔记——如何命名?
windows·笔记
__如风__42 分钟前
Nuitka打包python脚本
开发语言·python
小王子10241 小时前
设计模式Python版 抽象工厂模式
python·设计模式·抽象工厂模式
Zda天天爱打卡1 小时前
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
开发语言·python·numpy
纠结哥_Shrek2 小时前
AI常见的算法
人工智能·算法
Oracle_6662 小时前
C语言------数组从入门到精通
c语言·算法·排序算法
hunter2062062 小时前
如何把一个python文件打包成一步一步安装的可执行程序
python