猫史档案馆


【Python作品分享】人机大战:井字棋

用户:...凉风......凉风...查看:0 回复:1 评论:0 创建时间:2019-08-16T23:07:12


【作品展示】

center_image

 

【作品介绍】

井字棋

人机大战

快来挑战机器啦!

操作简单但赢不容易哦!

 

【作品源代码】

O = "O"
X = "X"
EMPTY = " "
TIE = "TIE"
NUM = 9
human = "X"
computer = "O"
def js():
    """游戏说明"""
    print("""
    游戏说明
棋盘分为9个部分
0 | 1  | 2
------------
3 | 4  | 5
------------
6 | 7  | 8  
位置从0开始,直接输入位置数字
你为X,电脑为O
连成一条线即胜利""")
def ask_number(question,low,high):   #下的位置
    """ zdwz"""
    response = -1
    while response not in range(low,high): 
        response = int(input(question))#返回位置
    return response
def new_board():   #创建棋盘
    """new game"""
    board = []   #创建空列表
    for sqare in range(NUM):
        board.append(EMPTY) #创建空白元素
    return board
def display(board): #打印棋盘
    """display game board on creen"""
    print("\t",board[0],"|",board[1],"|",board[2])
    print("         ---------")
    print("\t",board[3],"|",board[4],"|",board[5])
    print("         ---------")
    print("\t",board[6],"|",board[7],"|",board[8],"\n")
def legal_moves(board): #接收棋盘,检查合法性
    """legare"""
    moves = []
    for 喵 in range(NUM): #检查是否有空位
        if board[喵] == EMPTY:
            moves.append(喵)
    return moves #返回空位
def winner(board):  #判断输赢
    """game winner"""
    WIN = ((0,1,2), #所有赢得可能
           (3,4,5),
           (6,7,8),
           (0,3,6),
           (1,4,7),
           (2,5,8),
           (0,4,8),
           (2,4,6))
    for row in WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] == human: #检查是否有连线
            winner = human
            return winner
        elif board[row[0]] == board[row[1]] == board[row[2]] == computer: #检查是否有连线
            winner = computer
            return winner
        elif EMPTY not in board:  #检查是否有空位
            return TIE
    return None
def human_move(board,human):  #玩家动棋
    """GET human move"""
    legal = legal_moves(board) #获取合法位置
    move = None
    while move not in legal:
        move = ask_number("请输入0 - 8:",0,NUM)
        if move not in legal:
            print("\n此位置已被占用,请重新选择\n")
    print("Fine...")
    return move #返回玩家选的位置
def computer_move(board,computer,human):  #电脑动棋
    """MAKE computer move"""
    board = board[:] #创建棋盘副本
    BEST = (4,0,2,6,8,1,3,5,7) #最佳位置
    for move in legal_moves(board): #测试位置
        board[move] = computer
        if winner(board) == computer:
            print("电脑:",move)
            return move
        board[move] = EMPTY #还原棋盘
    for move in legal_moves(board): #测试玩家是否能胜利
        board[move] = human
        if winner(board) == human:
            print("电脑:",move)
            return move
        board[move] = EMPTY
    for move in BEST: #选择最佳位置
        if move in legal_moves(board):
            print("电脑:",move)
            return move
def next_turn(turn): #返回下一个行棋方
    """turn"""
    if turn == "X":
        return O
    else:
        return X
def congrat_winner(the_winner,computer,human): #返回输赢
    """winner"""
    if the_winner == human:
        print("你赢了!\n")
    elif the_winner == computer:
        print("你输了!") 
    else:
        print("平局!\n")
def main():   #执行主程序
    js()
    turn = X #当前下棋方
    board = new_board()
    display(board) #创建棋盘
    while not winner(board):
        if turn == human: #玩家下
            move = human_move(board,human)
            board[move] = human
        elif turn == computer:
            move = computer_move(board,computer,human) #电脑下
            board[move] = computer
        display(board) #打印棋盘
        the_winner = winner(board)
        turn = next_turn(turn) #切换下棋方
    congrat_winner(the_winner,computer,human)
main()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
银天X银天X

点赞0


评论