+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-07(1)

2019-08(109)

2019-09(120)

2019-10(17)

2019-11(1)

21 Python实现简单的井字棋游戏

发布于2020-09-30 20:07     阅读(874)     评论(0)     点赞(9)     收藏(1)


0

1

2

3

4

5

6

7

  • 游戏介绍:游戏在九块方格中进行,如果一方抢先在某个方向上(横、竖、斜)连出了3个棋子,就取得胜利。
    游戏进行方法是输入方格的位置代号(从0~8)。

  • 游戏效果:
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  • 游戏实现:序列board代表棋盘,存储玩家、电脑的落子信息,未落棋子的地方是EMPTY。
    对于电脑简单的人工智能操作:
    1.如果一步棋可以让电脑在本轮次获胜,就走那一步。
    2.如果有一步棋可以让玩家在本轮次获胜,电脑就走那一步,堵住那个位置。
    3.否则,就选择走最佳位置。最佳位置(空的)是最中间的格子,第二好的是四个棋盘角落,剩下都是一样的等级。
    想实现电脑智能,就要对于井字棋做出输赢判断。这里井字棋只有8种情况表示获胜,即3颗相同棋子连成一条线。可以定义一个元组存储获胜的8种情况。

  • 代码实现:

X = 'X'  # 定义全局常量
O = '#'
EMPTY = ' '


def new_board():  # 创建新的空棋盘的函数
    board = []
    for i in range(9):  # 9个格子
        board.append(EMPTY)  # 先把格子都初始化为空
    return board  # 返回新棋盘


def display(board):  # 打印棋盘的函数
    board2 = board[:]  # 创建副本,对副本修改不影响原来的列表board
    for i in range(len(board)):
        if board[i] == EMPTY:
            board2[i] = i
    print('\t', board2[0], '|', board2[1], '|', board2[2])
    print('\t', '---------')
    print('\t', board2[3], '|', board2[4], '|', board2[5])
    print('\t', '---------')
    print('\t', board2[6], '|', board2[7], '|', board2[8])
    print('\t', '---------')


def result(board):  # 判断游戏结果的函数
    WINNER = ((3, 4, 5), (0, 1, 2), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))  # 存储所有可能获胜的情况
    for win in WINNER:
        if board[win[0]] == board[win[1]] == board[win[2]] != EMPTY:  # 判断不能为空
            winner = board[win[0]]  # 全局常量区分电脑和玩家
            return winner
    if EMPTY not in board:  # 棋盘满了
        return '平局'
    return False


def move(board):  # 判断位置是否为空(即是否可以落棋)的函数
    move = []
    for tep in range(9):
        if board[tep] == EMPTY:
            move.append(tep)
    return move


def computer_move(board, computer, human):  # 电脑走棋函数
    board2 = board[:]  # 创建副本,不影响原来的board
    BEST = (4, 0, 2, 6, 8, 1, 3, 5, 7)  # 定义一个最佳下棋位置表

    for tep in move(board):
        board[tep] = computer
        if result(board) == computer:  # 如果电脑能赢,就走那个位置
            print('电脑下棋:', tep)
            return tep
        board[tep] = EMPTY  # 取消走棋

    for tep in move(board):
        board[tep] = human
        if result(board) == human:  # 如果玩家能赢,就堵住那个位置
            print('电脑下棋:', tep)
            return tep
        board[tep] = EMPTY  # 取消走棋

    for i in range(len(BEST)):
        for tep in move(board):
            if tep == BEST[i]:  # 如果电脑能赢,就走那个位置
                board[tep] = computer
                print('电脑下棋:', board[i])
                return tep
            board[tep] = EMPTY


def human_move(board, human):  # 玩家走棋函数
    legal = move(board)
    tep = None
    while tep not in legal:
        tep = int(input('棋子落在哪里?(0~8)'))
        if tep not in legal:
            print('\n这个位置已经有棋子了!')
    return tep


def go():  # 询问谁先出发的函数
    first = input('玩家你是否先落棋?(y/n):')
    if first == 'y':
        print('\n玩家先落棋')
        human = X
        computer = O  # 先落棋的一方计作X
    else:
        print('\n电脑先落棋')
        computer = X
        human = O
    return computer, human


board = new_board()  # 初始化一个空棋盘
display(board)  # 打印棋盘界面
computer, human = go()  # 决定谁先走
turn = X  # 先走的一方计作X

while not result(board):  # 没有人获胜的时候就继续
    if turn == human:
        tep = human_move(board, human)
        board[tep] = human  # 更改棋盘
        turn = computer  # 交换顺序
    else:
        tep = computer_move(board, computer, human)
        board[tep] = computer
        turn = human
    display(board)  # 落一次棋就打印一次棋盘

winner = result(board)
if winner == computer:
    print('电脑获胜了!\n')
elif winner == human:
    print('玩家获胜了!\n')
elif winner == '平局':
    print('平局了!\n')

原文链接:https://blog.csdn.net/weixin_45832571/article/details/108859675

0

1

2

3

4



所属网站分类: 技术文章 > 博客

作者:你太美丽

链接: https://www.pythonheidong.com/blog/article/555287/59e9db65d219e3860477/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)