python--面向对象

47 阅读2分钟

1.面向对象概述:

image.png

五子棋游戏:

屏幕截图 2025-12-12 082754.png

(一)代码如下:

import os

# 游戏配置
BOARD_SIZE = 15  # 15x15棋盘(标准五子棋)
EMPTY = '+'  # 空位置字符
BLACK = '●'  # 黑子
WHITE = '○'  # 白子


def clear_screen():
    """清空控制台(跨平台)"""
    os.system('cls' if os.name == 'nt' else 'clear')


def init_board():
    """初始化棋盘:二维列表,存储每个位置的棋子(EMPTY/BLACK/WHITE)"""
    return [[EMPTY for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]


def print_board(board):
    """打印棋盘(带行列号,方便输入)"""
    clear_screen()
    # 打印列号(0~14)
    print('    ', end='')
    for col in range(BOARD_SIZE):
        print(f'{col:2}', end=' ')
    print('\n')
    # 打印行号+每行棋子
    for row in range(BOARD_SIZE):
        print(f'{row:2}   ', end='')
        for col in range(BOARD_SIZE):
            print(board[row][col], end='  ')
        print()
    print()


def is_valid_pos(board, row, col):
    """判断落子位置是否合法:在棋盘内且为空"""
    return 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == EMPTY


def is_win(board, row, col, color):
    """判断当前落子是否获胜(五子连珠)"""
    # 四个方向:水平、垂直、正对角线、反对角线
    directions = [
        (0, 1),  # 左右(水平)
        (1, 0),  # 上下(垂直)
        (1, 1),  # 右下-左上(正对角线)
        (1, -1)  # 左下-右上(反对角线)
    ]

    for dx, dy in directions:
        count = 1  # 当前落子算1个
        # 正向遍历(如右、下、右下、左下)
        x, y = row + dx, col + dy
        while 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE and board[x][y] == color:
            count += 1
            x += dx
            y += dy
        # 反向遍历(如左、上、左上、右上)
        x, y = row - dx, col - dy
        while 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE and board[x][y] == color:
            count += 1
            x -= dx
            y -= dy
        # 五子连珠则获胜
        if count >= 5:
            return True
    return False


def get_input(player):
    """获取玩家输入的落子位置(行 列)"""
    while True:
        try:
            pos = input(f'{player}方落子(输入 行 列,用空格分隔,如:7 7):')
            row, col = map(int, pos.split())
            return row, col
        except ValueError:
            print('输入错误!请输入两个数字,用空格分隔(如:7 7)。')


def main():
    """主游戏流程"""
    board = init_board()
    current_player = BLACK  # 黑方先下
    game_over = False

    # 游戏主循环
    while not game_over:
        print_board(board)
        # 获取合法落子位置
        while True:
            row, col = get_input('黑' if current_player == BLACK else '白')
            if is_valid_pos(board, row, col):
                break
            print(f'位置({row},{col})已被占用或超出棋盘!请重新输入。')

        # 落子
        board[row][col] = current_player

        # 判断是否获胜
        if is_win(board, row, col, current_player):
            print_board(board)
            print(f'{"黑" if current_player == BLACK else "白"}方获胜!')
            game_over = True
        else:
            # 切换玩家
            current_player = WHITE if current_player == BLACK else BLACK

    # 游戏结束后询问是否重玩
    while True:
        choice = input('是否重新开始?(y/n):')
        if choice.lower() == 'y':
            main()
        elif choice.lower() == 'n':
            print('游戏结束!')
            break
        else:
            print('请输入y或n!')


if __name__ == '__main__':
    print('五子棋(控制台版)')
    print(f'棋盘大小:{BOARD_SIZE}x{BOARD_SIZE}')
    print('操作说明:输入行号和列号(如7 7),按回车落子\n')
    input('按回车开始游戏...')
    main()

(二)运行结果如下:

image.png

image.png

image.png

2.类的定义:

image.png

(一)代码如下:

class Car:
  wheels = 4
  def drive(self):
      print('行驶')

(二)运行结果如下:

image.png